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 }