크라우니캔버스 에디터 — 내용보존 블록변환 (P0-1)
개요
경쟁제품 연구(docs/10-경쟁제품-연구.md §③ P0-1)에 따라, 크라우니캔버스 위키 에디터(1b)에
"문단↔제목↔리스트↔토글↔체크 등 블록 타입 전환 시 내용·자식 무손실" 기능을 추가했다.
기존 슬래시 팔레트 선택 및 (미사용 상태였던) 블록교체 함수는 블록을 통째로 새 객체로
교체해 내용·자식을 항상 날려버리는 구조였다 — 이번 작업으로 텍스트 계열 사이 전환은
내용을 보존하도록 수리하고, 블록 핸들(⋯) 메뉴에 "전환" 서브메뉴를 신설했다.
무엇을 했는지
- editor.js
-
블록전환(idx, 파레트키) 신설: 이전종류/새종류가 둘 다 텍스트 계열
(문단/제목1-3/불릿/번호/체크/토글/인용/콜아웃/코드)이면
내용·
자식을 그대로 두고
종류만 바꾸고, 종류별 부속 속성(토글=펼침, 체크=완료)만 안전 이관.
비호환 전환(위젯/컬렉션뷰 등)은 기존처럼 새 기본값으로 교체(데이터 성격 불일치 — 명시적).
- 기존 미사용
블록교체(idx, 종류)는
블록전환으로 위임하는 하위호환 별칭으로 축소.
- 슬래시 팔레트 항목 선택 핸들러가 블록을 통째로 교체하던 코드를
블록전환 호출로 교체
(슬래시 트리거 텍스트만 제거하고 나머지 내용은 보존).
- 블록 행 컨트롤에 "⋯"(더보기) 버튼 추가 →
핸들메뉴열기(anchor, 블록)가
"전환 — 내용 보존" 팝업(문단/제목1-3/불릿/번호/체크/토글/인용/콜아웃 10항목)을 띄우고,
항목 클릭 시
블록전환 호출. 외부 클릭(document mousedown capture)·Escape로 닫힘.
- 한선씨/에디터.한선 (동반 파리티, 판정 로직 정본)
-
텍스트계열인가(종류) — 11개 텍스트 계열 종류 판정.
-
전환_내용보존되나(이전종류, 새종류) — 1=보존/2=동일종류 무동작/0=비호환 교체.
-
전환후_속성유지키(새종류) — 토글→"펼침", 체크→"완료", 그 외 없음.
- 셀프테스트 13건 추가(텍스트계열 판정 4 + 전환판정 6 + 속성유지키 3).
검증
node --check 앱/화면/editor.js → 통과
hanseonc_high STRICT 컴파일 → 경고 0, 12147 큐브 생성
crownyc run (환경변수 에디터_셀프테스트=1) → 40/40 PASS (기존 27건 + 신규 13건)
- 크라우니코드: lookup/search MISS(신규 로직) → 학습 1건 추가(
블록전환_내용보존_텍스트계열판정, 별칭 블록전환)
관련 파일
/Users/ef/crowny-canvas/앱/화면/editor.js
/Users/ef/crowny-canvas/한선씨/에디터.한선
/Users/ef/crowny-canvas/docs/10-경쟁제품-연구.md (§③ P0-1 근거)
/Users/ef/crowny-canvas/docs/07-앱-계약.md (블록 계약)
잔여 이슈
- 위젯류(컬렉션뷰/버튼/CAD뷰어 등) ↔ 텍스트 계열 상호 전환은 여전히 데이터 초기화(의도된 동작,
구조 불일치이므로 P0-1 범위 밖). 필요 시 별도 "부분 보존"(예: 텍스트 내용을 위젯 설정 필드로
매핑) 설계는 후속 과제.
- 블록 핸들 메뉴는 현재 "전환"만 제공 — 삭제/복제/색상 등 다른 항목은 별도 요청 시 추가.
- LaunchAgent org.crowny.canvas(:9620) 라이브 리로드는 정적 파일 서빙이라 브라우저 새로고침만
하면 반영됨(서버 재기동 불요) — 별도 curl 종단검증은 미실행(요청 범위=에디터.js·에디터.한선 한정).