Skip to content
amnotyoungPublic

About

HWP diff — HWP·HWPX 문서 신구대조 (로컬 실행, 개인 프로젝트)

Resources

Stars

6 stars

Watchers

0 watching

Forks

Repository files navigation

HWP diff

폐쇄망 PC에서 HWP·HWPX 두 문서를 비교하는 도구입니다. 기본 권장 실행 방식은 서버 없는 단일 HTML입니다. 주식회사 한컴(한글과컴퓨터)과 관계없는 개인 프로젝트이며, HWP는 주식회사 한컴의 등록상표입니다. LLM, API 키, 외부 서버가 필요하지 않습니다. Kordoc으로 문서 구조를 읽고 규칙 기반으로 신구대조표를 만듭니다.

HWP diff 사용 설명 영상

권장 실행: 단일 HTML

Windows 업무 PC에서는 HWP-diff-v0.2.0.html 한 파일을 내려받아 Edge 또는 Chrome으로 열어 사용합니다. 설치·EXE·Node.js·로컬 서버·인터넷 연결이 필요하지 않습니다. 문서 처리는 브라우저 안에서 이루어집니다.

  1. 빌드된 HWP-diff.html을 업무 PC에 복사합니다.
  2. Edge 또는 Chrome으로 파일 자체를 엽니다. 메일·문서 관리 시스템의 미리보기 화면이 아닌 브라우저에서 직접 여세요.
  3. 구버전·신버전 HWP 5.x 또는 HWPX를 선택하고 변경 사항 비교를 누릅니다.
  4. 내용·서식·메모, 목록·원본 보기를 사용하고 필요한 결과만 HTML 또는 JSON으로 저장합니다.

2026-11-02, 사용자가 Windows 업무 PC에서 HTML 버전이 정상 실행됨을 확인했습니다. HWP 서식·메모 미검사와 복잡한 문서의 파싱·미리보기 제한은 그대로 적용됩니다. 자세한 범위·처리 한도·검증 기록은 단일 HTML 안내를 참고하세요.

현재 배포 상태와 HTML 빌드

v0.2.0 사전 배포판에서 단일 HTML, 빌드 정보와 SHA-256 체크섬을 제공합니다. 사용자는 HTML 파일만 받으면 됩니다. 소스는 main과 v0.2.0 태그에서 확인할 수 있습니다. 직접 빌드하려면 인터넷이 되는 개발 PC에서 아래 명령을 실행하고, 업무 PC에는 완성된 HTML 파일만 가져갑니다.

git clone https://github.com/amnotyoung/hwp-diff.git
cd hwp-diff
git switch --detach v0.2.0
npm ci --ignore-scripts
npm run build:html

생성 파일은 artifacts/HWP-diff.html입니다. 소스 화면인 public/index.html과 다릅니다. 추가 파일 없이 복사할 수 있으며, 사용 PC에서 npm 설치나 서버 실행을 할 필요가 없습니다.

HTML 파일 자체·JavaScript·Worker 실행을 기관 정책이 막는 경우에는 해당 정책 확인이 필요합니다. 브라우저 보안 해제나 관리자 권한은 정상 실행의 전제가 아닙니다.

사용 중인 버전 확인

v0.2.0부터 앱 상단에 버전과 빌드 식별값을 표시합니다. 이를 누르고 버전 정보 복사를 선택해 피드백에 붙여 넣어 주세요. 문서 이름이나 내용은 포함하지 않습니다. 파일명을 바꿔도 HTML 안의 빌드 정보는 유지됩니다.

선택 실행: EXE·DMG

기존 실행 파일도 보조 방식으로 유지합니다. 아래 로컬 포트·프로그램 종료·코드서명 안내는 EXE·DMG에 해당하며 단일 HTML에는 적용되지 않습니다.

  • Windows x64: HWP diff.exe를 실행합니다. 내부 파일을 임시 폴더에 풀고 포함된 Node 런타임으로 로컬 서버를 시작합니다.
  • macOS (Apple Silicon): HWP diff (Apple Silicon).dmg에서 HWP diff.app을 Applications로 복사해 실행합니다. Node.js 별도 설치는 필요하지 않습니다. Intel Mac용은 현재 배포하지 않습니다.
  • 두 방식 모두 로컬 전용 빈 포트를 자동으로 고르고 기본 브라우저를 엽니다. 프로그램 종료를 누르거나 마지막 앱 탭을 닫으면 종료합니다. 탭을 닫은 경우 새로고침을 고려해 약 10초 뒤 종료합니다.
  • 기존 EXE·DMG는 Releases에서 받습니다. v0.1.0은 Windows PC와 Apple Silicon Mac에서 실행을 확인했습니다.

