diff --git a/components/admin/AdminBlockEditor.vue b/components/admin/AdminBlockEditor.vue index 3aaadf0..8dab6da 100644 --- a/components/admin/AdminBlockEditor.vue +++ b/components/admin/AdminBlockEditor.vue @@ -183,7 +183,7 @@ const createEditorBlock = (type = 'paragraph', text = '', level = null, id = '', title: options.title || '', width: options.width || 'regular', images: options.images || [], - calloutEmojiEnabled: options.calloutEmojiEnabled ?? true, + calloutEmojiEnabled: options.calloutEmojiEnabled === true, calloutEmoji: options.calloutEmoji || '๐Ÿ’ก', calloutBackground: options.calloutBackground || 'blue' }) @@ -195,7 +195,7 @@ const createEditorBlock = (type = 'paragraph', text = '', level = null, id = '', */ const parseCalloutOptions = (line) => { const options = { - calloutEmojiEnabled: true, + calloutEmojiEnabled: false, calloutEmoji: '๐Ÿ’ก', calloutBackground: 'blue' } diff --git a/components/admin/AdminEditorBlockPanel.vue b/components/admin/AdminEditorBlockPanel.vue index 051edc3..b141f7d 100644 --- a/components/admin/AdminEditorBlockPanel.vue +++ b/components/admin/AdminEditorBlockPanel.vue @@ -138,7 +138,7 @@ const panelMeta = computed(() => { } if (props.panel.kind === 'callout') { - return '์•„์ด์ฝ˜ยท๋ฐฐ๊ฒฝ์ƒ‰' + return '์ œ๋ชฉยท์•„์ด์ฝ˜ยท๋ฐฐ๊ฒฝ์ƒ‰' } if (props.panel.kind === 'code') { @@ -246,6 +246,17 @@ const onPanelFocusOut = (event) => { diff --git a/components/content/ContentMarkdownRenderer.vue b/components/content/ContentMarkdownRenderer.vue index fb666b7..a7c9aee 100644 --- a/components/content/ContentMarkdownRenderer.vue +++ b/components/content/ContentMarkdownRenderer.vue @@ -139,7 +139,7 @@ const createBlock = (type = 'paragraph', text = '', level = null, id = '', optio width: options.width || 'regular', images: options.images || [], meta: options.meta && typeof options.meta === 'object' ? { ...options.meta } : {}, - calloutEmojiEnabled: options.calloutEmojiEnabled ?? true, + calloutEmojiEnabled: options.calloutEmojiEnabled === true, calloutEmoji: options.calloutEmoji || '๐Ÿ’ก', calloutBackground: options.calloutBackground || 'blue', quoteBackground: options.quoteBackground || 'gray', @@ -2642,6 +2642,7 @@ onBeforeUnmount(() => { v-else-if="block.type === 'callout' && interactive" :callout-emoji-enabled="block.calloutEmojiEnabled" :callout-emoji="block.calloutEmoji" + :callout-title="block.title" :callout-background="block.calloutBackground" :block-source-line="block.meta.startLine" :body-source-line="block.meta.startLine + 1" @@ -2656,6 +2657,7 @@ onBeforeUnmount(() => { v-else-if="block.type === 'callout'" :emoji-enabled="block.calloutEmojiEnabled" :emoji="block.calloutEmoji" + :title="block.title" :background="block.calloutBackground" > diff --git a/docs/changelog.md b/docs/changelog.md index eb5c83d..89d9d85 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,11 @@ # ์—…๋ฐ์ดํŠธ ์š”์•ฝ +## v1.5.54 + +- ์ฝœ์•„์›ƒ์„ ์•„์ด์ฝ˜ยท์ œ๋ชฉ ํ—ค๋”์™€ ์•„๋ž˜ ๋ณธ๋ฌธ ๊ตฌ์กฐ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. +- ์ฝœ์•„์›ƒ ์ œ๋ชฉ์„ ์˜ค๋ฅธ์ชฝ ๋ธ”๋ก ์„ค์ • ํŒจ๋„์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. +- ์ƒˆ ์ฝœ์•„์›ƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. + ## v1.5.53 - ๋ผ์ด๋ธŒ ์ฝœ์•„์›ƒ ๋ณธ๋ฌธ์—์„œ ์—ฌ๋Ÿฌ ์ค„์„ `Shift+๋ฐฉํ–ฅํ‚ค`๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. diff --git a/docs/deploy.md b/docs/deploy.md index c9b10fa..a58c17e 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -1,6 +1,6 @@ # ๋ฐฐํฌ ๊ฐ€์ด๋“œ -> ๋กœ์ปฌ ๊ธฐ์ค€ v1.5.53์—์„œ `npm run lint`, `npm run build` ๊ฒ€์ฆ์„ ํ†ต๊ณผํ–ˆ๋‹ค. NAS ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™๊ณผ ๋„๋ฉ”์ธ/ํ”„๋ก์‹œ ์ ‘์† ๊ฒ€์ฆ์€ ์šด์˜ ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ ์ง„ํ–‰ํ•œ๋‹ค. +> ๋กœ์ปฌ ๊ธฐ์ค€ v1.5.54์—์„œ `npm run lint`, `npm run build` ๊ฒ€์ฆ์„ ํ†ต๊ณผํ–ˆ๋‹ค. NAS ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™๊ณผ ๋„๋ฉ”์ธ/ํ”„๋ก์‹œ ์ ‘์† ๊ฒ€์ฆ์€ ์šด์˜ ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ ์ง„ํ–‰ํ•œ๋‹ค. ## ๋นŒ๋“œ ์œ ํ˜• @@ -45,6 +45,13 @@ openssl rand -hex 32 npm run dev ``` +### v1.5.54 ์ฐธ๊ณ  + +- ์ถ”๊ฐ€ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์—†๋‹ค. +- `/์ฝœ์•„์›ƒ` ์‚ฝ์ž… ์‹œ ๊ธฐ๋ณธ ์„ ์–ธ๋ถ€๊ฐ€ `emoji=none`์œผ๋กœ ๋“ค์–ด๊ฐ€๊ณ  ์•„์ด์ฝ˜์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. +- ์˜ค๋ฅธ์ชฝ ๋ธ”๋ก ์„ค์ • ํŒจ๋„์—์„œ ์ฝœ์•„์›ƒ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜๋ฉด ์„ ์–ธ๋ถ€ `title` ์˜ต์…˜๊ณผ ๋ผ์ด๋ธŒยท๊ณต๊ฐœ ๋ Œ๋”๋ง์— ๋ฐ˜์˜๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. +- ์ฝœ์•„์›ƒ ์•„์ด์ฝ˜ ๋˜๋Š” ์ œ๋ชฉ์ด ์žˆ์„ ๋•Œ ํ—ค๋”๊ฐ€ ์™ผ์ชฝ ์ƒ๋‹จ์— ํ‘œ์‹œ๋˜๊ณ  ๋ณธ๋ฌธ์€ ์•„๋ž˜ ์ค„์—์„œ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. + ### v1.5.53 ์ฐธ๊ณ  - ์ถ”๊ฐ€ DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์—†๋‹ค. diff --git a/docs/history.md b/docs/history.md index 8185c4a..bd0d9b4 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,5 +1,9 @@ # ์˜์‚ฌ๊ฒฐ์ • ์ด๋ ฅ +## 2026-06-04 v1.5.54 โ€” ์ฝœ์•„์›ƒ ์ œ๋ชฉ ์˜ต์…˜๊ณผ ๊ธฐ๋ณธ ์•„์ด์ฝ˜ ๋ฏธ์‚ฌ์šฉ + +์ฝœ์•„์›ƒ์€ ๋ณธ๋ฌธ ์‹œ์ž‘ ์ „ ์‹œ๊ฐ ์‹ ํ˜ธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ํŽธ์ด ์—ฌ๋Ÿฌ ์ค„ ๋ณธ๋ฌธ์—์„œ ์ •๋ ฌ์ด ์•ˆ์ •์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒยท๊ณต๊ฐœ ๋ Œ๋”๋ง์„ ์•„์ด์ฝ˜ยท์ œ๋ชฉ ํ—ค๋”์™€ ๋ณธ๋ฌธ ์˜์—ญ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ œ๋ชฉ์€ ๊ธฐ์กด ์ฝœ์•„์›ƒ ์„ ์–ธ๋ถ€์— `title` ์˜ต์…˜์œผ๋กœ ์ €์žฅํ•œ๋‹ค. ์ƒˆ ์ฝœ์•„์›ƒ์€ ๋ณธ๋ฌธ ์ž‘์„ฑ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ ์•„์ด์ฝ˜ ํ‘œ์‹œ๋ฅผ ๋„๊ณ , ํ•„์š”ํ•  ๋•Œ ์˜ค๋ฅธ์ชฝ ๋ธ”๋ก ์„ค์ • ํŒจ๋„์—์„œ ์ผœ๋„๋ก ํ•œ๋‹ค. + ## 2026-06-04 v1.5.47 โ€” RSS ์ธ๋„ค์ผ์€ ํ”ผ๋“œ XML์— ๋ช…์‹œํ•œ๋‹ค ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ธ ํŽ˜์ด์ง€์—๋Š” ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜ `og:image`๊ฐ€ ์žˆ์ง€๋งŒ, RSS ๋ฆฌ๋”๊ฐ€ ๊ฒŒ์‹œ๋ฌผ ๋งํฌ๋ฅผ ๋‹ค์‹œ ํฌ๋กค๋งํ•ด OG ์ด๋ฏธ์ง€๋ฅผ ์ฝ๋Š”์ง€๋Š” ๋ฆฌ๋”๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค. ํ”ผ๋“œ ๊ตฌ๋… ํ™”๋ฉด์—์„œ ์ธ๋„ค์ผ ๋…ธ์ถœ์„ ๋” ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด RSS item์— Media RSS ํ™•์žฅ์ธ `media:thumbnail`๊ณผ `media:content`๋ฅผ ์ง์ ‘ ํฌํ•จํ•œ๋‹ค. ์ €์žฅ๋œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๊ฐ€ ์ƒ๋Œ€ ๊ฒฝ๋กœ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”ผ๋“œ ์ƒ์„ฑ ์‹œ ์‚ฌ์ดํŠธ URL ๊ธฐ์ค€ ์ ˆ๋Œ€ URL๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. diff --git a/docs/map.md b/docs/map.md index e237956..6dde126 100644 --- a/docs/map.md +++ b/docs/map.md @@ -94,7 +94,7 @@ | components/admin/AdminPostForm.vue | ๊ด€๋ฆฌ์ž ๊ธ€ ์ž‘์„ฑ/์ˆ˜์ • ํผ, Ghostํ˜• ํˆด๋ฐ”(์™ผ์ชฝ ์ƒํƒœ ํ…์ŠคํŠธยทPublish/Update/Unpublish/Unschedule, ์„œ๋ฒ„ ๋ฐ˜์˜ ์ƒํƒœ ๊ธฐ์ค€ ๋ถ„๊ธฐ), ์ดˆ์•ˆ๋งŒ ์„œ๋ฒ„ ๋””๋ฐ”์šด์Šค ์ž๋™ ์ €์žฅยท์‹ ๊ทœ ์ž„์‹œ ์Šฌ๋Ÿฌ๊ทธยท๋ฐœํ–‰ยท์˜ˆ์•ฝยท๋ฉค๋ฒ„์‹ญยท๋น„๊ณต๊ฐœ ์ƒํƒœ ์ €์žฅ, ๋ฐœํ–‰ ๋ชจ๋‹ฌ(์ค‘์•™ ๋ฐฐ์น˜), ์ขŒ์šฐ ์„ค์ • ํŒจ๋„(์ž‘์€ ํ™”๋ฉด์€ ์˜ค๋ฅธ์ชฝ ๊ณ ์ • ์˜ค๋ฒ„๋ ˆ์ด), ์˜ค๋ฅธ์ชฝ `View Post` ๋งํฌ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ emitยท๋ฏธ์ €์žฅ ์ดํƒˆ ๊ฐ€๋“œ, ์ถ”์ฒœ ๊ธ€ ํ† ๊ธ€, ํƒœ๊ทธ ์ƒ‰์ƒ ๋ฐฐ์ง€ ๋‹ค์ค‘ ์ž…๋ ฅยท๋ฉ”์ธ ํƒœ๊ทธ ๋“œ๋กญ๋‹ค์šดยท๋ถ€๋ถ„ ๊ฒ€์ƒ‰ ์ถ”์ฒœ | | components/admin/AdminPageForm.vue | ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์ž‘์„ฑ/์ˆ˜์ • ํผ, ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ๊ณผ ๊ฐ™์€ ์ „์ฒด ํ™”๋ฉด ์—๋””ํ„ฐยท์ƒ๋‹จ ์ €์žฅ ํˆด๋ฐ”ยท์ ‘์ด์‹ ์˜ค๋ฅธ์ชฝ ์„ค์ • ํŒจ๋„, ํŽ˜์ด์ง€ ๊ณต๊ฐœ ์ƒํƒœ ์„ ํƒ, HTML ๋ฌธ์„œ ๊ธฐ๋ณธ ๋ชจ๋“œ, ๋นˆ ๋ณธ๋ฌธ/`!`+Tab HTML ๊ณจ๊ฒฉ ์ž๋™ ์™„์„ฑ, ํ•ญ์ƒ ๋ณด์ด๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ/HTML ๋ชจ๋“œ ์„ ํƒ, ํ•œ๊ธ€ ์ œ๋ชฉ ์˜๋ฌธ ์Šฌ๋Ÿฌ๊ทธ ์ž๋™ ๋ณ€ํ™˜, HTML textarea ์ปค์„œ ์œ„์น˜ ํŒŒ์ผ URL ์‚ฝ์ž… | | components/admin/AdminMarkdownEditor.vue | ๊ด€๋ฆฌ์ž ๊ธ€ Markdown-first ์—๋””ํ„ฐ, ๋ผ์ด๋ธŒยท์†Œ์Šค ๋ชจ๋“œ `/` ์Šฌ๋ž˜์‹œ ๋ช…๋ นยท๋ฏธ๋””์–ด ๋ชจ๋‹ฌ(์ด๋ฏธ์ง€ยท๊ฐค๋Ÿฌ๋ฆฌยท๋น„๋””์˜คยท์˜ค๋””์˜คยทํŒŒ์ผ), ์ปค์„œ ๋ธ”๋ก ์ปจํ…์ŠคํŠธยท`block-panel` emit, ๋ผ์ด๋ธŒ ์ด๋ฏธ์ง€ ์„ค์ • ํŒจ๋„ยท์ด๋ฏธ์ง€โ†”๊ฐค๋Ÿฌ๋ฆฌ ๋“œ๋ž˜๊ทธ ๋ณ€ํ™˜(`merge-images-to-gallery`ยท`insert-image-to-gallery`ยท`extract-gallery-image`), ์ฝ”๋“œยท์ฝœ์•„์›ƒยทํ† ๊ธ€ ๋‚ด๋ถ€ ์ค„ ์‚ญ์ œ, ๋ธ”๋ก ํŒจ๋„ ๋ฐ”๊นฅ ํด๋ฆญ ๋‹ซ๊ธฐยท๋ฏธ๋””์–ด ๋ชจ๋‹ฌ ์ค‘ ์œ ์ง€, ์ธ์šฉยท์ฝœ์•„์›ƒยท์ฝ”๋“œยทํ† ๊ธ€ ์„ ์–ธ ์ค„ ์˜ต์…˜ ์ˆ˜์ •, IME ์กฐํ•ฉ ์ค‘ ๋ธ”๋ก ํŒจ๋„ ์œ ์ง€, ์†Œ์Šค ๋ชจ๋“œ wrap ๋ผ์ธ ๋ฒˆํ˜ธ ๋ณด์ •ยท๋ผ์ด๋ธŒโ†”์†Œ์Šค ์œ„์น˜ ๋ณต์›, ๋ผ์ด๋ธŒ ์Šฌ๋ž˜์‹œ ๋ช…๋ น ํ›„ ํฌ์ปค์Šค ๋ณต์› ์ง€์—ฐ | -| components/admin/AdminEditorBlockPanel.vue | ๊ฒŒ์‹œ๋ฌผ ์„ค์ • ์‚ฌ์ด๋“œ๋ฐ” ์˜ค๋ฒ„๋ ˆ์ด ๋ธ”๋ก ์„ค์ •(์ด๋ฏธ์ง€ยท๊ฐค๋Ÿฌ๋ฆฌยท์ž„๋ฒ ๋“œยท์ธ์šฉ ๋ฐฐ๊ฒฝ์ƒ‰ยท์ฝœ์•„์›ƒยท์ฝ”๋“œยทํ† ๊ธ€), ๊ฐค๋Ÿฌ๋ฆฌ ์„ ํƒ ์ด๋ฏธ์ง€ ๊ฐ•์กฐ | +| components/admin/AdminEditorBlockPanel.vue | ๊ฒŒ์‹œ๋ฌผ ์„ค์ • ์‚ฌ์ด๋“œ๋ฐ” ์˜ค๋ฒ„๋ ˆ์ด ๋ธ”๋ก ์„ค์ •(์ด๋ฏธ์ง€ยท๊ฐค๋Ÿฌ๋ฆฌยท์ž„๋ฒ ๋“œยท์ธ์šฉ ๋ฐฐ๊ฒฝ์ƒ‰ยท์ฝœ์•„์›ƒ ์ œ๋ชฉยท์•„์ด์ฝ˜ยท๋ฐฐ๊ฒฝ์ƒ‰ยท์ฝ”๋“œยทํ† ๊ธ€), ๊ฐค๋Ÿฌ๋ฆฌ ์„ ํƒ ์ด๋ฏธ์ง€ ๊ฐ•์กฐ | | components/admin/AdminBlockEditor.vue | ๊ด€๋ฆฌ์ž ๊ธ€ ๋ธ”๋กํ˜• ์—๋””ํ„ฐ, ์ด๋ฏธ์ง€/๊ฐค๋Ÿฌ๋ฆฌ/์ฝœ์•„์›ƒ/ํ† ๊ธ€/์ž„๋ฒ ๋“œ ๋ธ”๋ก, ์ฝœ์•„์›ƒ Emoji on/offยท์ด๋ชจ์ง€ ํ”„๋ฆฌ์…‹ยท์ธ์šฉ๊ณผ ๊ฐ™์€ ๋ฐฐ๊ฒฝ ํ”„๋ฆฌ์…‹ ์„ ํƒ(์šฐ์ธก ๊ณ ์ • ์„ค์ • ํŒจ๋„), ๊ฐค๋Ÿฌ๋ฆฌ ๋ณต์ˆ˜ ๋ฏธ๋””์–ด ์„ ํƒยท์ด๋ฏธ์ง€ ์ˆ˜๋ณ„ ์—ด ๋ฐฐ์น˜ยท์‚ฝ์ž… ์œ„์น˜ ํ‘œ์‹œ ๋“œ๋ž˜๊ทธ ์ˆœ์„œ ๋ณ€๊ฒฝ, ํ•œ๊ธ€ ์กฐํ•ฉ ์ž…๋ ฅ ์ฒ˜๋ฆฌ, Shift+Enter ์ค„๋ฐ”๊ฟˆ, ์ฝ”๋“œ ๋ธ”๋ก ๋‹จ์ถ• ๋ณ€ํ™˜, AFFiNE ์ฐธ๊ณ  ์„ธ๋กœ ๋ง‰๋Œ€ํ˜• ๋ธ”๋ก ํ•ธ๋“ค ์„ ํƒ/์‚ญ์ œ/๋“œ๋ž˜๊ทธ ์ด๋™๊ณผ ์‚ฝ์ž…์„  ํ‘œ์‹œ, ํ•˜๋‹จ ๋นˆ ์ž…๋ ฅ ๋ธ”๋ก ์œ ์ง€, ๋ณธ๋ฌธ placeholder ํ‘œ์‹œ | | components/admin/AdminTagForm.vue | ๊ด€๋ฆฌ์ž ํƒœ๊ทธ ์ƒ์„ฑ/์ˆ˜์ • ํผ(์ด๋ฆ„/์Šฌ๋Ÿฌ๊ทธ/์„ค๋ช…/์ƒ‰์ƒ๋งŒ ํŽธ์ง‘) | | components/admin/AdminMemberForm.vue | ๊ด€๋ฆฌ์ž ๋ฉค๋ฒ„ ์ถ”๊ฐ€/์ˆ˜์ • ํผ(Ghostํ˜• 3๋ถ„ํ• , ๊ธฐ์กด ํšŒ์› ๋ณด๊ธฐ/์ˆ˜์ • ๋ชจ๋“œ ๋ถ„๋ฆฌ, ์š”์•ฝ 1frยท์ž…๋ ฅ 2fr, ์›ํ˜• ์ธ๋„ค์ผ hover ๋“ฑ๋กยท๋ณ€๊ฒฝยท์‚ญ์ œ, ๊ธฐ๋ณธ ์ •๋ณดยท๋ ˆ์ด๋ธ”ยท๊ด€๋ฆฌ์ž ๋…ธํŠธยทํ™œ๋™ ์š”์•ฝ, ์„ค์ • ๋ฉ”๋‰ด์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝยท๋ฉค๋ฒ„ ์‚ญ์ œ ๋ชจ๋‹ฌ, ์ €์žฅ ํ† ์ŠคํŠธ, ๋ฏธ์ €์žฅ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ดํƒˆ ํ™•์ธ) | @@ -119,8 +119,8 @@ | components/content/ProseCodeBlock.vue | ์ฝ”๋“œ ๋ธ”๋ก ๊ณตํ†ต ์…ธ(๋‹คํฌ ๋ฐฐ๊ฒฝ, ์ค„๋ฒˆํ˜ธ gutter, ๊ณต๊ฐœ ๋ณต์‚ฌ ๋ฒ„ํŠผ) | | components/content/ContentMarkdownCodeBlockEditor.vue | ๋ผ์ด๋ธŒ ๋ชจ๋“œ ์ฝ”๋“œ ๋ธ”๋ก ์ธ๋ผ์ธ ํŽธ์ง‘(Languageยท์ค„๋ฒˆํ˜ธ ํ† ๊ธ€) | | components/content/ProseButton.vue | ๋ฒ„ํŠผ | -| components/content/ContentMarkdownCalloutEditor.vue | ๋ผ์ด๋ธŒ ๋ชจ๋“œ ์ฝœ์•„์›ƒ ๋ฉ€ํ‹ฐ๋ผ์ธ ๋ณธ๋ฌธ ํŽธ์ง‘, ์•„์ด์ฝ˜ ํ‘œ์‹œ ์—ฌ๋ถ€ยท๋ฐฐ๊ฒฝ ๋ฐ˜์˜, ๋‚ด๋ถ€ ์—ฌ๋Ÿฌ ์ค„ ๋ฒ”์œ„ ์„ ํƒ | -| components/content/ProseCallout.vue | Callout ์นด๋“œ(Emoji ํ‘œ์‹œ/์ˆจ๊น€, ์ธ์šฉ๊ณผ ๊ฐ™์€ ๋ฐฐ๊ฒฝ ํ”„๋ฆฌ์…‹, ์™ผ์ชฝ ์ƒ๋‹จ ์•„์ด์ฝ˜ ์ •๋ ฌ) | +| components/content/ContentMarkdownCalloutEditor.vue | ๋ผ์ด๋ธŒ ๋ชจ๋“œ ์ฝœ์•„์›ƒ ๋ฉ€ํ‹ฐ๋ผ์ธ ๋ณธ๋ฌธ ํŽธ์ง‘, ์ œ๋ชฉยท์•„์ด์ฝ˜ ํ‘œ์‹œ ์—ฌ๋ถ€ยท๋ฐฐ๊ฒฝ ๋ฐ˜์˜, ๋‚ด๋ถ€ ์—ฌ๋Ÿฌ ์ค„ ๋ฒ”์œ„ ์„ ํƒ | +| components/content/ProseCallout.vue | Callout ์นด๋“œ(Emoji ํ‘œ์‹œ/์ˆจ๊น€, ์„ ํƒ ์ œ๋ชฉ, ์ธ์šฉ๊ณผ ๊ฐ™์€ ๋ฐฐ๊ฒฝ ํ”„๋ฆฌ์…‹, ํ—ค๋” ์•„๋ž˜ ๋ณธ๋ฌธ ์ค„๋ฐ”๊ฟˆ) | | components/content/ProseToggle.vue | Toggle ์นด๋“œ(ํŽผ์นจ ์• ๋‹ˆ๋ฉ”์ด์…˜, chevron ํŠธ๋ฆฌ๊ฑฐ) | | components/content/ContentMarkdownToggleEditor.vue | ๋ผ์ด๋ธŒ ๋ชจ๋“œ ํ† ๊ธ€ ์ œ๋ชฉยท๋ณธ๋ฌธ ์ธ๋ผ์ธ ํŽธ์ง‘ | | components/content/ProseVideo.vue | `:::video` ๊ณต๊ฐœ ๋น„๋””์˜ค ์นด๋“œ | diff --git a/docs/spec.md b/docs/spec.md index 9c7b152..2d84c84 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -78,7 +78,7 @@ - ๋Œ“๊ธ€ ์•„๋ฐ”ํƒ€ ์ด๋ฏธ์ง€ ๋กœ๋“œ ์‹คํŒจ ์‹œ ์ด๋‹ˆ์…œ ์•„๋ฐ”ํƒ€๋กœ ์ฆ‰์‹œ ๋Œ€์ฒดํ•œ๋‹ค. - ๊ณต๊ฐœ ๊ฒŒ์‹œ๋ฌผ ๋ณธ๋ฌธ์€ ์ฝ˜ํ…์ธ  ํƒ€์ž…๋ณ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด ์ถ”ํ›„ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ์ด ์‰ฝ๋„๋ก ๊ตฌ์„ฑ - ์ธ์šฉ๋ฌธ(`>`)์€ ์ฒซ ์ค„ ์˜ต์…˜ `> [!bg=blue]` ๋˜๋Š” `> {bg=blue}`๋กœ ๋ฐฐ๊ฒฝ์ƒ‰์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง€์› ๊ฐ’์€ ์ฝœ์•„์›ƒ๊ณผ ๊ฐ™์€ `gray`, `blue`, `green`, `yellow`, `red`, `purple`์ด๋‹ค. -- ๊ด€๋ฆฌ์ž Markdown-first ๊ธ€์“ฐ๊ธฐ์˜ ์˜ค๋ฅธ์ชฝ ๋ธ”๋ก ์„ค์ • ํŒจ๋„์€ ์ธ์šฉยท์ฝœ์•„์›ƒยท์ฝ”๋“œ ๋ธ”๋กยทํ† ๊ธ€ ์„ค์ •์„ ์ง€์›ํ•œ๋‹ค. ์ฝœ์•„์›ƒ์€ ์•„์ด์ฝ˜ ํ‘œ์‹œ ์—ฌ๋ถ€ยท์•„์ด์ฝ˜ยท๋ฐฐ๊ฒฝ์ƒ‰, ์ฝ”๋“œ ๋ธ”๋ก์€ ์–ธ์–ดยท์ค„๋ฒˆํ˜ธ ํ‘œ์‹œ ์—ฌ๋ถ€, ํ† ๊ธ€์€ ๊ธฐ๋ณธ ํŽผ์นจยท๋‹ซํž˜ ์ƒํƒœ๋ฅผ ์„ ์–ธ ์ค„์— ์ €์žฅํ•œ๋‹ค. ์ฝœ์•„์›ƒ ์•„์ด์ฝ˜์€ ๋ผ์ด๋ธŒยท๊ณต๊ฐœ ํ™”๋ฉด ๋ชจ๋‘ ์™ผ์ชฝ ์ƒ๋‹จ์— ๋ฐฐ์น˜ํ•˜๊ณ , ์•„์ด์ฝ˜ ๋ฏธ์‚ฌ์šฉ ์‹œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ํ•œ๊ธ€ ๋“ฑ IME ์กฐํ•ฉ ์ž…๋ ฅ ์ค‘์—๋Š” ์ค„๋ฐ”๊ฟˆ ์งํ›„ ๋ธ”๋ก ํŒ๋ณ„์ด ์ผ์‹œ์ ์œผ๋กœ ๋น„์–ด๋„ ๋งˆ์ง€๋ง‰ ๋ธ”๋ก ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•ด ์„ค์ • ํŒจ๋„์ด ๋‹ซํžˆ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. +- ๊ด€๋ฆฌ์ž Markdown-first ๊ธ€์“ฐ๊ธฐ์˜ ์˜ค๋ฅธ์ชฝ ๋ธ”๋ก ์„ค์ • ํŒจ๋„์€ ์ธ์šฉยท์ฝœ์•„์›ƒยท์ฝ”๋“œ ๋ธ”๋กยทํ† ๊ธ€ ์„ค์ •์„ ์ง€์›ํ•œ๋‹ค. ์ฝœ์•„์›ƒ์€ ์ œ๋ชฉยท์•„์ด์ฝ˜ ํ‘œ์‹œ ์—ฌ๋ถ€ยท์•„์ด์ฝ˜ยท๋ฐฐ๊ฒฝ์ƒ‰, ์ฝ”๋“œ ๋ธ”๋ก์€ ์–ธ์–ดยท์ค„๋ฒˆํ˜ธ ํ‘œ์‹œ ์—ฌ๋ถ€, ํ† ๊ธ€์€ ๊ธฐ๋ณธ ํŽผ์นจยท๋‹ซํž˜ ์ƒํƒœ๋ฅผ ์„ ์–ธ ์ค„์— ์ €์žฅํ•œ๋‹ค. ์ฝœ์•„์›ƒ ์•„์ด์ฝ˜์€ ๋ผ์ด๋ธŒยท๊ณต๊ฐœ ํ™”๋ฉด ๋ชจ๋‘ ์™ผ์ชฝ ์ƒ๋‹จ์— ๋ฐฐ์น˜ํ•˜๊ณ , ์•„์ด์ฝ˜ยท์ œ๋ชฉ ํ—ค๋” ์•„๋ž˜์— ๋ณธ๋ฌธ์„ ์ค„๋ฐ”๊ฟˆํ•ด ํ‘œ์‹œํ•œ๋‹ค. ์•„์ด์ฝ˜ ๋ฏธ์‚ฌ์šฉ ์‹œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ํ•œ๊ธ€ ๋“ฑ IME ์กฐํ•ฉ ์ž…๋ ฅ ์ค‘์—๋Š” ์ค„๋ฐ”๊ฟˆ ์งํ›„ ๋ธ”๋ก ํŒ๋ณ„์ด ์ผ์‹œ์ ์œผ๋กœ ๋น„์–ด๋„ ๋งˆ์ง€๋ง‰ ๋ธ”๋ก ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•ด ์„ค์ • ํŒจ๋„์ด ๋‹ซํžˆ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. - ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ธ์˜ ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”๋Š” ๋ฐ์Šคํฌํ†ฑ์—์„œ ์ถ”์ฒœ ์‚ฌ์ดํŠธ ๋Œ€์‹  ๋ณธ๋ฌธ H1~H3 ์ œ๋ชฉ ๊ธฐ๋ฐ˜ TOC๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. TOC ๋งํฌ๋Š” ๋ณธ๋ฌธ ์ œ๋ชฉ์— ๋ถ€์—ฌ๋œ ์•ต์ปค ID๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™ํ•˜๋ฉฐ, ๊ณ ์ • ์ƒ๋‹จ ํ—ค๋” ๋†’์ด์™€ ์—ฌ๋ฐฑ์„ ๋ฐ˜์˜ํ•ด ์ œ๋ชฉ์ด ํ™”๋ฉด ๋ฐ–์— ๊ฑธ๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ๋ณธ๋ฌธ ์Šคํฌ๋กค ์ค‘์—๋Š” ํ˜„์žฌ ์ œ๋ชฉ์— ํ•ด๋‹นํ•˜๋Š” TOC ํ•ญ๋ชฉ์„ ๊ฐ•์กฐํ•˜๊ณ , ๋ชฉ์ฐจ ํ•ญ๋ชฉ์ด ๋งŽ์œผ๋ฉด TOC ๋‚ด๋ถ€ ์Šคํฌ๋กค์ด ํ™œ์„ฑ ํ•ญ๋ชฉ์„ ๋”ฐ๋ผ๊ฐ„๋‹ค. ๋ณธ๋ฌธ ์ œ๋ชฉ์ด ์—†์œผ๋ฉด ๋ชฉ์ฐจ ์—†์Œ ๋ฌธ๊ตฌ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ๋ณธ๋ฌธ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๋ชจ๋ฐ”์ผ ํญ์—์„œ๋Š” TOC๋ฅผ ์ˆจ๊ธด๋‹ค. - ์ œ๋ชฉ ์šฐ์ธก ๊ณต์œ  ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฒŒ์‹œ๋ฌผ ๊ณต์œ  ๋ชจ๋‹ฌ์„ ์—ฐ๋‹ค. - ๋กœ๊ทธ์ธ ํšŒ์› ID๊ฐ€ ๊ฒŒ์‹œ๋ฌผ `author_id`์™€ ๊ฐ™์œผ๋ฉด ์ œ๋ชฉ ์šฐ์ธก ๊ณต์œ  ๋ฒ„ํŠผ ์˜†์— ์ˆ˜์ • ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ•˜๋ฉฐ, ํด๋ฆญ ์‹œ `/admin/posts/:id` ํŽธ์ง‘ ํ™”๋ฉด์„ ์ƒˆ ํƒญ์œผ๋กœ ์—ฐ๋‹ค. @@ -627,7 +627,7 @@ components/content/ - ๋ผ์ด๋ธŒ ๋ชจ๋“œ ๊ฐค๋Ÿฌ๋ฆฌ ์ด๋ฏธ์ง€๋ฅผ ๋ธ”๋ก ์‚ฌ์ด ์–‡์€ ์‚ฝ์ž…์„ (๋˜๋Š” ๋ฌธ์„œ ๋งจ ์•„๋ž˜ ์‚ฝ์ž…์„ )์— ๋“œ๋กญํ•˜๋ฉด ํ•ด๋‹น ์œ„์น˜์— ๋‹จ์ผ ์ด๋ฏธ์ง€ ๋งˆํฌ๋‹ค์šด ์ค„์„ ์‚ฝ์ž…ํ•˜๊ณ  ๊ฐค๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค(`extract-gallery-image`). ๊ฐค๋Ÿฌ๋ฆฌ์— ์ด๋ฏธ์ง€๊ฐ€ 1์žฅ๋งŒ ๋‚จ์œผ๋ฉด ๊ฐค๋Ÿฌ๋ฆฌ ๋ธ”๋ก์„ ๋‹จ์ผ ์ด๋ฏธ์ง€ ์ค„๋กœ ๋ฐ”๊พธ๊ณ , 0์žฅ์ด๋ฉด ๊ฐค๋Ÿฌ๋ฆฌ ๋ธ”๋ก์„ ์ œ๊ฑฐํ•œ๋‹ค. - `ProseImage`๋Š” URL์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋กœ๋“œ์— ์‹คํŒจํ•ด๋„ ์ตœ์†Œ ๋†’์ด placeholder์™€ ใ€Œ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Œใ€ ์•ˆ๋‚ด๋ฅผ ํ‘œ์‹œํ•ด ๋ผ์ด๋ธŒ ๋ชจ๋“œ์—์„œ ๋ธ”๋ก ์„ ํƒยทํŽธ์ง‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค. - ์ธ์šฉ(`>`) ๋ธ”๋ก์€ ์ฒซ ์ธ์šฉ ์ค„์— `> [!bg=yellow]` ๋˜๋Š” `> {bg=yellow}` ์˜ต์…˜ ์ค„์„ ๋‘๋ฉด ํ•ด๋‹น ์ค„์€ ์ˆจ๊ธฐ๊ณ  ๋ธ”๋ก ๋ฐฐ๊ฒฝ์„ ๋ฐ”๊พผ๋‹ค. ์ง€์› ๋ฐฐ๊ฒฝ ํ”„๋ฆฌ์…‹์€ ์ฝœ์•„์›ƒ๊ณผ ๊ฐ™์€ `gray`, `blue`, `green`, `yellow`, `red`, `purple`์ด๋ฉฐ, ์˜ต์…˜์ด ์—†์œผ๋ฉด ํšŒ์ƒ‰ ๊ธฐ๋ณธ ์ธ์šฉ ์Šคํƒ€์ผ์„ ์“ด๋‹ค. -- ๊ด€๋ฆฌ์ž **๋ผ์ด๋ธŒ ๋ชจ๋“œ**(๋ฏธ๋ฆฌ๋ณด๊ธฐ) ์ธ๋ผ์ธ ํŽธ์ง‘: ๋ฌธ๋‹จยท๋นˆ ์ค„ยท์ œ๋ชฉยท์ธ์šฉยท๋ชฉ๋กยท์ฝ”๋“œ ๋ธ”๋กยท์ฝœ์•„์›ƒยทํ† ๊ธ€์„ ๋ Œ๋” ์Šคํƒ€์ผ ๊ทธ๋Œ€๋กœ contenteditable๋กœ ์ˆ˜์ •ํ•œ๋‹ค. blurยท๋ฌธ๋‹จ ์ด๋™(๋ฐฉํ–ฅํ‚ค) ์‹œ ํŽธ์ง‘ ์˜์—ญ์˜ ``ยท`` ๋“ฑ์„ `**`ยท`*` ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋‹ค์‹œ ์ง๋ ฌํ™”ํ•ด ์ €์žฅํ•œ๋‹ค. **Enter**ยท**Shift+Enter** ๋ชจ๋‘ ๋‹ค์Œ ๋ฌธ๋‹จ(๋ธ”๋ก) ๋ถ„๋ฆฌ. ๋ฌธ๋‹จ ์•ˆ `/`๋กœ ์Šฌ๋ž˜์‹œ ๋ช…๋ น ๋ฉ”๋‰ด(`/image`+Enter ์ด๋ฏธ์ง€ ์‚ฝ์ž… ๋“ฑ). **์†Œ์Šค(์ž‘์„ฑ) ๋ชจ๋“œ** textarea์—์„œ๋„ ๋™์ผํ•œ `/` ์Šฌ๋ž˜์‹œ ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ƒ๋‹จ ๋งˆํฌ๋‹ค์šด ํˆด๋ฐ”๋Š” ๋‘์ง€ ์•Š๋Š”๋‹ค. ์Šฌ๋ž˜์‹œ ๊ธฐ๋ณธ ์ œ๋ชฉ์€ **h2ยทh3ยทh4**๋งŒ ํ‘œ์‹œํ•˜๋ฉฐ, ๋ณธ๋ฌธ **h1**์€ `/h1` ๊ฒ€์ƒ‰ ์‹œ์—๋งŒ ์‚ฝ์ž…ํ•œ๋‹ค(๊ฒŒ์‹œ๋ฌผ **์ œ๋ชฉ ํ•„๋“œ**๊ฐ€ ํŽ˜์ด์ง€์˜ ์œ ์ผํ•œ h1). `Cmd+Shift+K`๋Š” ํ˜„์žฌ ์ค„์„ ์‚ญ์ œํ•˜๋ฉฐ ์ฝ”๋“œยท์ฝœ์•„์›ƒยทํ† ๊ธ€ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋Š” ์ปค์„œ๊ฐ€ ์žˆ๋Š” ๋ณธ๋ฌธ ์ค„์„ ์‚ญ์ œํ•˜๊ณ , ๋‚จ์€ ๋ณธ๋ฌธ ์ค„์ด 1๊ฐœ๋ฟ์ด๋ฉด fenced ๋ธ”๋ก ์ „์ฒด๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ์ฝœ์•„์›ƒ ์˜ต์…˜์€ ์ฒซ ์ค„ `:::callout emoji=๐Ÿ’ก bg=blue`์ฒ˜๋Ÿผ `emoji`ยท`bg`(gray|blue|green|yellow|red|purple)๋กœ ์ง€์ •ํ•˜๋ฉฐ, ๋ผ์ด๋ธŒ ๋ชจ๋“œ์—์„œ๋Š” ๋ธ”๋ก์— ํฌ์ปค์Šค๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์˜ค๋ฅธ์ชฝ ์„ค์ • ํŒจ๋„์—์„œ ์ˆ˜์ •ํ•œ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์€ ` ```์–ธ์–ด`ยท`nolinenos`(์ค„ ๋ฒˆํ˜ธ ์ˆจ๊น€)๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ผ์ด๋ธŒยท๊ณต๊ฐœ ๋ชจ๋‘ `ProseCodeBlock`(`#15171a`, `px-4 py-3`, `text-sm leading-6`)์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ํ‘œ์‹œํ•œ๋‹ค. ๋ผ์ด๋ธŒ ๋ชจ๋“œ ํ˜ธ๋ฒ„ยทํฌ์ปค์Šค ์‹œ Language ์ž…๋ ฅยท์ค„๋ฒˆํ˜ธ ํ† ๊ธ€์ด ๋ณด์ธ๋‹ค. ๊ณต๊ฐœ ํ™”๋ฉด์—๋Š” ์–ธ์–ด ๋ผ๋ฒจ ์˜† **๋ณต์‚ฌ** ๋ฒ„ํŠผ์œผ๋กœ ๋ณธ๋ฌธ์„ ํด๋ฆฝ๋ณด๋“œ์— ๋„ฃ๋Š”๋‹ค. ๋ณธ๋ฌธ ํ•˜๋‹จ ํด๋ฆญ์œผ๋กœ ์ƒˆ ๋ฌธ๋‹จ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. +- ๊ด€๋ฆฌ์ž **๋ผ์ด๋ธŒ ๋ชจ๋“œ**(๋ฏธ๋ฆฌ๋ณด๊ธฐ) ์ธ๋ผ์ธ ํŽธ์ง‘: ๋ฌธ๋‹จยท๋นˆ ์ค„ยท์ œ๋ชฉยท์ธ์šฉยท๋ชฉ๋กยท์ฝ”๋“œ ๋ธ”๋กยท์ฝœ์•„์›ƒยทํ† ๊ธ€์„ ๋ Œ๋” ์Šคํƒ€์ผ ๊ทธ๋Œ€๋กœ contenteditable๋กœ ์ˆ˜์ •ํ•œ๋‹ค. blurยท๋ฌธ๋‹จ ์ด๋™(๋ฐฉํ–ฅํ‚ค) ์‹œ ํŽธ์ง‘ ์˜์—ญ์˜ ``ยท`` ๋“ฑ์„ `**`ยท`*` ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋‹ค์‹œ ์ง๋ ฌํ™”ํ•ด ์ €์žฅํ•œ๋‹ค. **Enter**ยท**Shift+Enter** ๋ชจ๋‘ ๋‹ค์Œ ๋ฌธ๋‹จ(๋ธ”๋ก) ๋ถ„๋ฆฌ. ๋ฌธ๋‹จ ์•ˆ `/`๋กœ ์Šฌ๋ž˜์‹œ ๋ช…๋ น ๋ฉ”๋‰ด(`/image`+Enter ์ด๋ฏธ์ง€ ์‚ฝ์ž… ๋“ฑ). **์†Œ์Šค(์ž‘์„ฑ) ๋ชจ๋“œ** textarea์—์„œ๋„ ๋™์ผํ•œ `/` ์Šฌ๋ž˜์‹œ ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ƒ๋‹จ ๋งˆํฌ๋‹ค์šด ํˆด๋ฐ”๋Š” ๋‘์ง€ ์•Š๋Š”๋‹ค. ์Šฌ๋ž˜์‹œ ๊ธฐ๋ณธ ์ œ๋ชฉ์€ **h2ยทh3ยทh4**๋งŒ ํ‘œ์‹œํ•˜๋ฉฐ, ๋ณธ๋ฌธ **h1**์€ `/h1` ๊ฒ€์ƒ‰ ์‹œ์—๋งŒ ์‚ฝ์ž…ํ•œ๋‹ค(๊ฒŒ์‹œ๋ฌผ **์ œ๋ชฉ ํ•„๋“œ**๊ฐ€ ํŽ˜์ด์ง€์˜ ์œ ์ผํ•œ h1). `Cmd+Shift+K`๋Š” ํ˜„์žฌ ์ค„์„ ์‚ญ์ œํ•˜๋ฉฐ ์ฝ”๋“œยท์ฝœ์•„์›ƒยทํ† ๊ธ€ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋Š” ์ปค์„œ๊ฐ€ ์žˆ๋Š” ๋ณธ๋ฌธ ์ค„์„ ์‚ญ์ œํ•˜๊ณ , ๋‚จ์€ ๋ณธ๋ฌธ ์ค„์ด 1๊ฐœ๋ฟ์ด๋ฉด fenced ๋ธ”๋ก ์ „์ฒด๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ์ฝœ์•„์›ƒ ์˜ต์…˜์€ ์ฒซ ์ค„ `:::callout emoji=none bg=blue title="์ฃผ์˜์‚ฌํ•ญ"`์ฒ˜๋Ÿผ `emoji`ยท`bg`(gray|blue|green|yellow|red|purple)ยท`title`๋กœ ์ง€์ •ํ•˜๋ฉฐ, ๋ผ์ด๋ธŒ ๋ชจ๋“œ์—์„œ๋Š” ๋ธ”๋ก์— ํฌ์ปค์Šค๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์˜ค๋ฅธ์ชฝ ์„ค์ • ํŒจ๋„์—์„œ ์ˆ˜์ •ํ•œ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์€ ` ```์–ธ์–ด`ยท`nolinenos`(์ค„ ๋ฒˆํ˜ธ ์ˆจ๊น€)๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ผ์ด๋ธŒยท๊ณต๊ฐœ ๋ชจ๋‘ `ProseCodeBlock`(`#15171a`, `px-4 py-3`, `text-sm leading-6`)์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ํ‘œ์‹œํ•œ๋‹ค. ๋ผ์ด๋ธŒ ๋ชจ๋“œ ํ˜ธ๋ฒ„ยทํฌ์ปค์Šค ์‹œ Language ์ž…๋ ฅยท์ค„๋ฒˆํ˜ธ ํ† ๊ธ€์ด ๋ณด์ธ๋‹ค. ๊ณต๊ฐœ ํ™”๋ฉด์—๋Š” ์–ธ์–ด ๋ผ๋ฒจ ์˜† **๋ณต์‚ฌ** ๋ฒ„ํŠผ์œผ๋กœ ๋ณธ๋ฌธ์„ ํด๋ฆฝ๋ณด๋“œ์— ๋„ฃ๋Š”๋‹ค. ๋ณธ๋ฌธ ํ•˜๋‹จ ํด๋ฆญ์œผ๋กœ ์ƒˆ ๋ฌธ๋‹จ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. - ๋ผ์ด๋ธŒ ๋ชจ๋“œ ์ธ์šฉยท์ฝœ์•„์›ƒ ๋‚ด๋ถ€ Enter๋Š” ํ•œ๊ธ€ IME ์กฐํ•ฉ ํ™•์ • ๋’ค์—๋„ ํ•œ ๋ฒˆ๋งŒ ์ค„์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ฝœ์•„์›ƒ ๋ณธ๋ฌธ์€ ํ•˜๋‚˜์˜ ๋ฉ€ํ‹ฐ๋ผ์ธ ํŽธ์ง‘ ์˜์—ญ์œผ๋กœ ์œ ์ง€ํ•ด `Shift+๋ฐฉํ–ฅํ‚ค` ์„ ํƒ์ด ๋‚ด๋ถ€ ์—ฌ๋Ÿฌ ์ค„์„ ๊ฐ€๋กœ์ง€๋ฅผ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ธ์šฉ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ์•„๋ž˜ ๋ฐฉํ–ฅํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์™ธ๋ถ€ ๋นˆ ๋ฌธ๋‹จ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝœ์•„์›ƒ ์•„๋ž˜ ๋ฐฉํ–ฅํ‚ค๋Š” ๋ณธ๋ฌธ ์ค„์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. - ๋ผ์ด๋ธŒ ๋ชจ๋“œ `:::` fenced ๋ธ”๋ก์˜ ์›๋ณธ ๋ฒ”์œ„๋Š” ์—ฌ๋Š” ์ค„๋ถ€ํ„ฐ ๋‹ซ๋Š” `:::` ์ค„๊นŒ์ง€๋งŒ ํฌํ•จํ•œ๋‹ค. ์—ฐ์†๋œ ์ฝœ์•„์›ƒยทํ† ๊ธ€ยท๊ฐค๋Ÿฌ๋ฆฌ ๋“ฑ์€ ์•ž ๋ธ”๋ก ํŽธ์ง‘ ์‹œ ๋‹ค์Œ ๋ธ”๋ก์˜ ์„ ์–ธ ์ค„์„ ๊ต์ฒด ๋ฒ”์œ„์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. - ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ถ™์—ฌ๋„ฃ๊ฑฐ๋‚˜ ๋“œ๋กญํ•˜๋ฉด ๊ด€๋ฆฌ์ž ์—…๋กœ๋“œ API๋กœ ์ €์žฅํ•œ ๋’ค ํ˜„์žฌ ์ปค์„œ ์œ„์น˜์— ์ด๋ฏธ์ง€ ๋˜๋Š” ๊ฐค๋Ÿฌ๋ฆฌ ๋งˆํฌ๋‹ค์šด์„ ์‚ฝ์ž…ํ•œ๋‹ค. @@ -635,7 +635,7 @@ components/content/ - ๋ฏธ๋””์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‹จ์ผ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•˜๋ฉด `![alt](url)` ํ˜•์‹์œผ๋กœ ์‚ฝ์ž…ํ•œ๋‹ค. - ๋ฏธ๋””์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•˜๋ฉด `:::gallery` fenced block์œผ๋กœ ์‚ฝ์ž…ํ•œ๋‹ค. - ์ž‘์„ฑ ๋ชจ๋“œ์—์„œ ์ปค์„œ๊ฐ€ ์ด๋ฏธ์ง€ ๋งˆํฌ๋‹ค์šด ์ค„, `:::gallery`, ๋‹จ๋… URL ์ž„๋ฒ ๋“œ ์ค„, ๊ธฐ์กด `:::embed`, ์ธ์šฉ๋ฌธ, `:::callout`, ์ฝ”๋“œ fenced ๋ธ”๋ก, `:::toggle` ๋ธ”๋ก ์•ˆ์— ์žˆ๊ณ  textarea(๋˜๋Š” ๋ธ”๋ก ํŒจ๋„)์— ํฌ์ปค์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒŒ์‹œ๋ฌผ ์„ค์ • ์‚ฌ์ด๋“œ๋ฐ”(420px) ์œ„์— **๋ธ”๋ก ์„ค์ • ํŒจ๋„**(`AdminEditorBlockPanel`)์ด ์˜ค๋ฅธ์ชฝ์—์„œ ์Šฌ๋ผ์ด๋“œ ์ธํ•œ๋‹ค. ๋ณธ๋ฌธยทํŒจ๋„ ๋ฐ”๊นฅ์„ ํด๋ฆญํ•˜๋ฉด ์Šฌ๋ผ์ด๋“œ ์•„์›ƒํ•œ๋‹ค. ๊ฐค๋Ÿฌ๋ฆฌ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€ ๋ฏธ๋””์–ด ๋ชจ๋‹ฌ์„ ์—ฌ๋Š” ๋™์•ˆ์—๋Š” ํ™œ์„ฑ ๊ฐค๋Ÿฌ๋ฆฌ ์ปจํ…์ŠคํŠธ์™€ ํŒจ๋„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. -- ๋ธ”๋ก ์„ค์ • ํŒจ๋„: ์ด๋ฏธ์ง€ยท๊ฐค๋Ÿฌ๋ฆฌ(์บก์…˜, **ํŒŒ์ผ๋ช…์„ ์บก์…˜์œผ๋กœ ์‚ฌ์šฉ** ํ† ๊ธ€ยท๊ธฐ๋ณธ ๋”, URL, ๊ฐค๋Ÿฌ๋ฆฌ ์ˆœ์„œยท์‚ญ์ œยท์ถ”๊ฐ€), ์ž„๋ฒ ๋“œ(URL), ์ธ์šฉ ๋ฐฐ๊ฒฝ์ƒ‰, ์ฝœ์•„์›ƒ ์•„์ด์ฝ˜ยท๋ฐฐ๊ฒฝ์ƒ‰, ์ฝ”๋“œ ์–ธ์–ดยท์ค„๋ฒˆํ˜ธ, ํ† ๊ธ€ ๊ธฐ๋ณธ ํŽผ์นจ ์ƒํƒœ. `AdminMarkdownEditor`๋Š” `block-panel` ์ด๋ฒคํŠธ๋กœ ์ƒํƒœ๋ฅผ `AdminPostForm`์— ์ „๋‹ฌํ•œ๋‹ค. +- ๋ธ”๋ก ์„ค์ • ํŒจ๋„: ์ด๋ฏธ์ง€ยท๊ฐค๋Ÿฌ๋ฆฌ(์บก์…˜, **ํŒŒ์ผ๋ช…์„ ์บก์…˜์œผ๋กœ ์‚ฌ์šฉ** ํ† ๊ธ€ยท๊ธฐ๋ณธ ๋”, URL, ๊ฐค๋Ÿฌ๋ฆฌ ์ˆœ์„œยท์‚ญ์ œยท์ถ”๊ฐ€), ์ž„๋ฒ ๋“œ(URL), ์ธ์šฉ ๋ฐฐ๊ฒฝ์ƒ‰, ์ฝœ์•„์›ƒ ์ œ๋ชฉยท์•„์ด์ฝ˜ยท๋ฐฐ๊ฒฝ์ƒ‰, ์ฝ”๋“œ ์–ธ์–ดยท์ค„๋ฒˆํ˜ธ, ํ† ๊ธ€ ๊ธฐ๋ณธ ํŽผ์นจ ์ƒํƒœ. `AdminMarkdownEditor`๋Š” `block-panel` ์ด๋ฒคํŠธ๋กœ ์ƒํƒœ๋ฅผ `AdminPostForm`์— ์ „๋‹ฌํ•œ๋‹ค. - ๋ฏธ๋””์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐค๋Ÿฌ๋ฆฌ ๋‹ค์ค‘ ์„ ํƒ ์‹œ ์„ ํƒ ํ•ญ๋ชฉ์€ **์ฃผํ™ฉ(`#ff7a00`) ๊ตต์€ ํ…Œ๋‘๋ฆฌ**๋กœ ํ‘œ์‹œํ•œ๋‹ค. - ์˜ต์‹œ๋””์–ธ์‹ ํ† ํฐ ์ˆจ๊น€/๋ฐฑ์ŠคํŽ˜์ด์Šค ๋ณต์› Live Preview๋Š” ํ›„์† ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค. - ์ œ๋ชฉ์€ ๋ณ„๋„ ๋ผ๋ฒจ ์˜์—ญ์ด ์•„๋‹ˆ๋ผ ์—๋””ํ„ฐ ์ƒ๋‹จ์˜ ํฐ ์ œ๋ชฉ ์ž…๋ ฅ์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค. @@ -692,7 +692,7 @@ components/content/ - ์ด๋ฏธ์ง€์™€ ๊ฐค๋Ÿฌ๋ฆฌ ๋ธ”๋ก์€ ๊ธฐ์กด ์—…๋กœ๋“œ ๋ฏธ๋””์–ด ์„ ํƒ ๋˜๋Š” ์ƒˆ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. - ๊ด€๋ฆฌ์ž ๋ฏธ๋””์–ด ์—…๋กœ๋“œ API๋Š” ์ด๋ฏธ์ง€(`jpg`, `png`, `webp`, `gif`), ๋น„๋””์˜ค(`mp4`, `webm`, `mov`), ์˜ค๋””์˜ค(`mp3`, `wav`, `ogg`, `m4a`), ํŒŒ์ผ(`pdf`, `zip`, `txt`, `csv`, `docx`, `xlsx`, `pptx`)์„ ์ง€์›ํ•œ๋‹ค. - ์ฝœ์•„์›ƒ ๋ธ”๋ก์€ `:::callout` fenced block ์•ˆ์— ๋ณธ๋ฌธ์„ ์ €์žฅํ•œ๋‹ค. -- ์ฝœ์•„์›ƒ ๋ธ”๋ก์€ ์„ ์–ธ๋ถ€ ์˜ต์…˜์œผ๋กœ `emoji`, `bg`๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ: `:::callout emoji=๐Ÿ’ก bg=blue` +- ์ฝœ์•„์›ƒ ๋ธ”๋ก์€ ์„ ์–ธ๋ถ€ ์˜ต์…˜์œผ๋กœ `emoji`, `bg`, `title`์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ: `:::callout emoji=none bg=blue title="์ฃผ์˜์‚ฌํ•ญ"` - `emoji=none`์ด๋ฉด ๊ณต๊ฐœ ๋ Œ๋”๋Ÿฌ์—์„œ ์ด๋ชจ์ง€๋ฅผ ์ˆจ๊ธด๋‹ค. - ์ฝœ์•„์›ƒ ๋ฐฐ๊ฒฝ ํ”„๋ฆฌ์…‹์€ ์ธ์šฉ ๋ธ”๋ก๊ณผ ๊ฐ™์€ `gray`, `blue`, `green`, `yellow`, `red`, `purple`๋ฅผ ์ง€์›ํ•œ๋‹ค. - ํ† ๊ธ€ ๋ธ”๋ก์€ `:::toggle ์ œ๋ชฉ` fenced block ์•ˆ์— ํŽผ์นจ ๋ณธ๋ฌธ์„ ์ €์žฅํ•œ๋‹ค. ๋ผ์ด๋ธŒ ๋ชจ๋“œ์—์„œ๋Š” ์ œ๋ชฉยท๋ณธ๋ฌธ์„ ์ธ๋ผ์ธ ํŽธ์ง‘ํ•˜๋ฉฐ, chevron์œผ๋กœ ํŽผ์นจยท์ ‘ํž˜ ์‹œ ๋ณธ๋ฌธ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜๋œ๋‹ค. diff --git a/docs/update.md b/docs/update.md index 3163668..fcb0d88 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,12 @@ # ์—…๋ฐ์ดํŠธ ์ด๋ ฅ +## v1.5.54 + +- ๊ฒŒ์‹œ๋ฌผ ๊ธ€์“ฐ๊ธฐ: ์ฝœ์•„์›ƒ ๋ ˆ์ด์•„์›ƒ์„ ์•„์ด์ฝ˜ยท์ œ๋ชฉ ํ—ค๋”์™€ ๋ณธ๋ฌธ ์ค„๋ฐ”๊ฟˆ ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ. +- ๊ฒŒ์‹œ๋ฌผ ๊ธ€์“ฐ๊ธฐ: ์ฝœ์•„์›ƒ ์ œ๋ชฉ ์˜ต์…˜์„ ์˜ค๋ฅธ์ชฝ ๋ธ”๋ก ์„ค์ • ํŒจ๋„์— ์ถ”๊ฐ€. +- ๊ฒŒ์‹œ๋ฌผ ๊ธ€์“ฐ๊ธฐ: ์ฝœ์•„์›ƒ ์„ ์–ธ๋ถ€ `title` ์˜ต์…˜ ์ €์žฅยทํŒŒ์‹ฑ ์ถ”๊ฐ€. +- ๊ฒŒ์‹œ๋ฌผ ๊ธ€์“ฐ๊ธฐ: ์ƒˆ ์ฝœ์•„์›ƒ ๊ธฐ๋ณธ ์•„์ด์ฝ˜ ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ. + ## v1.5.53 - ๊ฒŒ์‹œ๋ฌผ ๊ธ€์“ฐ๊ธฐ: ๋ผ์ด๋ธŒ ๋ชจ๋“œ ์ฝœ์•„์›ƒ ๋ณธ๋ฌธ์„ ๋‹จ์ผ ๋ฉ€ํ‹ฐ๋ผ์ธ ํŽธ์ง‘ ์˜์—ญ์œผ๋กœ ์ •๋ฆฌํ•ด `Shift+๋ฐฉํ–ฅํ‚ค` ๋ฒ”์œ„ ์„ ํƒ์ด ๋‚ด๋ถ€ ์—ฌ๋Ÿฌ ์ค„์„ ๊ฐ€๋กœ์ง€๋ฅด๋„๋ก ์ˆ˜์ •. diff --git a/lib/markdown-callout.js b/lib/markdown-callout.js index 2b8be55..8107e4d 100644 --- a/lib/markdown-callout.js +++ b/lib/markdown-callout.js @@ -30,18 +30,67 @@ export const CALLOUT_BACKGROUND_SWATCHES = QUOTE_BACKGROUND_SWATCHES /** @type {string[]} */ export const CALLOUT_EMOJI_OPTIONS = ['๐Ÿ’ก', 'โš ๏ธ', 'โ—', 'โœ…', '๐Ÿ“Œ', '๐Ÿ”ฅ', '๐Ÿ’ฌ'] +/** + * ์˜ต์…˜ ์„ ์–ธ๋ถ€๋ฅผ key=value ํ† ํฐ ๋ชฉ๋ก์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. + * @param {string} input - ์˜ต์…˜ ๋ฌธ์ž์—ด + * @returns {string[]} ํ† ํฐ ๋ชฉ๋ก + */ +const tokenizeOptionString = (input) => { + const tokens = [] + const pattern = /[^\s"']+(?:"[^"]*"|'[^']*')?/g + const matches = String(input ?? '').match(pattern) + + return matches ? tokens.concat(matches) : tokens +} + +/** + * ์„ ์–ธ๋ถ€ ์˜ต์…˜ ๊ฐ’์„ ์ •๋ฆฌํ•œ๋‹ค. + * @param {string} value - ์›๋ณธ ๊ฐ’ + * @returns {string} ์ •๋ฆฌ๋œ ๊ฐ’ + */ +const normalizeOptionValue = (value) => { + const normalized = String(value ?? '').trim() + + if ((normalized.startsWith('"') && normalized.endsWith('"')) + || (normalized.startsWith("'") && normalized.endsWith("'"))) { + return normalized.slice(1, -1) + } + + return normalized +} + +/** + * ์„ ์–ธ๋ถ€ ์˜ต์…˜ ๊ฐ’์„ ์ง๋ ฌํ™”ํ•œ๋‹ค. + * @param {string} value - ์˜ต์…˜ ๊ฐ’ + * @returns {string} ์ง๋ ฌํ™” ๊ฐ’ + */ +const serializeOptionValue = (value) => { + const normalized = String(value ?? '').trim() + + if (!normalized) { + return '' + } + + if (/[\s"']/.test(normalized)) { + return `"${normalized.replace(/"/g, '\\"')}"` + } + + return normalized +} + /** * ์ฝœ์•„์›ƒ ์„ ์–ธ๋ถ€ ์˜ต์…˜์„ ํŒŒ์‹ฑํ•œ๋‹ค. * @param {string} line - ์ฝœ์•„์›ƒ ์„ ์–ธ ๋ผ์ธ - * @returns {{ calloutEmojiEnabled: boolean, calloutEmoji: string, calloutBackground: string }} + * @returns {{ calloutEmojiEnabled: boolean, calloutEmoji: string, calloutBackground: string, title: string }} */ export const parseCalloutOptions = (line) => { const options = { - calloutEmojiEnabled: true, + calloutEmojiEnabled: false, calloutEmoji: '๐Ÿ’ก', - calloutBackground: 'blue' + calloutBackground: 'blue', + title: '' } - const tokens = String(line ?? '').trim().split(/\s+/).slice(1) + const tokens = tokenizeOptionString(String(line ?? '').trim()).slice(1) tokens.forEach((token) => { const [rawKey, ...rawValueParts] = token.split('=') @@ -51,7 +100,7 @@ export const parseCalloutOptions = (line) => { } const key = rawKey.toLowerCase() - const value = rawValueParts.join('=').trim() + const value = normalizeOptionValue(rawValueParts.join('=')) if (key === 'emoji') { if (!value || value === 'none') { @@ -67,6 +116,11 @@ export const parseCalloutOptions = (line) => { if (key === 'bg' && CALLOUT_BACKGROUND_OPTIONS.includes(value)) { options.calloutBackground = value + return + } + + if (key === 'title') { + options.title = value } }) @@ -75,15 +129,17 @@ export const parseCalloutOptions = (line) => { /** * ์ฝœ์•„์›ƒ ์„ ์–ธ ์ค„์„ ๋งŒ๋“ ๋‹ค. - * @param {{ calloutEmojiEnabled?: boolean, calloutEmoji?: string, calloutBackground?: string }} options - ์˜ต์…˜ + * @param {{ calloutEmojiEnabled?: boolean, calloutEmoji?: string, calloutBackground?: string, title?: string }} options - ์˜ต์…˜ * @returns {string} ์„ ์–ธ ์ค„ */ export const buildCalloutOpenerLine = (options = {}) => { - const emojiEnabled = options.calloutEmojiEnabled !== false + const emojiEnabled = options.calloutEmojiEnabled === true const emoji = emojiEnabled ? (options.calloutEmoji || '๐Ÿ’ก') : 'none' const background = CALLOUT_BACKGROUND_OPTIONS.includes(options.calloutBackground) ? options.calloutBackground : 'blue' + const title = serializeOptionValue(options.title) + const titleOption = title ? ` title=${title}` : '' - return `:::callout emoji=${emoji} bg=${background}` + return `:::callout emoji=${emoji} bg=${background}${titleOption}` } diff --git a/lib/markdown-content-normalizer.js b/lib/markdown-content-normalizer.js index 5bb851c..e6d71cd 100644 --- a/lib/markdown-content-normalizer.js +++ b/lib/markdown-content-normalizer.js @@ -1,3 +1,5 @@ +import { buildCalloutOpenerLine } from './markdown-callout.js' + const BLANK_PARAGRAPH_MARKER = '' const blockSpacingTypes = new Set(['list']) @@ -59,13 +61,20 @@ const serializeLegacyBlock = (block = {}, index = 0, total = 1) => { } if (type === 'callout') { - const emoji = block.calloutEmojiEnabled === false - ? 'none' - : (block.calloutEmoji || '๐Ÿ’ก') - const background = block.calloutBackground || 'blue' - return text - ? { type, value: `:::callout emoji=${emoji} bg=${background}\n${text}\n:::` } + ? { + type, + value: [ + buildCalloutOpenerLine({ + calloutEmojiEnabled: block.calloutEmojiEnabled, + calloutEmoji: block.calloutEmoji, + calloutBackground: block.calloutBackground, + title: block.title + }), + text, + ':::' + ].join('\n') + } : null } diff --git a/lib/markdown-slash-commands.js b/lib/markdown-slash-commands.js index ba0360f..fa5c2e1 100644 --- a/lib/markdown-slash-commands.js +++ b/lib/markdown-slash-commands.js @@ -94,10 +94,10 @@ export const MARKDOWN_SLASH_COMMANDS = [ { id: 'callout', label: '์ฝœ์•„์›ƒ', - description: '๊ฐ•์กฐ ์•ˆ๋‚ด(์ฒซ ์ค„: :::callout emoji=๐Ÿ’ก bg=blue)', + description: '๊ฐ•์กฐ ์•ˆ๋‚ด(์ฒซ ์ค„: :::callout emoji=none bg=blue)', keywords: ['callout', 'notice', 'info', '์ฝœ์•„์›ƒ'], action: 'lines', - lines: [':::callout emoji=๐Ÿ’ก bg=blue', '', ':::'] + lines: [':::callout emoji=none bg=blue', '', ':::'] }, { id: 'toggle', diff --git a/package-lock.json b/package-lock.json index 4459904..61f4f5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sori.studio", - "version": "1.5.53", + "version": "1.5.54", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sori.studio", - "version": "1.5.53", + "version": "1.5.54", "hasInstallScript": true, "dependencies": { "@nuxtjs/tailwindcss": "^6.14.0", diff --git a/package.json b/package.json index 1f96cbb..55ab58b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sori.studio", - "version": "1.5.53", + "version": "1.5.54", "private": true, "type": "module", "imports": {