UNPKG

comment-parser

Version:
100 lines (89 loc) 2.47 kB
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; }