EXE·DMG를 처음 실행할 때 (코드서명 전 빌드)

코드서명과 Apple 공증을 받지 않은 빌드라, 처음 한 번은 Windows와 macOS가 실행을 막습니다. 아래 방법으로 한 번 허용하면 이후에는 바로 실행됩니다.

Windows

  • 실행하기 전에 HWP diff.exe를 우클릭 → 속성 → 일반 탭 아래쪽의 차단 해제를 체크 → 확인. 이후 경고 없이 실행됩니다.
  • 또는 파란 “Windows의 PC 보호” 화면에서 추가 정보를 누른 뒤 실행을 누릅니다.
  • 회사 PC 정책이 서명 없는 실행 파일을 막으면 두 방법 모두 동작하지 않습니다. 전산팀에 허용을 요청하세요.

Mac

  1. HWP diff.app을 Applications로 옮긴 뒤 한 번 실행합니다. 차단 안내가 뜨면 완료를 눌러 닫습니다.

  2. 시스템 설정 → 개인정보 보호 및 보안을 열고 아래쪽 ‘HWP diff’ 항목의 그래도 열기를 누른 뒤, 확인 창에서 열기를 누릅니다. macOS 15 이후에는 Finder 우클릭 → 열기로는 열리지 않습니다.

  3. 그래도 열기가 보이지 않으면 터미널에서 아래 명령을 한 번 실행합니다. 인터넷에서 받은 파일에 붙는 격리 표시를 지웁니다.

    xattr -dr com.apple.quarantine "/Applications/HWP diff.app"

경고 없이 배포하려면 Mac은 Apple Developer ID 서명과 공증, Windows는 코드서명 인증서가 필요합니다. 회사 안에서만 쓴다면 사내 인증서 서명이나 허용 목록 등록도 방법입니다.

Node 서버로 개발·검증하기

public/index.html을 직접 열지 마세요. Windows에서는 start-windows.cmd를 실행하면 서버가 준비된 뒤 기본 브라우저에 실행 화면이 열립니다. HTML을 직접 열면 실행 방법 안내만 표시합니다.

Node.js 22 이상이 필요합니다. 인터넷이 되는 개발 PC에서 처음 한 번 설치합니다.

npm ci --omit=optional --ignore-scripts
npm start

브라우저에서 http://127.0.0.1:3210을 엽니다. 구버전과 신버전을 선택하고 변경 사항 비교를 누릅니다. 샘플 비교는 실제 HWPX 두 개를 메모리에서 생성한 뒤 동일한 파서·비교 엔진으로 처리합니다. 종료는 터미널에서 Ctrl+C입니다.

주 사용 환경은 Windows OS의 Edge·Chrome입니다. Windows에서는 Node.js와 의존성을 준비한 뒤 start-windows.cmd를 실행할 수 있습니다. runtime/node.exe가 있으면 이를 사용하고, 없으면 설치된 Node.js를 사용합니다. 이 실행 방식은 개발·검증용입니다. 일반 사용자에게는 단일 HTML을 우선 전달합니다.

