현재 진행 중이거나 곧 시작할 작업 항목들입니다.
extract_imagesextract_images (node/web/react-native 공통)extractImages(data: Array<number>, options?: ExtractImagesOptions): ExtractImagesResultextract_images_to_dir (디렉토리에 저장하는 버전)crates/hwp-core/src/viewer/image.rs (새 파일)packages/hwpjs/src/lib.rspackages/hwpjs/index.d.ts반환 형식:
interface ExtractImagesResult {
images: Array<{
id: string;
data: Uint8Array;
format: string; // "jpg", "bmp", "png" 등
}>;
paths?: string[]; // output_dir 옵션 사용 시
}parse_summary_information_jsonparse_summary_information_json (node/web/react-native 공통)parseSummaryInformationJson(data: Array<number>): stringcrates/hwp-core/src/lib.rs (완료)packages/hwpjs/src/lib.rs (필요)examples/cli/ (필요)examples/web/ (필요)packages/hwpjs/index.d.ts (필요)반환 형식:
interface SummaryInformation {
title?: string;
subject?: string;
author?: string;
keywords?: string;
comments?: string;
last_saved_by?: string;
revision_number?: string;
last_printed?: string;
create_time?: string;
last_saved_time?: string;
page_count?: number;
date_string?: string;
para_count?: number;
}.a 정적 라이브러리 파일들이 여러 아키텍처에 대해 포함됨arm64-v8a, armeabi-v7a, x86, x86_64 (4개 아키텍처)ios-arm64, ios-arm64_x86_64-simulator (2개 아키텍처)Cargo.toml에 [profile.release] 추가 (workspace 전체 적용)
lto = "fat" (Link Time Optimization - 공격적 최적화)strip = true (모든 디버그 정보 제거)codegen-units = 1 (단일 코드 생성 단위)opt-level = "z" (최대 크기 최적화)panic = "abort" (unwind보다 작음)crates/hwp-core/Cargo.toml에도 동일한 최적화 적용package.json의 files 필드에 추가 제외 항목:
!android/build/**!android/.cxx/**!android/.gradle/**!android/.idea/**!ios/build/**!ios/Pods/**!ios/*.xcworkspace!**/*.logpackages/hwpjs/android/build.gradle의 release 빌드에 최적화 플래그 추가:
cppFlags "-O3 -flto -ffunction-sections -fdata-sections"x86, x86_64 제외 시 약 37MB 추가 감소 가능default-features = false 적용으로 추가 3-7% 감소 가능--gc-sections, --as-needed 플래그로 추가 2-5% 감소 가능Cargo.toml (workspace 루트)crates/hwp-core/Cargo.tomlpackages/hwpjs/package.json (files 필드)packages/hwpjs/android/build.gradlepackages/hwpjs/scripts/check-package-size.sh.a 파일 크기는 최종 앱 번들 크기에 직접적으로 영향을 줌.a 파일이 앱 번들에 포함됨packages/hwpjs/target 디렉토리가 별도로 생성되어 빌드 아티팩트가 중복 저장됨target 디렉토리를 workspace 루트의 target으로 심링크하도록 옵션 추가craby.toml에 target_symlink 옵션 추가true (기본값: false)[project]
name = "hwpjs"
source_dir = "src-reactnative"
target_symlink = true # workspace 루트의 target으로 심링크
[android]
package_name = "rs.craby.hwpjs"
[ios]packages/hwpjs/scripts/create-target-link.ts 스크립트를 Craby에 통합mklink /D 명령어 사용 (관리자 권한 필요)ln -s 사용target 디렉토리가 존재하는 경우 처리 방법 결정 필요toMarkdown과 extract_images 함수가 이미지 데이터만 반환하고, 실제 HWP 문서에서 렌더링되는 크기 정보는 포함하지 않음ImageData 구조체에 width, height 필드 추가 (옵션)crates/hwp-core/src/document/bodytext/shape_component_picture.rs에서 크기 정보 추출packages/hwpjs/src/lib.rs의 ImageData 구조체packages/hwpjs/dist/index.d.tsShapeComponentPicture에서 border_rectangle_x, border_rectangle_y의 크기 정보 추출ImageData에 width?: number, height?: number 필드 추가 (옵션)undefined 반환border_rectangle_x와 border_rectangle_y의 차이로 인한 크기 계산 방법 결정 필요bridging-generated.hpp에서 ArrayBuffer를 rust::Vec<uint8_t>로 변환하는 코드가 크래시 발생
vec.reserve(size); std::memcpy(vec.data(), data, size);rust::Vec는 set_len이 private이어서 reserve만으로는 크기가 설정되지 않음memcpy가 유효하지 않은 메모리에 접근하여 크래시 발생packages/hwpjs/crates/lib/src/ffi.rs에 create_vec_from_slice 함수 추가
ArrayBuffer를 rust::Vec<uint8_t>로 안전하게 변환하는 Rust 함수data.to_vec()를 사용하여 최적화된 메모리 복사 수행packages/hwpjs/cpp/bridging-generated.hpp에서 createVecFromSlice 사용하도록 수정
memcpy 방식 대신 Rust 함수 호출로 변경ArrayBuffer를 받아 rust::Slice<const uint8_t>로 변환rust::Vec<uint8_t> 생성rust::Vec는 set_len이 private이어서 직접 memcpy 사용 불가to_vec()이 SIMD 최적화 가능하여 충분히 빠름packages/hwpjs/crates/lib/src/ffi.rs: create_vec_from_slice 함수 추가 (커스텀)packages/hwpjs/cpp/bridging-generated.hpp: Bridging<rust::Vec<uint8_t>> 수정 (커스텀)packages/hwpjs/src-reactnative/NativeReactNative.ts: ArrayBuffer 타입 사용examples/react-native/src/App.tsx: ArrayBuffer 변환 로직 수정Array<ImageData> 형태의 타입을 인식하지 못함ToMarkdownResult 인터페이스에서 images: ImageData[] 형태를 사용할 수 없음ToMarkdownResult 내부의 ImageData[])를 인식하지 못함ERROR [as_rs_type] Unsupported type annotation: Ref(RefTypeAnnotation { ref_id: ReferenceId(0), name: "ImageData" })ToMarkdownResult에서 images 필드를 제거하고 마크다운만 반환to_markdown 함수의 반환 타입 수정 가능examples/node/: 다양한 사용 시나리오 예제 추가examples/web/: 인터랙티브 데모 기능 강화examples/react-native/: 실제 앱에서 사용할 수 있는 완성도 높은 예제toJson(), toMarkdown(), fileHeader() 함수 테스트toJson(), toMarkdown(), fileHeader() 함수 테스트toJson(), toMarkdown(), fileHeader() 함수 테스트examples/ 디렉토리package.json.github/workflows/tests/e2e/ 또는 각 예제 프로젝트 내docs/docs/guide/examples.md 업데이트CtrlHeaderData::Othercrates/hwp-core/src/document/bodytext/ctrl_header.rs:580ShapeComponentUnknowncrates/hwp-core/src/document/bodytext/shape_component_unknown.rsFIELD_UNKNOWN ("%unk")crates/hwp-core/src/document/bodytext/ctrl_header.rs:91docs/docs/spec/chart.mddocs/docs/spec/distribution.mddocs/docs/spec/hwp-3.0-hwpml.mdnoori.md 파일에서 테이블 셀 내부의 텍스트가 중복으로 출력되는 문제ParaText와 ShapeComponentPicture가 테이블 렌더링과 일반 문단 렌더링에서 모두 처리됨collect_text_and_images_from_paragraph 함수를 사용하여 재귀적으로 모든 중첩된 레코드 확인crates/hwp-core/src/viewer/markdown/document/bodytext/paragraph.rs의 CtrlHeader 처리 로직crates/hwp-core/src/viewer/markdown/collect.rs의 collect_text_and_images_from_paragraph 함수LIST_HEADER 파싱 시 원본 데이터에서 같은 데이터를 가진 첫번째 LIST_HEADER를 찾아서 잘못된 문단을 읽고 있음crates/hwp-core/src/document/bodytext/mod.rs의 LIST_HEADER 파싱 로직LIST_HEADER 파싱