Skip to content

Task #237: export text, markdown 구현#293

Merged
edwardkim merged 2 commits into
edwardkim:develfrom
nameofSEOKWONHONG:feature/export-text-markdown
Apr 26, 2026
Merged

Task #237: export text, markdown 구현#293
edwardkim merged 2 commits into
edwardkim:develfrom
nameofSEOKWONHONG:feature/export-text-markdown

Conversation

@nameofSEOKWONHONG

Copy link
Copy Markdown
Contributor

변경 요약

text 생성과 markdown 생성 기능을 추가합니다.

./rhwp export-text "E:\workspace\rhwp\samples\20250130-hongbo_saved.hwp"
./rhwp export-markdown "E:\workspace\rhwp\samples\20250130-hongbo_saved.hwp"

관련 이슈

closes #237

테스트

  • cargo test 통과
  • cargo clippy -- -D warnings 통과
  • 관련 샘플 파일로 SVG 내보내기 확인
  • 웹(WASM) 렌더링 확인 (해당하는 경우)

스크린샷

@nameofSEOKWONHONG nameofSEOKWONHONG force-pushed the feature/export-text-markdown branch from 8775b7b to ff6d71b Compare April 24, 2026 07:50

@edwardkim edwardkim left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nameofSEOKWONHONG 님, rhwp 프로젝트 첫 기여를 환영합니다! 🎉

구조적 사고가 돋보이는 좋은 PR입니다. 기능·검증 모두 통과해서 곧 merge 진행 가능한 수준입니다. 아래에 (A) 이번 PR 에서 반영 권장, (B) 후속 커밋으로 보완 권장, (C) 향후 기여 시 참고할 프로젝트 규칙 순으로 정리드립니다.


👍 잘하신 점 (먼저)

  • 계층 분리가 깔끔함DocumentCore::extract_*_native 가 순수 데이터 추출, src/main.rs 는 I/O orchestration 만. rhwp의 기존 분리 원칙과 일치.
  • 이미지 2단계 폴백 — 컨트롤 참조 실패 시 bin_data_id 로 복구하는 get_bin_data_image_{data,mime}_native. 실제 현장 HWP 파일 품질을 고려한 방어적 설계.
  • 기존 API 재사용detect_clipboard_image_mime, build_page_tree, paginate() 등 프로젝트 자원을 잘 활용.
  • docstring 품질 — 각 pub 함수에 의도(TextLine 순회, 표 내부 중복 추출 방지)를 명확히 기록.
  • Known Issue 정직 공개page_count == 0 underflow, MIME 매핑 한계를 명시하고 후속 패치로 분리. 업스트림에 가장 환영받는 스타일.
  • CI + cargo clippy + test 모두 통과.

🔧 (A) 이번 PR 범위 내 — 작은 수정 요청

A1. 최종 보고서 내부 링크 깨짐

mydocs/report/task_m100_237_report.md 하단의 링크:

- 계획: [feature_text_markdown_export_plan.md](../plans/feature_text_markdown_export_plan.md)
- 단계: [feature_text_markdown_export_stage1.md](../working/feature_text_markdown_export_stage1.md)

실제 파일명은 task_m100_237.md / task_m100_237_stage1.md 로 갱신됐습니다. 링크를 실제 파일명에 맞게 수정 부탁드립니다.

A2. page_count == 0 가드

src/main.rsexport_text / export_markdown 에 이미 감지 후 return 은 있지만, 범위 오류 메시지 (페이지 번호가 범위를 벗어났습니다 (0~{page_count - 1}))가 page_count == 0 이전에 평가되면 underflow 합니다. 가드 위치 앞으로 이동하거나 page_count.saturating_sub(1) 사용 권장.

if p >= page_count {
    eprintln!("오류: 페이지 번호가 범위를 벗어났습니다 (0~{})", page_count.saturating_sub(1));
    return;
}

📋 (B) 후속 커밋(또는 후속 PR)으로 보완 권장

B1. 구현계획서 누락

rhwp의 하이퍼-워터폴 규칙상 mydocs/plans/task_m100_237_impl.md (구현계획서)가 필요합니다. 수행계획서와 구분되는 목적:

  • 수행계획서 (task_m100_237.md): WHY, WHAT, 범위, 리스크
  • 구현계획서 (task_m100_237_impl.md): HOW, 단계 분할, 파일별 diff 의도

CLAUDE.md 의 "문서 파일명 규칙" 섹션을 참고해 주세요.

B2. orders 갱신 누락

mydocs/orders/20260424.md 에 Task #237 섹션을 추가 부탁드립니다. 형식은 기존 섹션(예: ## 1. Task #265 — HWP 3.0 파일 감지 + 친절한 에러 메시지)을 참고.

B3. export-text / export-markdown 자동화 테스트

Known Issue에 본인도 기록하셨는데, 현재 수동 CLI 실행만 검증됐습니다. 최소 수준으로:

  • 텍스트 추출: 작은 샘플 로드 → 특정 문자열 포함 확인
  • 마크다운 추출: 이미지 토큰 치환 + assets 디렉터리 생성 확인
  • 통합 테스트 파일 (tests/export_text_markdown.rs) 신설 권장