지원 기능

  • HWP·HWPX 입력 및 교차 비교. 파일별 20MB 이하.
  • 문단·표의 추가, 삭제, 수정, 동일 분류와 좌우 표시.
  • 숫자 한 자리 변경, 공백·줄바꿈 변경도 정확 일치 검사로 검출.
  • HWPX의 글자색·글꼴·자간·장평 변경을 별도 서식 탭에 표시. 서로 대응되는 글자 구간의 실제 속성 값을 비교하며, 숫자 ID 재배열·구간 분할·미사용 서식 변경은 제외. 서식 변경 문단은 원본에서 파란색으로 표시.
  • 표의 행·열 위치별 셀 변경과 병합 구조 변경 표시.
  • 원본 미리보기: 입력한 HWPX·HWP 5.x 자체를 Kordoc으로 렌더링한 SVG 쪽 이미지를 좌우로 표시. 문서별 쪽 선택, 확대, 변경 항목에서 해당 쪽 이동.
  • 변경 셀에서는 동일한 앞뒤 문맥을 접고 실제 추가·삭제·수정 문구를 먼저 표시하며, 셀 전체 내용은 펼쳐 확인. 표·문단 집계와 별도로 문구의 추가·삭제·수정 위치 수를 표시. 고정 검색·필터·변경 목록과 이전/다음 이동. 검색어를 강조하고 이전/다음 일치로 이동. 원본에서는 전체 문서의 일치 문단을 검색하며 현재 탭을 유지.
  • 비교 후 업로드 영역과 사이드바 축소, 파일명 중간 생략·전체 이름 툴팁·버전 배지.
  • 그림은 변경/동일 건수에서 제외하며 구버전·신버전별 미지원 개수를 별도 표시.
  • 자체 포함 HTML 신구대조표 및 JSON 저장. HTML은 인터넷 없이 열 수 있으며 브라우저 인쇄로 PDF 저장 가능.
  • 파싱 경고를 화면과 보고서에 함께 표시. 실패를 ‘변경 없음’으로 처리하지 않음.
  • HWPX의 검토 메모(MEMO)를 별도로 추출해 추가·삭제·수정 비교. 메모 본문, 작성자, 연결된 문구를 표시하며 HTML·JSON 결과에도 포함. 메모의 원문 위치 보기 또는 미리볼 메모 선택으로 해당 쪽·문단으로 이동하며, 원본에서는 보라색으로 표시. 동일한 메모도 펼쳐서 위치 확인 가능. 본문이 같고 메모만 달라지면 메모 탭을 먼저 엽니다.

비교 방식과 범위

Kordoc 4.24.21의 parse()와 diffBlocks()를 사용합니다. diffBlocks()가 유사도와 LCS로 문단 대응을 찾은 뒤, 이 프로그램이 대응된 블록의 텍스트·주석·자식 블록·표 셀·병합 구조를 다시 정확 일치 비교합니다. Kordoc의 similarity >= 0.99 변경 없음 판정은 그대로 쓰지 않습니다. 그림 바이트와 서식 속성은 본문 변경 집계에서 제외합니다. 글자 서식은 별도의 HWPX XML 비교 결과로 집계합니다.

문장 강조는 짧은 변경에서 문자 단위, 긴 변경에서 낱말 단위 LCS를 사용합니다. 처리 한도를 넘는 구간도 변경 자체는 누락하지 않습니다. 긴 셀은 공통 소제목 구간으로 나눠 비교합니다. 요약은 블록별 건수와 변경 전후 값이며, 의미 해석이나 자연어 AI 요약은 하지 않습니다.

