116 lines
2.8 KiB
TypeScript
116 lines
2.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { extractMarkdownTable, splitMarkdownRow } from './markdownTable'
|
|
|
|
describe('splitMarkdownRow', () => {
|
|
it('keeps pipes inside code spans and escaped pipes inside cells', () => {
|
|
expect(splitMarkdownRow('| A | `x | y` | left \\| right |')).toEqual([
|
|
'A',
|
|
'`x | y`',
|
|
'left \\| right',
|
|
])
|
|
})
|
|
|
|
it('matches arbitrary backtick fence lengths and ignores escaped backticks', () => {
|
|
expect(splitMarkdownRow('| ``x | y`` | escaped \\` tick |')).toEqual([
|
|
'``x | y``',
|
|
'escaped \\` tick',
|
|
])
|
|
})
|
|
|
|
it('treats an unmatched backtick as literal text', () => {
|
|
expect(splitMarkdownRow('| A | unmatched `code | B |')).toEqual([
|
|
'A',
|
|
'unmatched `code',
|
|
'B',
|
|
])
|
|
})
|
|
})
|
|
|
|
describe('extractMarkdownTable', () => {
|
|
it('finds a table and gathers its contiguous body rows', () => {
|
|
const lines = [
|
|
'intro',
|
|
'| A | B |',
|
|
'| --- | :---: |',
|
|
'| 1 | 2 |',
|
|
'',
|
|
]
|
|
|
|
expect(extractMarkdownTable(lines)).toEqual({
|
|
start: 1,
|
|
end: 3,
|
|
header: ['A', 'B'],
|
|
rows: [['1', '2']],
|
|
})
|
|
})
|
|
|
|
it.each([
|
|
['backtick', ['```markdown', '| Fake | Table |', '| --- | --- |', '```']],
|
|
['tilde', ['~~~~', '| Fake | Table |', '| --- | --- |', '~~~~']],
|
|
])('skips pseudo-tables inside %s fenced code', (_marker, fencedLines) => {
|
|
const lines = [
|
|
...fencedLines,
|
|
'',
|
|
'| Real | Table |',
|
|
'| --- | --- |',
|
|
'| 1 | 2 |',
|
|
]
|
|
const realTableStart = fencedLines.length + 1
|
|
|
|
expect(extractMarkdownTable(lines)).toEqual({
|
|
start: realTableStart,
|
|
end: realTableStart + 2,
|
|
header: ['Real', 'Table'],
|
|
rows: [['1', '2']],
|
|
})
|
|
})
|
|
|
|
it.each([
|
|
['four spaces', ' '],
|
|
['a tab', '\t'],
|
|
])('skips pseudo-tables indented with %s', (_indentation, indent) => {
|
|
const lines = [
|
|
`${indent}| Fake | Table |`,
|
|
`${indent}| --- | --- |`,
|
|
`${indent}| 0 | 0 |`,
|
|
'',
|
|
'| Real | Table |',
|
|
'| --- | --- |',
|
|
'| 1 | 2 |',
|
|
]
|
|
|
|
expect(extractMarkdownTable(lines)).toEqual({
|
|
start: 4,
|
|
end: 6,
|
|
header: ['Real', 'Table'],
|
|
rows: [['1', '2']],
|
|
})
|
|
})
|
|
|
|
it('starts its table search at fromIndex', () => {
|
|
const lines = [
|
|
'| First | Table |',
|
|
'| --- | --- |',
|
|
'| 1 | 1 |',
|
|
'',
|
|
'| Second | Table |',
|
|
'| --- | --- |',
|
|
'| 2 | 2 |',
|
|
]
|
|
|
|
expect(extractMarkdownTable(lines, 4)).toEqual({
|
|
start: 4,
|
|
end: 6,
|
|
header: ['Second', 'Table'],
|
|
rows: [['2', '2']],
|
|
})
|
|
})
|
|
|
|
it('returns null when no valid table exists', () => {
|
|
expect(extractMarkdownTable(['plain text'])).toBeNull()
|
|
expect(
|
|
extractMarkdownTable(['| A | B |', '| -- | not-a-divider |']),
|
|
).toBeNull()
|
|
})
|
|
})
|