| 12345678910111213141516171819202122232425262728293031323334353637 |
- const range: number = 2
- export function generateCodeFrame(
- source: string,
- start: number = 0,
- end: number = source.length
- ): string {
- const lines = source.split(/\r?\n/)
- let count = 0
- const res = []
- for (let i = 0; i < lines.length; i++) {
- count += lines[i].length + 1
- if (count >= start) {
- for (let j = i - range; j <= i + range || end > count; j++) {
- if (j < 0 || j >= lines.length) continue
- res.push(
- `${j + 1}${' '.repeat(3 - String(j + 1).length)}| ${lines[j]}`
- )
- const lineLength = lines[j].length
- if (j === i) {
- // push underline
- const pad = start - (count - lineLength) + 1
- const length = end > count ? lineLength - pad : end - start
- res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length))
- } else if (j > i) {
- if (end > count) {
- const length = Math.min(end - count, lineLength)
- res.push(` | ` + '^'.repeat(length))
- }
- count += lineLength + 1
- }
- }
- break
- }
- }
- return res.join('\n')
- }
|