v1.2.9: 라이브 에디터·홈 피드·메인 커버 개선

라이브 모드 코드/콜아웃/토글 편집, 슬래시 명령, 홈 Latest List·Compact·Cards 보기,
사이트 설정 메인 화면 커버(720px) 및 HomeHero 반영.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-18 16:57:30 +09:00
parent 666bd304fc
commit 3fb8a40031
34 changed files with 3823 additions and 443 deletions

View File

@@ -110,6 +110,118 @@ export const isEmptyQuoteMarkerLine = (line) => {
return !stripQuoteMarker(line).trim()
}
/**
* 이전 마크다운 줄 끝에 텍스트를 이어 붙인다.
* @param {string} line - 이전 줄
* @param {string} appendText - 붙일 본문
* @returns {string} 병합된 줄
*/
export const appendTextToMarkdownLine = (line, appendText) => {
const prev = String(line ?? '')
const add = String(appendText ?? '')
if (!add) {
return prev
}
const ordered = parseOrderedListMarker(prev)
if (ordered) {
return `${ordered.number}. ${ordered.body}${add}`
}
if (hasQuoteMarker(prev)) {
const body = stripQuoteMarker(prev)
return `> ${body}${add}`
}
if (hasListMarker(prev, false)) {
const body = stripListMarker(prev, false)
return `- ${body}${add}`
}
return `${prev}${add}`
}
/**
* 편집 값에서 이전 줄에 붙일 본문만 추출한다.
* @param {string} value - 편집 값
* @param {string} previousLine - 이전 마크다운 줄
* @param {boolean} raw - 원문 모드 여부
* @returns {string} 본문
*/
export const getAppendTextForMerge = (value, previousLine, raw = false) => {
const text = String(value ?? '').trim()
if (!text) {
return ''
}
if (raw) {
if (hasQuoteMarker(text)) {
return stripQuoteMarker(text)
}
if (hasListMarker(text, true)) {
return stripListMarker(text, true)
}
if (hasListMarker(text, false)) {
return stripListMarker(text, false)
}
return text
}
if (hasListMarker(previousLine, true)) {
return stripListMarker(text, true)
}
if (hasListMarker(previousLine, false)) {
return stripListMarker(text, false)
}
if (hasQuoteMarker(previousLine)) {
return stripQuoteMarker(text)
}
return text
}
/**
* 줄 병합 후 편집 영역에 둘 커서 오프셋(이전 줄 본문 끝)을 반환한다.
* @param {string} previousLine - 이전 마크다운 줄
* @param {boolean} [raw=false] - 원문 모드 여부
* @returns {number} 표시 텍스트 기준 오프셋
*/
export const getMergeJunctionDisplayOffset = (previousLine, raw = false) => {
const prev = String(previousLine ?? '')
if (raw) {
return prev.length
}
const ordered = parseOrderedListMarker(prev)
if (ordered) {
return ordered.body.length
}
if (hasListMarker(prev, true)) {
return stripListMarker(prev, true).length
}
if (hasListMarker(prev, false)) {
return stripListMarker(prev, false).length
}
if (hasQuoteMarker(prev)) {
return stripQuoteMarker(prev).length
}
return prev.length
}
/**
* 제목 접두사 제거
* @param {string} value - 원본