-
{{ emoji || '๐ก' }}
-
-
-
+
+
+
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/
- ๋ฏธ๋์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋จ์ผ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๋ฉด `` ํ์์ผ๋ก ์ฝ์
ํ๋ค.
- ๋ฏธ๋์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๋ฉด `:::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": {