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,704 @@
1
+ # Document Processing Issues - Root Cause Analysis & Fix Plan
2
+
3
+ **Date:** 2025-01-16
4
+ **Document:** Test_Code - Copy (9) - Copy
5
+ **Analyzer:** Architect Mode
6
+
7
+ ---
8
+
9
+ ## Executive Summary
10
+
11
+ Four critical issues identified in processed documents:
12
+
13
+ 1. **TOC Not Populating** - Shows "Right-click to update field" instead of generated entries
14
+ 2. **Hyperlink Font Mismatch** - Calibri 12pt instead of Verdana 12pt
15
+ 3. **Bullet Square Symbol** - Level 2 shows ■ instead of user-configured ●
16
+ 4. **Blank Line Style** - Heading2 instead of Normal after 1x1 tables
17
+
18
+ All issues stem from either framework API limitations or processing order conflicts.
19
+
20
+ ---
21
+
22
+ ## Issue 1: Table of Contents Not Populating
23
+
24
+ ### Observed Behavior
25
+
26
+ TOC shows placeholder text: "Right-click to update field" instead of actual heading entries.
27
+
28
+ ### XML Evidence
29
+
30
+ ```xml
31
+ <w:sdt>
32
+ <w:sdtPr>
33
+ <w:docPartObj>
34
+ <w:docPartGallery w:val="Table of Contents"/>
35
+ </w:docPartObj>
36
+ </w:sdtPr>
37
+ <w:sdtContent>
38
+ <w:p><w:pPr><w:pStyle w:val="TOCHeading"/></w:pPr>
39
+ <w:r><w:t>Table of Contents</w:t></w:r>
40
+ </w:p>
41
+ <w:p>
42
+ <w:r><w:fldChar w:fldCharType="begin"/></w:r>
43
+ <w:r><w:instrText>TOC \h \u \z \t "Heading 2,2,"</w:instrText></w:r>
44
+ <w:r><w:fldChar w:fldCharType="separate"/></w:r>
45
+ <w:r><w:t>Right-click to update field.</w:t></w:r>
46
+ <w:r><w:fldChar w:fldCharType="end"/></w:r>
47
+ </w:p>
48
+ </w:sdtContent>
49
+ </w:sdt>
50
+ ```
51
+
52
+ ### Root Cause Analysis
53
+
54
+ **Location:** [`WordDocumentProcessor.ts:1031-1051`](WordDocumentProcessor.ts:1031)
55
+
56
+ ```typescript
57
+ if (options.operations?.updateTocHyperlinks) {
58
+ this.log.debug('=== GENERATING/UPDATING TABLE OF CONTENTS ===');
59
+ const tocCount = await doc.replaceTableOfContents(filePath);
60
+ this.log.info(`✓ Replaced ${tocCount} Table of Contents element(s)`);
61
+ }
62
+ ```
63
+
64
+ **Problem:** The `updateTocHyperlinks` option is **NOT enabled** in the processing options.
65
+
66
+ **Contributing Factors:**
67
+
68
+ 1. Option is opt-in (requires explicit user enablement)
69
+ 2. No UI control exists for this option in ProcessingOptions component
70
+ 3. Method requires file path (operates on saved file, not in-memory document)
71
+
72
+ ### Fix Required
73
+
74
+ #### 1. Add UI Control
75
+
76
+ **File:** `src/components/sessions/ProcessingOptions.tsx`
77
+
78
+ ```typescript
79
+ // Add to Hyperlink Operations section
80
+ <FormControlLabel
81
+ control={
82
+ <Switch
83
+ checked={options.operations?.updateTocHyperlinks || false}
84
+ onChange={(e) => handleChange('operations.updateTocHyperlinks', e.target.checked)}
85
+ />
86
+ }
87
+ label="Update Table of Contents"
88
+ />
89
+ ```
90
+
91
+ #### 2. Enable by Default (Optional Alternative)
92
+
93
+ **File:** `src/contexts/SessionContext.tsx`
94
+
95
+ ```typescript
96
+ operations: {
97
+ // ... other operations
98
+ updateTocHyperlinks: true, // Add this
99
+ }
100
+ ```
101
+
102
+ #### 3. Verify docXMLater Method
103
+
104
+ Check if `doc.replaceTableOfContents(filePath)` is working correctly:
105
+
106
+ - Requires document must be saved first (line 1010)
107
+ - Operates on file on disk (not in-memory)
108
+ - Should scan for Heading styles and generate TOC entries
109
+
110
+ ---
111
+
112
+ ## Issue 2: Hyperlinks Using Wrong Font
113
+
114
+ ### Observed Behavior
115
+
116
+ Hyperlinks rendered with **Calibri 12pt** instead of **Verdana 12pt**.
117
+
118
+ ### XML Evidence
119
+
120
+ ```xml
121
+ <w:hyperlink r:id="rId23">
122
+ <w:r>
123
+ <w:rPr>
124
+ <w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:cs="Calibri"/>
125
+ <w:sz w:val="24"/>
126
+ <w:color w:val="0000FF"/>
127
+ <w:u w:val="single"/>
128
+ </w:rPr>
129
+ <w:t>Aetna Compass - Requests for Formularies...</w:t>
130
+ </w:r>
131
+ </w:hyperlink>
132
+ ```
133
+
134
+ Multiple hyperlinks show this pattern - all have Calibri despite code specifying Verdana.
135
+
136
+ ### Root Cause Analysis
137
+
138
+ **Location:** [`WordDocumentProcessor.ts:1871-1914`](WordDocumentProcessor.ts:1871)
139
+
140
+ The `standardizeHyperlinkFormatting()` method runs AUTOMATICALLY (line 615-617):
141
+
142
+ ```typescript
143
+ // ALWAYS standardize hyperlink formatting to ensure consistency
144
+ this.log.debug('=== STANDARDIZING HYPERLINK FORMATTING (AUTOMATIC) ===');
145
+ const hyperlinksStandardized = await this.standardizeHyperlinkFormatting(doc);
146
+ ```
147
+
148
+ **Method Implementation:**
149
+
150
+ ```typescript
151
+ private async standardizeHyperlinkFormatting(doc: Document): Promise<number> {
152
+ const hyperlinks = await this.docXMLater.extractHyperlinks(doc);
153
+
154
+ for (const { hyperlink, url, text } of hyperlinks) {
155
+ hyperlink.setFormatting({
156
+ font: 'Verdana', // ✅ Correct font specified
157
+ size: 12,
158
+ color: '0000FF',
159
+ underline: 'single',
160
+ bold: false,
161
+ italic: false,
162
+ });
163
+ }
164
+ }
165
+ ```
166
+
167
+ **Problem:** The setFormatting() call IS being made with Verdana, but output shows Calibri.
168
+
169
+ **Possible Causes:**
170
+
171
+ 1. **API Not Working:** `hyperlink.setFormatting()` may not be applying font correctly
172
+ 2. **Overwritten by Later Operations:** Another operation runs AFTER this and resets font
173
+ 3. **Incomplete Coverage:** Some hyperlinks may be created AFTER standardization runs
174
+
175
+ ### Investigation Needed
176
+
177
+ Check execution order of operations (lines 600-992):
178
+
179
+ ```typescript
180
+ Line 615: standardizeHyperlinkFormatting() ← Sets Verdana
181
+ Line 645: applyCustomStylesFromUI() ← Could reset fonts?
182
+ Line 659: doc.standardizeBulletSymbols() ← List formatting
183
+ Line 676: doc.applyHyperlink() ← SUSPECT: Applies Hyperlink style
184
+ ```
185
+
186
+ **CRITICAL FINDING:** Line 676 calls `doc.applyHyperlink()` which applies the **Hyperlink style definition** from styles.xml.
187
+
188
+ ### Styles.xml Analysis
189
+
190
+ ```xml
191
+ <w:style w:type="character" w:styleId="Hyperlink">
192
+ <w:name w:val="Hyperlink"/>
193
+ <w:rPr>
194
+ <w:u w:val="single"/>
195
+ <w:color w:val="003399"/> <!-- Note: Different color! -->
196
+ </w:rPr>
197
+ </w:style>
198
+ ```
199
+
200
+ The Hyperlink style doesn't specify a font, so it inherits from document defaults:
201
+
202
+ ```xml
203
+ <w:rPrDefault>
204
+ <w:rPr>
205
+ <w:rFonts w:ascii="Calibri" w:hAnsi="Calibri"/> <!-- This is the culprit! -->
206
+ </w:rPr>
207
+ </w:rPrDefault>
208
+ ```
209
+
210
+ ### Fix Required
211
+
212
+ #### Option 1: Update Hyperlink Style Definition (Recommended)
213
+
214
+ **Location:** Before calling `applyHyperlink()`, update the Hyperlink style
215
+
216
+ ```typescript
217
+ // After line 645, before applyHyperlink()
218
+ this.log.debug('=== UPDATING HYPERLINK STYLE DEFINITION ===');
219
+ const hyperlinkStyle = Style.create({
220
+ styleId: 'Hyperlink',
221
+ name: 'Hyperlink',
222
+ type: 'character',
223
+ runFormatting: {
224
+ font: 'Verdana',
225
+ size: 12,
226
+ color: '0000FF',
227
+ underline: 'single',
228
+ },
229
+ });
230
+ doc.addStyle(hyperlinkStyle); // Updates existing or creates new
231
+ ```
232
+
233
+ #### Option 2: Move Standardization to After applyHyperlink()
234
+
235
+ Change execution order:
236
+
237
+ ```typescript
238
+ // Current order (WRONG):
239
+ Line 615: standardizeHyperlinkFormatting()
240
+ Line 676: applyHyperlink() ← Overwrites Verdana with Calibri
241
+
242
+ // Fixed order:
243
+ Line 615: // Remove standardizeHyperlinkFormatting() call
244
+ Line 676: applyHyperlink()
245
+ Line 677: standardizeHyperlinkFormatting() ← Add here, runs AFTER style application
246
+ ```
247
+
248
+ #### Option 3: Don't Use applyHyperlink() Style
249
+
250
+ Skip the style application for hyperlinks since we're manually formatting them:
251
+
252
+ ```typescript
253
+ // Line 676: Comment out or skip
254
+ // const hyperlinkCount = doc.applyHyperlink();
255
+ ```
256
+
257
+ **Recommended:** **Option 1** - Update the Hyperlink style definition to match requirements.
258
+
259
+ ---
260
+
261
+ ## Issue 3: Bullet Point Square Symbol
262
+
263
+ ### Observed Behavior
264
+
265
+ "Bullet 3" at level 2 displays square symbol (■) instead of filled bullet (●).
266
+
267
+ ### XML Evidence
268
+
269
+ **numbering.xml - AbstractNum 3:**
270
+
271
+ ```xml
272
+ <w:abstractNum w:abstractNumId="3">
273
+ <w:lvl w:ilvl="0">
274
+ <w:lvlText w:val="●"/> <!-- Level 0: Correct -->
275
+ </w:lvl>
276
+ <w:lvl w:ilvl="1">
277
+ <w:lvlText w:val="○"/> <!-- Level 1: Correct -->
278
+ </w:lvl>
279
+ <w:lvl w:ilvl="2">
280
+ <w:lvlText w:val="■"/> <!-- Level 2: WRONG - should be ● -->
281
+ </w:lvl>
282
+ </w:abstractNum>
283
+ ```
284
+
285
+ **document.xml - Bullet 3 paragraph:**
286
+
287
+ ```xml
288
+ <w:p>
289
+ <w:pPr>
290
+ <w:numPr>
291
+ <w:ilvl w:val="2"/> <!-- Level 2 -->
292
+ <w:numId w:val="3"/> <!-- References abstractNum 3 -->
293
+ </w:numPr>
294
+ </w:pPr>
295
+ <w:r><w:t>Bullet 3</w:t></w:r>
296
+ </w:p>
297
+ ```
298
+
299
+ ### Root Cause Analysis
300
+
301
+ **Location:** [`WordDocumentProcessor.ts:2891-3037`](WordDocumentProcessor.ts:2891)
302
+
303
+ The code DOES attempt to update ALL abstractNum definitions:
304
+
305
+ ```typescript
306
+ // FIX: Update ALL existing abstractNum definitions to use user's bullet symbols
307
+ this.log.debug('Updating existing abstractNum bullet lists...');
308
+ const abstractNums = manager.getAllAbstractNumberings();
309
+
310
+ for (const abstractNum of abstractNums) {
311
+ for (let i = 0; i < bullets.length; i++) {
312
+ const level = abstractNum.getLevel(i);
313
+ if (level && level.getFormat() === 'bullet') {
314
+ const oldSymbol = level.getProperties().text;
315
+ const newSymbol = bullets[i];
316
+
317
+ if (oldSymbol !== newSymbol) {
318
+ level.setText(newSymbol); // ← Should update square to bullet
319
+ this.log.debug(`Updated abstractNum level ${i}: "${oldSymbol}" → "${newSymbol}"`);
320
+ }
321
+ }
322
+ }
323
+ }
324
+ ```
325
+
326
+ **Problem:** The square symbol (■) is STILL in the output, meaning either:
327
+
328
+ 1. The `level.setText(newSymbol)` call didn't work
329
+ 2. The user's bullet configuration has ■ at level 2
330
+ 3. The level wasn't detected as a bullet (`getFormat() !== 'bullet'`)
331
+
332
+ ### Issue Detection
333
+
334
+ Looking at the user's bullet configuration in `applyBulletUniformity()`:
335
+
336
+ ```typescript
337
+ const bullets = settings.indentationLevels.map(
338
+ (levelConfig) => levelConfig.bulletChar || '\u2022' // Default: ●
339
+ );
340
+ ```
341
+
342
+ **User Configuration Check Needed:**
343
+
344
+ - What is `settings.indentationLevels[2].bulletChar`?
345
+ - Is it explicitly set to ■ (square)?
346
+ - Or is it missing/undefined (should default to ●)?
347
+
348
+ ### Fix Required
349
+
350
+ #### 1. Debug Logging Enhancement
351
+
352
+ Add detailed logging to see what's happening:
353
+
354
+ ```typescript
355
+ // In applyBulletUniformity(), before updating abstractNums
356
+ this.log.debug('User bullet configuration:');
357
+ settings.indentationLevels.forEach((level, idx) => {
358
+ const char = level.bulletChar || '●';
359
+ const code = char.charCodeAt(0).toString(16);
360
+ this.log.debug(` Level ${idx}: "${char}" (U+${code})`);
361
+ });
362
+
363
+ // In the update loop
364
+ for (let i = 0; i < bullets.length; i++) {
365
+ const level = abstractNum.getLevel(i);
366
+ if (level) {
367
+ const format = level.getFormat();
368
+ const oldSymbol = level.getProperties().text;
369
+ this.log.debug(` Level ${i}: format="${format}", current="${oldSymbol}"`);
370
+
371
+ if (format === 'bullet' && oldSymbol !== bullets[i]) {
372
+ this.log.debug(` → Updating to "${bullets[i]}"`);
373
+ level.setText(bullets[i]);
374
+ }
375
+ }
376
+ }
377
+ ```
378
+
379
+ #### 2. Verify User Configuration
380
+
381
+ **File:** Check UI settings or session defaults
382
+
383
+ Ensure level 2 bullet is set to ● not ■:
384
+
385
+ ```typescript
386
+ // In SessionContext or ProcessingOptions
387
+ listBulletSettings: {
388
+ indentationLevels: [
389
+ { level: 0, bulletChar: '●', ... }, // Level 0
390
+ { level: 1, bulletChar: '○', ... }, // Level 1
391
+ { level: 2, bulletChar: '●', ... }, // Level 2 ← Should be ●, not ■
392
+ ]
393
+ }
394
+ ```
395
+
396
+ #### 3. Force All Levels to User Config
397
+
398
+ If detection is failing, force update ALL levels regardless of current symbol:
399
+
400
+ ```typescript
401
+ // Replace the if condition
402
+ for (let i = 0; i < bullets.length; i++) {
403
+ const level = abstractNum.getLevel(i);
404
+ if (level && level.getFormat() === 'bullet') {
405
+ // FORCE update - ignore current symbol
406
+ level.setText(bullets[i]);
407
+ this.log.debug(`Forced level ${i} to "${bullets[i]}"`);
408
+ }
409
+ }
410
+ ```
411
+
412
+ ---
413
+
414
+ ## Issue 4: Blank Lines Have Wrong Style
415
+
416
+ ### Observed Behavior
417
+
418
+ Blank paragraphs inserted after 1x1 tables have **Heading2 style** instead of **Normal style**.
419
+
420
+ ### XML Evidence
421
+
422
+ ```xml
423
+ <!-- After 1x1 table -->
424
+ <w:p>
425
+ <w:pPr>
426
+ <w:pStyle w:val="Heading2"/> <!-- WRONG: Should be "Normal" -->
427
+ </w:pPr>
428
+ <w:r></w:r> <!-- Empty run -->
429
+ </w:p>
430
+ ```
431
+
432
+ ### Root Cause Analysis
433
+
434
+ **Location:** [`WordDocumentProcessor.ts:719-746`](WordDocumentProcessor.ts:719)
435
+
436
+ ```typescript
437
+ if (options.preserveBlankLinesAfterHeader2Tables) {
438
+ this.log.debug('=== ENSURING BLANK LINES AFTER 1x1 TABLES ===');
439
+
440
+ const result = doc.ensureBlankLinesAfter1x1Tables({
441
+ spacingAfter: 120,
442
+ markAsPreserved: true,
443
+ // NOTE: Blank paragraphs may not have Normal style applied
444
+ // (docxmlater library doesn't expose 'style' option in interface)
445
+ });
446
+ }
447
+ ```
448
+
449
+ **Critical Finding:** The code comment explicitly states:
450
+
451
+ > "NOTE: Blank paragraphs may not have Normal style applied (docxmlater library doesn't expose 'style' option in interface)"
452
+
453
+ **Problem:** The `ensureBlankLinesAfter1x1Tables()` framework method:
454
+
455
+ - ✅ Creates blank paragraphs
456
+ - ✅ Sets spacing (120 twips)
457
+ - ✅ Marks as preserved
458
+ - ❌ **Does NOT set paragraph style to Normal**
459
+
460
+ The docXMLater framework API doesn't expose a `style` parameter for this method.
461
+
462
+ ### Additional Evidence
463
+
464
+ Looking at manual blank line creation elsewhere in the code (line 779):
465
+
466
+ ```typescript
467
+ // In preserveBlankLinesAfterAllTables
468
+ const blankPara = doc.createParagraph('');
469
+ blankPara.setStyle('Normal'); // ✅ Explicitly sets Normal style
470
+ blankPara.setPreserved(true);
471
+ blankPara.setSpaceAfter(120);
472
+ ```
473
+
474
+ This shows the CORRECT way to create blank paragraphs with Normal style.
475
+
476
+ ### Fix Required
477
+
478
+ #### Option 1: Post-Process Blank Lines (Recommended)
479
+
480
+ Add a cleanup step AFTER `ensureBlankLinesAfter1x1Tables()`:
481
+
482
+ ```typescript
483
+ if (options.preserveBlankLinesAfterHeader2Tables) {
484
+ this.log.debug('=== ENSURING BLANK LINES AFTER 1x1 TABLES ===');
485
+
486
+ const result = doc.ensureBlankLinesAfter1x1Tables({
487
+ spacingAfter: 120,
488
+ markAsPreserved: true,
489
+ });
490
+
491
+ // NEW: Fix styles of created blank lines
492
+ this.log.debug('=== FIXING BLANK LINE STYLES ===');
493
+ const fixedCount = this.fixBlankLineStyles(doc);
494
+ this.log.info(`Fixed ${fixedCount} blank line styles to Normal`);
495
+ }
496
+
497
+ // New method
498
+ private fixBlankLineStyles(doc: Document): number {
499
+ let fixedCount = 0;
500
+ const bodyElements = doc.getBodyElements();
501
+
502
+ for (let i = 0; i < bodyElements.length; i++) {
503
+ const element = bodyElements[i];
504
+
505
+ // Find blank paragraphs after tables
506
+ if (element instanceof Table && i + 1 < bodyElements.length) {
507
+ const nextElement = bodyElements[i + 1];
508
+
509
+ if (nextElement instanceof Paragraph && this.isParagraphTrulyEmpty(nextElement)) {
510
+ const currentStyle = nextElement.getStyle();
511
+
512
+ // Fix if not Normal (e.g., Heading2)
513
+ if (currentStyle && currentStyle !== 'Normal') {
514
+ nextElement.setStyle('Normal');
515
+ fixedCount++;
516
+ this.log.debug(`Fixed blank line style: ${currentStyle} → Normal`);
517
+ }
518
+ }
519
+ }
520
+ }
521
+
522
+ return fixedCount;
523
+ }
524
+ ```
525
+
526
+ #### Option 2: Replace Framework Method with Manual Implementation
527
+
528
+ Replace `ensureBlankLinesAfter1x1Tables()` with custom logic:
529
+
530
+ ```typescript
531
+ // Instead of framework method
532
+ private async ensureBlankLinesAfter1x1TablesCustom(doc: Document): Promise<number> {
533
+ const tables = doc.getTables();
534
+ const bodyElements = doc.getBodyElements();
535
+ let blankLinesAdded = 0;
536
+
537
+ for (let i = 0; i < bodyElements.length; i++) {
538
+ const element = bodyElements[i];
539
+
540
+ if (element instanceof Table) {
541
+ const rows = (element as Table).getRows();
542
+ const is1x1 = rows.length === 1 && rows[0]?.getCells().length === 1;
543
+
544
+ if (is1x1) {
545
+ const nextElement = bodyElements[i + 1];
546
+
547
+ // Check if already has blank line
548
+ if (!nextElement || !(nextElement instanceof Paragraph) || !this.isParagraphTrulyEmpty(nextElement)) {
549
+ // Create blank paragraph with CORRECT style
550
+ const blankPara = doc.createParagraph('');
551
+ blankPara.setStyle('Normal'); // ✅ Sets Normal style
552
+ blankPara.setPreserved(true);
553
+ blankPara.setSpaceAfter(120);
554
+ doc.insertParagraphAt(i + 1, blankPara);
555
+ blankLinesAdded++;
556
+ }
557
+ }
558
+ }
559
+ }
560
+
561
+ return blankLinesAdded;
562
+ }
563
+ ```
564
+
565
+ **Recommended:** **Option 1** - Post-process to fix styles. This leverages the framework's table detection while fixing the style issue.
566
+
567
+ ---
568
+
569
+ ## Implementation Priority
570
+
571
+ ### Critical (Must Fix)
572
+
573
+ 1. **Issue 2 - Hyperlink Font:** Most visible, affects all hyperlinks
574
+ 2. **Issue 4 - Blank Line Style:** Causes formatting inconsistencies
575
+
576
+ ### High Priority
577
+
578
+ 3. **Issue 1 - TOC Population:** Feature not working, but opt-in
579
+ 4. **Issue 3 - Bullet Symbol:** Depends on user configuration verification
580
+
581
+ ---
582
+
583
+ ## Testing Strategy
584
+
585
+ ### Test Document Requirements
586
+
587
+ - Multiple hyperlinks (in-document and external)
588
+ - Table of Contents field
589
+ - 1x1 tables (Header 2 style)
590
+ - Multi-level bullet lists (0, 1, 2)
591
+
592
+ ### Verification Steps
593
+
594
+ **Issue 1 (TOC):**
595
+
596
+ 1. Enable `updateTocHyperlinks` option
597
+ 2. Process document
598
+ 3. Open in Word - verify TOC shows actual headings, not "Right-click to update field"
599
+
600
+ **Issue 2 (Hyperlink Font):**
601
+
602
+ 1. Process document
603
+ 2. Extract document.xml
604
+ 3. Verify ALL `<w:hyperlink>` elements have:
605
+ - `<w:rFonts w:ascii="Verdana" w:hAnsi="Verdana"/>`
606
+ - `<w:sz w:val="24"/>`
607
+ - `<w:color w:val="0000FF"/>`
608
+
609
+ **Issue 3 (Bullet Symbol):**
610
+
611
+ 1. Check user configuration: `listBulletSettings.indentationLevels[2].bulletChar`
612
+ 2. Process document
613
+ 3. Extract numbering.xml
614
+ 4. Verify ALL `<w:lvl w:ilvl="2">` have `<w:lvlText w:val="●"/>` (not ■)
615
+
616
+ **Issue 4 (Blank Line Style):**
617
+
618
+ 1. Process document
619
+ 2. Extract document.xml
620
+ 3. Find blank `<w:p>` after `</w:tbl>` (1x1 tables)
621
+ 4. Verify `<w:pStyle w:val="Normal"/>` (not Heading2)
622
+
623
+ ---
624
+
625
+ ## API Considerations
626
+
627
+ ### DocXMLater Framework Limitations
628
+
629
+ **Identified Gaps:**
630
+
631
+ 1. `ensureBlankLinesAfter1x1Tables()` - No `style` parameter
632
+ 2. `applyHyperlink()` - Applies style definition, may override manual formatting
633
+ 3. `replaceTableOfContents()` - Unclear why not populating (needs investigation)
634
+
635
+ ### Recommended Framework Enhancements
636
+
637
+ Submit to docXMLater repository:
638
+
639
+ 1. Add `style` parameter to `ensureBlankLinesAfter1x1Tables()`
640
+ 2. Add `skipHyperlinks` flag to `applyHyperlink()` for manual formatting
641
+ 3. Enhance `replaceTableOfContents()` logging/error reporting
642
+
643
+ ---
644
+
645
+ ## Code Locations Reference
646
+
647
+ | Issue | File | Line Range | Method |
648
+ | ---------------- | ------------------------ | -------------- | --------------------------------------------------- |
649
+ | TOC | WordDocumentProcessor.ts | 1031-1051 | processDocument() |
650
+ | Hyperlink Font | WordDocumentProcessor.ts | 1871-1914, 676 | standardizeHyperlinkFormatting(), processDocument() |
651
+ | Bullet Symbol | WordDocumentProcessor.ts | 2891-3037 | applyBulletUniformity() |
652
+ | Blank Line Style | WordDocumentProcessor.ts | 719-746 | processDocument() |
653
+
654
+ ---
655
+
656
+ ## Scalability Considerations
657
+
658
+ ### Performance Impact
659
+
660
+ - **Fix 1 (TOC):** Minimal - one-time operation
661
+ - **Fix 2 (Hyperlinks):** O(n) where n = hyperlink count - already optimized
662
+ - **Fix 3 (Bullets):** O(m×l) where m = abstractNum count, l = levels - minimal overhead
663
+ - **Fix 4 (Blank Lines):** O(t) where t = table count - already iterating tables
664
+
665
+ ### Memory Impact
666
+
667
+ - All fixes operate on existing document structures
668
+ - No additional memory allocations beyond logging
669
+ - Document size unchanged (style changes only)
670
+
671
+ ### Backwards Compatibility
672
+
673
+ - Fix 1: Opt-in, no breaking changes
674
+ - Fix 2: May change existing hyperlink appearance (BREAKING if users expect Calibri)
675
+ - Fix 3: Depends on user config, maintains current behavior if config correct
676
+ - Fix 4: Changes blank line styles (could affect user's manual formatting)
677
+
678
+ ---
679
+
680
+ ## Security Considerations
681
+
682
+ ### XML Injection
683
+
684
+ - All fixes use framework APIs (no manual XML manipulation)
685
+ - Style names validated by framework
686
+ - User bullet characters sanitized by framework
687
+
688
+ ### Data Integrity
689
+
690
+ - No content modification (only formatting)
691
+ - Preserve flags prevent accidental deletion
692
+ - Backup system remains in place
693
+
694
+ ---
695
+
696
+ ## Next Steps
697
+
698
+ 1. **Verify user configuration** for bullet symbols (Issue 3)
699
+ 2. **Implement Fix 2** (Hyperlink Font) - highest visibility
700
+ 3. **Implement Fix 4** (Blank Line Style) - affects document structure
701
+ 4. **Add UI control** for TOC update (Issue 1)
702
+ 5. **Test all fixes** with comprehensive test document
703
+ 6. **Update documentation** with new behavior
704
+ 7. **Consider framework enhancement requests** for long-term maintainability