다음 제약이 있습니다.

  • 문단 대응은 휴리스틱입니다. 큰 수정이나 문단 이동은 삭제·추가로 보일 수 있습니다.
  • 표는 좌표를 기준으로 비교합니다. 행·열 삽입 시 뒤의 셀도 연쇄 변경으로 보일 수 있습니다. 의미 기반 행 대응은 후속 개선 대상입니다.
  • 배치·그림·도장·OCR·PDF·DOCX는 비교 대상이 아닙니다. HWPX의 글자색·글꼴·자간·장평만 별도 서식 비교하며, 글자 크기·굵기·밑줄·여백은 아직 비교하지 않습니다. ‘변경 없음’은 문서 파일 전체의 동일성을 보증하지 않습니다.
  • 쪽 정보가 근사치인 문서는 ‘섹션 근사’로 표시합니다. 블록 번호는 파서의 읽기 순서입니다.
  • 원본 미리보기는 저장된 조판 정보를 우선 사용하며, 없으면 Kordoc이 재배치합니다. 한컴의 픽셀 단위 복제는 아니며 글꼴·수식·머리말/꼬리말·복잡한 개체가 다르게 보일 수 있습니다. 렌더링 경고를 표시합니다. 문단 텍스트와 표 식별자·셀 순서를 렌더링 결과에 대조해 변경 영역을 색으로 표시합니다. 변경 목록이나 색칠된 영역을 누르면 해당 쪽·위치로 이동하고, 선택한 변경 전후 문구를 함께 표시합니다. 같은 문장이 반복되면 문서 내 등장 순서를 사용합니다. 셀 위치가 불명확하면 표 전체 표시, 연결 자체가 불가능하면 위치 미확인으로 안내하며 임의 위치를 확정하지 않습니다. 여러 쪽 표의 미지원 부분은 원본 확인이 필요합니다.
  • HWP의 검토 메모, 변경 내용 추적 이력은 이번 메모 비교 대상이 아닙니다. 한컴의 메모 풍선 모양 자체는 재현하지 않습니다. 메모가 연결된 문단은 원본 미리보기에 표시하고 의견은 옆 패널에서 확인합니다. 여러 문단·쪽에 걸친 범위를 찾되, 모호한 위치는 확정하지 않고 일부만 찾은 경우 부분 표시로 안내합니다. 추출에 실패하면 메모 없음으로 처리하지 않고 확인 필요로 알립니다.
  • HTML 버전은 HWP 5.x·HWPX만 지원합니다. Node 서버 방식에서 HWP 3.x/HWPML이 파싱되더라도 원본 미리보기는 지원하지 않습니다. 렌더 실패가 내용 비교 결과를 지우지 않습니다. 탭 왕복 시 문서별 쪽·확대율·스크롤 위치를 유지합니다. 명시적으로 변경 위치 보기나 검색 이동을 실행할 때만 위치를 이동합니다. 좁은 화면은 필터를 접고 원본을 구버전/신버전 중 하나씩 표시합니다. 원본은 브라우저의 선택 파일로 보유합니다. HTML 버전은 미리보기 요청을 브라우저 내부 Worker에 전달하고, Node 서버 방식은 로컬 서버에 전송합니다. 미리보기 캐시는 브라우저 메모리에 최대 8쪽만 둡니다. 위치 탐색은 그림을 뺀 전체 쪽의 글·표만 읽으며(SVG 합계 64MB 한도), 그림은 화면에 표시하는 쪽에만 넣습니다. 한 쪽이 16MB를 넘으면 그 쪽은 그림 없이 글과 표만 표시하고 안내합니다.
  • 읽기 실패, 암호/DRM, 손상 파일은 오류로 표시합니다. 복구 파싱의 누락 가능성은 파서 경고와 함께 검토해야 합니다.
  • 문단·표를 쪼개지 않고 비교 계산을 자동 분할합니다. 문서별 최대 20,000블록이며, 대응을 확정하지 못한 구간은 최대 25,000,000개 후보 쌍까지 계산합니다. HTML은 진행 없는 작업 60초·자동 분할 작업 전체 5분, Node 서버는 기존 60초 제한입니다. Node Worker의 JS 힙 제한은 512MB이며 전체 프로세스 메모리 상한은 아닙니다. HTML 버전에는 동일한 힙 제한이 없으며, 입력·압축 해제·결과·캐시 크기와 처리 시간으로 제한합니다.

Node 서버 소스의 폐쇄망 반입 (개발·검증용)

  1. 반입 대상과 동일한 OS/CPU의 준비 PC에서 프로젝트와 Node.js 22 이상 런타임을 준비합니다.
  2. npm ci --omit=optional --ignore-scripts로 package-lock.json에 고정된 의존성을 설치하고 npm test를 실행합니다.
  3. 프로젝트의 src/, public/, package.json, package-lock.json, node_modules/, 실행 스크립트와 Node.js 런타임을 반입합니다. 개발 검증용 tests/, scripts/도 함께 가져갈 수 있습니다. Windows 포터블 런타임은 runtime/node.exe에 둡니다.
  4. 폐쇄망에서는 npm 설치·npx 다운로드 없이 node src/server.mjs 또는 start-windows.cmd로 실행합니다.
  5. 실제 대상 Windows PC에서 네트워크 차단 상태의 실행과 업무용 HWP/HWPX 비교를 검증합니다. 현재 개발 환경에서의 검증과 별개의 배포 승인 단계입니다.

