100 lines
2.4 KiB
TypeScript
100 lines
2.4 KiB
TypeScript
|
|
import { Block, Tokens, Spec, Line } from './primitives.js';
|
||
|
|
|
||
|
|
export function isSpace(source: string): boolean {
|
||
|
|
return /^\s+$/.test(source);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function hasCR(source: string): boolean {
|
||
|
|
return /\r$/.test(source);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function splitCR(source: string): [string, string] {
|
||
|
|
const matches = source.match(/\r+$/);
|
||
|
|
return matches == null
|
||
|
|
? ['', source]
|
||
|
|
: [source.slice(-matches[0].length), source.slice(0, -matches[0].length)];
|
||
|
|
}
|
||
|
|
|
||
|
|
export function splitSpace(source: string): [string, string] {
|
||
|
|
const matches = source.match(/^\s+/);
|
||
|
|
return matches == null
|
||
|
|
? ['', source]
|
||
|
|
: [source.slice(0, matches[0].length), source.slice(matches[0].length)];
|
||
|
|
}
|
||
|
|
|
||
|
|
export function splitLines(source: string): string[] {
|
||
|
|
return source.split(/\n/);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function seedBlock(block: Partial<Block> = {}): Block {
|
||
|
|
return {
|
||
|
|
description: '',
|
||
|
|
tags: [],
|
||
|
|
source: [],
|
||
|
|
problems: [],
|
||
|
|
...block,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function seedSpec(spec: Partial<Spec> = {}): Spec {
|
||
|
|
return {
|
||
|
|
tag: '',
|
||
|
|
name: '',
|
||
|
|
type: '',
|
||
|
|
optional: false,
|
||
|
|
description: '',
|
||
|
|
problems: [],
|
||
|
|
source: [],
|
||
|
|
...spec,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function seedTokens(tokens: Partial<Tokens> = {}): Tokens {
|
||
|
|
return {
|
||
|
|
start: '',
|
||
|
|
delimiter: '',
|
||
|
|
postDelimiter: '',
|
||
|
|
tag: '',
|
||
|
|
postTag: '',
|
||
|
|
name: '',
|
||
|
|
postName: '',
|
||
|
|
type: '',
|
||
|
|
postType: '',
|
||
|
|
description: '',
|
||
|
|
end: '',
|
||
|
|
lineEnd: '',
|
||
|
|
...tokens,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Assures Block.tags[].source contains references to the Block.source items,
|
||
|
|
* using Block.source as a source of truth. This is a counterpart of rewireSpecs
|
||
|
|
* @param block parsed coments block
|
||
|
|
*/
|
||
|
|
export function rewireSource(block: Block): Block {
|
||
|
|
const source = block.source.reduce(
|
||
|
|
(acc, line) => acc.set(line.number, line),
|
||
|
|
new Map<number, Line>()
|
||
|
|
);
|
||
|
|
for (const spec of block.tags) {
|
||
|
|
spec.source = spec.source.map((line) => source.get(line.number));
|
||
|
|
}
|
||
|
|
return block;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Assures Block.source contains references to the Block.tags[].source items,
|
||
|
|
* using Block.tags[].source as a source of truth. This is a counterpart of rewireSource
|
||
|
|
* @param block parsed coments block
|
||
|
|
*/
|
||
|
|
export function rewireSpecs(block: Block): Block {
|
||
|
|
const source = block.tags.reduce(
|
||
|
|
(acc, spec) =>
|
||
|
|
spec.source.reduce((acc, line) => acc.set(line.number, line), acc),
|
||
|
|
new Map<number, Line>()
|
||
|
|
);
|
||
|
|
block.source = block.source.map((line) => source.get(line.number) || line);
|
||
|
|
return block;
|
||
|
|
}
|