현재 진행 중이거나 곧 시작할 작업 항목들입니다.
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 옵션 사용 시
}.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 파일이 앱 번들에 포함됨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 업데이트group_offset을 렌더링에 사용
group_offset은 "개체가 속한 그룹 내에서의 offset" (표 83)offset_y는 "기준점에서의 오프셋" (표 69)ShapeComponent가 있으면 group_offset 우선 사용group_offset이 없으면 ObjectCommon의 offset_x, offset_y 사용crates/hwp-core/src/viewer/html/line_segment.rs: ImageInfo 구조체에 group_offset 필드 추가crates/hwp-core/src/viewer/html/ctrl_header/table/cells.rs: 테이블 셀 내부 이미지 렌더링 시 group_offset 사용crates/hwp-core/src/viewer/html/paragraph.rs: 일반 문단 내 이미지 렌더링 시 group_offset 사용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.mdwidth, height, padding 값들이 span 태그에 적용되지 않음span 태그는 inline 요소이므로 width, height, padding-top, padding-bottom 속성이 적용되지 않음line_spacing은 line-height로 적용됨 (정상 작동)line_height, text_height, baseline_distance, segment_width는 인라인 스타일로 추가되지만 span 태그 특성상 일부는 적용되지 않음crates/hwp-core/src/viewer/html/document/bodytext/para_text.rs의 apply_html_styles 함수display: inline-block 또는 display: block으로 변경 시 레이아웃이 깨질 수 있음position: absolute) 사용 시 복잡도 증가legacy/work/working.md)strikethrough 속성이 0으로 파싱됨strikethrough: 0으로 파싱됨underline_type=2 (글자 위)로 표현될 수 있음crates/hwp-core/src/document/docinfo/char_shape.rs의 strikethrough 파싱 로직crates/hwp-core/src/viewer/markdown/document/bodytext/para_text.rs의 마크다운 변환 로직