미디어 슬래시 명령 종류 계산 분리

This commit is contained in:
2026-07-27 11:31:06 +09:00
parent 675c45092b
commit 3515cf0ccf
7 changed files with 37 additions and 6 deletions

View File

@@ -45,6 +45,7 @@ import {
} from '../../lib/markdown-editor-media.js'
import {
filterSlashCommands,
getMediaPickerKindFromSlashAction,
getSlashCommandFocusTarget,
getSlashCommandTextareaSelection,
insertMarkdownLinesAtSlashTarget,
@@ -2670,10 +2671,16 @@ const applyLiveSlashCommand = (command) => {
const line = liveSlashSourceLine.value
if (isMediaSlashAction(command.action)) {
const mediaKind = getMediaPickerKindFromSlashAction(command.action)
if (!mediaKind) {
return
}
liveSlashInsertLine.value = line
replaceLineRange(line, line, [], false)
onLiveSlashEnd()
openMediaPicker(command.action.replace('media-', ''))
openMediaPicker(mediaKind)
return
}

View File

@@ -60,7 +60,7 @@
| lib/markdown-image.js | 이미지 마크다운 직렬화·파싱, 단독 이미지 URL 판별 |
| lib/markdown-table.js | 공개 Markdown 표 행·구분선·정렬·블록 파싱 |
| lib/markdown-toc.js | 공개 게시글 TOC용 H1~H3 제목 추출과 앵커 ID 생성 |
| lib/markdown-slash-commands.js | 관리자 Markdown-first 에디터 슬래시 명령 목록과 삽입 줄 정의, 미디어 명령 action 판별, 미디어 명령 지연 commit 무시·슬래시 원문 줄 교체 삽입, 적용 후 포커스·textarea 선택 위치 계산 helper |
| lib/markdown-slash-commands.js | 관리자 Markdown-first 에디터 슬래시 명령 목록과 삽입 줄 정의, 미디어 명령 action·모달 종류 판별, 미디어 명령 지연 commit 무시·슬래시 원문 줄 교체 삽입, 적용 후 포커스·textarea 선택 위치 계산 helper |
| lib/markdown-slash-menu-position.js | 관리자 Markdown-first 에디터 슬래시 메뉴 뷰포트 위치 보정 helper |
| lib/markdown-slash-menu-scroll.js | 관리자 Markdown-first 에디터 슬래시 메뉴 선택 항목 표시용 scrollTop 계산 helper |
| lib/markdown-inline.js | 공개·관리자 공통 인라인 마크다운 파서, 링크·굵게·기울임·인라인 코드·첨자·인라인 색상 토큰(`::color[텍스트]`) 변환, 링크·굵게·기울임·색상 내부 중첩 인라인 문법과 `<br>` 줄바꿈 처리, 라이브 멀티라인 본문의 기본 불릿/번호 목록 HTML 변환과 contenteditable 목록 마커 기준 커서 offset 계산·직렬화 |
@@ -123,7 +123,7 @@
| tests/markdown-block-context.test.js | 관리자 블록 설정 패널의 활성 블록 컨텍스트 단위 회귀 테스트 |
| tests/markdown-editor-history.test.js | 관리자 Markdown 에디터 undo/redo 히스토리 항목과 선택 범위 보정 단위 회귀 테스트 |
| tests/markdown-editor-media.test.js | 관리자 Markdown 에디터 미디어 선택 helper의 종류·선택 가능 여부·미리보기·선택 상태·블록 생성 단위 회귀 테스트 |
| tests/markdown-slash-commands.test.js | 관리자 슬래시 명령 파싱·미디어 action·포커스 대상·textarea 선택 위치·원문 줄 교체 삽입 단위 회귀 테스트 |
| tests/markdown-slash-commands.test.js | 관리자 슬래시 명령 파싱·미디어 action·모달 종류·포커스 대상·textarea 선택 위치·원문 줄 교체 삽입 단위 회귀 테스트 |
| tests/markdown-slash-menu-scroll.test.js | 관리자 슬래시 메뉴 선택 항목 scrollTop 보정 단위 테스트 |
| tests/markdown-block-parser.test.js | 공개 Markdown 본문 블록 파싱 단위 회귀 테스트 |
| tests/markdown-fenced-meta.test.js | Markdown fenced 블록 시작·종료 줄 탐색, 본문 수집, 메타 파싱 단위 회귀 테스트 |

View File

@@ -1,5 +1,10 @@
# 업데이트 이력
## v1.11.88
- 관리자 Markdown 에디터의 미디어 슬래시 action → 미디어 선택 모달 종류 변환을 `markdown-slash-commands` helper로 분리.
- 슬래시 미디어 action 변환 단위 테스트 추가.
## v1.11.87
- 관리자 Markdown 에디터의 슬래시 명령 textarea 커서 복원 계산을 `markdown-slash-commands` helper로 분리.

View File

@@ -227,6 +227,21 @@ export const resolveSlashCommand = (query) => {
export const isMediaSlashAction = (action) => ['media-image', 'media-gallery', 'media-video', 'media-audio', 'media-file']
.includes(String(action || ''))
/**
* 미디어 슬래시 action에서 미디어 선택 모달 종류를 계산한다.
* @param {string} action - 명령 action
* @returns {'image'|'gallery'|'video'|'audio'|'file'|''} 모달 종류
*/
export const getMediaPickerKindFromSlashAction = (action) => {
const normalized = String(action || '')
if (!isMediaSlashAction(normalized)) {
return ''
}
return normalized.slice('media-'.length)
}
/**
* 라이브 모드 미디어 슬래시 명령 처리 중 지연 commit을 무시할지 확인한다.
* @param {Object} options - 판별 옵션

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "sori.studio",
"version": "1.11.87",
"version": "1.11.88",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "sori.studio",
"version": "1.11.87",
"version": "1.11.88",
"hasInstallScript": true,
"dependencies": {
"@nuxtjs/tailwindcss": "^6.14.0",

View File

@@ -1,6 +1,6 @@
{
"name": "sori.studio",
"version": "1.11.87",
"version": "1.11.88",
"private": true,
"type": "module",
"imports": {

View File

@@ -1,6 +1,7 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import {
getMediaPickerKindFromSlashAction,
getSlashCommandFocusTarget,
getSlashCommandTextareaSelection,
insertMarkdownLinesAtSlashTarget,
@@ -24,6 +25,9 @@ test('정확한 슬래시 명령과 미디어 액션을 판별한다', () => {
assert.equal(resolveSlashCommand('img')?.id, 'image')
assert.equal(isMediaSlashAction('media-image'), true)
assert.equal(isMediaSlashAction('lines'), false)
assert.equal(getMediaPickerKindFromSlashAction('media-image'), 'image')
assert.equal(getMediaPickerKindFromSlashAction('media-gallery'), 'gallery')
assert.equal(getMediaPickerKindFromSlashAction('lines'), '')
})
test('미디어 슬래시 명령 지연 commit은 같은 줄 slash 원문일 때만 무시한다', () => {