import assert from 'node:assert/strict' import test from 'node:test' import { createCalloutOptionsReplacementPlan, createCodeOptionsReplacementPlan, createEmbedUrlReplacementPlan, createGalleryImageMovePlan, createGalleryImagesAppendPlan, createLiveInlineColorValue, createMediaImageRemovePlan, createMediaImagesReplacementPlan, createMediaImageUpdatePlan, createMediaUseAltPatch, createQuoteBackgroundValue, createSourceInlineColorValue, createToggleOptionsReplacementPlan } from '../lib/markdown-editor-block-options.js' const imageBlock = { kind: 'image', startLine: 2, endLine: 2, images: [{ url: '/uploads/one.png', caption: '', useAlt: false, width: 'regular', pixelWidth: null }] } const galleryBlock = { kind: 'gallery', startLine: 1, endLine: 4, images: [ { url: '/uploads/one.png', caption: '', useAlt: false, width: 'regular', pixelWidth: null }, { url: '/uploads/two.png', caption: '둘', useAlt: true, width: 'regular', pixelWidth: 235 } ] } test('단일 이미지와 갤러리 이미지 목록 교체 계획을 만든다', () => { assert.deepEqual(createMediaImagesReplacementPlan(imageBlock, []), { startLine: 2, endLine: 2, replacementLines: [] }) assert.deepEqual(createMediaImagesReplacementPlan(galleryBlock, galleryBlock.images), { startLine: 1, endLine: 4, replacementLines: [ ':::gallery', '![](/uploads/one.png)', '![](/uploads/two.png "둘"){size=235}', ':::' ] }) }) test('미디어 이미지 수정과 삭제 계획을 만든다', () => { assert.deepEqual(createMediaImageUpdatePlan(imageBlock, 0, { caption: '캡션', useAlt: true }), { startLine: 2, endLine: 2, replacementLines: ['![](/uploads/one.png "캡션")'] }) assert.deepEqual(createMediaImageRemovePlan(galleryBlock, 1), { startLine: 1, endLine: 4, replacementLines: [ ':::gallery', '![](/uploads/one.png)', ':::' ] }) }) test('파일명 캡션 사용 patch를 만든다', () => { assert.deepEqual(createMediaUseAltPatch({ url: '/uploads/posts/2026/07/sample-car.png', caption: '', legacyBracketLabel: '' }, true), { useAlt: true, caption: 'sample-car.png' }) assert.deepEqual(createMediaUseAltPatch({ url: '/uploads/posts/2026/07/sample-car.png', caption: 'sample-car.png', legacyBracketLabel: '' }, false), { useAlt: false, caption: '' }) }) test('갤러리 이미지 이동과 추가 계획을 만든다', () => { assert.equal(createGalleryImageMovePlan(galleryBlock, 0, -1), null) assert.deepEqual(createGalleryImageMovePlan(galleryBlock, 0, 1), { startLine: 1, endLine: 4, replacementLines: [ ':::gallery', '![](/uploads/two.png "둘"){size=235}', '![](/uploads/one.png)', ':::' ] }) assert.deepEqual(createGalleryImagesAppendPlan(galleryBlock, [{ url: '/uploads/three.png' }]), { startLine: 1, endLine: 4, replacementLines: [ ':::gallery', '![](/uploads/one.png)', '![](/uploads/two.png "둘"){size=235}', '![](/uploads/three.png)', ':::' ] }) }) test('임베드 블록 값 교체 계획을 만든다', () => { const block = { kind: 'iframe', startLine: 3, endLine: 5 } assert.deepEqual(createEmbedUrlReplacementPlan(block, ' https://example.com '), { startLine: 3, endLine: 5, replacementLines: [':::iframe', 'https://example.com', ':::'] }) assert.deepEqual(createEmbedUrlReplacementPlan(block, ' '), { startLine: 3, endLine: 5, replacementLines: [] }) }) test('인용 배경색은 옵션 줄을 삽입하거나 교체한다', () => { assert.equal(createQuoteBackgroundValue({ value: '> 인용', block: { kind: 'quote', startLine: 0, endLine: 0, hasQuoteOptions: false }, background: 'blue' }), '> [!bg=blue]\n> 인용') assert.equal(createQuoteBackgroundValue({ value: '> [!bg=gray]\n> 인용', block: { kind: 'quote', startLine: 0, endLine: 1, hasQuoteOptions: true }, background: 'purple' }), '> [!bg=purple]\n> 인용') }) test('콜아웃·코드·토글 선언 줄 교체 계획을 만든다', () => { assert.deepEqual(createCalloutOptionsReplacementPlan({ kind: 'callout', startLine: 1, endLine: 3, calloutEmojiEnabled: false, calloutEmoji: '💡', calloutBackground: 'gray', title: '기존' }, { calloutEmojiEnabled: true, calloutBackground: 'blue', title: '주의' }), { startLine: 1, endLine: 3, replacementLines: [':::callout emoji=💡 bg=blue title=주의'] }) assert.deepEqual(createCodeOptionsReplacementPlan({ kind: 'code', startLine: 5, endLine: 7, language: 'javascript', showLineNumbers: false }, { showLineNumbers: true }), { startLine: 5, endLine: 7, replacementLines: ['```javascript line-numbers'] }) assert.deepEqual(createToggleOptionsReplacementPlan({ kind: 'toggle', startLine: 9, endLine: 11, title: '더 보기', defaultOpen: false }, { defaultOpen: true }), { startLine: 9, endLine: 11, replacementLines: [':::toggle open 더 보기'] }) }) test('소스와 라이브 인라인 색상 적용 결과를 만든다', () => { assert.deepEqual(createSourceInlineColorValue({ value: 'hello world', context: { kind: 'inline-color', mode: 'source', start: 6, end: 11 }, color: 'red' }), { value: 'hello ::red[world]', selectionStart: 18, selectionEnd: 18 }) assert.deepEqual(createLiveInlineColorValue({ value: '- 안녕하세요', context: { kind: 'inline-color', mode: 'live', sourceLine: 0, bodyText: '안녕하세요', startOffset: 0, endOffset: 2 }, color: 'blue' }), { value: '- ::blue[안녕]하세요', focusLine: 0, focusOffset: 2 }) })