@awesome-fe/translate
Version:
Translation utils
368 lines • 11.8 kB
JavaScript
;
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