UNPKG

@awesome-fe/translate

Version:
368 lines 11.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.listTokenizer = void 0; var remove_indent_1 = require("./utils/remove-indent"); var get_indent_1 = require("./utils/get-indent"); var tabSize = 4; var looseListItemExpression = /\n\n(?!\s*$)/; var taskItemExpression = /^\[([ \t]|x|X)][ \t]/; var bulletExpression = /^([ \t]*)([*+-]|\d+[.)])( {1,4}(?! )| |\t|$|(?=\n))([^\n]*)/; var pedanticBulletExpression = /^([ \t]*)([*+-]|\d+[.)])([ \t]+)/; var initialIndentExpression = /^( {1,4}|\t)?/gm; function isDecimal(character) { var code = typeof character === 'string' ? character.charCodeAt(0) : character; return code >= 48 && code <= 57; /* 0-9 */ } function listTokenizer(eat, value, silent) { var _a; var self = this; var commonmark = self.options.commonmark; var pedantic = self.options.pedantic; var tokenizers = self.blockTokenizers; var interuptors = self.interruptList; var index = 0; var length = value.length; var start = null; var size = 0; var queue; var ordered; var character; var marker; var currentMarker; var empty; var item; var spread = false; while (index < length) { character = value.charAt(index); if (character === '\t') { size += tabSize - (size % tabSize); } else if (character === ' ') { size++; } else { break; } index++; } if (size >= tabSize) { return; } character = value.charAt(index); if (character === '*' || character === '+' || character === '-') { marker = character; ordered = false; } else { ordered = true; queue = ''; while (index < length) { character = value.charAt(index); if (!isDecimal(character)) { break; } queue += character; index++; } character = value.charAt(index); if (!queue || !(character === '.' || (commonmark && character === ')'))) { return; } start = parseInt(queue, 10); marker = character; } character = value.charAt(++index); if (character !== ' ' && character !== '\t' && (pedantic || (character !== '\n' && character !== ''))) { return; } if (silent) { return true; } index = 0; var items = []; var allLines = []; var emptyLines = []; while (index < length) { var nextIndex = value.indexOf('\n', index); var startIndex = index; var prefixed = false; var indented = false; if (nextIndex === -1) { nextIndex = length; } var end = index + tabSize; size = 0; while (index < length) { character = value.charAt(index); if (character === '\t') { size += tabSize - (size % tabSize); } else if (character === ' ') { size++; } else { break; } index++; } if (size >= tabSize) { indented = true; } if (item && size >= item.indent) { indented = true; } character = value.charAt(index); currentMarker = null; if (!indented) { if (character === '*' || character === '+' || character === '-') { currentMarker = character; index++; size++; } else { queue = ''; while (index < length) { character = value.charAt(index); if (!isDecimal(character)) { break; } queue += character; index++; } character = value.charAt(index); index++; if (queue && (character === '.' || (commonmark && character === ')'))) { currentMarker = character; size += queue.length + 1; } } if (currentMarker) { character = value.charAt(index); if (character === '\t') { size += tabSize - (size % tabSize); index++; } else if (character === ' ') { end = index + tabSize; while (index < end) { if (value.charAt(index) !== ' ') { break; } index++; size++; } if (index === end && value.charAt(index) === ' ') { index -= tabSize - 1; size -= tabSize - 1; } } else if (character !== '\n' && character !== '') { currentMarker = null; } } } if (currentMarker) { if (!pedantic && marker !== currentMarker) { break; } prefixed = true; } else { if (!commonmark && !indented && value.charAt(startIndex) === ' ') { indented = true; } else if (commonmark && item) { indented = size >= item.indent || size > tabSize; } prefixed = false; index = startIndex; } var line = value.slice(startIndex, nextIndex); var content = startIndex === index ? line : value.slice(index, nextIndex); if (currentMarker === '*' || currentMarker === '_' || currentMarker === '-') { if (tokenizers.thematicBreak.call(self, eat, line, true)) { break; } } var prevEmpty = empty; empty = !prefixed && !((_a = content === null || content === void 0 ? void 0 : content.trim()) === null || _a === void 0 ? void 0 : _a.length); if (indented && item) { item.value = item.value.concat(emptyLines, line); allLines = allLines.concat(emptyLines, line); emptyLines = []; } else if (prefixed) { if (emptyLines.length !== 0) { spread = true; item.value.push(''); item.trail = emptyLines.concat(); } item = { value: [line], indent: size, trail: [], }; items.push(item); allLines = allLines.concat(emptyLines, line); emptyLines = []; } else if (empty) { if (prevEmpty && !commonmark) { break; } emptyLines.push(line); } else { if (prevEmpty) { break; } if (interrupt(interuptors, tokenizers, self, [eat, line, true])) { break; } item.value = item.value.concat(emptyLines, line); allLines = allLines.concat(emptyLines, line); emptyLines = []; } index = nextIndex + 1; } var node = eat(allLines.join('\n')).reset({ type: 'list', ordered: ordered, start: start, spread: spread, children: [], }); var enterTop = self.enterList(); var exitBlockquote = self.enterBlock(); index = -1; length = items.length; while (++index < length) { item = items[index].value.join('\n'); var now = eat.now(); eat(item)(listItem(self, item, now, item.split(' ')[0]), node); item = items[index].trail.join('\n'); if (index !== length - 1) { item += '\n'; } eat(item); } enterTop(); exitBlockquote(); return node; } exports.listTokenizer = listTokenizer; function listItem(ctx, value, position, marker) { var offsets = ctx.offset; var fn = ctx.options.pedantic ? pedanticListItem : normalListItem; var checked = null; var task; var indent; value = fn.call(null, ctx, value, position); if (ctx.options.gfm) { task = value.match(taskItemExpression); if (task) { indent = task[0].length; checked = task[1].toLowerCase() === 'x'; offsets[position.line] += indent; value = value.slice(indent); } } return { type: 'listItem', marker: marker, spread: looseListItemExpression.test(value), checked: checked, children: ctx.tokenizeBlock(value, position), }; } // Create a list-item using overly simple mechanics. function pedanticListItem(ctx, value, position) { var offsets = ctx.offset; var line = position.line; // Remove the list-item’s bullet. value = value.replace(pedanticBulletExpression, replacer); // The initial line was also matched by the below, so we reset the `line`. line = position.line; return value.replace(initialIndentExpression, replacer); // A simple replacer which removed all matches, and adds their length to // `offset`. function replacer($0) { offsets[line] = (offsets[line] || 0) + $0.length; line++; return ''; } } // Create a list-item using sane mechanics. function normalListItem(ctx, value, position) { var offsets = ctx.offset; var line = position.line; var max; var bullet; var rest; var lines; var trimmedLines; var index; var length; // Remove the list-item’s bullet. value = value.replace(bulletExpression, replacer); lines = value.split('\n'); trimmedLines = remove_indent_1.removeIndent(value, get_indent_1.getIndent(max).indent).split('\n'); // We replaced the initial bullet with something else above, which was used // to trick `removeIndentation` into removing some more characters when // possible. However, that could result in the initial line to be stripped // more than it should be. trimmedLines[0] = rest; offsets[line] = (offsets[line] || 0) + bullet.length; line++; index = 0; length = lines.length; while (++index < length) { offsets[line] = (offsets[line] || 0) + lines[index].length - trimmedLines[index].length; line++; } return trimmedLines.join('\n'); function replacer($0, $1, $2, $3, $4) { bullet = $1 + $2 + $3; rest = $4; // Make sure that the first nine numbered list items can indent with an // extra space. That is, when the bullet did not receive an extra final // space. if (Number($2) < 10 && bullet.length % 2 === 1) { $2 = ' ' + $2; } max = $1 + ' '.repeat($2.length) + $3; return max + rest; } } function interrupt(interruptors, tokenizers, ctx, params) { var length = interruptors.length; var index = -1; var interruptor; var config; while (++index < length) { interruptor = interruptors[index]; config = interruptor[1] || {}; if (config.pedantic !== undefined && config.pedantic !== ctx.options.pedantic) { continue; } if (config.commonmark !== undefined && config.commonmark !== ctx.options.commonmark) { continue; } if (tokenizers[interruptor[0]].apply(ctx, params)) { return true; } } return false; } //# sourceMappingURL=list-tokenizer.js.map