런타임은 Kordoc을 불러오기 전에 KORDOC_OFFLINE=1을 강제하며 OCR을 끕니다. 프런트엔드는 CDN·외부 글꼴·분석 스크립트를 사용하지 않습니다. Node 서버 방식은 127.0.0.1에만 바인딩하며 Host/Origin 및 사용자 정의 요청 헤더를 확인합니다. 문서 처리에는 Worker를 사용하고 시간 제한·취소 시 종료합니다.

입력 문서와 결과를 서버 디스크·로그·브라우저 저장소에 자동 저장하지 않습니다. 사용자가 내보내기를 실행하면 브라우저 다운로드 위치에 결과가 저장됩니다. OS 스왑·브라우저/OS 자체 동작까지 제어하는 보안 삭제 기능은 아닙니다. 원본은 수정하지 않습니다.

의존 패키지의 라이선스 고지는 node_modules/kordoc/NOTICE, node_modules/kordoc/THIRD_PARTY/와 각 패키지의 라이선스를 포함해 유지합니다. 참고: Kordoc 폐쇄망 배포 가이드.

개발 및 검증

npm test
npm run samples

samples/generated/에 구버전·신버전 HWPX 샘플이 생성됩니다. 이 폴더와 개인 문서는 Git에서 제외됩니다. 민감한 문서는 private-documents/에 보관하면 Git에서 제외됩니다.

src/engine.mjs는 파싱 및 정확 비교, src/server.mjs는 로컬 HTTP 서버, public/은 화면 및 보고서 생성, tests/는 회귀·통합 테스트를 담당합니다. Node 서버는 소스 그대로 실행합니다. 단일 HTML 배포에는 npm run build:html 빌드가 필요합니다.

후속 개발: 실제 업무 문서 코퍼스로 HWP/병합표 검증 → 추가 Windows 업무 환경 확인. EXE·DMG의 코드서명·공증은 별도 배포 과제입니다.

자동 테스트는 node --test 자동 탐색을 사용하여 Windows 셸의 와일드카드 확장에 의존하지 않습니다. 개발 환경의 브라우저 검증과 실제 Windows 폐쇄망 검증은 구분하며, 실제 Windows PC에서 포터블 런타임·업무 문서·설치 글꼴 조합의 최종 확인이 필요합니다.

이어지는 표는 변경 문구가 속한 실제 렌더 페이지를 찾아 표시합니다. 문구를 찾지 못해 표 전체로 대체한 경우 버튼과 안내를 ‘표 시작 쪽 보기’로 구분합니다. 순수 추가·삭제의 반대쪽 버전에서는 주변 문맥을 회색 점선으로 표시하며 실제 변경으로 집계하지 않습니다.

글자 서식 비교

HWPX charPr 및 언어별 fontRef를 실제 글꼴 이름·색상·수치로 해석합니다. 한글·영문 등 실제 문자의 언어 슬롯별 값을 사용합니다. 설치된 글꼴 대체 결과가 아니라 문서에 지정된 글꼴을 비교하므로 Windows와 다른 OS에서도 저장 속성의 비교 결과는 같습니다.

본문·표·도형 내부의 텍스트 문단을 대응시킨 뒤 동일 구간과 대응되는 교체 구간의 서식을 비교합니다. 길이가 다른 교체 구간에서는 각각 한 값으로 적용된 속성만 비교하고, 복잡한 혼합 서식으로 대응이 불명확하면 확인 필요로 알립니다. 새로 추가·삭제된 글자의 서식은 기존 글자의 서식 변경으로 세지 않습니다. 검토 메모 본문의 서식은 제외합니다. 문단 대응은 내용 비교와 마찬가지로 휴리스틱이며 위치를 확정하지 못하면 안내합니다. HWP와 혼합 형식, 잘못된 사용 서식 참조, 비교 한도 초과는 서식 변경 없음 대신 확인 필요로 표시합니다. 서식 대응도 자동 분할 계산을 적용하며, 서식 변경 구간 수는 5,000까지입니다.

node scripts/create-format-samples.mjs로 네 가지 속성과 표 안의 일부 글자 서식이 바뀐 검증용 HWPX 두 개를 samples/generated/에 만들 수 있습니다. 생성 문서는 Git에 포함하지 않습니다.

화면 디자인

