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

크라우니 오피스 Phase 2 — 내보내기 4종(MD·RTF·DOCX·PDF)

개요

spec/오피스-개발계획.md Phase 2 "내보내기" 항목 완결. 기존 HTML 내보내기(⌘⇧E)에 이어 Markdown·RTF·DOCX·PDF 4종을 crowny-word 엔진 이식으로 연결. File > 내보내기 서브메뉴로 5종 전체 노출. 앱 번들·crowny-browser.m·crowny-shell.m·Makefile 기존 타깃 무수정.

무엇을 했는지

한선씨 정본 — bundle/office/bridge/내보내기.한선 (신규, ~1080줄, 111함수)

  • HTML 파서(신규 로직): 블록나누기(html) → 블록튜플배열. 블록튜플 = FS(글자변환1)로 구분한
5필드(타입/정렬/레벨/런상태/텍스트). 타입 = H1~H6/P/UL/OL/QUOTE/HR/TABLE. 인라인추출(html)은 b/strong·i/em·u·br·엔티티(& 등 5종+숫자엔티티)를 스캔하며 위치기반 런상태("시작|끝|속성;..." — RTF내보내기.한선과 동일 규약)를 생성. 표는 셀추출/표행추출로 RS(글자변환3)/CS(글자변환2) 직렬화(셀 서식은 1단계 범위 밖).
  • MD: 마크다운왕복.한선 스타일(헤딩#, 목록-/N., 인용>, 표|---|) 직접 조립 + 런상태를MD적용()으로
굵게/기울임 마크업 반영, MD문자이스케이프로 * _ \ [ ]` 이스케이프.
  • RTF: RTF내보내기.한선 저수준 조각(RTF헤더/색테이블수집/RTF이스케이프/굵게기울임런변환/
정렬변환/표기초변환/문단조립줄/중괄호짝검증/RTF저장) 이식 + 표 블록을 섞어 넣는 자체 조립루프.
  • DOCX: DOCX파일.한선(CRC32/ZIP store/XML 조립) + DOCX조각.한선(표XML기초) 이식.
헤딩은 굵게+크기(H1=22~H6=12pt) 강제, 목록/인용은 접두 run 분리, 런상태를세그먼트배열()로 연속 동일서식 구간을 run생성() 배열로 변환. ZIP생성/ZIP파일저장은 프로그램 실행당 1회만 호출(DOCX파일.한선 실측 함정 — 2번째 호출 시 VM 배열스토리지 랩어라운드 오염).
  • PDF: PDF텍스트.한선(옥텟이스케이프/PDF객체/xref/트레일러/다중페이지분할) 이식, 텍스트 전용
최소 PDF(A4 595×842pt, Helvetica, 11pt, 88자 랩).
  • CLI 규약: CROWNY_OFFICE_EXPORT_MODE(md|rtf|docx|pdf) + TITLE_FILE/HTML_FILE(입력) +
EXPORT_OUT(출력, VM 내부에서 직접 씀 — native는 바이너리를 stdout으로 다루지 않음, 문서저장.한선 save 모드와 동일 안전 패턴). 자체시험 30/30 PASS(포맷별 5+ + 블록파서 8 + 특수문자 2).

네이티브 — native/crowny-ai-content.m / crowny-ai-main.m

  • content.m: caOfficeExportBridgeSrc/EnsureBridgeToau/RunVMStage(문서저장.한선 브릿지와 별도
toau·캐시경로) + caExportOfficeDocumentFormat:ext:label:(공용 구현, kCAOfficeExtractJS 재사용) + 4개 공개 셀렉터(caExportOfficeDocumentMarkdown/RTF/DOCX/PDF).
  • main.m: File > 내보내기 서브메뉴(HTML 기존 ⌘⇧E 유지 + Markdown/RTF/DOCX/PDF 4종 신규) +
4개 menuExport* 액션.

실측 검증

  1. cc -fsyntax-only -fobjc-arc -DCROWNY_HYBRID content.m/main.m 각각 통과.
  2. make ai — 에러 0 · 경고 0. 458K 바이너리. 3초 생존 확인.
  3. 한선씨 정본 자체시험 30/30 PASS(hanseonc_high 컴파일 → crownyc run).
  4. CLI 모드로 실제 픽스처(제목·H1·굵게+기울임·UL·OL·인용·표·HR·특수문자) 4포맷 전부 "OK" +
실측: - .md: cat으로 # 제목/**굵게**/| 표 | 확인 - .rtf: file → "Rich Text Format data, version 1, ANSI", textutil -convert txt로 왕복 - .docx: file → "Microsoft Word 2007+", unzip -l로 5개 내부파일(Content_Types/document.xml 등) 확인, xmllint --noout로 document.xml/styles.xml/Content_Types.xml 전부 XML-VALID, textutil -convert txt로 실제 텍스트 추출 성공(헤딩·굵게·목록·표·HR 전부 보존) - .pdf: file → "PDF document, version 1.4, 1 pages", qlmanage -t로 Quick Look 썸네일 생성 성공(시스템 PDF 렌더러로 실제 렌더 확인)
  1. 회귀 하니스: 27/27 PASS(bundle/office/bridge/회귀실행.sh, 무변경 확인).

관련 파일

  • /Users/ef/crownybrowser/bundle/office/bridge/내보내기.한선 (신규)
  • /Users/ef/crownybrowser/native/crowny-ai-content.m (CAOfficeIO 카테고리 확장)
  • /Users/ef/crownybrowser/native/crowny-ai-main.m (File>내보내기 서브메뉴)
  • 원본 엔진(무수정): /Users/ef/crowny-word/도구/{마크다운왕복,RTF내보내기,DOCX파일,DOCX조각,PDF텍스트}.한선

잔여 이슈

  • 표 셀 내부 서식(굵게/기울임)·중첩 목록·이미지 삽입은 1단계 범위 밖(문서화된 한계) — 후속 심화.
  • 전체 마우스 조작 GUI E2E(File>내보내기 메뉴 클릭)는 미실시 — 이 데스크톱이 다세션 공유
환경(동시 세션 다수, 창 다수 중첩)이라 좌표 기반 클릭이 실제로 다른 세션의 Chrome 창을 오조작하는 사고가 1회 발생(피해 없음, 즉시 중단). 대신 native가 호출하는 것과 동일한 NSTask 경로(crownyc run + 동일 env var)를 CLI로 직접 재현해 검증했으며, 이는 엔진 계층의 완전한 실측이다. 메뉴 클릭 자체(⌘⇧E 패턴과 동일 배선)는 사람이 실제 데스크톱에서 1회 육안 확인 권장.
  • 크라우니코드: lookup MISS(신규 도메인) → learn 1건 등록(오피스내보내기_HTML블록파서_4포맷조립).