| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /**
- * @import {Chunk, Code, Encoding, Value} from 'micromark-util-types'
- */
- /**
- * @callback Preprocessor
- * Preprocess a value.
- * @param {Value} value
- * Value.
- * @param {Encoding | null | undefined} [encoding]
- * Encoding when `value` is a typed array (optional).
- * @param {boolean | null | undefined} [end=false]
- * Whether this is the last chunk (default: `false`).
- * @returns {Array<Chunk>}
- * Chunks.
- */
- const search = /[\0\t\n\r]/g;
- /**
- * @returns {Preprocessor}
- * Preprocess a value.
- */
- export function preprocess() {
- let column = 1;
- let buffer = '';
- /** @type {boolean | undefined} */
- let start = true;
- /** @type {boolean | undefined} */
- let atCarriageReturn;
- return preprocessor;
- /** @type {Preprocessor} */
- // eslint-disable-next-line complexity
- function preprocessor(value, encoding, end) {
- /** @type {Array<Chunk>} */
- const chunks = [];
- /** @type {RegExpMatchArray | null} */
- let match;
- /** @type {number} */
- let next;
- /** @type {number} */
- let startPosition;
- /** @type {number} */
- let endPosition;
- /** @type {Code} */
- let code;
- value = buffer + (typeof value === 'string' ? value.toString() : new TextDecoder(encoding || undefined).decode(value));
- startPosition = 0;
- buffer = '';
- if (start) {
- // To do: `markdown-rs` actually parses BOMs (byte order mark).
- if (value.charCodeAt(0) === 65279) {
- startPosition++;
- }
- start = undefined;
- }
- while (startPosition < value.length) {
- search.lastIndex = startPosition;
- match = search.exec(value);
- endPosition = match && match.index !== undefined ? match.index : value.length;
- code = value.charCodeAt(endPosition);
- if (!match) {
- buffer = value.slice(startPosition);
- break;
- }
- if (code === 10 && startPosition === endPosition && atCarriageReturn) {
- chunks.push(-3);
- atCarriageReturn = undefined;
- } else {
- if (atCarriageReturn) {
- chunks.push(-5);
- atCarriageReturn = undefined;
- }
- if (startPosition < endPosition) {
- chunks.push(value.slice(startPosition, endPosition));
- column += endPosition - startPosition;
- }
- switch (code) {
- case 0:
- {
- chunks.push(65533);
- column++;
- break;
- }
- case 9:
- {
- next = Math.ceil(column / 4) * 4;
- chunks.push(-2);
- while (column++ < next) chunks.push(-1);
- break;
- }
- case 10:
- {
- chunks.push(-4);
- column = 1;
- break;
- }
- default:
- {
- atCarriageReturn = true;
- column = 1;
- }
- }
- }
- startPosition = endPosition + 1;
- }
- if (end) {
- if (atCarriageReturn) chunks.push(-5);
- if (buffer) chunks.push(buffer);
- chunks.push(null);
- }
- return chunks;
- }
- }
|