사용자가 지정한 KOICA_AI_Design_Kit/koica design.md(Universal Design System v2)의 Web·Digital Service 프로파일을 적용합니다. 주색 #0A46A5, 본문 #19202C, 배경 #FFFFFF/#F5F7F9, 구분선 #DCE2E8, 보조 글자 #67717C를 사용합니다. Noto Sans KR을 우선하고, 설치되어 있지 않으면 키트의 지정 대체서체(Apple SD Gothic Neo, 맑은 고딕, Arial)로 표시합니다. 외부 웹폰트는 요청하지 않습니다. KOICA 로고·VI·권위표장 이미지는 포함하지 않습니다.

상시 실행 환경 배지는 표시하지 않습니다. HWP가 포함되어 서식을 검사할 수 없는 경우에는 결과 위에 해당 제한과 HWPX 재저장 방법을 표시하고 서식 탭을 ‘서식 미검사’로 구분합니다. 현재 Kordoc 4.24.21의 공개 파싱/렌더 API는 HWP의 네 가지 글자 서식 비교에 필요한 값을 모두 제공하지 않습니다. 이 제한을 우회하기 위한 자체 HWP 바이너리 파서는 구현하지 않습니다.

탐색 및 구조 변경

제목·문단·목록은 텍스트를 먼저 대응시키고, 동일 문구의 분류/제목 단계 변화는 ‘구조 변경’으로 별도 표시합니다. 본문 추가·삭제 건수에는 포함하지 않습니다. 구조는 Kordoc의 추출 분류이므로 HWP에서 글자 서식을 모두 검사했다는 의미는 아닙니다.

탐색 대상(내용·서식·메모)과 보기 방식(목록·원본)은 독립적입니다. 원본에서 유형을 누르면 탐색 목록과 조건만 바꾸고 양쪽 쪽·스크롤·확대율·상세 패널 열림 상태를 유지합니다. 처음 선택한 유형은 항목을 자동 선택하지 않습니다. 이전 선택을 복원했지만 화면 밖이면 ‘현재 화면 밖의 선택’과 이동 버튼을 표시합니다. 항목 선택, 이전·다음 변경, ‘문서에서 보기’, ‘선택 위치로 이동’을 실행할 때만 원본 위치를 이동합니다. 보기 방식을 바꾸면 선택 항목·세부 구간·목록 스크롤·표 펼침 상태를 보존합니다. 원문 저장 쪽과 렌더링 쪽을 구분하며, 쪽 번호는 직접 입력 후 Enter로 이동할 수 있습니다.

내용 검색의 일치 수와 이전·다음 탐색은 선택한 변경 유형의 전체 결과를 대상으로 합니다. 처음에는 50개 항목을 표시하지만, 다음 일치가 미표시 항목에 있으면 자동으로 불러와 이동합니다. 표의 동일한 셀·제목·주석도 검색하며 접힌 중복 사본은 집계하지 않습니다. 1,000곳 집계 제한은 제거했습니다. 원본 검색은 전체 렌더링 문단 기준입니다. 유형별 검색어와 필터를 따로 기억합니다. 바깥 클릭이나 유형 전환으로 검색창을 접어도 조건은 유지하고, 검색 버튼에 적용 중인 검색어를 표시합니다. ×·Escape·검색 버튼으로 닫으면 현재 유형의 검색 조건을 해제합니다. 원본에서는 검색어를 바꾸는 것만으로 쪽을 이동하지 않으며 이전·다음 일치를 누를 때 이동합니다.

결과 화면의 ‘순서 교체’는 현재 파일을 재선택하지 않고 구버전·신버전을 바꿔 다시 비교합니다. 내용·구조·메모·서식 결과와 미리보기 캐시는 모두 새 방향으로 갱신됩니다. ‘신구대조표 저장 (.html)’과 보조 메뉴의 JSON 저장을 구분합니다.

비교 작업 화면

