← 목록
기타 2026-07-15 4KB 읽기 4분

크라우니 오피스 문서 편집기 — punch #7 댓글 CRUD + 선택 텍스트 앵커링

개요

문서기능-판정표.md punch #7(댓글 CRUD + 선택 텍스트 앵커링) 구현 완료. 기존 브릿지 1~6차(서식·상태바·실행취소·찾기·삽입·개요) 패턴을 그대로 이어 crownyBridge.js에 섹션 11을 추가. 앱 번들(bundle/office/app/index.html)과 네이티브(crowny-browser.m/ crowny-shell.m/Makefile) 무수정.

무엇을 했는지

  • 댓글 데이터 계층: 프레임워크의 하드코딩 2건(commentDefs)을 브릿지가 완전히
인수(섹션 10 개요와 동일 전략) — 프레임워크가 소유한 렌더를 매 틱 시그니처 비교로 대체. 각 댓글 = {id, author, initial, time, quote, text, resolved, range(라이브 DOM Range), replies[]}.
  • 선택 텍스트 앵커링: "+ 선택한 텍스트에 댓글" 죽은 div + 툴바 💬 버튼 양쪽에
리스너 부착. 선택 영역을 라이브 Range 클론으로 보관(편집에 자동 추적, 찾기처럼 매 틱 재계산 불필요). CSS Custom Highlight API로 비파괴 하이라이트(::highlight(crowny-comment)).
  • 답글: 카드별 "답글" 클릭 → 인라인 textarea 작성창 → 저장 시 답글 배열에 추가.
  • 해결/재열기 + 삭제: 브릿지가 통일된 해결 토글(라벨/투명도) + 하드 삭제(카드
제거, 목록 감소) 제공 — 원본 2건과 신규 댓글 모두 동일 동작.
  • 댓글 버튼→탭 전환: 💬 클릭 시 기존 실작동 "패널 탭 전환"을 합성 클릭으로 재사용해
댓글 탭으로 전환 + 선택 있으면 새 댓글 흐름 자동 개시.
  • 한선씨 정본: bundle/office/bridge/댓글모델.한선 신규 — crowny-word
주석변경추적.한선 이식(주석추가/답글추가/오프셋조회 패턴) + 인용/해결여부 필드 추가 + 하드삭제(연쇄삭제)로 변형. 자체시험 21/21 PASS.

실측 중 발견/수정한 버그

우패널 탭(스타일/서식/댓글/히스토리) 라벨이 {{ pt.label }} 보간이라 실제로는 <div><span class="sc-interp">댓글</span></div> 구조(자식 1개) — 처음 작성한 findPanelTabByLabel이 다른 섹션(fmtButtonFor 등)의 "children.length===0 리프" 관용구를 그대로 재사용했다가 탭을 못 찾는 버그 발생. CDP 실측으로 발견 후 children.length 조건 제거, 정확한 텍스트 일치만으로 판별하도록 수정.

관련 파일

  • /Users/ef/crownybrowser/bundle/office/bridge/crownyBridge.js — 섹션 11(댓글 CRUD),
schedule()에 renderCommentsIfNeeded()/applyCommentHighlights() 추가
  • /Users/ef/crownybrowser/bundle/office/bridge/댓글모델.한선 — 신규, 한선씨 정본
  • /Users/ef/crownybrowser/spec/문서기능-판정표.md — punch #7 정의
  • /Users/ef/crownybrowser/spec/오피스-개발계획.md — Phase 1-A 순서 6번

게이트 통과 (CDP :9333, /tmp/crowny-cdp, 새로고침 단일주입 실측)

  1. hanseonc_high 댓글모델.한선 컴파일 + crownyc run → 21/21 PASS
  2. node --check crownyBridge.js 통과, native/CrownyAI 3초 생존(무변경) 확인
  3. 실측(before→after):
- ① 선택 텍스트 + "선택한 텍스트에 댓글" → 카드 2→3, 인용/본문 포함, 하이라이트 Range 3건 등록 - ② 답글 추가 → 카드 안에 답글 표시됨 - ③ 해결 토글 → 라벨 "해결"→"✓ 해결됨"(opacity 0.55) → 재클릭 시 원복 - ④ 삭제 → 카드 수 3→2 감소, 해당 id 완전 제거 - ⑤ 회귀: B서식(<b> 실적용) · 상태바(99→100단어 실시간) · undo(⌘Z로 REGTEST123 제거, 버튼 활성/비활성 색 정상) · 찾기("가격" 1/1 매치) · 표 삽입(1→2) · 개요(3항목 스캔 + 클릭 시 active 마킹) 전부 정상 — 회귀 없음

잔여 이슈

  • 찾기 입력창(input[placeholder="검색어…"])은 프레임워크 controlled 컴포넌트라,
find가 열린 상태에서 다른 프레임워크 setState(탭 전환 등)가 발생하면 표시 값이 리셋될 수 있음(punch #4 기존 구조적 특성, 내 변경으로 인한 회귀 아님 — 브릿지 자체 매치 로직은 입력 값을 직접 재조회해 독립적으로 동작).
  • 댓글 작성자는 고정값 "나"(로그인/사용자 식별 시스템이 앱에 없음) — 추후 실사용자
식별 연동 시 교체 필요.
  • Phase 1-A 남은 항목: 히스토리 실스냅샷(#8), 키보드 단축키 배선(#9),
툴바 드롭다운 3종(#10).