documentation-hub 5.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/.eslintrc.json +43 -0
  2. package/.github/workflows/build.yml +64 -0
  3. package/.github/workflows/ci.yml +39 -0
  4. package/.vscode/extensions.json +3 -0
  5. package/Current.md +97 -0
  6. package/DocHub_Image.png +0 -0
  7. package/README.md +666 -0
  8. package/USER_GUIDE.md +1173 -0
  9. package/Updater.md +311 -0
  10. package/build/256x256.png +0 -0
  11. package/build/512x512.png +0 -0
  12. package/build/app-update.yml +4 -0
  13. package/build/create-icon.js +208 -0
  14. package/build/icon.ico +0 -0
  15. package/build/icon.png +0 -0
  16. package/build/icon_1024x1024.png +0 -0
  17. package/dist/assets/Analytics-BpsG9895.js +1 -0
  18. package/dist/assets/Card-IAZin8kp.js +1 -0
  19. package/dist/assets/CurrentSession-B-rFkHvf.js +12 -0
  20. package/dist/assets/Dashboard-C_5gMb0q.js +1 -0
  21. package/dist/assets/Documents-CqZ25axS.js +1 -0
  22. package/dist/assets/Input-l89xwXBi.js +1 -0
  23. package/dist/assets/Reporting-DqdHJY_a.js +1 -0
  24. package/dist/assets/Search-XNbu5z_3.js +1 -0
  25. package/dist/assets/SessionManager-lH9hZfzH.js +1 -0
  26. package/dist/assets/Sessions-ClZOPYNc.js +1 -0
  27. package/dist/assets/Settings-DUEHGURa.js +11 -0
  28. package/dist/assets/index-8xUe8ptc.js +24 -0
  29. package/dist/assets/index-RYyJqF7O.css +1 -0
  30. package/dist/assets/path-BkOl0AGO.js +1 -0
  31. package/dist/assets/promises-ID_B9S-h.js +1 -0
  32. package/dist/assets/urlHelpers-TvgahX0r.js +1 -0
  33. package/dist/assets/useToast-yRSO1dkm.js +1 -0
  34. package/dist/assets/vendor-charts-RkGK5ROP.js +36 -0
  35. package/dist/assets/vendor-db-l0sNRNKZ.js +1 -0
  36. package/dist/assets/vendor-react-BVZ_anCF.js +4 -0
  37. package/dist/assets/vendor-search-Dw8P0qyA.js +1 -0
  38. package/dist/assets/vendor-ui-BU7NfluV.js +53 -0
  39. package/dist/electron/PowerAutomateApiService-LfW09ZGr.js +147 -0
  40. package/dist/electron/main-CXkNtyv-.js +19789 -0
  41. package/dist/electron/main.js +5 -0
  42. package/dist/electron/preload.js +1 -0
  43. package/dist/icon.png +0 -0
  44. package/dist/index.html +27 -0
  45. package/docs/CODEBASE_ANALYSIS_REPORT.md +309 -0
  46. package/docs/DEBUG_LOGGING_GUIDE.md +244 -0
  47. package/docs/README.md +115 -0
  48. package/docs/TOC_WIRING_GUIDE.md +344 -0
  49. package/docs/analysis/Bullet_Symbol_Bug_Analysis.md +136 -0
  50. package/docs/analysis/DOCXMLATER_ANALYSIS_SUMMARY.txt +169 -0
  51. package/docs/analysis/Document_Processing_Issues_Analysis.md +704 -0
  52. package/docs/analysis/FIELD_PRESERVATION_ANALYSIS.md +1200 -0
  53. package/docs/analysis/INDENTATION_PRESERVE_ANALYSIS.md +181 -0
  54. package/docs/analysis/INDENTATION_PRESERVE_IMPLEMENTATION.md +207 -0
  55. package/docs/analysis/List_Implementation.md +206 -0
  56. package/docs/analysis/List_Implementation_Accuracy_Report.md +366 -0
  57. package/docs/analysis/PROCESSING_OPTIONS_UI_UPDATES.md +220 -0
  58. package/docs/analysis/RefactorStyles.md +852 -0
  59. package/docs/analysis/STYLE_PARAMETER_ENHANCEMENT.md +143 -0
  60. package/docs/analysis/docxmlater-comparison-todo-2025-11-13.md +636 -0
  61. package/docs/analysis/docxmlater-implementation-analysis-2025-11-13.md +340 -0
  62. package/docs/analysis/docxmlater-template_ui-integration-analysis.md +263 -0
  63. package/docs/analysis/github-issues-to-create.md +237 -0
  64. package/docs/api/API_README.md +538 -0
  65. package/docs/api/API_REFERENCE.md +751 -0
  66. package/docs/api/TYPE_DEFINITIONS.md +869 -0
  67. package/docs/architecture/FONT_EMBEDDING_GUIDE.md +318 -0
  68. package/docs/architecture/docxmlater-functions-and-structure.md +726 -0
  69. package/docs/docxmlater-readme.md +1341 -0
  70. package/docs/fixes/EXECUTION_LOG_TEST_BASE.md +573 -0
  71. package/docs/fixes/HYPERLINK_TEXT_SANITIZATION.md +253 -0
  72. package/docs/fixes/README.md +37 -0
  73. package/docs/github-issues/issue-1-body.md +125 -0
  74. package/docs/github-issues/issue-10-body.md +850 -0
  75. package/docs/github-issues/issue-2-body.md +200 -0
  76. package/docs/github-issues/issue-3-body.md +270 -0
  77. package/docs/github-issues/issue-4-body.md +169 -0
  78. package/docs/github-issues/issue-5-body.md +173 -0
  79. package/docs/github-issues/issue-6-body.md +158 -0
  80. package/docs/github-issues/issue-7-body.md +171 -0
  81. package/docs/github-issues/issue-8-body.md +407 -0
  82. package/docs/github-issues/issue-9-body.md +515 -0
  83. package/docs/github-issues/issue-tracker.md +274 -0
  84. package/docs/github-issues/predictive-analysis-2025-10-18.md +2131 -0
  85. package/docs/implementation/List_Framework_Refactor_Plan.md +336 -0
  86. package/docs/implementation/PRIMARY_TEXT_COLOR_FEATURE.md +217 -0
  87. package/docs/implementation/RELEASE_PLAN_v2.1.0.md +362 -0
  88. package/docs/implementation/RefactorStyles.md +588 -0
  89. package/docs/implementation/implement-plan.md +489 -0
  90. package/docs/implementation/missing-helpers-implementation.md +391 -0
  91. package/docs/implementation/refactor-plan.md +520 -0
  92. package/docs/implementation/session-implementation-complete.md +233 -0
  93. package/docs/implementation/session-management-plan.md +250 -0
  94. package/docs/setup-checklist.md +77 -0
  95. package/docs/versions/changelog.md +345 -0
  96. package/electron/customUpdater.ts +656 -0
  97. package/electron/main.ts +2441 -0
  98. package/electron/memoryConfig.ts +187 -0
  99. package/electron/preload.ts +394 -0
  100. package/electron/proxyConfig.ts +340 -0
  101. package/electron/services/BackupService.ts +452 -0
  102. package/electron/services/DictionaryService.ts +402 -0
  103. package/electron/services/LocalDictionaryLookupService.ts +147 -0
  104. package/electron/services/PowerAutomateApiService.ts +231 -0
  105. package/electron/services/SharePointSyncService.ts +474 -0
  106. package/electron/windowsCertStore.ts +427 -0
  107. package/electron/zscalerConfig.ts +381 -0
  108. package/eslint.config.js +92 -0
  109. package/jest.config.js +52 -0
  110. package/package.json +214 -0
  111. package/postcss.config.mjs +6 -0
  112. package/public/icon.png +0 -0
  113. package/publish-release.ps1 +5 -0
  114. package/renovate.json +30 -0
  115. package/src/App.tsx +216 -0
  116. package/src/__mocks__/p-limit.js +12 -0
  117. package/src/__mocks__/styleMock.js +1 -0
  118. package/src/components/common/BugReportButton.tsx +44 -0
  119. package/src/components/common/BugReportDialog.tsx +193 -0
  120. package/src/components/common/Button.tsx +153 -0
  121. package/src/components/common/Card.tsx +86 -0
  122. package/src/components/common/ColorPickerDialog.tsx +177 -0
  123. package/src/components/common/ConfirmDialog.tsx +96 -0
  124. package/src/components/common/DebugConsole.tsx +275 -0
  125. package/src/components/common/EmptyState.tsx +183 -0
  126. package/src/components/common/ErrorBoundary.tsx +98 -0
  127. package/src/components/common/ErrorDetailsDialog.tsx +153 -0
  128. package/src/components/common/ErrorFallback.tsx +218 -0
  129. package/src/components/common/Input.tsx +109 -0
  130. package/src/components/common/Skeleton.tsx +184 -0
  131. package/src/components/common/SplashScreen.tsx +81 -0
  132. package/src/components/common/Toast.tsx +155 -0
  133. package/src/components/common/Tooltip.tsx +79 -0
  134. package/src/components/common/UpdateNotification.tsx +320 -0
  135. package/src/components/comparison/ComparisonWindow.tsx +374 -0
  136. package/src/components/comparison/SideBySideDiff.tsx +486 -0
  137. package/src/components/comparison/index.ts +8 -0
  138. package/src/components/document/DocumentUploader.tsx +288 -0
  139. package/src/components/document/HyperlinkPreview.tsx +430 -0
  140. package/src/components/document/HyperlinkService.md +1484 -0
  141. package/src/components/document/Hyperlink_Technical_Documentation.md +496 -0
  142. package/src/components/document/InlineChangesView.tsx +707 -0
  143. package/src/components/document/ProcessingProgress.tsx +303 -0
  144. package/src/components/document/ProcessingResults.tsx +256 -0
  145. package/src/components/document/TrackedChangesDetail.tsx +530 -0
  146. package/src/components/document/TrackedChangesPanel.tsx +546 -0
  147. package/src/components/document/VirtualDocumentList.tsx +240 -0
  148. package/src/components/editor/DocumentEditor.tsx +723 -0
  149. package/src/components/editor/DocumentEditorModal.tsx +640 -0
  150. package/src/components/editor/EditorQuickActions.tsx +502 -0
  151. package/src/components/editor/EditorToolbar.tsx +312 -0
  152. package/src/components/editor/TableEditor.tsx +926 -0
  153. package/src/components/editor/index.ts +18 -0
  154. package/src/components/layout/Header.tsx +190 -0
  155. package/src/components/layout/Sidebar.tsx +313 -0
  156. package/src/components/layout/TitleBar.tsx +190 -0
  157. package/src/components/navigation/CommandPalette.tsx +233 -0
  158. package/src/components/navigation/KeyboardShortcutsModal.tsx +173 -0
  159. package/src/components/sessions/ChangeItem.tsx +408 -0
  160. package/src/components/sessions/ChangeViewer.tsx +1155 -0
  161. package/src/components/sessions/DocumentComparisonModal.tsx +314 -0
  162. package/src/components/sessions/ProcessingOptions.tsx +297 -0
  163. package/src/components/sessions/ReplacementsTab.tsx +438 -0
  164. package/src/components/sessions/RevisionHandlingOptions.tsx +87 -0
  165. package/src/components/sessions/SessionManager.tsx +188 -0
  166. package/src/components/sessions/StylesEditor.tsx +1335 -0
  167. package/src/components/sessions/TabContainer.tsx +151 -0
  168. package/src/components/sessions/VirtualSessionList.tsx +157 -0
  169. package/src/components/sessions/sessionToProcessorManager.tsx +420 -0
  170. package/src/components/settings/CertificateManager.tsx +410 -0
  171. package/src/components/settings/SegmentedControl.tsx +88 -0
  172. package/src/components/settings/SettingRow.tsx +52 -0
  173. package/src/contexts/GlobalStatsContext.tsx +396 -0
  174. package/src/contexts/SessionContext.tsx +2129 -0
  175. package/src/contexts/ThemeContext.tsx +428 -0
  176. package/src/contexts/UserSettingsContext.tsx +290 -0
  177. package/src/contexts/__tests__/GlobalStatsContext.test.tsx +390 -0
  178. package/src/global.d.ts +273 -0
  179. package/src/hooks/useDocumentQueue.tsx +210 -0
  180. package/src/hooks/useToast.tsx +55 -0
  181. package/src/main.tsx +10 -0
  182. package/src/pages/Analytics.tsx +386 -0
  183. package/src/pages/CurrentSession.tsx +1174 -0
  184. package/src/pages/Dashboard.tsx +319 -0
  185. package/src/pages/Documents.tsx +317 -0
  186. package/src/pages/Projects.tsx +250 -0
  187. package/src/pages/Reporting.tsx +386 -0
  188. package/src/pages/Search.tsx +349 -0
  189. package/src/pages/Sessions.tsx +285 -0
  190. package/src/pages/Settings.tsx +2662 -0
  191. package/src/services/HyperlinkService.ts +1085 -0
  192. package/src/services/document/DocXMLaterProcessor.ts +617 -0
  193. package/src/services/document/DocumentProcessingComparison.ts +856 -0
  194. package/src/services/document/DocumentSnapshotService.ts +575 -0
  195. package/src/services/document/WordDocumentProcessor.ts +10509 -0
  196. package/src/services/document/__tests__/DocXMLaterProcessor.hyperlinks.test.md +311 -0
  197. package/src/services/document/__tests__/WordDocumentProcessor.integration.test.ts +515 -0
  198. package/src/services/document/__tests__/WordDocumentProcessor.test.ts +812 -0
  199. package/src/services/document/blanklines/BlankLineManager.ts +658 -0
  200. package/src/services/document/blanklines/__tests__/paragraphChecks.test.ts +281 -0
  201. package/src/services/document/blanklines/helpers/blankLineInsertion.ts +87 -0
  202. package/src/services/document/blanklines/helpers/blankLineSnapshot.ts +251 -0
  203. package/src/services/document/blanklines/helpers/clearCustom.ts +121 -0
  204. package/src/services/document/blanklines/helpers/contextChecks.ts +117 -0
  205. package/src/services/document/blanklines/helpers/imageChecks.ts +51 -0
  206. package/src/services/document/blanklines/helpers/paragraphChecks.ts +236 -0
  207. package/src/services/document/blanklines/helpers/removeBlanksBetweenListItems.ts +91 -0
  208. package/src/services/document/blanklines/helpers/removeTrailingBlanks.ts +35 -0
  209. package/src/services/document/blanklines/helpers/tableGuards.ts +21 -0
  210. package/src/services/document/blanklines/index.ts +67 -0
  211. package/src/services/document/blanklines/rules/additionRules.ts +337 -0
  212. package/src/services/document/blanklines/rules/indentationRules.ts +317 -0
  213. package/src/services/document/blanklines/rules/removalRules.ts +362 -0
  214. package/src/services/document/blanklines/rules/ruleTypes.ts +92 -0
  215. package/src/services/document/blanklines/types.ts +29 -0
  216. package/src/services/document/helpers/ImageBorderCropper.ts +377 -0
  217. package/src/services/document/helpers/__tests__/whitespace.test.ts +272 -0
  218. package/src/services/document/helpers/whitespace.ts +117 -0
  219. package/src/services/document/list/ListNormalizer.ts +947 -0
  220. package/src/services/document/list/index.ts +45 -0
  221. package/src/services/document/list/list-detection.ts +275 -0
  222. package/src/services/document/list/list-types.ts +162 -0
  223. package/src/services/document/processors/HyperlinkProcessor.ts +370 -0
  224. package/src/services/document/processors/ListProcessor.ts +257 -0
  225. package/src/services/document/processors/StructureProcessor.ts +176 -0
  226. package/src/services/document/processors/StyleProcessor.ts +389 -0
  227. package/src/services/document/processors/TableProcessor.ts +2238 -0
  228. package/src/services/document/processors/__tests__/HyperlinkProcessor.test.ts +314 -0
  229. package/src/services/document/processors/__tests__/ListProcessor.test.ts +291 -0
  230. package/src/services/document/processors/__tests__/StructureProcessor.test.ts +257 -0
  231. package/src/services/document/processors/__tests__/TableProcessor.hlp-tips-bullets.test.ts +459 -0
  232. package/src/services/document/processors/__tests__/TableProcessor.test.ts +1604 -0
  233. package/src/services/document/processors/index.ts +28 -0
  234. package/src/services/document/types/docx-processing.ts +310 -0
  235. package/src/services/editor/EditorActionHandlers.ts +901 -0
  236. package/src/services/editor/index.ts +13 -0
  237. package/src/setupTests.ts +47 -0
  238. package/src/styles/global.css +782 -0
  239. package/src/types/backup.ts +132 -0
  240. package/src/types/dictionary.ts +125 -0
  241. package/src/types/document-processing.ts +331 -0
  242. package/src/types/docxmlater-augments.d.ts +142 -0
  243. package/src/types/editor.ts +280 -0
  244. package/src/types/electron.ts +340 -0
  245. package/src/types/globalStats.ts +155 -0
  246. package/src/types/hyperlink.ts +471 -0
  247. package/src/types/operations.ts +354 -0
  248. package/src/types/session.ts +427 -0
  249. package/src/types/settings.ts +112 -0
  250. package/src/utils/MemoryMonitor.ts +248 -0
  251. package/src/utils/cn.ts +6 -0
  252. package/src/utils/colorConvert.ts +306 -0
  253. package/src/utils/diffUtils.ts +347 -0
  254. package/src/utils/documentUtils.ts +202 -0
  255. package/src/utils/electronGuard.ts +62 -0
  256. package/src/utils/indexedDB.ts +915 -0
  257. package/src/utils/logger.ts +717 -0
  258. package/src/utils/pathSecurity.ts +232 -0
  259. package/src/utils/pathValidator.ts +236 -0
  260. package/src/utils/processingTimeEstimator.ts +153 -0
  261. package/src/utils/safeJsonParse.ts +62 -0
  262. package/src/utils/textSanitizer.ts +162 -0
  263. package/src/utils/urlHelpers.ts +304 -0
  264. package/src/utils/urlPatterns.ts +198 -0
  265. package/src/utils/urlSanitizer.ts +152 -0
  266. package/src/vite-env.d.ts +11 -0
  267. package/tsconfig.electron.json +19 -0
  268. package/tsconfig.json +36 -0
  269. package/tsconfig.node.json +12 -0
  270. package/typedoc.json +45 -0
  271. package/vite.config.ts +152 -0