기존 비교 UI의 변경 설명·탐색·상세 표시를 유지하면서 상단 공간을 줄였습니다. 같은 도구 행에 내용 → 서식 → 메모와 작은 목록 / 원본 전환을 배치합니다. 내용에는 기존 변경만·전체·추가·삭제·수정·구조 필터를 유지합니다.

  • 랜딩과 결과 화면은 같은 헤더의 색·서체·파란 상단선을 사용합니다. 결과 도구는 44px 높이와 8px 간격을 기준으로 배치하며, PC 창이 좁아지면 두 줄로 나눕니다. 탭 밑줄은 버튼 내부에 표시합니다.
  • 유형과 보기 방식을 전환해도 상단 높이와 버튼 위치가 같습니다. 사용할 수 없는 기능은 자리를 유지한 채 비활성화합니다. 이전·다음 변경 버튼은 현재 탐색 대상의 항목 선택과 원문 이동에 함께 사용합니다.
  • 필터는 유형마다 분리합니다. 서식은 글자색·글꼴·자간·장평, 메모는 추가·삭제·수정을 고를 수 있으며 내용의 삭제 조건이 다른 유형에 적용되지 않습니다. 목록에 탐색 범위를 명시합니다(예: 서식 변경 4/10). 원본은 선택한 유형을 진하게, 다른 유형을 옅게 표시합니다. 강조 숨기기는 별도 버튼으로 조작합니다. 위치 미확인 항목은 목록에서 제외하지 않으며, 현재 쪽에 없는 경우와 문서 전체에 없는 경우를 구분합니다.
  • 서식 비교는 소제목이 서로 다르고 본문도 달라진 문단을 같은 문단으로 확정하지 않습니다. 크게 교체된 문구와 그 안에서 우연히 일치한 글자는 서식 판정에서 제외하고, 서식 탭에 제외 사유와 전후 문구를 표시합니다. 같은 문맥의 짧은 이름·숫자 교체는 계속 비교하며 ‘내용도 바뀐 구간’으로 구분합니다.
  • 변경 유형별 건수는 필터에만 표시합니다(예: 수정 3). 별도 상단 집계와 안내 메뉴의 중복 집계는 제거했습니다. 필터 건수는 검색어와 관계없이 전체 비교 결과 기준입니다. 메모·서식 건수는 각 탭에 표시합니다. 순서 교체·파일 재선택·JSON 저장은 더보기 메뉴에서 확인합니다.
  • 원본의 기본 배율은 페이지 맞춤입니다. 실제 페이지 비율과 남은 화면 높이를 계산하여 페이지 전체를 표시하며, 너비 맞춤·100/150/200%와 구분합니다.
  • 원본 아래에는 선택한 변경의 전후 문구를 짧게 표시합니다. 긴 표도 첫 변경 구간을 바로 보여줍니다. 상세 패널은 기본 닫힘이며, 열면 1180px 초과 화면에서 구버전·신버전·상세가 공간을 나눠 사용하고 그 이하에서는 상세가 하단에 배치됩니다. 원문 이미지는 줄어든 영역에 다시 맞춰집니다. 상세에서도 동일한 앞부분은 접고 변경 문구를 먼저 표시합니다.
  • 각 원본 위에 숫자형 렌더링 쪽 입력과 이전/다음 쪽 버튼을 둡니다. 선택한 변경이 다른 쪽에 있으면 이동 버튼을 표시합니다.
  • 잘못된 쪽 번호는 Enter 또는 입력란을 벗어날 때 실제 표시 중인 쪽으로 복원하고, 입력 범위를 안내합니다. 좁은 창에서도 확대 조작을 더보기 메뉴에 숨기지 않고 원본 위에 표시합니다.
  • 검색 중에도 입력란을 유지합니다. 입력을 계속하거나 커서를 옮길 수 있으며, 이전 검색 응답은 새 검색어의 결과를 덮지 않습니다. 변경 항목(문단·표) 수와 세부 변경 구간 수를 구분합니다.
  • 좁은 PC 창의 비교 파일 버튼으로 구버전·신버전의 전체 파일명을 확인합니다. 넓은 창에서는 상단 파일명을 누르면 같은 정보가 열립니다.
  • 미확인 위치는 위치 다시 찾기로 표시하며 캐시를 비우고 재탐색합니다. 실패 사유와 현재 선택을 유지하는 내용/메모/서식 비교 복귀 경로를 제공합니다.
  • HWP 글상자 등의 본문이 파싱에는 포함되지만 Kordoc 미리보기에서 누락되는 경우가 있습니다. 비교 문구가 미리보기 텍스트에서 확인되지 않으면 문서 옆에 렌더링 경고를 표시합니다. 이는 누락을 복구하는 기능이나 완전성 보증이 아니며, 한컴 원본과의 대조가 필요합니다. 메모·서식 검사 불가는 미검사로 표시합니다.
  • 파일·안내·더보기·원본 안내 팝업은 바깥 클릭, Escape, 닫기 버튼으로 닫습니다. Escape는 먼저 열린 팝업을 닫고 원본 상세 패널은 유지합니다. 안내는 같은 원인을 반복하지 않고 영향과 다음 행동만 보여줍니다. 좌표·region·제외한 영역 수는 사용자 문구에서 제외했습니다. 문장은 ASD-STE100 Issue 9의 짧고 명확한 문장 원칙을 참고해 한국어로 정리했습니다.