B4. MIME 확장자 매핑 확장

image/tifftif, image/svg+xmlsvg 등 누락된 매핑을 보강해 주세요. 단순하므로 후속 커밋 1건으로 충분.

B5. 이슈 #237 본문 정리

이슈 #237 본문이 PR 템플릿 구조(변경요약/테스트/스크린샷)로 작성되어 있는데, 이는 PR용 템플릿입니다. 이슈는 증상/재현/기대 동작/제안 형식이 더 적합합니다. 이번 PR 이슈는 이미 CLOSED 상태이지만, 앞으로 이슈 작성 시 참고 부탁드립니다.


📖 (C) 향후 기여 시 참고할 프로젝트 규칙

rhwp는 하이퍼-워터폴 방법론을 채택하고 있어 일반적인 오픈소스보다 문서화가 엄격합니다. 다음 순서를 지켜주시면 리뷰가 빠르게 진행됩니다:

  1. 이슈 생성 (증상/재현/제안)
  2. 브랜치 생성 — 브랜치명은 local/task{번호} 형식 권장 (외부 기여자는 이번처럼 feature/* 도 허용)
  3. 수행계획서 (mydocs/plans/task_m100_{번호}.md) 작성 + 승인 요청
  4. 구현계획서 (task_m100_{번호}_impl.md) 작성 + 승인 요청
  5. 단계별 구현 + 단계 보고서 (mydocs/working/task_m100_{번호}_stage{N}.md) — 범위가 크면 분리
  6. 최종 보고서 (mydocs/report/task_m100_{번호}_report.md) + orders/ 갱신
  7. PR 생성 (위 문서들을 함께 커밋)

상세는 CLAUDE.md 참조. 이번 PR은 이미 상당 부분을 갖추셨으니 작은 보완만 하시면 됩니다.


다음 단계

A1, A2 만 이번 PR 에 반영 후 push 해주시면 merge 진행하겠습니다. B 항목은 별도 후속 PR 이나 추가 커밋으로 처리 가능합니다.

감사합니다! 앞으로도 많은 기여 부탁드립니다.

AzureAD\홍석원 and others added 2 commits April 26, 2026 21:17
작성자 산출물의 보고서 내부 링크가 feature_*.md 패턴이었으나 실제
파일명은 task_m100_237*.md 로 작성됨. 메인테이너 측에서 링크 정정.

A2 (page_count == 0 가드) 는 작성자가 본인 PR 본문에서 "미구현"
이라 자가 보고했으나 실제 코드 (src/main.rs:545, 665) 에는 이미
early return 가드가 있어 underflow 발생 가능성 없음 — 추가 수정
불필요.

closes edwardkim#237

Co-Authored-By: SEOKWON HONG <nameofSEOKWONHONG@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim edwardkim force-pushed the feature/export-text-markdown branch from ff6d71b to dc45587 Compare April 26, 2026 12:22
@edwardkim

Copy link
Copy Markdown
Owner

@nameofSEOKWONHONG 님 — 본 PR 메인테이너가 마무리 합니다.

처리

작성자 핵심 commit (ff6d71b) 을 origin/devel 위에 cherry-pick + 메인테이너가 다음 보강 후 admin merge 진행합니다:

  • A1 (보고서 내부 링크): feature_*.mdtask_m100_237*.md 정정 (commit dc45587)
  • A2 (page_count == 0 가드): 점검 결과 src/main.rs:545, 665 에 이미 early return 가드가 있어 underflow 발생 가능성 없음 — 추가 수정 불필요로 판단
  • author 보존: 작성자 commit author 정보 그대로 유지

검증

  • cargo build --release v0.7.6: ✅
  • cargo test --lib: 1008 passed ✅
  • cargo clippy --lib -D warnings: clean ✅
  • cargo check --target wasm32: clean ✅
  • 기능 검증: export-text / export-markdown 동작 확인 (biz_plan.hwp 6 페이지 → 6 txt/md 파일)

후속 (별도 후속 사이클)

PR #293 첫 review 코멘트의 (B) 항목들은 후속 사이클로 분리:

  • 구현계획서 (task_m100_237_impl.md) — 향후 작성 가능
  • export-text/markdown 자동화 테스트
  • MIME 확장자 매핑 확장 (tif, svg 등)

다시 한번 첫 기여 + 본 PR 의 깔끔한 계층 분리 (CLI orchestration vs DocumentCore::extract_*_native) 감사드립니다. 머지 진행합니다 🙏

@edwardkim edwardkim merged commit da55552 into edwardkim:devel Apr 26, 2026
6 checks passed
edwardkim added a commit that referenced this pull request Apr 26, 2026
@nameofSEOKWONHONG 의 PR 인수 (작업지시자 결정 — 작성자 응답 3d+).
cherry-pick + A1 보강 (보고서 링크) + admin merge (commit da55552).

A2 (page_count == 0 가드) 는 점검 결과 이미 정상 (early return) —
추가 수정 불필요.

Co-Authored-By: SEOKWON HONG <nameofSEOKWONHONG@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants