comment-parser
Version:
Generic JSDoc-like comment parser
100 lines (89 loc) • 2.47 kB
text/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;
}