기본 배포 방식은 단일 HTML입니다. EXE·DMG는 필요할 때 사용하는 보조 방식으로 유지합니다.

2026-11-02 사용자 요청으로 Windows 진단 EXE 패키징을 재개했습니다. 실행 단계·접속 주소·시작 로그는 Windows 실행 진단을 참고하세요. 이번 진단 빌드의 Windows 실기기 검증은 별도로 필요합니다.

긴 셀의 내용은 양쪽에 공통으로 등장하는 고유한 소제목을 기준으로 문단 구간을 나눕니다. 내용 비교와 원본 상세에서 이전·다음 구간으로 이동하며, 원본에서는 현재 구간을 진하게, 나머지를 옅게 표시합니다. 원본에서 확인할 수 없는 위치는 임의로 다음 쪽에 배치하지 않습니다. 같은 제목이 고유하게 나타나는 삭제·추가 문단은 ‘대응 후보’로 연결해 나란히 볼 수 있으며, 원래의 변경 집계는 유지합니다. 제목이 중복되어 대응이 모호하면 자동 연결하지 않습니다.

Kordoc 4.24.21(공식 npm 최신 버전 확인: 2026-10-29)으로 고정했습니다. 제공된 HWP 초록은 공식 renderDocumentToScene의 reflow 켬/끔, renderHwp5Pages, renderDocument(format: svg)에서 모두 누락이 재현되어 해결됐다고 표시하지 않습니다. 별도 HWP 파서는 추가하지 않았습니다. 강조 영역은 선언된 쪽 경계와 교차하는 부분만 표시하며, 범위 밖·0 크기·중복 영역을 제거합니다. 쪽 밖 좌표를 임의의 다음 쪽으로 옮기지 않습니다. 키보드 초점은 변경 항목마다 한 번만 제공하며, 강조 버튼으로 표시를 숨길 수 있습니다.

배포 빌드

npm ci --omit=optional --ignore-scripts
npm test
npm run build:mac
npm run build:win

Mac DMG는 macOS의 clang, codesign, hdiutil로 만듭니다. Windows EXE는 NSIS 컴파일러로 macOS·Linux·Windows에서 만들 수 있습니다. Node 런타임과 NSIS 도구는 packaging/inputs.json의 공식 URL·버전에 고정하고 SHA-256을 검증합니다. 첫 빌드에는 인터넷이 필요하고, 캐시가 준비되면 -- --offline으로 다시 만들 수 있습니다.

빌드 도구와 중간 파일은 .build-cache/, 배포 파일은 dist/에 만들며 Git에서 제외합니다. 명시적 포함 목록(src, public, 고정된 JS 의존성, package.json, package-lock.json, README.md)만 앱에 넣으므로 문서·테스트·.git·.env·개발 산출물은 들어가지 않습니다. 네이티브 의존성이 발견되면 빌드를 중단합니다.

포함 파일은 앱 안의 BUILD-MANIFEST.json, 버전·소스 커밋·체크섬·검증 범위는 dist/mac-arm64-build-info.json과 dist/windows-build-info.json에 기록합니다. node src/portable.mjs --self-test와 Mac 앱 실행 파일의 --self-test는 브라우저를 열지 않고 포함된 비교·렌더링·HTTP 경로를 검증합니다.

라이선스

MIT. 함께 배포하는 의존성(Kordoc 등)과 Node.js·NSIS는 각자의 라이선스를 따르며, 배포 파일 안에 라이선스 문서를 포함합니다.

About

HWP diff — HWP·HWPX 문서 신구대조 (로컬 실행, 개인 프로젝트)

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages