1장 개요
CHM(Compiled HTML Help) 파일은 주로 Windows 환경에서 사용되는 도움말 파일 형식으로, HTML, 이미지, 스크립트 등 다양한 파일을 압축하여 하나의 파일로 제공한다. Microsoft에서 개발한 이 파일 형식은 소프트웨어 사용자에게 도움말 시스템 제공에 최적화되어 있으며, 웹 브라우저와 유사한 탐색 환경을 지원한다. CHM 파일은 오프라인 상태에서도 사용 가능하여 정보 접근이 쉽고 빠르다.
1.1 도움말 시스템
문서화는 모든 소프트웨어에서 중요한 요소다. 복잡한 소프트웨어 시스템을 비프로그래머도 이해할 수 있도록 설명하는 것으로, 프로그램의 작동 방식과 기능, 그리고 이를 사용해 목표를 달성하는 방법을 안내한다.
좋은 문서는 사용자에게 큰 도움이 되지만, 부족한 문서는 오히려 불쾌감을 줄 수 있다. 그러므로 사용자가 원하는 정보를 쉽게 찾을 수 있도록 문서는 논리적으로 구성되고, 검색이 용이하며, 광범위하게 링크와 색인이 설정되어 있어야 한다.
도움말 시스템은 플랫폼과 시간에 따라 매우 다양하다. Unix에서는 매뉴얼 페이지(man pages), GNU/Linux에서는 Info 파일, MacOS의 도움말 시스템, 특정 독점 소프트웨어의 개별 시스템, 순수 HTML, DocBook 같은 맞춤형 XML 형식, 그리고 여러 세대에 걸친 MS-DOS와 Windows의 도움말 시스템 등 다양하게 존재한다. DocBook은 책 출판과 오픈 유닉스 플랫폼의 소프트웨어 문서화에 큰 역할을 하고 있으며, 웹 브라우저의 발전과 함께 HTML이 최종 사용자용 문서화 형식의 표준으로 자리 잡았다. 참고로 이 사양 자체도 DocBook XML로 작성되었으며, 이를 다양한 형식으로 변환하기 위해 표준 소프트웨어가 사용되었다.
1.2 MS의 도움말 시스템
다음 표는 MS의 도움말 시스템을 보여준다.
이름 | 파일/확장자 | 기반 | 세대 | 역컴파일러 | 컴파일러 | 뷰어 | 사양 |
WinHelp | hlp, cnt, gid, ... | RTF | Win95 | helpdeco, ... | HC30, HC31, ... | WinHelp, MultiMedia ... | The Windows Help File Format ... |
HTMLHelp | chm, chi, chq, ... | HTML | Win98 - WinXP | chmdeco, ... | HHA, ... | HH, xCHM, ... | ITSF 형식 |
MS Help 2 | HxS, HxI, HxC, ... | HTML | VS.net | open convert | hxcomp | dox | ITOLITLS 형식, convert lit source code |
1.3 HTML Help
현재 MS 도움말 시스템의 세대는 HTML Help로 알려져 있다. HTML을 콘텐츠 형식으로 사용해 이름 붙여졌으며, 1997년 8월에 처음 소개되어 Win98과 Win2K에 함께 배포되었다. HTML Help는 IE 브라우저 엔진을 사용하고, HTML 페이지에 추가 기능을 제공하는 ActiveX 컨트롤을 포함한다.
HTML Help의 콘텐츠는 "Compiled HTML Help 파일" 또는 CHM 파일에 저장된다. HTML Help 뷰어(HH), 컴파일러(HHC) 및 대부분의 역컴파일러(예: istorage)는 파일의 가상 파일 시스템에 접근하기 위해 IStorage 인터페이스를 사용한다. 가상 파일 시스템은 이후 챕터에서 다룰 예정이며, 파일 시스템의 대부분 데이터는 LZX(Amiga 커뮤니티에서 유래한 LZ77 기반 압축기)로 압축된다. GUI 저작 도구로는 HTML Help Workshop(HHW)이 있으며, MS 컴파일러(HHC)에서 dll(HHA)을 호출해 모든 작업을 수행한다.
HTML Help는 목차, 색인, 전체 텍스트 검색, 북마크, 문맥 인식, 맞춤형 탐색 탭, 병합 도움말, 단순한 UI 등 문서 작성자와 사용자 모두에게 유용한 다양한 기능을 포함하고 있다.
2장 CHM 파일의 특징
- HTML 기반
- HTML 문서로 구성되어 웹 페이지와 비슷하게 작동하며, 하이퍼링크, 이미지 삽입, CSS 스타일링 등이 가능해 직관적인 사용자 인터페이스를 제공한다.
- 압축 형식
- LZX 알고리즘으로 압축하여 파일 크기를 줄여 전송 속도를 높이고 저장 공간을 절약한다. 여러 HTML 파일을 하나로 묶어 관리 용이성을 제공한다.
- 탐색 및 검색 기능
- 목차와 색인 기능을 통해 빠른 탐색과 검색이 가능해 소프트웨어 매뉴얼이나 기술 자료에 자주 활용된다.
3장 HTML Help의 주요 기능
3.1 서문
HTML Help(이하 HH)의 1.x 버전에서는 많은 기능이 완전히 구현되지 않았다. 새로운 Help 2 시스템이 이러한 기능을 보완하여 더욱 풍부한 문서화 시스템을 제공할 것으로 기대되었으나, 개발이 취소되고 Windows Longhorn(트레스헬프)용 도움말 시스템 개발로 전환되었다. 결과적으로 Windows 개발자들은 최소 2005년까지 HH를 사용해야 했다.
3.2 메뉴
HTML Help의 메뉴는 툴바의 모든 기능을 포함하면서, 추가적인 기능을 제공한다. 예를 들어, MSDN Library Help와 MSDN Online으로 연결되는 "Define Subset" 기능이 포함되어 있다. 이 기능은 다양한 주제를 다루는 문서에서 유용하지만, 사용자에게 혼란을 줄 수 있는 MSDN 전용 항목이 존재하기도 한다. Help 2에서는 이러한 기능들이 개선되었을 가능성이 크다.
3.3 툴바
툴바에는 여러 가지 유용한 버튼들이 있다. Hide/Show, Back, Forward, Stop, Refresh, Home, Locate, Options, Print, Font, Next 및 Previous 등의 버튼이 포함되어 있으며, 대부분은 이름에 따라 예상되는 기능을 수행한다. 두 개의 점프 버튼은 기본 아이콘을 사용하며, 도움말 작성자가 링크 위치와 텍스트를 커스터마이징할 수 있다.
3.4 내비게이션 패널
내비게이션 패널은 콘텐츠 패널 왼쪽에 위치하며, 여러 개의 탭이 포함되어 있다. 주요 탭은 Contents, Index, Search, Favourites, History, Author(현재 활성화 불가) 등이 있으며, 일부 맞춤형 탭도 지원한다.
3.4.1 목차
Contents 탭은 트리 구조로, 각 항목이 다른 주제나 파일로 연결된다. 도움말 파일의 전체 내용을 구조적으로 나열하는 데 사용된다.
3.4.2 색인
Index 탭은 주로 키워드와 주제를 연결하는 트리 구조로, 문서의 모든 개념을 나열하는 데 사용되며 문맥 감지 기능과 연결된다.
3.4.3 검색
Search 탭에서는 사용자가 키워드로 주제를 검색할 수 있으며, 고급 모드에서는 불리언, 와일드카드 및 중첩 표현식 등을 사용한 검색이 가능하다.
3.4.4 즐겨찾기
Favourites 탭은 사용자가 북마크를 추가하고 관리할 수 있는 목록으로, hh.dat 파일에 저장된다.
3.4.5 맞춤형 탭
MS Office의 맞춤형 인덱스 탭이 여기에 포함되지만, HH에서는 제대로 작동하지 않는다.
3.5 정보 유형
HH에서는 정보 유형이 일부 구현되어 있으며, 이 기능을 통해 문서 작성자가 주제를 카테고리별로 분류하고, 사용자는 자신에게 해당하는 주제만 선택해 볼 수 있다. 예를 들어, 사용 경험에 따라 초급, 중급, 고급 같은 유형을 설정할 수 있다.
3.6 텍스트 팝업
팝업은 대화 상자에서 특정 컨트롤에 대한 추가 정보를 제공할 때 주로 사용되며, 보통 What's This? 버튼이나 마우스 오른쪽 클릭을 통해 활성화된다. HH에서는 텍스트 팝업만 지원되지만, Help 2에서는 HTML 팝업이 구현될 것으로 예상되었다.
3.7 컨텍스트 민감 도움말
이 기능은 특정 인터페이스 요소와 관련된 도움말 주제를 프로그램 내에서 직접 열 수 있도록 한다. 예를 들어 대화 상자의 Help 버튼을 눌러 해당 대화 상자와 관련된 도움말 주제를 표시할 수 있다.
3.8 서브셋
서브셋은 MSDN에서는 지원되지만 HH Workshop에는 구현되지 않은 기능이다. 사용자가 활성화된 서브셋을 선택하면, 그 서브셋만 콘텐츠와 검색에 표시되며, 색인 항목도 서브셋에 속하지 않는 경우 비활성화된다.
3.9 샘플
샘플은 MSDN에서 주로 사용되는 기능으로, 코드 등의 파일 세트를 사용자 시스템으로 복사할 수 있게 한다. 이 기능은 ActiveX 컨트롤을 통해 제공된다.
3.10 병합 도움말
병합 도움말 기능을 통해 작성자는 여러 파일을 개별적으로 작성한 후 하나의 CHM 파일처럼 작동하게 할 수 있다. 이 기능에는 컬렉션과 CHM 기반의 두 가지 방식이 있다.
3.10.1 컬렉션
컬렉션 방식에서는 .col 확장자를 가진 XML 파일이 파일 병합 정보를 포함하고 있어, 새로운 문서 추가 시 수정이 용이하다.
3.10.2 병합 파일
CHM 파일 내의 병합 지시어를 통해 다른 CHM 파일과 병합하는 방식이다.
4장 파일
4.1 서문
이 장에서는 HTML Help(HH) 콘텐츠 제작과 사용에 필요한 파일들을 설명한다. 파일 형식에 대한 자세한 내용은 다음 장에서 다루며, 여기에서는 기본적인 파일 구조와 용도를 소개한다.
4.2 콘텐츠 파일
콘텐츠 파일은 도움말 주제를 포함하는 HTML, 이미지, 스타일시트, 스크립트, 샘플 및 기타 파일로 구성된다. 이들은 컴파일된 HTML 도움말 파일, 즉 CHM 파일로 알려져 있으며, ITSF 파일 시스템 형식을 사용한다.
- CHI, CHW, CHQ
- 이 파일들은 각각 인덱스, ALinks/KLinks, 검색 정보를 저장하여 여러 CHM 파일이나 CHM 컬렉션의 병합에 사용된다. CHM 파일과 같은 폴더에 위치하며 ITSF 형식을 사용하지만, 일반적으로 압축되지 않아 빠르게 액세스할 수 있다.
- CHS
- 사용자가 정의한 서브셋 정보를 저장하며, CHM과 동일한 폴더에 위치하고 고유의 바이너리 형식을 사용한다.
- KPD
- CHM 업데이트 방법에 대한 정보를 저장하며, KeyWorks.net에서 제공하는 KeyUpdate ActiveX 컨트롤을 통해 사용된다. 주의사항으로, 이 기술은 베타 버전으로 안정성이 보장되지 않는다.
4.3 작성 파일
HTML Help 콘텐츠를 제작할 때 필요한 파일들은 다음과 같다.
- HHP
- HTML Help 프로젝트 파일로, 옵션, 창 유형, 병합 정보, 파일 목록, 텍스트 팝업, 정보 유형, 컨텍스트-센서티브 도움말, 서브셋 등의 정보를 저장하며 INI 형식을 사용한다. 일부 HHP 형식은 별도의 텍스트 파일로 분리하여 HHP에서 포함시킬 수 있다.
- HHC
- HTML Help의 목차 파일로, Sitemap 형식을 사용하여 콘텐츠를 저장한다.
- HHK
- HTML Help의 색인 파일로, Sitemap 형식을 사용하여 색인을 저장한다.
- HHS
- 샘플 정보 파일로, INI 형식을 사용해 샘플 관련 정보를 저장한다.
- STP
- 검색 데이터를 생성할 때 무시해야 할 단어 목록을 저장하며, 텍스트 형식이다.
- ALI
- 컨텍스트-센서티브 링크를 저장하는 파일로, 텍스트 형식을 사용한다.
4.4 설정 파일
HH의 개인화 설정과 캐시 데이터는 다음과 같은 파일에 저장된다.
- hh.dat
- 각 CHM 파일에 대한 즐겨찾기와 검색 기록을 저장하며, 각 CHM의 창 유형 정보를 캐시한다. 보통 사용자 프로필 디렉터리의 Application Data\Microsoft\HTML Help 폴더에 위치하며 ITSF 형식을 사용한다.
- hhcolreg.dat
- 시스템의 CHM 컬렉션 정보를 저장하는 XML 파일로, 시스템 도움말 디렉터리나 All Users 프로필의 Application Data\Microsoft\HTML Help 폴더에 위치한다.
5장 파일 형식
5.1 서문
이 장에서는 HTML Help(HH) 시스템 내 다양한 파일의 형식에 대해 자세히 설명한다. 여기서는 CHM 파일을 생성하고 사용하는 과정에서 사용되는 여러 파일 형식을 심도 있게 다룬다.
5.2 ITSF (Internet Text Storage Format) 형식
ITSF 형식은 CHM 파일의 기본 구조로, Microsoft HTML 도움말 시스템이 사용하는 파일 시스템 형식을 정의한다. 이는 Matthew Russotto의 Microsoft's HTML Help (.chm) format 문서(링크)의 내용을 기반으로 한다.
5.2.1 CHM 파일의 전체 포맷
CHM 파일은 짧은 초기 헤더($38 바이트)로 시작한다. 이 헤더에는 헤더 섹션 테이블과 콘텐츠의 오프셋이 포함된다. 이 부분을 통틀어 "헤더"라고 부른다.
헤더 다음에는 두 개의 헤더 섹션이 이어진다. 하나는 파일 디렉토리를, 다른 하나는 파일 크기와 알 수 없는 데이터를 포함한다. 헤더 섹션 뒤에는 실제 콘텐츠가 위치한다.
5.2.2 헤더
헤더는 다음과 같은 형식의 초기 헤더로 시작한다.
Offset | Type | Description |
0000 | char[4] | 'ITSF' |
0004 | DWORD | 3 (버전 번호) |
0008 | DWORD | 총 헤더 길이(헤더 섹션 테이블 및 그 뒤의 데이터를 포함) |
000C | DWORD | 1 (알 수 없음) |
0010 | DWORD | 타임스탬프. 상위 바이트에 초를, 두 번째 바이트에 분할 초를 포함 |
0014 | DWORD | Windows 언어 ID. 0409은 영어(미국) 0407은 독일어 |
0018 | GUID | {7C01FD10-7BAA-11D0-9E0C-00A0-C922-E6EC} |
0028 | GUID | {7C01FD11-7BAA-11D0-9E0C-00A0-C922-E6EC} |
- 참고: GUID는 $10 바이트로, 1 DWORD, 2 WORD, 8 BYTE로 구성된다.
초기 헤더 다음에는 2개의 항목으로 구성된 헤더 섹션 테이블이 있으며, 각 항목은 $10 바이트 길이로 다음과 같은 형식을 갖는다.
Offset | Type | Description |
0000 | QWORD | 파일 시작부터 섹션의 오프셋 |
0008 | QWORD | 섹션 길이 |
헤더 섹션 테이블 다음에는 8바이트의 추가 헤더 데이터가 존재한다. Version 2 파일에서는 이 데이터가 없으며, 콘텐츠 섹션이 디렉토리 바로 뒤에 시작된다.
Offset | Type | Description |
0000 | QWORD | 콘텐츠 섹션 0의 파일 내 오프셋 |
5.2.3 헤더 섹션
헤더 섹션 0
헤더 섹션 0에는 파일의 총 크기와 몇 가지 알 수 없는 데이터가 포함되어 있다.
Offset | Type | Description |
0000 | DWORD | $01FE (알 수 없음) |
0004 | DWORD | 0 (알 수 없음) |
0008 | QWORD | 파일 크기 |
0010 | DWORD | 0 (알 수 없음) |
0014 | DWORD | 0 (알 수 없음) |
헤더 섹션 1: 디렉토리 목록
이 섹션은 .chm 파일의 핵심 부분으로, 포함된 파일과 정보를 디렉토리 형식으로 제공한다.
디렉토리 헤더
디렉토리 목록은 다음과 같은 형식의 헤더로 시작한다.
Offset | Type | Description |
0000 | char[4] | 'ITSP' |
0004 | DWORD | 버전 번호 1 |
0008 | DWORD | 디렉토리 헤더 길이 |
000C | DWORD | $0a (알 수 없음) |
0010 | DWORD | 디렉토리 청크 크기 (일반적으로 $1000) |
0014 | DWORD | 빠른 참조 섹션의 밀도 (일반적으로 2) |
0018 | DWORD | 인덱스 트리 깊이. 1이면 인덱스가 없으며, 2이면 1레벨 PMGI 청크가 있음 |
001C | DWORD | 루트 인덱스 청크 번호 (-1은 인덱스 없음) |
0020 | DWORD | 첫 번째 PMGL(목록) 청크의 청크 번호 |
0024 | DWORD | 마지막 PMGL(목록) 청크의 청크 번호 |
0028 | DWORD | -1 (알 수 없음) |
002C | DWORD | 디렉토리 청크의 총 개수 |
0030 | DWORD | Windows 언어 ID |
0034 | GUID | {5D02926A-212E-11D0-9DF9-00A0C922E6EC} |
0044 | DWORD | $54 (이 길이를 다시 나타냄) |
0048 | DWORD | -1 (알 수 없음) |
004C | DWORD | -1 (알 수 없음) |
0050 | DWORD | -1 (알 수 없음) |
목록 청크
디렉토리 헤더 다음에는 디렉토리 청크가 나열된다. 목록 청크는 다음과 같은 형식을 갖는다.
Offset | Type | Description |
0000 | char[4] | 'PMGL' |
0004 | DWORD | 디렉토리 청크의 여유 공간 및 빠른 참조 영역의 길이 |
0008 | DWORD | 항상 0 |
000C | DWORD | 이전 목록 청크의 청크 번호 (이 청크가 첫 번째일 경우 -1) |
0010 | DWORD | 다음 목록 청크의 청크 번호 (이 청크가 마지막일 경우 -1) |
0014 | Entries | 디렉토리 목록 항목 (파일명 기준 정렬, 대소문자 무시) |
- 목록 청크의 빠른 참조 영역은 청크 끝에서 역순으로 작성된다. 각 파일에 대해 n개의 참조 항목이 생성되며, n은 1 + (1 << 밀도)로 계산된다. 따라서 밀도가 2이면 n은 5가 된다.
목록 항목의 형식은 다음과 같다.
Field | Description |
ENCINT | 이름의 길이 |
BYTEs | UTF-8로 인코딩된 이름 |
ENCINT | 콘텐츠 섹션 |
ENCINT | 오프셋 |
ENCINT | 길이 |
오프셋은 콘텐츠 섹션의 시작을 기준으로 하며, 길이는 압축 해제 후 파일의 길이를 나타낸다. 디렉토리에는 사용자 데이터와 형식 관련 파일 두 종류가 포함되며, 형식 관련 파일의 이름은 ::로 시작하고 사용자 데이터 파일의 이름은 /로 시작한다.
인덱스 청크
인덱스 청크는 다음 형식으로 구성된다.
Offset | Type | Description |
0000 | char[4] | 'PMGI' |
0004 | DWORD | 인덱스 청크의 여유/빠른 참조 영역의 길이 |
0008 | Entries | 디렉토리 인덱스 항목들 |
빠른 참조 영역은 PMGL과 동일한 방식으로 구성된다. 디렉토리 인덱스 항목 형식은 다음과 같다.
Field | Description |
ENCINT | 이름의 길이 |
BYTEs | UTF-8로 인코딩된 이름 |
ENCINT | 이름으로 시작하는 디렉토리 목록 청크 |
5.2.4 콘텐츠
Version 3에서는 콘텐츠가 보통 헤더 섹션 바로 뒤에 위치하며, Version 2에서는 헤더 뒤에 바로 위치한다.
네임리스트 파일
콘텐츠 섹션 0과 디렉토리에는 "::DataSpace/NameList"라는 파일이 존재한다. 이 파일은 모든 콘텐츠 섹션의 이름을 포함하며, 다음과 같은 형식을 따른다.
Offset | Type | Description |
0000 | WORD | 파일의 길이(단어 단위) |
0002 | WORD | 파일 내 항목 수 |
각 항목은 다음과 같다.
Offset | Type | Description |
0000 | WORD | 이름 길이(단어 단위, 종료 null 제외) |
0002 | WORD | 더블 바이트 문자 |
xxxx | WORD | 0 |
이름은 길이 워드와 null 종료 문자를 모두 가지며, 일종의 "이중 안전장치" 접근 방식을 따른다. 인코딩 방식은 리틀 엔디안 방식의 UTF-16일 가능성이 높다.
확인된 섹션 이름
- Uncompressed
- MSCompressed
Uncompressed는 말 그대로 압축되지 않은 섹션을 의미하며, MSCompressed는 Microsoft의 LZX 알고리즘으로 압축된 섹션을 나타낸다.
섹션 데이터
0 이외의 각 섹션에는 '::DataSpace/Storage/<Section Name>/Content'라는 파일이 존재하며, 이 파일에는 해당 섹션의 압축된 데이터가 포함된다. 따라서, 0이 아닌 섹션에서 파일을 가져오는 과정은 여러 단계로 이루어진다. 먼저 섹션 0에서 콘텐츠 파일을 가져온 후 섹션을 압축 해제(해당되는 경우)하고, 압축 해제된 섹션에서 원하는 파일을 추출하는 방식이다.
섹션 관련 추가 파일
섹션과 관련된 여러 파일이 존재한다.
::DataSpace/Storage/<SectionName>/ControlData
이 파일은 압축 정보와 관련된 $20 바이트의 정보를 포함하며, 일부는 아래와 같이 알려져 있다.
Offset | Type | Description |
0000 | DWORD | 'LZXC' 이후 DWORD의 수. 버전이 2인 경우 6 |
0004 | ASCII | 'LZXC' 압축 유형 식별자 |
0008 | DWORD | 버전 (최대 2) |
000C | DWORD | LZX 재설정 간격 |
0010 | DWORD | 윈도우 크기 |
0014 | DWORD | 캐시 크기 |
0018 | DWORD | 0 (알 수 없음) |
재설정 간격, 윈도우 크기, 캐시 크기는 버전 1에서는 바이트 단위, 버전 2에서는 $8000 바이트 블록 단위로 측정된다.
::DataSpace/Storage/<SectionName>/SpanInfo
이 파일은 섹션의 압축 해제 전 길이를 담은 쿼드워드를 포함한다.
::DataSpace/Storage/<SectionName>/Transform/List
이 파일은 섹션의 압축 해제(또는 변환) 방법 목록을 담은 GUID를 포함하도록 설계된 것으로 보인다. 하지만 실제로는 GUID의 문자열 표현 절반만 포함되어 있으며, 캐릭터에 대한 공간이 할당되어 있지만 와이드 캐릭터가 들어가 있다.
5.2.5 부록: 압축
압축된 섹션들은 Microsoft가 캐비닛 파일에 사용한 LZX 압축 방법을 이용하여 압축된다. 압축된 섹션임을 확인하기 위해 ControlData 파일의 두 번째 DWORD가 'LZXC'인지 확인할 수 있다. 압축을 해제하려면 먼저 "::DataSpace/Storage/<SectionName>/Transform/{7FC28940-9D31-11D0-9B27-0A0C91E9C7C}/InstanceData/ResetTable" 파일을 읽어야 한다. 이 재설정 테이블의 형식은 다음과 같다.
Offset | Type | Description |
0000 | DWORD | 2 (알 수 없음, 버전 번호일 가능성) |
0004 | DWORD | 재설정 테이블 항목 수 |
0008 | DWORD | 8 (테이블 항목 크기, 바이트 단위) |
000C | DWORD | $28 (테이블 헤더 길이) |
0010 | QWORD | 압축 해제된 길이 |
0018 | QWORD | 압축된 길이 |
0020 | QWORD | $8000 블록 크기 |
0028 | QWORD | 0 (테이블의 첫 번째 항목) |
0030 | QWORD | 압축 데이터의 첫 번째 블록 경계의 위치 |
테이블 끝까지 반복된다.
이제 콘텐츠 파일을 얻을 수 있다. LZX 압축의 윈도우 크기는 지금까지 확인된 모든 파일에서 16(십진수)이다. ControlData 파일의 $10에 지정된 DWORD가 윈도우 크기를 $8000 바이트 블록 단위로 나타낸다.
Russotto의 문서(링크)에서 다루지 않은 몇 가지 세부 사항이 아래에 추가되어 있다.
5.2.2 ITSF 파일의 세부 사항
- LCID (Locale Identifier)
- ITSF 파일 초기 헤더의 LCID는 컴파일 당시 운영체제의 사용자 LCID를 따르며, 이는 HHP 파일에 저장된 LCID와 다를 수 있다.
- 반면, 디렉터리 헤더의 LCID는 ITSS.DLL (버전 4.72.8085.0 기준, 오프셋 0xB306)에 의해 제공되는 컴파일러의 LCID를 사용한다.
- 타임스탬프
- 초기 헤더의 타임스탬프는 GetFileTime 함수에서 파생되며, ITSF 파일이 생성된 직후 해당 파일의 핸들을 통해 마지막 쓰기 시간 정보에서 가져온다.
- 생성된 시간 값에 42를 더한 후 저장하는데, 이는 더글러스 애덤스의 은하수를 여행하는 히치하이커를 위한 안내서의 팬을 암시하는 유머일 수 있다.
- 청크 간의 여유 공간
- 청크 항목과 빠른 참조 항목 사이에는 여유 공간이 존재한다. 이 공간은 종종 이전 청크의 동일한 오프셋 데이터를 포함하며, 이를 0으로 비워도 디코딩에 영향을 미치지 않는다.
- 이 여유 공간은 압축 파일(zip, gzip, bzip2 등)의 압축 효율을 약간 높일 수 있으며, 보통 일부 청크 항목, 여유 공간, 빠른 참조 항목 등이 포함되어 있다.
이 섹션에서는 ITSF 파일 형식이 시스템 정보와 컴파일러 정보를 어떻게 저장하고 구조화하는지, 그리고 각 데이터가 파일 내 어디에 위치하는지를 설명한다. ITSF의 세부 사항은 HH 시스템 내 여러 파일 간의 일관된 관리 및 참조에 필수적이며, 압축성 및 효율성 측면에서 구조적 유연성을 제공한다.
이후 섹션에서는 각 파일 형식이 저장하는 데이터와 역할에 대해 좀 더 상세히 다룬다.
5.3 내부 파일 형식
ITSF 파일 형식의 CHM 파일은 다양한 내부 파일들로 구성되어 있으며, 이 파일들은 서로 연관되어 도움말 시스템이 작동하도록 지원한다. 각 파일은 CHM 파일의 특정 기능에 중요한 역할을 한다.
5.3.1 서문
이 섹션에서는 ITSF 파일 형식에 포함된 파일들을 설명한다. 만약 사용자가 다른 내부 파일을 발견하거나, 아래 파일에서 설명되지 않은 부분의 기능을 파악한다면 기여할 수 있다. 특정 파일에서 ‘오프셋’이라 하면, 다른 파일의 위치를 가리킬 수 있으며, 이는 동일한 CHM 내에 있거나 동반 CHI 파일에 있을 수 있다.
ITSF 파일 내 다양한 파일 타입
- CHI 파일
- /#ITBITS, /#SYSTEM, /#IDXHDR, /#STRINGS 등 여러 메타 파일 포함
- CHM 파일
- /#SYSTEM, $FIftiMain, $OBJINST 등 콘텐츠 파일 포함
- CHQ 파일
- $TitleMap 등 인덱싱 파일 포함
- CHW 파일
- $HHTitleMap, $WWAssociativeLinks 등 링크 파일 포함
5.3.2 CHM 파일 내부 구성 요소
CHM 파일은 다양한 데이터와 메타데이터로 구성되어 있으며, HTML 문서 외에도 인덱스 정보와 파일 위치를 지정하는 오프셋 데이터를 포함한다. 아래에서 CHM 파일 내부에서 자주 사용되는 주요 구성 요소와 그 특징을 정리한다.(링크)
분류 | 특징 | 설명 |
#ITBITS | 주로 비어 있는 파일 | - 여러 CHM 파일에 별다른 의미가 없는, 빈 파일로 주로 사용한다. |
#SYSTEM | DWORD로 시작하며, 버전을 의미한다. | - 여러 CHM 파일에 대한 정보가 포함되어 있으며, 콘텐츠 파일, 인덱스 파일, 기본 주제, 타이틀, 기본 창 등의 값을 포함한다. - 버전에 따라 정보를 다르게 저장한다. |
#IDXHDR | T#SM로 시작한다. | /#SYSTEM의 Code13 데이터와 중복되며, 4096 바이트 크기로 저장한다. |
#WINDOWS | 윈도우 타입 관련 정보 저장 | CHM 파일에서 윈도우 창 유형과 관련된 설정 정보를 저장한다. |
#STRINGS | ANSI/UTF-8 NT 문자열 목록 | CHM 파일의 실제 내용이 저장되는 부분으로, 각 항목은 문자열로 저장한다. |
#TOCIDX | 0x1000 바이트 블록으로 구성 | Compatibility 1.1 이상에서 사용되며, TOC(목차) 관련된 인덱스 정보를 저장한다. |
#TOPICS | 현재 주제와 관련된 정보 저장 | 현재 표시 중인 주제에 관련된 정보를 저장하며, 오프셋 정보를 포함한다. |
#URLSTR | 0x4000 바이트 블록으로 구성 | URL 문자열과 관련된 데이터를 저장하며, 마지막 블록은 0x4000보다 작은 크기로 채워지지 않은 경우도 있다. |
#URLTBL | URL 테이블 정보를 저장 | URL과 관련된 테이블 형식의 데이터를 저장한다. |
5.3.3 추가 파일 및 섹션
- $FIftiMain
- CHM 파일의 인덱스 정보에 관련된 데이터를 포함한다.
- $OBJINST
- 객체 인스턴스와 관련된 정보를 저장한다.
- $WWAssociativeLinksBTree, $WWAssociativeLinksData, $WWAssociativeLinksMap, $WWAssociativeLinksProperty
- 연관 링크(Associative Links) 관련 데이터와 트리 구조를 저장하며, 각각의 파일은 트리 구조, 데이터 맵, 속성 등을 나타낸다.
- $WWKeywordLinksBTree, $WWKeywordLinksData, $WWKeywordLinksMap, $WWKeywordLinksProperty
- 키워드 링크 관련 데이터가 저장되며, 연관 링크와 유사한 방식으로 관리한다.
버전별 차이점
CHM 파일은 버전에 따라 데이터 구조와 정보 저장 방식이 다를 수 있다. 아래에서 주요 버전 차이점을 설명한다.
- Compatibility 1.0 - CHM 파일의 초기 버전
- CHM 파일의 버전 2에 해당하며, 기본적인 파일 포맷과 구조를 따른다.
- Compatibility 1.1 이상 - 추가적인 파일 블록과 인덱스 정보가 포함된 확장 구조
- CHM 파일의 버전 3에 해당하며, 더 많은 기능과 데이터가 추가된 구조를 지원한다.
OFFSET 정보
CHM 파일 내부에서 각 파일과 데이터는 오프셋 정보를 통해 위치가 정해진다. 예를 들어, #TOPICS와 #URLSTR는 각각 오프셋을 통해 데이터의 위치를 참조하며, 이 오프셋 정보는 파일이 압축 해제될 때 파일 위치를 결정하는 중요한 요소로 작동한다.
- #TOPICS
- 현재 주제에 대한 오프셋 정보를 저장한다.
- #URLSTR
URL 문자열에 대한 오프셋 정보를 관리하며, 마지막 블록은 0x4000 바이트보다 작은 경우가 있다.
5.3.4 #ITBITS
일반적으로 #ITBITS 파일은 비어 있거나 NULL BYTE로 채워져 있으며, 정보 유형과 관련이 있을 것으로 추정된다.
5.3.5 #SYSTEM
#SYSTEM 파일은 DWORD로 시작하여 파일의 버전을 나타내며, Compatibility 설정에 따라 값이 달라진다. 이후 #SYSTEM 항목들은 EOF까지 계속되며 다음과 같은 포맷을 가진다.
Offset | Type | 설명 |
0 | WORD | 코드 |
2 | WORD | 데이터 길이 |
4 | BYTEs | 데이터 |
코드 설명
코드 | 설명 |
0 | HHP 파일의 [OPTIONS] 섹션에서 콘텐츠 파일의 값 |
1 | [OPTIONS] 섹션에서 색인 파일의 값 |
2 | 기본 주제의 값 |
4 | 28 또는 36 바이트 구조체 |
5.3.5 #IDXHDR
4096 바이트 길이의 #IDXHDR 파일은 색인 및 콘텐츠 노드 정보를 저장하며, #SYSTEM 파일의 코드 13 항목과 동일한 데이터를 포함한다.
5.3.6 #WINDOWS
#WINDOWS 파일에는 CHM 파일에서 사용되는 윈도우 타입 정보가 포함되어 있으며, HH_WINTYPE 구조를 따른다. 이 파일에는 각 윈도우 항목의 유효한 속성을 포함하는 플래그가 있으며, 다양한 CHM 파일의 창 속성을 정의한다.
5.3.7 #STRINGS
이 파일은 ANSI/UTF-8 NT 문자열 목록으로 구성되며, 각 문자열은 4096 바이트 블록 단위로 저장된다. 만약 블록 끝에 문자열이 나누어지면 다음 블록의 시작에서 해당 문자열을 완성한다.
5.3.8 #TOCIDX
바이너리 TOC(목차)가 활성화되어 있고 Compatibility 설정이 1.1 이상일 때 #TOCIDX 파일이 포함된다. 이 파일은 4096 바이트 블록으로 구성된 헤더를 포함한다.
5.3.9 #TOPICS
#TOPICS 파일에는 각 주제의 정보가 저장되어 있으며, 색인으로 접근할 수 있다. 각 항목은 CHM의 주제 정보를 담고 있으며 16바이트의 고정 크기 항목으로 구성된다.
5.3.10 #URLSTR
0x4000 바이트 블록으로 구성된 #URLSTR 파일은 URL 및 FrameName 문자열 목록을 저장한다. URL과 FrameName 쌍이 저장되며, 로컬 항목 문자열로 이어진다.
5.3.11 #URLTBL
이 파일은 0x1000 바이트 블록으로 구성되며, 주제의 URL 문자열을 나타낸다. 이 파일의 오프셋은 #TOPICS 파일로 변환할 수 있다.
5.3.12 #IVB
이 파일은 [ALIAS] 섹션의 내용을 저장하며, #IVB 항목을 포함하여 각 항목은 다음과 같은 형식을 가진다.
Offset | Type | 설명 |
0 | DWORD | 별칭 값 |
4 | DWORD | 표시할 파일의 #STRINGS 파일 오프셋 |
5.3.13 #SUBSETS
[SUBSETS] 섹션이 존재할 때 포함되는 파일이다. 서브셋 항목은 이전 사용 메모리의 잔여 데이터를 포함하고 있다.
5.3.14 $FIftiMain
이 파일은 전체 텍스트 검색 인덱스를 위한 정보를 저장하며, 검색 속도를 높이기 위해 트리 구조로 구성된다. 검색 대상 단어가 포함된 파일 및 위치를 빠르게 찾을 수 있도록 지원한다.
파일 구조
Offset | Type | 설명 |
0 | BYTE[4] | 0x00 0x00 0x28 0x00 |
4 | DWORD | 색인된 HTML 파일 수 |
8 | DWORD | 리프 노드 오프셋 |
5.3.15 $OBJINST
ActiveX 객체와 관련된 것으로 추정된다. 삭제해도 큰 영향은 없는 것으로 보인다.
파일 구조
Offset | Type | 설명 |
0 | DWORD | 0x04000000 (알려지지 않음) |
4 | DWORD | 항목 수 |
5.3.16 $WWAssociativeLinks 및 $WWKeywordLinks
이 디렉토리의 파일들은 B-트리 구조를 사용하여 각 파일의 색인 정보를 저장한다.
BTree 파일 구조
Offset | Type | 설명 |
0 | char[2] | ;) 서명 |
2 | WORD | 플래그 값 |
5.3.17 $HHTitleMap
0x1000 바이트 블록으로 이루어져 있으며, 각 항목에는 파일 이름과 LCID가 포함된다.
5.3.18 $TitleMap
68 바이트 고정 크기의 항목으로 구성된 파일이며, 각 항목에는 파일 이름과 색인 번호가 포함된다.
5.3.19 /Path/file.chm/windowtype
사용자가 설정한 창 유형 캐시 정보를 저장한다.
5.3.20 /Path/file.chm/AdvSearchUI/Keywords
UTF-16 문자열로 검색 항목을 저장한다.
5.3.21 /Path/file.chm/AdvSearchUI/Properties
검색 옵션(유사 단어 일치, 제목만 검색 등)을 저장하며, 3비트의 DWORD로 구성된다.
5.3.22 /Path/file.chm/Bookmarks/v1/Count
저장된 즐겨찾기 개수를 저장하는 DWORD 파일이다.
5.3.23 /Path/file.chm/Bookmarks/v1/n/Topic 및 URL
각 즐겨찾기에 대한 주제 및 URL 문자열을 UTF-16 형식으로 저장한다.
5.3.24 #KEY_DELETED
삭제된 내부 파일의 목록을 ANSI/UTF-8 형식으로 저장한다.
5.3.25 #KEY_DATA
이전 CHM의 이름 및 메타 데이터를 포함한 ANSI/UTF-8 형식의 파일이다.
5.4 CHS 포맷
CHS 포맷은 80바이트 헤더로 구성되며, 각 필드의 세부 내용은 다음과 같다.
Offset | Type | Comment/Value |
0 | BYTE[4] | 79 56 34 12 (signature) |
4 | DWORD | 0 (unknown) |
8 | DWORD | 서브셋 항목 수 (QWORD, WORD 또는 BYTE일 가능성 있음) |
0xC | DWORD | 0 (unknown) |
0x10 | BYTE[51] | 현재 선택된 서브셋 이름 또는 서브셋이 선택되지 않았을 때 "(Entire Collection)" |
0x43 | BYTE[13] | 알려지지 않은 값. 타임스탬프 또는 임시 데이터로 추정 |
헤더 뒤에는 파일 끝까지 서브셋 항목들이 반복된다. 서브셋 항목 포맷은 다음과 같다.
Offset | Type | Comment/Value |
0 | DWORD | 항목 끝의 DWORD 수 (각 항목 길이 = 4*this+112) |
4 | BYTE[51] | 서브셋 이름 (ANSI NT 문자열). NIL 종료 후 나머지 51 BYTE는 임시 데이터로 채워짐. |
0x37 | BYTE[57] | 알려지지 않은 값. 예를 들어 VC, MSDN, VSS 등과 같은 약어 |
0x70 | DWORDs | 서브셋 내용 정보. 각 DWORD는 컬렉션 내에서 고유한 단일 리프 노드를 나타냄 |
헤더에 저장된 서브셋 수가 파일에 실제 존재하는 서브셋 항목 수보다 크지 않도록 주의해야 한다. 그렇지 않으면 일부 시스템에서 오류가 발생할 수 있다.
5.5 XML 포맷
XML은 SGML에서 파생된 구조화된 콘텐츠 및 메타데이터 저장 형식이다. XML 파일들은 대부분 유효하지만 몇 가지 문제점이 존재하는데, 특히 시작 시 DOCTYPE이 없고 속성 값이 따옴표로 감싸져 있지 않은 경우가 있다.
5.5.1 서문
XML 파일의 태그들은 내용이 없고, 하위 태그와 속성만 포함하며, 콘텐츠는 모두 "value"라는 이름의 속성에 저장된다.
XML 파일들은 컬렉션 기능을 구현하는 데 사용되며, 각 COL 파일은 개별 컬렉션을 정의하고 hhcolreg.dat 파일은 시스템에 있는 모든 컬렉션 데이터를 저장한다.
hhctrl.ocx에는 아직 XML 형식에서 볼 수 없는 findmergedchms, showhomepage, homepage 등의 태그가 있다.
5.5.2 COL 포맷
COL XML 형식은 개별 CHM 파일 컬렉션을 설명하며, 각 파일은 컬렉션의 집합으로 콘텐츠를 묶는다. 외부 요소는 XML이며, 바로 안에 HTMLHelpCollection 요소가 있고 이는 다른 요소들의 컨테이너 역할을 한다.
COL XML 포맷 메타데이터 요소는 아래와 같다.
Element | Explanation |
masterchm | 컬렉션의 주요 CHM 파일 이름 |
masterlangid | 주요 언어의 숫자 값 (주로 masterchm 요소의 CHM 언어) |
samplelocation | 비어 있으며, 샘플 저장 위치로 추정 |
collectionnum | 컬렉션 레지스트리 파일 (hhcolreg.dat)에서의 컬렉션 번호 |
refcount | 이 컬렉션이 다른 컬렉션 또는 hhcolreg.dat에 링크된 횟수 추정 |
version | 특정 컬렉션의 DTD 버전 추정 |
HTMLHelpCollection 요소 안에는 Folders 요소가 있으며, 이 안에 단일 Folder 요소가 포함된다.
각 Folder 요소는 TitleString, FolderOrder 요소와 0개 이상의 Folder 요소를 포함할 수 있다.
5.5.3 hhcolreg.dat 포맷
hhcolreg.dat는 시스템에 있는 컬렉션 정보를 저장하며, 외부 요소는 XML로, 바로 안에 HTMLHelpDocInfo 요소가 있다.
Location 하위 요소
요소 | 설명 |
LocColNum | 이 Location 요소가 적용되는 Collection 요소의 ColNum 요소 값 |
LocName | Location 요소의 이름 (LocationHistory 요소의 하위 요소로 사용) |
TitleString | hh에 의해 사용자에게 삽입이 요청될 때 대화 상자에 표시되는 텍스트 |
LocPath | Location을 접근할 수 있는 전체 경로 |
Volume | Location이 저장된 파일 시스템의 볼륨 레이블 |
LocationHistory 하위 요소
요소 | 설명 |
ColNum | 이 DocCompilation이 속한 컬렉션 번호 |
TitleLocation | CHM 파일의 전체 경로 |
IndexLocation | CHI 파일의 전체 경로 |
QueryLocation | CHQ 파일의 전체 경로 |
LocationRef | CHM/CHI가 저장된 LocName |
Version | CHM의 버전으로 추정되는 숫자 값 |
LastPromptedVersion | 이전에 설치된 마지막 버전으로 추정되는 값 |
TitleSampleLocation | 이 CHM 샘플이 저장된 LocName |
TitleQueryLocation | 이 CHQ가 저장된 LocName |
SupportsMerge | CHM이 병합을 지원하는지 여부를 나타내는 숫자 값 |
이와 같이 각 XML 포맷은 시스템에서 컬렉션을 관리하기 위한 세부 정보와 구조를 정의하고 있다.
5.6 INI 포맷
INI 파일은 CRLF 줄 끝을 사용하는 텍스트 파일이며, 고유한 이름을 가진 섹션으로 나뉜다. 각 섹션의 시작은 다음과 같은 형식으로 표시된다: [섹션 타입]. 섹션 타입에 따라 각 섹션에 대해 고유한 데이터 형식을 가진 줄들이 작성되며, 두 가지 주요 형식이 있다.
- variable = value[, value]… 형식
- EOL로 종료되는 단일 문자열 형식
주석은 세미콜론(;)으로 시작하는 줄이며 무시된다. MS의 HTML Help Compiler(HHC & HHA)의 개발자가 밝힌 바에 따르면, 주석은 파일의 시작, 즉 섹션 이름이 지정되기 전까지만 안전하게 사용할 수 있다고 한다. 다만 HHW 1.3 (HHA Version 4.74.8702) 테스트에 따르면, 주석은 모든 줄에 안전하게 사용할 수 있다.
5.6.2 HHP 포맷
HHP(HTML Help Project) 포맷은 MS HTML Help Workshop(HHW)에서 CHM 파일을 컴파일하는 데 사용된다. 이 파일은 INI 형식을 따르며, 1024자 이상의 줄(CRLF 포함되지 않음)이 있으면 HHW가 오류를 일으킨다.
[OPTIONS]
이는 variable=value 형식을 가지며 변수명 순으로 정렬된다. 이 섹션의 다양한 옵션에 대한 설명은 다음과 같다.
Variable & Type | 설명 | 기본값 |
Auto Index= bool | 인덱스 자동 생성 여부 설정 | No |
Auto TOC= number | HTML 파일의 제목 태그를 사용하여 콘텐츠 생성 | No |
Binary Index= bool | 바이너리 인덱스 사용 여부 설정 | Yes |
Binary TOC= bool | 바이너리 TOC 사용 여부 설정 | No |
Compiled file= path | 컴파일된 파일 경로 | - |
Contents file= path | 목차 파일 경로 | - |
Default Font= string, number, number | 기본 글꼴 설정 | - |
Default topic= path | 기본 주제 파일 경로 | - |
Full-text search= bool | 전체 텍스트 검색 인덱스 추가 여부 설정 | No |
Index file= path | 인덱스 파일 경로 | - |
Title= string | 제목 표시줄에 표시할 텍스트 | - |
[WINDOWS]
variable=value 형식을 가지며 추가 순서에 따라 정렬된다. 각 줄은 창의 속성을 정의하며, 총 21개의 매개변수를 가진다.
[MERGE FILES]
이 섹션은 병합할 CHM 파일 목록을 포함하며, 최대 1148개의 항목이 허용된다. 주석은 세미콜론으로 시작하고 공백을 제외한 파일 이름의 처음과 끝에 존재하는 공백은 제거된다.
[FILES]
이 섹션은 컴파일러가 CHM에 포함할 파일 목록을 포함한다.
[TEXT POPUPS]
다양한 팝업 텍스트를 포함한 파일 목록을 포함한다.
[MAP]
각 줄은 #define string number 또는 #include path 형식을 따른다.
[ALIAS]
variable=value 형식으로 구성되며, 각 줄은 number|string = path 형식을 따른다.
5.6.3 HHS 포맷
HHS(HTML Help Samples) 파일은 HHW에서 샘플을 CHM 파일로 컴파일하는 데 사용된다. 각 HHS 파일의 예시는 다음과 같다.
[Example1]
ID=Example1
DistributionMediaDestination=MyProject\Example1
DefaultClientCopyDestination=\MyProject\Example1
SourceLocation=Samples\Example1\
5.6.4 SFL 포맷
SFL 포맷은 MS HTML Help Workshop에서 다양한 설정 및 샘플 목록을 관리하는 데 사용된다. SFL 파일 형식의 구체적인 내용은 아직 알려지지 않았다.
5.7 사이트맵 포맷
5.7.1 서문
이 포맷들은 HTML을 기반으로 하며 다음과 같은 doctype을 사용한다.
예시)
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HEAD> 태그는 파일을 생성한 프로그램에 대한 정보를 제공하는 <meta> 태그와 파일 버전을 나타내는 주석을 포함한다.
예시)
<meta name="GENERATOR"content="Microsoft® HTML Help Workshop 4.1">
<!-- Sitemap 1.0 -->
<BODY> 태그는 파일의 속성을 <param> 태그로 저장하는 <OBJECT> 태그를 포함하며, <UL> 태그 안에 <LI> 태그들이 위치한다. 각 <LI> 태그는 콘텐츠/인덱스 항목의 속성을 <param> 태그로 저장하는 <OBJECT> 태그를 포함한다.
예시)
<BODY>
<OBJECT type="text/site properties">
<param name="Property Name" value="Property Value">
…
</OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Property Name" value="Property Value">
…
</OBJECT>
…
</UL>
</BODY>
참고로 속성 이름과 값 및 태그는 대소문자를 구분하지 않는다. 하지만 HHW는 기본 대문자 형식을 사용한다.
5.7.2 HHC 포맷
이 파일들은 콘텐츠 창에 필요한 정보를 저장하며 사이트맵 형식을 따른다. 글로벌 속성의 순서는 다음과 같다.
속성 | 예시 값 | 설명 |
FrameName | left | 주제를 특정 HTML 프레임에 열도록 설정 |
WindowName | main | 주제를 특정 창에 열도록 설정 |
ImageList | foobar.bmp | 동일 크기의 이미지가 가로 배열된 BMP 파일 경로 |
Image Width | 16 | 이미지의 너비 (HHW GUI에는 20으로 표시됨) |
Color Mask | 0xFF | Foreground 및 Background 색상에 영향을 줌 |
Background | 0xffffff | TOC 창의 배경색 (16진수 형식) |
Foreground | 0x0 | TOC 창의 텍스트 색상 (16진수 형식) |
ExWindow Styles | 0x6300 | Win32 확장 창 스타일 DWORD |
Window Styles | 0xc01627 | Win32 창 스타일 DWORD |
ImageType | Folder | 표준 이미지 사용 시 헤딩에 폴더 아이콘이 사용됨 |
Font | Times New Roman,8,0 | 폰트 이름, 크기, 문자 집합 설정 |
정보 유형도 글로벌 속성에 저장된다.
속성 | 예시 값 | 설명 |
SaveType | Manager | 정보 유형을 Inclusive로 선언 |
SaveHidden | Code monkey | 정보 유형을 Hidden으로 선언 |
SaveExclusive | Engineer | 정보 유형을 Exclusive로 선언 |
SaveTypeDesc | 프로 엔지니어 | 이전에 선언된 정보 유형을 설명 |
Category | 경험 수준 | 카테고리를 선언 |
CategoryDesc | 경험치를 설명 | 이전에 선언된 카테고리를 설명 |
Type | 초보자 | Inclusive 유형으로 이전에 선언된 카테고리에 속함 |
TypeHidden | 전문가 | Hidden 유형으로 이전에 선언된 카테고리에 속함 |
TypeExclusive | 마스터 | Exclusive 유형으로 이전에 선언된 카테고리에 속함 |
TypeDesc | 고급 프로그래머 | 이전에 선언된 유형 설명 |
5.7.3 HHK 포맷
HHK 파일은 인덱스 창에 필요한 정보를 저장하며 사이트맵 형식을 따른다. 글로벌 속성의 순서는 다음과 같다.
속성 | 예시 값 | 설명 |
FrameName | left | 주제를 특정 HTML 프레임에 열도록 설정 |
WindowName | main | 주제를 특정 창에 열도록 설정 |
Font | Times New Roman,8,0 | 폰트 이름, 크기, 문자 집합 설정 |
정보 유형도 글로벌 속성에 포함되며, 그 순서는 다음과 같다.
속성 | 예시 값 | 설명 |
SaveType | Manager | 정보 유형을 Inclusive로 선언 |
SaveHidden | Code monkey | 정보 유형을 Hidden으로 선언 |
SaveExclusive | Engineer | 정보 유형을 Exclusive로 선언 |
SaveTypeDesc | 프로 엔지니어 | 이전에 선언된 정보 유형 설명 |
Category | 경험 수준 | 카테고리를 선언 |
CategoryDesc | 경험 수준 설명 | 이전에 선언된 카테고리 설명 |
Type | 초보자 | Inclusive 유형으로 이전에 선언된 카테고리에 속함 |
TypeHidden | 전문가 | Hidden 유형으로 이전에 선언된 카테고리에 속함 |
TypeExclusive | 마스터 | Exclusive 유형으로 이전에 선언된 카테고리에 속함 |
TypeDesc | 고급 프로그래머 | 이전에 선언된 유형 설명 |
5.8 기타 포맷
5.8.1 별칭 파일
별칭 파일은 var=file 형식을 따르며, 특정 파일을 변수로 지정한다.
5.8.2 텍스트 팝업 파일
텍스트 팝업 파일은 .topic number 및 텍스트 형식으로 구성되며, 텍스트 팝업을 정의한다.
5.8.3 헤더 파일
헤더 파일은 #define var num 형식을 따르며 변수와 숫자를 정의한다.
5.8.4 전체 텍스트 검색 제외 목록 파일
이 파일은 $FIftiMain 파일에서 제외될 단어 목록을 포함한다.
6장 CHM 파일 생성 및 열람 도구
CHM 파일은 주로 Microsoft의 HTML Help Workshop을 사용해 생성할 수 있으며, 다른 도구로도 도움말 시스템을 작성하고 컴파일할 수 있다.
- Microsoft HTML Help Workshop(링크)
- Windows용 CHM 파일을 생성하는 대표적인 도구
- CHM 뷰어
- Windows 기본 뷰어 외에도 iChm, KchmViewer, xCHM 등 타사 소프트웨어로 macOS 및 Linux에서 열람 가능
7장 CHM 파일의 파일 압축 구조
CHM(Compiled HTML Help) 파일의 압축 구조는 여러 개의 압축된 데이터 블록으로 나뉘어 있으며, 이 블록들은 효율적인 데이터 저장과 빠른 검색 기능을 가능하게 한다. 이 압축 구조의 핵심은 LZX(Lempel-Ziv Extended) 압축 알고리즘을 사용하여 여러 HTML 파일과 기타 리소스들을 단일 파일로 묶고 크기를 줄이는 것이다. 이는 특히 소프트웨어 매뉴얼이나 기술 문서와 같은 대용량 데이터셋을 하나의 CHM 파일로 배포할 때 유용하다.
이와 같이 여러 블록이 폴더 내에 저장되어 있으며, 각 블록은 압축된 파일로 구성된다.
7.1 LZX 알고리즘
CHM 파일의 압축을 담당하는 주요 요소로, 데이터의 블록별 압축을 통해 파일 크기를 줄인다. 이 알고리즘은 일반적인 압축 알고리즘보다 높은 압축률을 자랑하며, 특히 HTML 문서처럼 텍스트 기반 파일에 대해 뛰어난 성능을 발휘한다. LZX 알고리즘은 연속된 데이터 스트림을 압축하고, 해당 데이터를 해제할 때에도 빠른 복원이 가능하다.
7.2 파일 구조와 블록 구성
CHM 파일은 하나의 큰 파일처럼 보이지만, 실제로는 여러 개의 독립적인 블록으로 나뉘어 저장된다. 각 블록은 고유한 압축 데이터 덩어리로, 여러 개의 파일을 포함할 수 있다. 이 블록들은 다음과 같은 구조를 따른다.
- 데이터 블록
- 각 데이터 블록에는 HTML 문서, 이미지, 스크립트 등 다양한 리소스를 포함한다.
- 목차 및 인덱스 정보
- 파일 내에서 목차와 색인 기능을 제공하기 위해 별도의 인덱스 블록이 사용되며, 이러한 정보는 사용자가 CHM 파일을 탐색할 때 참조한다.
7.3 파일 테이블 및 엔트리 리스트
CHM 파일은 데이터의 압축과 함께 각 파일의 위치와 크기를 기록하는 엔트리 리스트를 사용한다. 엔트리 리스트는 각 파일이 CHM 파일 내에서 어디에 위치해 있는지에 대한 정보를 저장하며, 압축 해제 과정에서 파일 복원에 필수적이다. 여기에는 파일의 시작 위치(오프셋)와 길이, 압축된 크기 등이 기록되어 있다.
7.4 압축 블록의 처리 과정
CHM 파일의 압축 해제 과정은 각 데이터 블록을 LZX 알고리즘을 사용해 압축 해제하는 것으로 시작한다. 해제된 데이터는 엔트리 리스트에 기록된 정보를 바탕으로 복원한다. 이 과정은 다음 단계를 거친다.
- 압축 해제
- 각 블록의 데이터를 해제하여 원본 데이터를 복원한다.
- 데이터 블록 연결
- 여러 압축된 블록을 순차적으로 연결하여 하나의 연속된 데이터 스트림으로 만든다.
- 파일 복원
- 엔트리 리스트에 기록된 오프셋 정보를 사용해 데이터를 정확한 위치에 맞춰 재구성한다.
7.5 압축의 장점
CHM 파일의 압축 구조는 단순한 파일 크기 축소 이상의 장점을 제공한다. 압축된 데이터는 읽기 및 탐색 속도를 높이기 위해 최적화되어 있으며, 사용자가 파일을 열 때 즉시 필요한 데이터를 제공할 수 있도록 설계되었다. 이는 특히 대규모의 매뉴얼이나 기술 문서에서 사용자 경험을 크게 향상시킨다.
7.6 보안 및 데이터 무결성
CHM 파일은 압축 과정에서 데이터를 효율적으로 저장하는 동시에, 파일 무결성을 유지하기 위해 데이터 무결성 검사 기능을 포함할 수 있다. 이 기능은 압축 해제 과정에서 오류를 감지하고, 잘못된 데이터를 복구하는 데 도움을 줄 수 있다. 이를 통해 CHM 파일은 안전한 데이터 전송 및 배포에 적합한 형식이 된다.
참조URL:
https://www.nongnu.org/chmspec/latest/index.html
http://www.russotto.net/chm/chmformat.html
'기술 노트' 카테고리의 다른 글
MacOS 개발 첫 발: 환경 설정부터 코드 호출까지 (0) | 2022.03.18 |
---|---|
Unix와 Linux: 다양한 OS 환경에서의 빌드와 자동화 경험 (0) | 2022.03.17 |
Solaris 10 이하에서 .tar.gz 파일을 여는 방법 (0) | 2022.03.16 |
AIX에서의 XL gcc 컴파일러: 설치/삭제 가이드 (2) | 2022.03.15 |
AIX에서 오픈소스 패키지 설치하기: 리눅스와의 차이점과 필수 도구 (0) | 2022.03.14 |