@@ -0,0 +1,318 @@
1
+ # Font Embedding in DOCX Documents
2
+
3
+ ## Overview
4
+
5
+ This guide explains how to properly embed fonts in DOCX documents using the docxmlater framework's `FontManager` class. When fonts are embedded, they must be registered in `[Content_Types].xml` to ensure Office applications recognize them.
6
+
7
+ ## Important: Content_Types.xml Registration
8
+
9
+ **CRITICAL:** When adding fonts to `/word/fonts/`, you **MUST** add corresponding entries to `[Content_Types].xml`. The `FontManager` class in docxmlater automatically handles this for you.
10
+
11
+ ## Font Manager Architecture
12
+
13
+ ### Font Structure in DOCX
14
+
15
+ ```
16
+ document.docx (ZIP archive)
17
+ ├── [Content_Types].xml ← Registers all file types including fonts
18
+ ├── word/
19
+ │ ├── document.xml
20
+ │ ├── fontTable.xml ← Optional: Font substitution info
21
+ │ └── fonts/ ← Embedded font files
22
+ │ ├── arial_1.ttf
23
+ │ ├── times_2.otf
24
+ │ └── custom_3.woff
25
+ ```
26
+
27
+ ### Content_Types.xml Example
28
+
29
+ When fonts are added, `FontManager` generates entries like:
30
+
31
+ ```xml
32
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
33
+ <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
34
+ <!-- Font type registrations -->
35
+ <Default Extension="ttf" ContentType="application/x-font-ttf"/>
36
+ <Default Extension="otf" ContentType="application/x-font-opentype"/>
37
+ <Default Extension="woff" ContentType="application/font-woff"/>
38
+ <Default Extension="woff2" ContentType="font/woff2"/>
39
+
40
+ <!-- Other content types... -->
41
+ <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
42
+ </Types>
43
+ ```
44
+
45
+ ## Using FontManager in docxmlater
46
+
47
+ ### Basic Usage
48
+
49
+ ```typescript
50
+ import { Document } from 'docxmlater';
51
+
52
+ // Create or load document
53
+ const doc = await Document.load('input.docx');
54
+
55
+ // Access the document's FontManager
56
+ const fontManager = doc.getFontManager(); // Hypothetical API - needs verification
57
+
58
+ // Add a font from file
59
+ await fontManager.addFontFromFile('Arial', '/path/to/arial.ttf');
60
+
61
+ // Or add from buffer
62
+ const fontData = fs.readFileSync('/path/to/custom.ttf');
63
+ fontManager.addFont('CustomFont', fontData, 'ttf');
64
+
65
+ // Save document - Content_Types.xml is automatically updated
66
+ await doc.save('output.docx');
67
+ ```
68
+
69
+ ### Supported Font Formats
70
+
71
+ | Format | Extension | MIME Type | Description |
72
+ |--------|-----------|-----------|-------------|
73
+ | TrueType | `.ttf` | `application/x-font-ttf` | Standard TrueType fonts |
74
+ | OpenType | `.otf` | `application/x-font-opentype` | OpenType fonts |
75
+ | WOFF | `.woff` | `application/font-woff` | Web Open Font Format |
76
+ | WOFF2 | `.woff2` | `font/woff2` | WOFF 2.0 (compressed) |
77
+
78
+ ### Font Manager Methods
79
+
80
+ ```typescript
81
+ // Add font from buffer
82
+ addFont(fontFamily: string, data: Buffer, format: FontFormat): string
83
+
84
+ // Add font from file path
85
+ addFontFromFile(fontFamily: string, filePath: string, format?: FontFormat): Promise<string>
86
+
87
+ // Check if font exists
88
+ hasFont(fontFamily: string): boolean
89
+
90
+ // Get all registered fonts
91
+ getAllFonts(): FontEntry[]
92
+
93
+ // Get font count
94
+ getCount(): number
95
+
96
+ // Get font by family name
97
+ getFontByFamily(fontFamily: string): FontEntry | undefined
98
+
99
+ // Generate Content_Types.xml entries
100
+ generateContentTypeEntries(): string[]
101
+ ```
102
+
103
+ ### Font Entry Structure
104
+
105
+ ```typescript
106
+ interface FontEntry {
107
+ filename: string; // e.g., 'arial_1.ttf'
108
+ format: FontFormat; // 'ttf' | 'otf' | 'woff' | 'woff2'
109
+ fontFamily: string; // e.g., 'Arial'
110
+ data: Buffer; // Font file binary data
111
+ path: string; // e.g., 'word/fonts/arial_1.ttf'
112
+ }
113
+ ```
114
+
115
+ ## Implementation Details
116
+
117
+ ### How FontManager Works
118
+
119
+ 1. **Font Addition:**
120
+ - When `addFont()` is called, FontManager:
121
+ - Sanitizes the font family name for filename safety
122
+ - Generates a unique filename (e.g., `arial_1.ttf`)
123
+ - Stores font data in memory
124
+ - Returns the path: `word/fonts/filename.ext`
125
+
126
+ 2. **Content_Types.xml Update:**
127
+ - When document is saved, FontManager:
128
+ - Detects all unique font extensions used
129
+ - Generates `<Default Extension="..." ContentType="..."/>` entries
130
+ - Injects entries into `[Content_Types].xml`
131
+
132
+ 3. **ZIP Archive Creation:**
133
+ - Font files are added to `word/fonts/` directory
134
+ - Content_Types.xml is placed as first entry with STORE compression
135
+ - Maintains proper file ordering for Office compatibility
136
+
137
+ ### Filename Sanitization
138
+
139
+ Font family names are sanitized for safe filenames:
140
+
141
+ ```typescript
142
+ // Input: "Times New Roman"
143
+ // Output: "times_new_roman_1.ttf"
144
+
145
+ // Input: "Source Sans Pro"
146
+ // Output: "source_sans_pro_2.ttf"
147
+ ```
148
+
149
+ ### Counter System
150
+
151
+ Each font gets a unique counter to prevent naming conflicts:
152
+
153
+ ```typescript
154
+ fontManager.addFont('Arial', data1, 'ttf'); // → 'arial_1.ttf'
155
+ fontManager.addFont('Arial', data2, 'ttf'); // → 'arial_2.ttf'
156
+ ```
157
+
158
+ ## Obfuscated Fonts (.odttf)
159
+
160
+ For copyright protection, fonts can be obfuscated:
161
+
162
+ ### ODTTF Format
163
+
164
+ - **Extension:** `.odttf` (Obfuscated OpenType)
165
+ - **MIME Type:** `application/vnd.openxmlformats-officedocument.obfuscatedFont`
166
+ - **Obfuscation:** First 32 bytes XOR-encrypted with font GUID
167
+
168
+ ### Content_Types.xml for ODTTF
169
+
170
+ ```xml
171
+ <Default Extension="odttf" ContentType="application/vnd.openxmlformats-officedocument.obfuscatedFont"/>
172
+ ```
173
+
174
+ **Note:** docxmlater currently supports standard fonts (.ttf, .otf, .woff, .woff2). For .odttf support, custom implementation may be needed.
175
+
176
+ ## Best Practices
177
+
178
+ ### 1. Font Licensing
179
+
180
+ ```typescript
181
+ // ✅ GOOD: Only embed fonts you have license to redistribute
182
+ fontManager.addFont('CustomBrandFont', brandFontData, 'ttf');
183
+
184
+ // ❌ BAD: Don't embed licensed fonts without permission
185
+ // fontManager.addFont('HelveticaNeue', data, 'ttf'); // License violation!
186
+ ```
187
+
188
+ ### 2. Font Subsetting
189
+
190
+ For production use, embed only glyphs actually used in the document:
191
+
192
+ ```typescript
193
+ // Future enhancement: Subset fonts to reduce file size
194
+ // const subset = await createFontSubset(fontData, usedCharacters);
195
+ // fontManager.addFont('Arial', subset, 'ttf');
196
+ ```
197
+
198
+ ### 3. Error Handling
199
+
200
+ ```typescript
201
+ try {
202
+ await fontManager.addFontFromFile('CustomFont', '/path/to/font.ttf');
203
+ } catch (error) {
204
+ console.error('Font embedding failed:', error);
205
+ // Fallback: Use system fonts
206
+ }
207
+ ```
208
+
209
+ ### 4. Verify Font Registration
210
+
211
+ ```typescript
212
+ // After adding fonts, verify they're registered
213
+ const fonts = fontManager.getAllFonts();
214
+ console.log(`Embedded ${fonts.length} fonts`);
215
+
216
+ fonts.forEach(font => {
217
+ console.log(`- ${font.fontFamily} (${font.format}) at ${font.path}`);
218
+ });
219
+
220
+ // Verify Content_Types entries will be generated
221
+ const entries = fontManager.generateContentTypeEntries();
222
+ console.log('Content_Types.xml entries:', entries);
223
+ ```
224
+
225
+ ## Troubleshooting
226
+
227
+ ### Issue: Fonts not displaying in Word
228
+
229
+ **Symptoms:** Document opens but custom fonts fall back to default
230
+
231
+ **Causes:**
232
+ 1. Missing Content_Types.xml entries
233
+ 2. Incorrect MIME types
234
+ 3. Corrupted font files
235
+ 4. Missing fontTable.xml references
236
+
237
+ **Solutions:**
238
+ ```typescript
239
+ // Verify Content_Types.xml contains font entries
240
+ const entries = fontManager.generateContentTypeEntries();
241
+ if (entries.length === 0) {
242
+ console.error('No font Content-Type entries generated!');
243
+ }
244
+
245
+ // Check font was actually added
246
+ if (!fontManager.hasFont('CustomFont')) {
247
+ console.error('Font was not registered!');
248
+ }
249
+
250
+ // Verify font file is valid
251
+ const fontData = fs.readFileSync('/path/to/font.ttf');
252
+ if (fontData.length === 0) {
253
+ console.error('Font file is empty!');
254
+ }
255
+ ```
256
+
257
+ ### Issue: ZIP corruption after adding fonts
258
+
259
+ **Symptoms:** "File is corrupted" error when opening DOCX
260
+
261
+ **Cause:** Incorrect ZIP structure or Content_Types.xml placement
262
+
263
+ **Solution:** Ensure docxmlater handles ZIP creation:
264
+ ```typescript
265
+ // ✅ GOOD: Let docxmlater handle everything
266
+ await doc.save('output.docx');
267
+
268
+ // ❌ BAD: Don't manually manipulate ZIP after adding fonts
269
+ // const buffer = await doc.toBuffer();
270
+ // // Manual ZIP manipulation can corrupt structure
271
+ ```
272
+
273
+ ## Integration with WordDocumentProcessor
274
+
275
+ Our `WordDocumentProcessor` should expose font functionality:
276
+
277
+ ```typescript
278
+ // In WordDocumentProcessor.ts
279
+ export class WordDocumentProcessor {
280
+ /**
281
+ * Adds a custom font to the document
282
+ * Automatically updates Content_Types.xml
283
+ */
284
+ async addCustomFont(fontFamily: string, fontPath: string): Promise<void> {
285
+ const doc = await this.loadDocument();
286
+ const fontManager = doc.getFontManager();
287
+
288
+ await fontManager.addFontFromFile(fontFamily, fontPath);
289
+
290
+ this.log.info(`Added font: ${fontFamily} from ${fontPath}`);
291
+ }
292
+
293
+ /**
294
+ * Gets all embedded fonts in the document
295
+ */
296
+ getEmbeddedFonts(): FontEntry[] {
297
+ const doc = this.getCurrentDocument();
298
+ return doc.getFontManager().getAllFonts();
299
+ }
300
+ }
301
+ ```
302
+
303
+ ## References
304
+
305
+ - [ECMA-376: Office Open XML File Formats](https://www.ecma-international.org/publications-and-standards/standards/ecma-376/)
306
+ - [Microsoft: Office Open XML Font Table](https://learn.microsoft.com/en-us/office/open-xml/word/how-to-set-the-font-for-a-text-run)
307
+ - [ODTTF Wikipedia](https://en.wikipedia.org/wiki/ODTTF)
308
+ - docxmlater FontManager source code (see implementation above)
309
+
310
+ ## Version History
311
+
312
+ - **2025-10-19:** Initial documentation created
313
+ - Based on docxmlater v0.26.0 FontManager implementation
314
+
315
+ ---
316
+
317
+ **Last Updated:** 2025-10-19
318
+ **Maintained By:** Documentation Hub Team