|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import { Markers } from '../primitives.js';
- import { seedTokens, splitSpace, splitCR } from '../util.js';
- export default function getParser({ startLine = 0, } = {}) {
- let block = null;
- let num = startLine;
- return function parseSource(source) {
- let rest = source;
- const tokens = seedTokens();
- [tokens.lineEnd, rest] = splitCR(rest);
- [tokens.start, rest] = splitSpace(rest);
- if (block === null &&
- rest.startsWith(Markers.start) &&
- !rest.startsWith(Markers.nostart)) {
- block = [];
- tokens.delimiter = rest.slice(0, Markers.start.length);
- rest = rest.slice(Markers.start.length);
- [tokens.postDelimiter, rest] = splitSpace(rest);
- }
- if (block === null) {
- num++;
- return null;
- }
- const isClosed = rest.trimRight().endsWith(Markers.end);
- if (tokens.delimiter === '' &&
- rest.startsWith(Markers.delim) &&
- !rest.startsWith(Markers.end)) {
- tokens.delimiter = Markers.delim;
- rest = rest.slice(Markers.delim.length);
- [tokens.postDelimiter, rest] = splitSpace(rest);
- }
- if (isClosed) {
- const trimmed = rest.trimRight();
- tokens.end = rest.slice(trimmed.length - Markers.end.length);
- rest = trimmed.slice(0, -Markers.end.length);
- }
- tokens.description = rest;
- block.push({ number: num, source, tokens });
- num++;
- if (isClosed) {
- const result = block.slice();
- block = null;
- return result;
- }
- return null;
- };
- }
|