페이지 HTML 링크 속성 정규화

This commit is contained in:
2026-07-01 10:46:38 +09:00
parent 1a95e9c2fd
commit c6ca46bbb1
7 changed files with 55 additions and 5 deletions

View File

@@ -46,6 +46,15 @@ const htmlCursorRange = reactive({
end: 0
})
/**
* HTML 태그 내부의 스마트 따옴표를 표준 따옴표로 정규화한다.
* @param {string} value - 원본 HTML
* @returns {string} 정규화된 HTML
*/
const normalizeHtmlTagQuotes = (value) => String(value || '').replace(/<[^>]*>/g, (tag) => tag
.replace(/[“”]/g, '"')
.replace(/[‘’]/g, "'"))
const defaultHtmlDocument = `<!doctype html>
<html lang="ko">
<head>
@@ -376,6 +385,28 @@ const insertTextAtHtmlCursor = async (text) => {
htmlCursorRange.end = nextCursor
}
/**
* HTML textarea 붙여넣기 값을 정규화해 삽입한다.
* @param {ClipboardEvent} event - 붙여넣기 이벤트
* @returns {Promise<void>}
*/
const handleHtmlEditorPaste = async (event) => {
if (form.renderMode !== 'html_document') {
return
}
const text = event.clipboardData?.getData('text/plain') ?? ''
const normalizedText = normalizeHtmlTagQuotes(text)
if (text === normalizedText) {
return
}
event.preventDefault()
rememberHtmlCursor()
await insertTextAtHtmlCursor(normalizedText)
}
/**
* HTML 기본 문서 골격을 현재 본문에 채운다.
* @returns {Promise<void>}
@@ -491,7 +522,7 @@ const createPayload = () => ({
slug: pageSlug.value,
status: form.status,
renderMode: form.renderMode,
content: form.content,
content: form.renderMode === 'html_document' ? normalizeHtmlTagQuotes(form.content) : form.content,
featuredImage: form.listingImage.trim() || null,
isListed: Boolean(form.isListed),
isFeatured: Boolean(form.isListed && form.isFeatured),
@@ -506,6 +537,10 @@ const createPayload = () => ({
* @returns {void}
*/
const submitPage = () => {
if (form.renderMode === 'html_document') {
form.content = normalizeHtmlTagQuotes(form.content)
}
emit('submit', createPayload())
}
@@ -608,6 +643,7 @@ defineExpose({
@input="rememberHtmlCursor"
@keydown="handleHtmlEditorKeydown"
@keyup="rememberHtmlCursor"
@paste="handleHtmlEditorPaste"
@select="rememberHtmlCursor"
:placeholder="defaultHtmlDocument"
/>