From a25306389b6a6bcd01fb2a13db122ec8e11ee815 Mon Sep 17 00:00:00 2001 From: zenn Date: Tue, 26 May 2026 11:03:33 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=A0=EC=A0=95=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20HTML=20=EB=AC=B8=EC=84=9C=20=EB=AA=A8=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20v1.5.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/admin/AdminPageForm.vue | 65 +++++++++++++++++++++- db/migrations/034_add_page_render_mode.sql | 14 +++++ docs/changelog.md | 9 +++ docs/history.md | 4 ++ docs/map.md | 9 +-- docs/spec.md | 10 +++- docs/update.md | 7 +++ package-lock.json | 4 +- package.json | 2 +- pages/pages/[slug].vue | 9 ++- server/middleware/html-page-renderer.js | 34 +++++++++++ server/repositories/content-repository.js | 4 ++ server/utils/admin-page-input.js | 10 +++- server/utils/content-schema.js | 1 + server/utils/sample-content.js | 1 + 15 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 db/migrations/034_add_page_render_mode.sql create mode 100644 server/middleware/html-page-renderer.js diff --git a/components/admin/AdminPageForm.vue b/components/admin/AdminPageForm.vue index 832e111..7754d9c 100644 --- a/components/admin/AdminPageForm.vue +++ b/components/admin/AdminPageForm.vue @@ -18,6 +18,7 @@ const emit = defineEmits(['submit']) const slugTouched = ref(Boolean(props.initialPage.slug)) const blockEditor = ref(null) +const htmlEditor = ref(null) const mediaItems = ref([]) const isMediaPickerOpen = ref(false) const isLoadingMedia = ref(false) @@ -26,6 +27,7 @@ const isUploadingFeaturedImage = ref(false) const form = reactive({ title: props.initialPage.title || '', slug: props.initialPage.slug || '', + renderMode: props.initialPage.renderMode || 'markdown', content: props.initialPage.content || '', featuredImage: props.initialPage.featuredImage || '' }) @@ -140,9 +142,23 @@ const uploadFeaturedImage = async (event) => { * @returns {void} */ const focusContentEditor = () => { + if (form.renderMode === 'html_document') { + htmlEditor.value?.focus() + return + } + blockEditor.value?.focusFirstBlock() } +/** + * 페이지 작성 모드를 변경한다. + * @param {'markdown'|'html_document'} mode - 페이지 작성 모드 + * @returns {void} + */ +const setRenderMode = (mode) => { + form.renderMode = mode +} + /** * 페이지 입력값 제출 * @returns {void} @@ -151,6 +167,7 @@ const submitPage = () => { emit('submit', { title: form.title.trim(), slug: toSlug(form.slug || form.title), + renderMode: form.renderMode, content: form.content, featuredImage: form.featuredImage.trim() || null }) @@ -170,12 +187,58 @@ const submitPage = () => { @keydown.enter.prevent="focusContentEditor" > -
+
+