← 목록
기타 2026-07-14 5KB 읽기 5분

크라우니 오피스 문서 편집기 — 찾기/바꾸기 실동작 (punch #4)

개요

spec/오피스-개발계획.md "두뇌 연결 = 한선씨 엔진 브릿지" 순서의 punch #4(찾기/바꾸기)를 crownyBridge.js(즉시층)에 이어붙였다. 앱 번들(bundle/office/app/index.html) 무수정. punch #1(서식)·#2(상태바)·#3(실행취소)와 동일 패턴(콘텐츠 마커 기반 요소 탐색, DOM 재렌더 방어, 실행취소 스택 재사용).

무엇을 했는지

  • 판정표 실측: 찾기바 카운트는 하드코딩 정적 문자열과 비교(라이브 텍스트 무시), 매치
하이라이트 전무, 바꾸기/모두 바꾸기 버튼 onClick 없음, ⌘F 미동작 — 전부 확인.
  • crownyBridge.js에 섹션 8 "찾기/바꾸기" 추가(약 250줄):
  • 라이브 contenteditable 텍스트를 TreeWalker로 순회해 텍스트↔DOM오프셋 매핑, 대소문자
  • 무시 겹침없는 매치 계산.
  • 하이라이트는 CSS Custom Highlight API(CSS.highlights + ::highlight())로 비파괴
  • 적용 — DOM에 <mark>/span을 전혀 삽입하지 않아 실행취소 스택·MutationObserver·단어수 통계를 오염시키지 않음.
  • 다음/이전 순환 이동(Enter/⇧Enter), 매치 위치로 scrollIntoView.
  • 바꾸기(현재 매치 1개)/모두 바꾸기(뒤→앞 역순 Range 처리로 오프셋 보존) — 둘 다 편집
  • 연산이므로 기존 commitSnapshot()(punch #3 실행취소 스택) 재사용해 하나의 undo 단계로 커밋.
  • ⌘F=찾기바 열고 입력창 포커스(브라우저 기본 찾기 차단)/Esc=앱의 기존 닫기 토글 재사용+
  • 하이라이트 정리.
    • 한선씨 정본 bundle/office/bridge/찾기치환.한선 신규(디렉토리 관례: 도메인별 미러,
    전체파일 crownyBridge.한선 아님) — crowny-word 검색치환.한선·찾기고급.한선 이식. 매치전부/카운트텍스트/순환인덱스/구간치환/치환전부매치 + 단어경계 옵션. 자체시험 15/15.

    함정 2건 (실측 중 발견)

    1. VM % 연산자는 C스타일이 아니다. crownyc/CLAUDE.md: "나눗셈 자연반올림, 13%5=-2,
    |나머지|≤|제수|/2(음수 가능)". (현재-1+총개수) % 총개수 식의 순환 인덱스 계산이 전부 깨짐(2%3=-1, 5%3=-1 등) — 루프 기반 범위내로() 정규화 함수로 대체.
    1. new Highlight(rangeArray)는 예외를 던진다 — 생성자는 배열이 아니라 가변인자
    (...ranges)를 받는다. CSS.highlights.set('crowny-find', new Highlight(...allRanges))로 수정. (window.onerror 캡처로 확인: TypeError: parameter 1 is not of type 'AbstractRange')

    실측 결과 (CDP :9333, headless Chrome, 단일 주입 상태에서)

    TESTINSERT 마커 CROWNYFINDTEST9981 3곳 삽입 후:

    항목beforeafter
    찾기 카운트(하드코딩, 항상 "일치 없음")"1/3" 정확
    하이라이트없음CSS.highlights allRanges=2 + activeRanges=1 = 3
    다음/이전미동작"1/3"→"2/3"→"1/3"
    모두 바꾸기onClick 없음마커 3→0, "ZZFOUND" 0→3
    ⌘Z(모두바꾸기 직후)-마커 0→3, ZZFOUND 3→0 복원
    바꾸기(단일)onClick 없음마커 3→2, "ONE" 0→1, 카운트 "1/3"→"1/2"
    Esc미동작바 display:none(앱 기존 로직), 하이라이트 정리됨
    회귀: B 서식-정상(볼드 적용 확인 후 원복)
    회귀: 상태바"99단어·325자""102단어·379자"(마커 3개 반영, 실시간)
    회귀: 실행취소 아이콘-정상 색상
    Runtime 에러-0건(window.onerror 캡처)
    빌드: make ai — 네이티브 무변경(재빌드 스킵), ./CrownyAI 3초+ 생존 확인 후 정리. crowny-browser.m/crowny-shell.m/Makefile/bundle/office/app/index.html mtime 전부 이번 세션 이전 — 무수정 확인.

    관련 파일

    • /Users/ef/crownybrowser/bundle/office/bridge/crownyBridge.js (섹션 8 추가, 724줄)
    • /Users/ef/crownybrowser/bundle/office/bridge/찾기치환.한선 (신규, 267줄, 자체시험 15/15)
    • /Users/ef/crownybrowser/spec/문서기능-판정표.md (punch #4 근거)
    • /Users/ef/crownybrowser/spec/오피스-개발계획.md (두뇌 연결 순서)

    잔여 이슈

    • 대소문자 구분/전체단어 옵션은 찾기치환.한선에 함수(매치전부옵션)로 준비돼 있으나
    앱 UI에 토글이 없어 브릿지는 항상 대소문자무시 모드로만 호출(추후 UI 추가 시 바로 연결 가능).
    • 여러 텍스트노드에 걸친 매치(굵게/기울임 등 서식 경계를 가로지르는 매치)는 Range API로
    구조상 처리되지만 별도 실측은 안 함(현재 문서에 그런 경계 매치 케이스가 없었음).
    • punch #5(삽입 3종: 표/이미지/링크)가 다음 순서.