공개 마크다운 블록 파서 분리

This commit is contained in:
2026-07-24 15:31:55 +09:00
parent 5f6d950721
commit c833d47a2c
8 changed files with 553 additions and 451 deletions

View File

@@ -0,0 +1,87 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import {
BLANK_PARAGRAPH_MARKER,
isMarkdownBlockStart,
parseMarkdownBlocks
} from '../lib/markdown-block-parser.js'
test('기본 마크다운 행을 렌더링 블록으로 변환한다', () => {
const blocks = parseMarkdownBlocks([
'# 제목',
'',
'본문 ',
BLANK_PARAGRAPH_MARKER,
'---'
].join('\n'))
assert.deepEqual(blocks.map((block) => block.type), ['heading', 'spacer', 'paragraph', 'spacer', 'divider'])
assert.equal(blocks[0].text, '제목')
assert.equal(blocks[0].level, 1)
assert.equal(blocks[2].text, '본문')
assert.equal(blocks[3].meta.legacy, true)
})
test('fenced 블록을 타입별 메타와 원본 줄 범위로 변환한다', () => {
const blocks = parseMarkdownBlocks([
':::gallery',
'![](/uploads/a.webp "A"){size=235}',
'![](/uploads/b.webp)',
':::',
':::callout bg=red emoji=none',
'주의',
':::',
':::toggle open 자세히',
'내용',
':::'
].join('\n'))
assert.deepEqual(blocks.map((block) => block.type), ['gallery', 'callout', 'toggle'])
assert.equal(blocks[0].images.length, 2)
assert.equal(blocks[0].images[0].pixelWidth, 235)
assert.deepEqual(
{
startLine: blocks[0].meta.startLine,
endLine: blocks[0].meta.endLine
},
{ startLine: 0, endLine: 3 }
)
assert.equal(blocks[1].calloutBackground, 'red')
assert.equal(blocks[1].calloutEmojiEnabled, false)
assert.equal(blocks[2].title, '자세히')
assert.equal(blocks[2].defaultOpen, true)
})
test('인용·목록·코드·표 블록을 변환한다', () => {
const blocks = parseMarkdownBlocks([
'> [!bg=blue]',
'> 인용',
'- 하나',
'- 둘',
'1. 첫째',
'3. 셋째',
'```js line-numbers',
'const value = 1',
'```',
'| A | B |',
'| --- | ---: |',
'| a | b |'
].join('\n'))
assert.deepEqual(blocks.map((block) => block.type), ['quote', 'list', 'list', 'code', 'table'])
assert.equal(blocks[0].quoteBackground, 'blue')
assert.equal(blocks[0].text, '인용')
assert.deepEqual(blocks[1].text, ['하나', '둘'])
assert.equal(blocks[2].ordered, true)
assert.deepEqual(blocks[2].listNumbers, [1, 3])
assert.equal(blocks[3].codeLanguage, 'js')
assert.equal(blocks[3].codeShowLineNumbers, true)
assert.deepEqual(blocks[4].meta.alignments, ['left', 'right'])
})
test('블록 시작 줄을 판별한다', () => {
assert.equal(isMarkdownBlockStart(':::gallery'), true)
assert.equal(isMarkdownBlockStart('```html'), true)
assert.equal(isMarkdownBlockStart('![](/a.webp)'), true)
assert.equal(isMarkdownBlockStart('일반 문단'), false)
})