aboutsummaryrefslogtreecommitdiff
path: root/node_modules/markdown-it/lib/rules_inline
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/markdown-it/lib/rules_inline
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/markdown-it/lib/rules_inline')
-rw-r--r--node_modules/markdown-it/lib/rules_inline/autolink.js72
-rw-r--r--node_modules/markdown-it/lib/rules_inline/backticks.js43
-rw-r--r--node_modules/markdown-it/lib/rules_inline/balance_pairs.js44
-rw-r--r--node_modules/markdown-it/lib/rules_inline/emphasis.js127
-rw-r--r--node_modules/markdown-it/lib/rules_inline/entity.js48
-rw-r--r--node_modules/markdown-it/lib/rules_inline/escape.js52
-rw-r--r--node_modules/markdown-it/lib/rules_inline/html_inline.js47
-rw-r--r--node_modules/markdown-it/lib/rules_inline/image.js152
-rw-r--r--node_modules/markdown-it/lib/rules_inline/link.js150
-rw-r--r--node_modules/markdown-it/lib/rules_inline/newline.js42
-rw-r--r--node_modules/markdown-it/lib/rules_inline/state_inline.js130
-rw-r--r--node_modules/markdown-it/lib/rules_inline/strikethrough.js117
-rw-r--r--node_modules/markdown-it/lib/rules_inline/text.js89
-rw-r--r--node_modules/markdown-it/lib/rules_inline/text_collapse.js33
14 files changed, 1146 insertions, 0 deletions
diff --git a/node_modules/markdown-it/lib/rules_inline/autolink.js b/node_modules/markdown-it/lib/rules_inline/autolink.js
new file mode 100644
index 00000000..1f0c466d
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/autolink.js
@@ -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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/backticks.js b/node_modules/markdown-it/lib/rules_inline/backticks.js
new file mode 100644
index 00000000..0cd1a992
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/backticks.js
@@ -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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/balance_pairs.js b/node_modules/markdown-it/lib/rules_inline/balance_pairs.js
new file mode 100644
index 00000000..f2a52072
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/balance_pairs.js
@@ -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;
+ }
+ }
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/emphasis.js b/node_modules/markdown-it/lib/rules_inline/emphasis.js
new file mode 100644
index 00000000..54549e39
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/emphasis.js
@@ -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--;
+ }
+ }
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/entity.js b/node_modules/markdown-it/lib/rules_inline/entity.js
new file mode 100644
index 00000000..52e7cbaf
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/entity.js
@@ -0,0 +1,48 @@
+// Process html entity - &#123;, &#xAF;, &quot;, ...
+
+'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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/escape.js b/node_modules/markdown-it/lib/rules_inline/escape.js
new file mode 100644
index 00000000..229ead0a
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/escape.js
@@ -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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/html_inline.js b/node_modules/markdown-it/lib/rules_inline/html_inline.js
new file mode 100644
index 00000000..28c79805
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/html_inline.js
@@ -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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/image.js b/node_modules/markdown-it/lib/rules_inline/image.js
new file mode 100644
index 00000000..53edd323
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/image.js
@@ -0,0 +1,152 @@
+// Process ![image](<src> "title")
+
+'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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/link.js b/node_modules/markdown-it/lib/rules_inline/link.js
new file mode 100644
index 00000000..7c9834c0
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/link.js
@@ -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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/newline.js b/node_modules/markdown-it/lib/rules_inline/newline.js
new file mode 100644
index 00000000..14aa42d1
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/newline.js
@@ -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;
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/state_inline.js b/node_modules/markdown-it/lib/rules_inline/state_inline.js
new file mode 100644
index 00000000..2847496c
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/state_inline.js
@@ -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;
diff --git a/node_modules/markdown-it/lib/rules_inline/strikethrough.js b/node_modules/markdown-it/lib/rules_inline/strikethrough.js
new file mode 100644
index 00000000..03472412
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/strikethrough.js
@@ -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;
+ }
+ }
+};
diff --git a/node_modules/markdown-it/lib/rules_inline/text.js b/node_modules/markdown-it/lib/rules_inline/text.js
new file mode 100644
index 00000000..b19591e1
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/text.js
@@ -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;
+};*/
diff --git a/node_modules/markdown-it/lib/rules_inline/text_collapse.js b/node_modules/markdown-it/lib/rules_inline/text_collapse.js
new file mode 100644
index 00000000..3104c0c6
--- /dev/null
+++ b/node_modules/markdown-it/lib/rules_inline/text_collapse.js
@@ -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;
+ }
+};