mirror of
https://github.com/fooflington/selfdefined.git
synced 2025-08-06 20:48:35 +00:00
update
This commit is contained in:
72
node_modules/markdown-it/lib/rules_inline/autolink.js
generated
vendored
Normal file
72
node_modules/markdown-it/lib/rules_inline/autolink.js
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
// Process autolinks '<protocol:...>'
|
||||
|
||||
'use strict';
|
||||
|
||||
|
||||
/*eslint max-len:0*/
|
||||
var EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;
|
||||
var AUTOLINK_RE = /^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;
|
||||
|
||||
|
||||
module.exports = function autolink(state, silent) {
|
||||
var tail, linkMatch, emailMatch, url, fullUrl, token,
|
||||
pos = state.pos;
|
||||
|
||||
if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }
|
||||
|
||||
tail = state.src.slice(pos);
|
||||
|
||||
if (tail.indexOf('>') < 0) { return false; }
|
||||
|
||||
if (AUTOLINK_RE.test(tail)) {
|
||||
linkMatch = tail.match(AUTOLINK_RE);
|
||||
|
||||
url = linkMatch[0].slice(1, -1);
|
||||
fullUrl = state.md.normalizeLink(url);
|
||||
if (!state.md.validateLink(fullUrl)) { return false; }
|
||||
|
||||
if (!silent) {
|
||||
token = state.push('link_open', 'a', 1);
|
||||
token.attrs = [ [ 'href', fullUrl ] ];
|
||||
token.markup = 'autolink';
|
||||
token.info = 'auto';
|
||||
|
||||
token = state.push('text', '', 0);
|
||||
token.content = state.md.normalizeLinkText(url);
|
||||
|
||||
token = state.push('link_close', 'a', -1);
|
||||
token.markup = 'autolink';
|
||||
token.info = 'auto';
|
||||
}
|
||||
|
||||
state.pos += linkMatch[0].length;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (EMAIL_RE.test(tail)) {
|
||||
emailMatch = tail.match(EMAIL_RE);
|
||||
|
||||
url = emailMatch[0].slice(1, -1);
|
||||
fullUrl = state.md.normalizeLink('mailto:' + url);
|
||||
if (!state.md.validateLink(fullUrl)) { return false; }
|
||||
|
||||
if (!silent) {
|
||||
token = state.push('link_open', 'a', 1);
|
||||
token.attrs = [ [ 'href', fullUrl ] ];
|
||||
token.markup = 'autolink';
|
||||
token.info = 'auto';
|
||||
|
||||
token = state.push('text', '', 0);
|
||||
token.content = state.md.normalizeLinkText(url);
|
||||
|
||||
token = state.push('link_close', 'a', -1);
|
||||
token.markup = 'autolink';
|
||||
token.info = 'auto';
|
||||
}
|
||||
|
||||
state.pos += emailMatch[0].length;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
43
node_modules/markdown-it/lib/rules_inline/backticks.js
generated
vendored
Normal file
43
node_modules/markdown-it/lib/rules_inline/backticks.js
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
// Parse backticks
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function backtick(state, silent) {
|
||||
var start, max, marker, matchStart, matchEnd, token,
|
||||
pos = state.pos,
|
||||
ch = state.src.charCodeAt(pos);
|
||||
|
||||
if (ch !== 0x60/* ` */) { return false; }
|
||||
|
||||
start = pos;
|
||||
pos++;
|
||||
max = state.posMax;
|
||||
|
||||
while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }
|
||||
|
||||
marker = state.src.slice(start, pos);
|
||||
|
||||
matchStart = matchEnd = pos;
|
||||
|
||||
while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {
|
||||
matchEnd = matchStart + 1;
|
||||
|
||||
while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }
|
||||
|
||||
if (matchEnd - matchStart === marker.length) {
|
||||
if (!silent) {
|
||||
token = state.push('code_inline', 'code', 0);
|
||||
token.markup = marker;
|
||||
token.content = state.src.slice(pos, matchStart)
|
||||
.replace(/[ \n]+/g, ' ')
|
||||
.trim();
|
||||
}
|
||||
state.pos = matchEnd;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!silent) { state.pending += marker; }
|
||||
state.pos += marker.length;
|
||||
return true;
|
||||
};
|
44
node_modules/markdown-it/lib/rules_inline/balance_pairs.js
generated
vendored
Normal file
44
node_modules/markdown-it/lib/rules_inline/balance_pairs.js
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
// For each opening emphasis-like marker find a matching closing one
|
||||
//
|
||||
'use strict';
|
||||
|
||||
|
||||
module.exports = function link_pairs(state) {
|
||||
var i, j, lastDelim, currDelim,
|
||||
delimiters = state.delimiters,
|
||||
max = state.delimiters.length;
|
||||
|
||||
for (i = 0; i < max; i++) {
|
||||
lastDelim = delimiters[i];
|
||||
|
||||
if (!lastDelim.close) { continue; }
|
||||
|
||||
j = i - lastDelim.jump - 1;
|
||||
|
||||
while (j >= 0) {
|
||||
currDelim = delimiters[j];
|
||||
|
||||
if (currDelim.open &&
|
||||
currDelim.marker === lastDelim.marker &&
|
||||
currDelim.end < 0 &&
|
||||
currDelim.level === lastDelim.level) {
|
||||
|
||||
// typeofs are for backward compatibility with plugins
|
||||
var odd_match = (currDelim.close || lastDelim.open) &&
|
||||
typeof currDelim.length !== 'undefined' &&
|
||||
typeof lastDelim.length !== 'undefined' &&
|
||||
(currDelim.length + lastDelim.length) % 3 === 0;
|
||||
|
||||
if (!odd_match) {
|
||||
lastDelim.jump = i - j;
|
||||
lastDelim.open = false;
|
||||
currDelim.end = i;
|
||||
currDelim.jump = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
j -= currDelim.jump + 1;
|
||||
}
|
||||
}
|
||||
};
|
127
node_modules/markdown-it/lib/rules_inline/emphasis.js
generated
vendored
Normal file
127
node_modules/markdown-it/lib/rules_inline/emphasis.js
generated
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
// Process *this* and _that_
|
||||
//
|
||||
'use strict';
|
||||
|
||||
|
||||
// Insert each marker as a separate text token, and add it to delimiter list
|
||||
//
|
||||
module.exports.tokenize = function emphasis(state, silent) {
|
||||
var i, scanned, token,
|
||||
start = state.pos,
|
||||
marker = state.src.charCodeAt(start);
|
||||
|
||||
if (silent) { return false; }
|
||||
|
||||
if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }
|
||||
|
||||
scanned = state.scanDelims(state.pos, marker === 0x2A);
|
||||
|
||||
for (i = 0; i < scanned.length; i++) {
|
||||
token = state.push('text', '', 0);
|
||||
token.content = String.fromCharCode(marker);
|
||||
|
||||
state.delimiters.push({
|
||||
// Char code of the starting marker (number).
|
||||
//
|
||||
marker: marker,
|
||||
|
||||
// Total length of these series of delimiters.
|
||||
//
|
||||
length: scanned.length,
|
||||
|
||||
// An amount of characters before this one that's equivalent to
|
||||
// current one. In plain English: if this delimiter does not open
|
||||
// an emphasis, neither do previous `jump` characters.
|
||||
//
|
||||
// Used to skip sequences like "*****" in one step, for 1st asterisk
|
||||
// value will be 0, for 2nd it's 1 and so on.
|
||||
//
|
||||
jump: i,
|
||||
|
||||
// A position of the token this delimiter corresponds to.
|
||||
//
|
||||
token: state.tokens.length - 1,
|
||||
|
||||
// Token level.
|
||||
//
|
||||
level: state.level,
|
||||
|
||||
// If this delimiter is matched as a valid opener, `end` will be
|
||||
// equal to its position, otherwise it's `-1`.
|
||||
//
|
||||
end: -1,
|
||||
|
||||
// Boolean flags that determine if this delimiter could open or close
|
||||
// an emphasis.
|
||||
//
|
||||
open: scanned.can_open,
|
||||
close: scanned.can_close
|
||||
});
|
||||
}
|
||||
|
||||
state.pos += scanned.length;
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
// Walk through delimiter list and replace text tokens with tags
|
||||
//
|
||||
module.exports.postProcess = function emphasis(state) {
|
||||
var i,
|
||||
startDelim,
|
||||
endDelim,
|
||||
token,
|
||||
ch,
|
||||
isStrong,
|
||||
delimiters = state.delimiters,
|
||||
max = state.delimiters.length;
|
||||
|
||||
for (i = max - 1; i >= 0; i--) {
|
||||
startDelim = delimiters[i];
|
||||
|
||||
if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Process only opening markers
|
||||
if (startDelim.end === -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
endDelim = delimiters[startDelim.end];
|
||||
|
||||
// If the previous delimiter has the same marker and is adjacent to this one,
|
||||
// merge those into one strong delimiter.
|
||||
//
|
||||
// `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`
|
||||
//
|
||||
isStrong = i > 0 &&
|
||||
delimiters[i - 1].end === startDelim.end + 1 &&
|
||||
delimiters[i - 1].token === startDelim.token - 1 &&
|
||||
delimiters[startDelim.end + 1].token === endDelim.token + 1 &&
|
||||
delimiters[i - 1].marker === startDelim.marker;
|
||||
|
||||
ch = String.fromCharCode(startDelim.marker);
|
||||
|
||||
token = state.tokens[startDelim.token];
|
||||
token.type = isStrong ? 'strong_open' : 'em_open';
|
||||
token.tag = isStrong ? 'strong' : 'em';
|
||||
token.nesting = 1;
|
||||
token.markup = isStrong ? ch + ch : ch;
|
||||
token.content = '';
|
||||
|
||||
token = state.tokens[endDelim.token];
|
||||
token.type = isStrong ? 'strong_close' : 'em_close';
|
||||
token.tag = isStrong ? 'strong' : 'em';
|
||||
token.nesting = -1;
|
||||
token.markup = isStrong ? ch + ch : ch;
|
||||
token.content = '';
|
||||
|
||||
if (isStrong) {
|
||||
state.tokens[delimiters[i - 1].token].content = '';
|
||||
state.tokens[delimiters[startDelim.end + 1].token].content = '';
|
||||
i--;
|
||||
}
|
||||
}
|
||||
};
|
48
node_modules/markdown-it/lib/rules_inline/entity.js
generated
vendored
Normal file
48
node_modules/markdown-it/lib/rules_inline/entity.js
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
// Process html entity - {, ¯, ", ...
|
||||
|
||||
'use strict';
|
||||
|
||||
var entities = require('../common/entities');
|
||||
var has = require('../common/utils').has;
|
||||
var isValidEntityCode = require('../common/utils').isValidEntityCode;
|
||||
var fromCodePoint = require('../common/utils').fromCodePoint;
|
||||
|
||||
|
||||
var DIGITAL_RE = /^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i;
|
||||
var NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;
|
||||
|
||||
|
||||
module.exports = function entity(state, silent) {
|
||||
var ch, code, match, pos = state.pos, max = state.posMax;
|
||||
|
||||
if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }
|
||||
|
||||
if (pos + 1 < max) {
|
||||
ch = state.src.charCodeAt(pos + 1);
|
||||
|
||||
if (ch === 0x23 /* # */) {
|
||||
match = state.src.slice(pos).match(DIGITAL_RE);
|
||||
if (match) {
|
||||
if (!silent) {
|
||||
code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);
|
||||
state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);
|
||||
}
|
||||
state.pos += match[0].length;
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
match = state.src.slice(pos).match(NAMED_RE);
|
||||
if (match) {
|
||||
if (has(entities, match[1])) {
|
||||
if (!silent) { state.pending += entities[match[1]]; }
|
||||
state.pos += match[0].length;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!silent) { state.pending += '&'; }
|
||||
state.pos++;
|
||||
return true;
|
||||
};
|
52
node_modules/markdown-it/lib/rules_inline/escape.js
generated
vendored
Normal file
52
node_modules/markdown-it/lib/rules_inline/escape.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
// Process escaped chars and hardbreaks
|
||||
|
||||
'use strict';
|
||||
|
||||
var isSpace = require('../common/utils').isSpace;
|
||||
|
||||
var ESCAPED = [];
|
||||
|
||||
for (var i = 0; i < 256; i++) { ESCAPED.push(0); }
|
||||
|
||||
'\\!"#$%&\'()*+,./:;<=>?@[]^_`{|}~-'
|
||||
.split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });
|
||||
|
||||
|
||||
module.exports = function escape(state, silent) {
|
||||
var ch, pos = state.pos, max = state.posMax;
|
||||
|
||||
if (state.src.charCodeAt(pos) !== 0x5C/* \ */) { return false; }
|
||||
|
||||
pos++;
|
||||
|
||||
if (pos < max) {
|
||||
ch = state.src.charCodeAt(pos);
|
||||
|
||||
if (ch < 256 && ESCAPED[ch] !== 0) {
|
||||
if (!silent) { state.pending += state.src[pos]; }
|
||||
state.pos += 2;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (ch === 0x0A) {
|
||||
if (!silent) {
|
||||
state.push('hardbreak', 'br', 0);
|
||||
}
|
||||
|
||||
pos++;
|
||||
// skip leading whitespaces from next line
|
||||
while (pos < max) {
|
||||
ch = state.src.charCodeAt(pos);
|
||||
if (!isSpace(ch)) { break; }
|
||||
pos++;
|
||||
}
|
||||
|
||||
state.pos = pos;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!silent) { state.pending += '\\'; }
|
||||
state.pos++;
|
||||
return true;
|
||||
};
|
47
node_modules/markdown-it/lib/rules_inline/html_inline.js
generated
vendored
Normal file
47
node_modules/markdown-it/lib/rules_inline/html_inline.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
// Process html tags
|
||||
|
||||
'use strict';
|
||||
|
||||
|
||||
var HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;
|
||||
|
||||
|
||||
function isLetter(ch) {
|
||||
/*eslint no-bitwise:0*/
|
||||
var lc = ch | 0x20; // to lower case
|
||||
return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);
|
||||
}
|
||||
|
||||
|
||||
module.exports = function html_inline(state, silent) {
|
||||
var ch, match, max, token,
|
||||
pos = state.pos;
|
||||
|
||||
if (!state.md.options.html) { return false; }
|
||||
|
||||
// Check start
|
||||
max = state.posMax;
|
||||
if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||
|
||||
pos + 2 >= max) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Quick fail on second char
|
||||
ch = state.src.charCodeAt(pos + 1);
|
||||
if (ch !== 0x21/* ! */ &&
|
||||
ch !== 0x3F/* ? */ &&
|
||||
ch !== 0x2F/* / */ &&
|
||||
!isLetter(ch)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
match = state.src.slice(pos).match(HTML_TAG_RE);
|
||||
if (!match) { return false; }
|
||||
|
||||
if (!silent) {
|
||||
token = state.push('html_inline', '', 0);
|
||||
token.content = state.src.slice(pos, pos + match[0].length);
|
||||
}
|
||||
state.pos += match[0].length;
|
||||
return true;
|
||||
};
|
152
node_modules/markdown-it/lib/rules_inline/image.js
generated
vendored
Normal file
152
node_modules/markdown-it/lib/rules_inline/image.js
generated
vendored
Normal file
@@ -0,0 +1,152 @@
|
||||
// Process 
|
||||
|
||||
'use strict';
|
||||
|
||||
var normalizeReference = require('../common/utils').normalizeReference;
|
||||
var isSpace = require('../common/utils').isSpace;
|
||||
|
||||
|
||||
module.exports = function image(state, silent) {
|
||||
var attrs,
|
||||
code,
|
||||
content,
|
||||
label,
|
||||
labelEnd,
|
||||
labelStart,
|
||||
pos,
|
||||
ref,
|
||||
res,
|
||||
title,
|
||||
token,
|
||||
tokens,
|
||||
start,
|
||||
href = '',
|
||||
oldPos = state.pos,
|
||||
max = state.posMax;
|
||||
|
||||
if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }
|
||||
if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }
|
||||
|
||||
labelStart = state.pos + 2;
|
||||
labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);
|
||||
|
||||
// parser failed to find ']', so it's not a valid link
|
||||
if (labelEnd < 0) { return false; }
|
||||
|
||||
pos = labelEnd + 1;
|
||||
if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {
|
||||
//
|
||||
// Inline link
|
||||
//
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^ skipping these spaces
|
||||
pos++;
|
||||
for (; pos < max; pos++) {
|
||||
code = state.src.charCodeAt(pos);
|
||||
if (!isSpace(code) && code !== 0x0A) { break; }
|
||||
}
|
||||
if (pos >= max) { return false; }
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^^^^^ parsing link destination
|
||||
start = pos;
|
||||
res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);
|
||||
if (res.ok) {
|
||||
href = state.md.normalizeLink(res.str);
|
||||
if (state.md.validateLink(href)) {
|
||||
pos = res.pos;
|
||||
} else {
|
||||
href = '';
|
||||
}
|
||||
}
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^ skipping these spaces
|
||||
start = pos;
|
||||
for (; pos < max; pos++) {
|
||||
code = state.src.charCodeAt(pos);
|
||||
if (!isSpace(code) && code !== 0x0A) { break; }
|
||||
}
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^^^^^^ parsing link title
|
||||
res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);
|
||||
if (pos < max && start !== pos && res.ok) {
|
||||
title = res.str;
|
||||
pos = res.pos;
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^ skipping these spaces
|
||||
for (; pos < max; pos++) {
|
||||
code = state.src.charCodeAt(pos);
|
||||
if (!isSpace(code) && code !== 0x0A) { break; }
|
||||
}
|
||||
} else {
|
||||
title = '';
|
||||
}
|
||||
|
||||
if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {
|
||||
state.pos = oldPos;
|
||||
return false;
|
||||
}
|
||||
pos++;
|
||||
} else {
|
||||
//
|
||||
// Link reference
|
||||
//
|
||||
if (typeof state.env.references === 'undefined') { return false; }
|
||||
|
||||
if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {
|
||||
start = pos + 1;
|
||||
pos = state.md.helpers.parseLinkLabel(state, pos);
|
||||
if (pos >= 0) {
|
||||
label = state.src.slice(start, pos++);
|
||||
} else {
|
||||
pos = labelEnd + 1;
|
||||
}
|
||||
} else {
|
||||
pos = labelEnd + 1;
|
||||
}
|
||||
|
||||
// covers label === '' and label === undefined
|
||||
// (collapsed reference link and shortcut reference link respectively)
|
||||
if (!label) { label = state.src.slice(labelStart, labelEnd); }
|
||||
|
||||
ref = state.env.references[normalizeReference(label)];
|
||||
if (!ref) {
|
||||
state.pos = oldPos;
|
||||
return false;
|
||||
}
|
||||
href = ref.href;
|
||||
title = ref.title;
|
||||
}
|
||||
|
||||
//
|
||||
// We found the end of the link, and know for a fact it's a valid link;
|
||||
// so all that's left to do is to call tokenizer.
|
||||
//
|
||||
if (!silent) {
|
||||
content = state.src.slice(labelStart, labelEnd);
|
||||
|
||||
state.md.inline.parse(
|
||||
content,
|
||||
state.md,
|
||||
state.env,
|
||||
tokens = []
|
||||
);
|
||||
|
||||
token = state.push('image', 'img', 0);
|
||||
token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ];
|
||||
token.children = tokens;
|
||||
token.content = content;
|
||||
|
||||
if (title) {
|
||||
attrs.push([ 'title', title ]);
|
||||
}
|
||||
}
|
||||
|
||||
state.pos = pos;
|
||||
state.posMax = max;
|
||||
return true;
|
||||
};
|
150
node_modules/markdown-it/lib/rules_inline/link.js
generated
vendored
Normal file
150
node_modules/markdown-it/lib/rules_inline/link.js
generated
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
// Process [link](<to> "stuff")
|
||||
|
||||
'use strict';
|
||||
|
||||
var normalizeReference = require('../common/utils').normalizeReference;
|
||||
var isSpace = require('../common/utils').isSpace;
|
||||
|
||||
|
||||
module.exports = function link(state, silent) {
|
||||
var attrs,
|
||||
code,
|
||||
label,
|
||||
labelEnd,
|
||||
labelStart,
|
||||
pos,
|
||||
res,
|
||||
ref,
|
||||
title,
|
||||
token,
|
||||
href = '',
|
||||
oldPos = state.pos,
|
||||
max = state.posMax,
|
||||
start = state.pos,
|
||||
parseReference = true;
|
||||
|
||||
if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }
|
||||
|
||||
labelStart = state.pos + 1;
|
||||
labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);
|
||||
|
||||
// parser failed to find ']', so it's not a valid link
|
||||
if (labelEnd < 0) { return false; }
|
||||
|
||||
pos = labelEnd + 1;
|
||||
if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {
|
||||
//
|
||||
// Inline link
|
||||
//
|
||||
|
||||
// might have found a valid shortcut link, disable reference parsing
|
||||
parseReference = false;
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^ skipping these spaces
|
||||
pos++;
|
||||
for (; pos < max; pos++) {
|
||||
code = state.src.charCodeAt(pos);
|
||||
if (!isSpace(code) && code !== 0x0A) { break; }
|
||||
}
|
||||
if (pos >= max) { return false; }
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^^^^^ parsing link destination
|
||||
start = pos;
|
||||
res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);
|
||||
if (res.ok) {
|
||||
href = state.md.normalizeLink(res.str);
|
||||
if (state.md.validateLink(href)) {
|
||||
pos = res.pos;
|
||||
} else {
|
||||
href = '';
|
||||
}
|
||||
}
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^ skipping these spaces
|
||||
start = pos;
|
||||
for (; pos < max; pos++) {
|
||||
code = state.src.charCodeAt(pos);
|
||||
if (!isSpace(code) && code !== 0x0A) { break; }
|
||||
}
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^^^^^^ parsing link title
|
||||
res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);
|
||||
if (pos < max && start !== pos && res.ok) {
|
||||
title = res.str;
|
||||
pos = res.pos;
|
||||
|
||||
// [link]( <href> "title" )
|
||||
// ^^ skipping these spaces
|
||||
for (; pos < max; pos++) {
|
||||
code = state.src.charCodeAt(pos);
|
||||
if (!isSpace(code) && code !== 0x0A) { break; }
|
||||
}
|
||||
} else {
|
||||
title = '';
|
||||
}
|
||||
|
||||
if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {
|
||||
// parsing a valid shortcut link failed, fallback to reference
|
||||
parseReference = true;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
|
||||
if (parseReference) {
|
||||
//
|
||||
// Link reference
|
||||
//
|
||||
if (typeof state.env.references === 'undefined') { return false; }
|
||||
|
||||
if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {
|
||||
start = pos + 1;
|
||||
pos = state.md.helpers.parseLinkLabel(state, pos);
|
||||
if (pos >= 0) {
|
||||
label = state.src.slice(start, pos++);
|
||||
} else {
|
||||
pos = labelEnd + 1;
|
||||
}
|
||||
} else {
|
||||
pos = labelEnd + 1;
|
||||
}
|
||||
|
||||
// covers label === '' and label === undefined
|
||||
// (collapsed reference link and shortcut reference link respectively)
|
||||
if (!label) { label = state.src.slice(labelStart, labelEnd); }
|
||||
|
||||
ref = state.env.references[normalizeReference(label)];
|
||||
if (!ref) {
|
||||
state.pos = oldPos;
|
||||
return false;
|
||||
}
|
||||
href = ref.href;
|
||||
title = ref.title;
|
||||
}
|
||||
|
||||
//
|
||||
// We found the end of the link, and know for a fact it's a valid link;
|
||||
// so all that's left to do is to call tokenizer.
|
||||
//
|
||||
if (!silent) {
|
||||
state.pos = labelStart;
|
||||
state.posMax = labelEnd;
|
||||
|
||||
token = state.push('link_open', 'a', 1);
|
||||
token.attrs = attrs = [ [ 'href', href ] ];
|
||||
if (title) {
|
||||
attrs.push([ 'title', title ]);
|
||||
}
|
||||
|
||||
state.md.inline.tokenize(state);
|
||||
|
||||
token = state.push('link_close', 'a', -1);
|
||||
}
|
||||
|
||||
state.pos = pos;
|
||||
state.posMax = max;
|
||||
return true;
|
||||
};
|
42
node_modules/markdown-it/lib/rules_inline/newline.js
generated
vendored
Normal file
42
node_modules/markdown-it/lib/rules_inline/newline.js
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
// Proceess '\n'
|
||||
|
||||
'use strict';
|
||||
|
||||
var isSpace = require('../common/utils').isSpace;
|
||||
|
||||
|
||||
module.exports = function newline(state, silent) {
|
||||
var pmax, max, pos = state.pos;
|
||||
|
||||
if (state.src.charCodeAt(pos) !== 0x0A/* \n */) { return false; }
|
||||
|
||||
pmax = state.pending.length - 1;
|
||||
max = state.posMax;
|
||||
|
||||
// ' \n' -> hardbreak
|
||||
// Lookup in pending chars is bad practice! Don't copy to other rules!
|
||||
// Pending string is stored in concat mode, indexed lookups will cause
|
||||
// convertion to flat mode.
|
||||
if (!silent) {
|
||||
if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {
|
||||
if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {
|
||||
state.pending = state.pending.replace(/ +$/, '');
|
||||
state.push('hardbreak', 'br', 0);
|
||||
} else {
|
||||
state.pending = state.pending.slice(0, -1);
|
||||
state.push('softbreak', 'br', 0);
|
||||
}
|
||||
|
||||
} else {
|
||||
state.push('softbreak', 'br', 0);
|
||||
}
|
||||
}
|
||||
|
||||
pos++;
|
||||
|
||||
// skip heading spaces for next line
|
||||
while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }
|
||||
|
||||
state.pos = pos;
|
||||
return true;
|
||||
};
|
130
node_modules/markdown-it/lib/rules_inline/state_inline.js
generated
vendored
Normal file
130
node_modules/markdown-it/lib/rules_inline/state_inline.js
generated
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
// Inline parser state
|
||||
|
||||
'use strict';
|
||||
|
||||
|
||||
var Token = require('../token');
|
||||
var isWhiteSpace = require('../common/utils').isWhiteSpace;
|
||||
var isPunctChar = require('../common/utils').isPunctChar;
|
||||
var isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;
|
||||
|
||||
|
||||
function StateInline(src, md, env, outTokens) {
|
||||
this.src = src;
|
||||
this.env = env;
|
||||
this.md = md;
|
||||
this.tokens = outTokens;
|
||||
|
||||
this.pos = 0;
|
||||
this.posMax = this.src.length;
|
||||
this.level = 0;
|
||||
this.pending = '';
|
||||
this.pendingLevel = 0;
|
||||
|
||||
this.cache = {}; // Stores { start: end } pairs. Useful for backtrack
|
||||
// optimization of pairs parse (emphasis, strikes).
|
||||
|
||||
this.delimiters = []; // Emphasis-like delimiters
|
||||
}
|
||||
|
||||
|
||||
// Flush pending text
|
||||
//
|
||||
StateInline.prototype.pushPending = function () {
|
||||
var token = new Token('text', '', 0);
|
||||
token.content = this.pending;
|
||||
token.level = this.pendingLevel;
|
||||
this.tokens.push(token);
|
||||
this.pending = '';
|
||||
return token;
|
||||
};
|
||||
|
||||
|
||||
// Push new token to "stream".
|
||||
// If pending text exists - flush it as text token
|
||||
//
|
||||
StateInline.prototype.push = function (type, tag, nesting) {
|
||||
if (this.pending) {
|
||||
this.pushPending();
|
||||
}
|
||||
|
||||
var token = new Token(type, tag, nesting);
|
||||
|
||||
if (nesting < 0) { this.level--; }
|
||||
token.level = this.level;
|
||||
if (nesting > 0) { this.level++; }
|
||||
|
||||
this.pendingLevel = this.level;
|
||||
this.tokens.push(token);
|
||||
return token;
|
||||
};
|
||||
|
||||
|
||||
// Scan a sequence of emphasis-like markers, and determine whether
|
||||
// it can start an emphasis sequence or end an emphasis sequence.
|
||||
//
|
||||
// - start - position to scan from (it should point at a valid marker);
|
||||
// - canSplitWord - determine if these markers can be found inside a word
|
||||
//
|
||||
StateInline.prototype.scanDelims = function (start, canSplitWord) {
|
||||
var pos = start, lastChar, nextChar, count, can_open, can_close,
|
||||
isLastWhiteSpace, isLastPunctChar,
|
||||
isNextWhiteSpace, isNextPunctChar,
|
||||
left_flanking = true,
|
||||
right_flanking = true,
|
||||
max = this.posMax,
|
||||
marker = this.src.charCodeAt(start);
|
||||
|
||||
// treat beginning of the line as a whitespace
|
||||
lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;
|
||||
|
||||
while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }
|
||||
|
||||
count = pos - start;
|
||||
|
||||
// treat end of the line as a whitespace
|
||||
nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;
|
||||
|
||||
isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));
|
||||
isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));
|
||||
|
||||
isLastWhiteSpace = isWhiteSpace(lastChar);
|
||||
isNextWhiteSpace = isWhiteSpace(nextChar);
|
||||
|
||||
if (isNextWhiteSpace) {
|
||||
left_flanking = false;
|
||||
} else if (isNextPunctChar) {
|
||||
if (!(isLastWhiteSpace || isLastPunctChar)) {
|
||||
left_flanking = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (isLastWhiteSpace) {
|
||||
right_flanking = false;
|
||||
} else if (isLastPunctChar) {
|
||||
if (!(isNextWhiteSpace || isNextPunctChar)) {
|
||||
right_flanking = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!canSplitWord) {
|
||||
can_open = left_flanking && (!right_flanking || isLastPunctChar);
|
||||
can_close = right_flanking && (!left_flanking || isNextPunctChar);
|
||||
} else {
|
||||
can_open = left_flanking;
|
||||
can_close = right_flanking;
|
||||
}
|
||||
|
||||
return {
|
||||
can_open: can_open,
|
||||
can_close: can_close,
|
||||
length: count
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
// re-export Token class to use in block rules
|
||||
StateInline.prototype.Token = Token;
|
||||
|
||||
|
||||
module.exports = StateInline;
|
117
node_modules/markdown-it/lib/rules_inline/strikethrough.js
generated
vendored
Normal file
117
node_modules/markdown-it/lib/rules_inline/strikethrough.js
generated
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
// ~~strike through~~
|
||||
//
|
||||
'use strict';
|
||||
|
||||
|
||||
// Insert each marker as a separate text token, and add it to delimiter list
|
||||
//
|
||||
module.exports.tokenize = function strikethrough(state, silent) {
|
||||
var i, scanned, token, len, ch,
|
||||
start = state.pos,
|
||||
marker = state.src.charCodeAt(start);
|
||||
|
||||
if (silent) { return false; }
|
||||
|
||||
if (marker !== 0x7E/* ~ */) { return false; }
|
||||
|
||||
scanned = state.scanDelims(state.pos, true);
|
||||
len = scanned.length;
|
||||
ch = String.fromCharCode(marker);
|
||||
|
||||
if (len < 2) { return false; }
|
||||
|
||||
if (len % 2) {
|
||||
token = state.push('text', '', 0);
|
||||
token.content = ch;
|
||||
len--;
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i += 2) {
|
||||
token = state.push('text', '', 0);
|
||||
token.content = ch + ch;
|
||||
|
||||
state.delimiters.push({
|
||||
marker: marker,
|
||||
jump: i,
|
||||
token: state.tokens.length - 1,
|
||||
level: state.level,
|
||||
end: -1,
|
||||
open: scanned.can_open,
|
||||
close: scanned.can_close
|
||||
});
|
||||
}
|
||||
|
||||
state.pos += scanned.length;
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
// Walk through delimiter list and replace text tokens with tags
|
||||
//
|
||||
module.exports.postProcess = function strikethrough(state) {
|
||||
var i, j,
|
||||
startDelim,
|
||||
endDelim,
|
||||
token,
|
||||
loneMarkers = [],
|
||||
delimiters = state.delimiters,
|
||||
max = state.delimiters.length;
|
||||
|
||||
for (i = 0; i < max; i++) {
|
||||
startDelim = delimiters[i];
|
||||
|
||||
if (startDelim.marker !== 0x7E/* ~ */) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (startDelim.end === -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
endDelim = delimiters[startDelim.end];
|
||||
|
||||
token = state.tokens[startDelim.token];
|
||||
token.type = 's_open';
|
||||
token.tag = 's';
|
||||
token.nesting = 1;
|
||||
token.markup = '~~';
|
||||
token.content = '';
|
||||
|
||||
token = state.tokens[endDelim.token];
|
||||
token.type = 's_close';
|
||||
token.tag = 's';
|
||||
token.nesting = -1;
|
||||
token.markup = '~~';
|
||||
token.content = '';
|
||||
|
||||
if (state.tokens[endDelim.token - 1].type === 'text' &&
|
||||
state.tokens[endDelim.token - 1].content === '~') {
|
||||
|
||||
loneMarkers.push(endDelim.token - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// If a marker sequence has an odd number of characters, it's splitted
|
||||
// like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the
|
||||
// start of the sequence.
|
||||
//
|
||||
// So, we have to move all those markers after subsequent s_close tags.
|
||||
//
|
||||
while (loneMarkers.length) {
|
||||
i = loneMarkers.pop();
|
||||
j = i + 1;
|
||||
|
||||
while (j < state.tokens.length && state.tokens[j].type === 's_close') {
|
||||
j++;
|
||||
}
|
||||
|
||||
j--;
|
||||
|
||||
if (i !== j) {
|
||||
token = state.tokens[j];
|
||||
state.tokens[j] = state.tokens[i];
|
||||
state.tokens[i] = token;
|
||||
}
|
||||
}
|
||||
};
|
89
node_modules/markdown-it/lib/rules_inline/text.js
generated
vendored
Normal file
89
node_modules/markdown-it/lib/rules_inline/text.js
generated
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
// Skip text characters for text token, place those to pending buffer
|
||||
// and increment current pos
|
||||
|
||||
'use strict';
|
||||
|
||||
|
||||
// Rule to skip pure text
|
||||
// '{}$%@~+=:' reserved for extentions
|
||||
|
||||
// !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~
|
||||
|
||||
// !!!! Don't confuse with "Markdown ASCII Punctuation" chars
|
||||
// http://spec.commonmark.org/0.15/#ascii-punctuation-character
|
||||
function isTerminatorChar(ch) {
|
||||
switch (ch) {
|
||||
case 0x0A/* \n */:
|
||||
case 0x21/* ! */:
|
||||
case 0x23/* # */:
|
||||
case 0x24/* $ */:
|
||||
case 0x25/* % */:
|
||||
case 0x26/* & */:
|
||||
case 0x2A/* * */:
|
||||
case 0x2B/* + */:
|
||||
case 0x2D/* - */:
|
||||
case 0x3A/* : */:
|
||||
case 0x3C/* < */:
|
||||
case 0x3D/* = */:
|
||||
case 0x3E/* > */:
|
||||
case 0x40/* @ */:
|
||||
case 0x5B/* [ */:
|
||||
case 0x5C/* \ */:
|
||||
case 0x5D/* ] */:
|
||||
case 0x5E/* ^ */:
|
||||
case 0x5F/* _ */:
|
||||
case 0x60/* ` */:
|
||||
case 0x7B/* { */:
|
||||
case 0x7D/* } */:
|
||||
case 0x7E/* ~ */:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = function text(state, silent) {
|
||||
var pos = state.pos;
|
||||
|
||||
while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {
|
||||
pos++;
|
||||
}
|
||||
|
||||
if (pos === state.pos) { return false; }
|
||||
|
||||
if (!silent) { state.pending += state.src.slice(state.pos, pos); }
|
||||
|
||||
state.pos = pos;
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
// Alternative implementation, for memory.
|
||||
//
|
||||
// It costs 10% of performance, but allows extend terminators list, if place it
|
||||
// to `ParcerInline` property. Probably, will switch to it sometime, such
|
||||
// flexibility required.
|
||||
|
||||
/*
|
||||
var TERMINATOR_RE = /[\n!#$%&*+\-:<=>@[\\\]^_`{}~]/;
|
||||
|
||||
module.exports = function text(state, silent) {
|
||||
var pos = state.pos,
|
||||
idx = state.src.slice(pos).search(TERMINATOR_RE);
|
||||
|
||||
// first char is terminator -> empty text
|
||||
if (idx === 0) { return false; }
|
||||
|
||||
// no terminator -> text till end of string
|
||||
if (idx < 0) {
|
||||
if (!silent) { state.pending += state.src.slice(pos); }
|
||||
state.pos = state.src.length;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!silent) { state.pending += state.src.slice(pos, pos + idx); }
|
||||
|
||||
state.pos += idx;
|
||||
|
||||
return true;
|
||||
};*/
|
33
node_modules/markdown-it/lib/rules_inline/text_collapse.js
generated
vendored
Normal file
33
node_modules/markdown-it/lib/rules_inline/text_collapse.js
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
// Merge adjacent text nodes into one, and re-calculate all token levels
|
||||
//
|
||||
'use strict';
|
||||
|
||||
|
||||
module.exports = function text_collapse(state) {
|
||||
var curr, last,
|
||||
level = 0,
|
||||
tokens = state.tokens,
|
||||
max = state.tokens.length;
|
||||
|
||||
for (curr = last = 0; curr < max; curr++) {
|
||||
// re-calculate levels
|
||||
level += tokens[curr].nesting;
|
||||
tokens[curr].level = level;
|
||||
|
||||
if (tokens[curr].type === 'text' &&
|
||||
curr + 1 < max &&
|
||||
tokens[curr + 1].type === 'text') {
|
||||
|
||||
// collapse two adjacent text nodes
|
||||
tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;
|
||||
} else {
|
||||
if (curr !== last) { tokens[last] = tokens[curr]; }
|
||||
|
||||
last++;
|
||||
}
|
||||
}
|
||||
|
||||
if (curr !== last) {
|
||||
tokens.length = last;
|
||||
}
|
||||
};
|
Reference in New Issue
Block a user