Terrace/packages/js/src/parser.ts
2023-02-07 13:33:23 -05:00

36 lines
1.3 KiB
TypeScript

export type LineData = {
line: string;
indent: string;
level: number;
offsetHead: number;
offsetTail: number;
}
export function createLineData(line: string = '', indent: string = ' '): LineData {
return { line, indent, level: 0, offsetHead: 0, offsetTail: 0 }
}
export function parseLine(lineData: LineData): LineData {
if ((typeof lineData !== 'object' || !lineData) || typeof lineData.level !== 'number') throw new Error(`'lineData' must be an object with string line and numeric level properties`)
if (typeof lineData.indent !== 'string' || lineData.indent.length === 0 || lineData.indent.length > 1) throw new Error(`'lineData.indent' must be a single-character string`)
if (typeof lineData.line !== 'string') throw new Error(`'lineData.line' must be a string`)
let level = 0
// Repeat previous level for blank lines.
if (!lineData.line.length) {
lineData.level = lineData.level
lineData.offsetHead = 0
lineData.offsetTail = 0
} else {
while (lineData.line[level] === lineData.indent && level <= lineData.level + 1) ++level
lineData.level = level
lineData.offsetHead = level
lineData.offsetTail = level
while (lineData.line[lineData.offsetTail] && lineData.line[lineData.offsetTail] !== ' ') ++lineData.offsetTail
}
return lineData
}