| 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; | |
| } |