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.
- package/.eslintrc.json +43 -0
- package/.github/workflows/build.yml +64 -0
- package/.github/workflows/ci.yml +39 -0
- package/.vscode/extensions.json +3 -0
- package/Current.md +97 -0
- package/DocHub_Image.png +0 -0
- package/README.md +666 -0
- package/USER_GUIDE.md +1173 -0
- package/Updater.md +311 -0
- package/build/256x256.png +0 -0
- package/build/512x512.png +0 -0
- package/build/app-update.yml +4 -0
- package/build/create-icon.js +208 -0
- package/build/icon.ico +0 -0
- package/build/icon.png +0 -0
- package/build/icon_1024x1024.png +0 -0
- package/dist/assets/Analytics-BpsG9895.js +1 -0
- package/dist/assets/Card-IAZin8kp.js +1 -0
- package/dist/assets/CurrentSession-B-rFkHvf.js +12 -0
- package/dist/assets/Dashboard-C_5gMb0q.js +1 -0
- package/dist/assets/Documents-CqZ25axS.js +1 -0
- package/dist/assets/Input-l89xwXBi.js +1 -0
- package/dist/assets/Reporting-DqdHJY_a.js +1 -0
- package/dist/assets/Search-XNbu5z_3.js +1 -0
- package/dist/assets/SessionManager-lH9hZfzH.js +1 -0
- package/dist/assets/Sessions-ClZOPYNc.js +1 -0
- package/dist/assets/Settings-DUEHGURa.js +11 -0
- package/dist/assets/index-8xUe8ptc.js +24 -0
- package/dist/assets/index-RYyJqF7O.css +1 -0
- package/dist/assets/path-BkOl0AGO.js +1 -0
- package/dist/assets/promises-ID_B9S-h.js +1 -0
- package/dist/assets/urlHelpers-TvgahX0r.js +1 -0
- package/dist/assets/useToast-yRSO1dkm.js +1 -0
- package/dist/assets/vendor-charts-RkGK5ROP.js +36 -0
- package/dist/assets/vendor-db-l0sNRNKZ.js +1 -0
- package/dist/assets/vendor-react-BVZ_anCF.js +4 -0
- package/dist/assets/vendor-search-Dw8P0qyA.js +1 -0
- package/dist/assets/vendor-ui-BU7NfluV.js +53 -0
- package/dist/electron/PowerAutomateApiService-LfW09ZGr.js +147 -0
- package/dist/electron/main-CXkNtyv-.js +19789 -0
- package/dist/electron/main.js +5 -0
- package/dist/electron/preload.js +1 -0
- package/dist/icon.png +0 -0
- package/dist/index.html +27 -0
- package/docs/CODEBASE_ANALYSIS_REPORT.md +309 -0
- package/docs/DEBUG_LOGGING_GUIDE.md +244 -0
- package/docs/README.md +115 -0
- package/docs/TOC_WIRING_GUIDE.md +344 -0
- package/docs/analysis/Bullet_Symbol_Bug_Analysis.md +136 -0
- package/docs/analysis/DOCXMLATER_ANALYSIS_SUMMARY.txt +169 -0
- package/docs/analysis/Document_Processing_Issues_Analysis.md +704 -0
- package/docs/analysis/FIELD_PRESERVATION_ANALYSIS.md +1200 -0
- package/docs/analysis/INDENTATION_PRESERVE_ANALYSIS.md +181 -0
- package/docs/analysis/INDENTATION_PRESERVE_IMPLEMENTATION.md +207 -0
- package/docs/analysis/List_Implementation.md +206 -0
- package/docs/analysis/List_Implementation_Accuracy_Report.md +366 -0
- package/docs/analysis/PROCESSING_OPTIONS_UI_UPDATES.md +220 -0
- package/docs/analysis/RefactorStyles.md +852 -0
- package/docs/analysis/STYLE_PARAMETER_ENHANCEMENT.md +143 -0
- package/docs/analysis/docxmlater-comparison-todo-2025-11-13.md +636 -0
- package/docs/analysis/docxmlater-implementation-analysis-2025-11-13.md +340 -0
- package/docs/analysis/docxmlater-template_ui-integration-analysis.md +263 -0
- package/docs/analysis/github-issues-to-create.md +237 -0
- package/docs/api/API_README.md +538 -0
- package/docs/api/API_REFERENCE.md +751 -0
- package/docs/api/TYPE_DEFINITIONS.md +869 -0
- package/docs/architecture/FONT_EMBEDDING_GUIDE.md +318 -0
- package/docs/architecture/docxmlater-functions-and-structure.md +726 -0
- package/docs/docxmlater-readme.md +1341 -0
- package/docs/fixes/EXECUTION_LOG_TEST_BASE.md +573 -0
- package/docs/fixes/HYPERLINK_TEXT_SANITIZATION.md +253 -0
- package/docs/fixes/README.md +37 -0
- package/docs/github-issues/issue-1-body.md +125 -0
- package/docs/github-issues/issue-10-body.md +850 -0
- package/docs/github-issues/issue-2-body.md +200 -0
- package/docs/github-issues/issue-3-body.md +270 -0
- package/docs/github-issues/issue-4-body.md +169 -0
- package/docs/github-issues/issue-5-body.md +173 -0
- package/docs/github-issues/issue-6-body.md +158 -0
- package/docs/github-issues/issue-7-body.md +171 -0
- package/docs/github-issues/issue-8-body.md +407 -0
- package/docs/github-issues/issue-9-body.md +515 -0
- package/docs/github-issues/issue-tracker.md +274 -0
- package/docs/github-issues/predictive-analysis-2025-10-18.md +2131 -0
- package/docs/implementation/List_Framework_Refactor_Plan.md +336 -0
- package/docs/implementation/PRIMARY_TEXT_COLOR_FEATURE.md +217 -0
- package/docs/implementation/RELEASE_PLAN_v2.1.0.md +362 -0
- package/docs/implementation/RefactorStyles.md +588 -0
- package/docs/implementation/implement-plan.md +489 -0
- package/docs/implementation/missing-helpers-implementation.md +391 -0
- package/docs/implementation/refactor-plan.md +520 -0
- package/docs/implementation/session-implementation-complete.md +233 -0
- package/docs/implementation/session-management-plan.md +250 -0
- package/docs/setup-checklist.md +77 -0
- package/docs/versions/changelog.md +345 -0
- package/electron/customUpdater.ts +656 -0
- package/electron/main.ts +2441 -0
- package/electron/memoryConfig.ts +187 -0
- package/electron/preload.ts +394 -0
- package/electron/proxyConfig.ts +340 -0
- package/electron/services/BackupService.ts +452 -0
- package/electron/services/DictionaryService.ts +402 -0
- package/electron/services/LocalDictionaryLookupService.ts +147 -0
- package/electron/services/PowerAutomateApiService.ts +231 -0
- package/electron/services/SharePointSyncService.ts +474 -0
- package/electron/windowsCertStore.ts +427 -0
- package/electron/zscalerConfig.ts +381 -0
- package/eslint.config.js +92 -0
- package/jest.config.js +52 -0
- package/package.json +214 -0
- package/postcss.config.mjs +6 -0
- package/public/icon.png +0 -0
- package/publish-release.ps1 +5 -0
- package/renovate.json +30 -0
- package/src/App.tsx +216 -0
- package/src/__mocks__/p-limit.js +12 -0
- package/src/__mocks__/styleMock.js +1 -0
- package/src/components/common/BugReportButton.tsx +44 -0
- package/src/components/common/BugReportDialog.tsx +193 -0
- package/src/components/common/Button.tsx +153 -0
- package/src/components/common/Card.tsx +86 -0
- package/src/components/common/ColorPickerDialog.tsx +177 -0
- package/src/components/common/ConfirmDialog.tsx +96 -0
- package/src/components/common/DebugConsole.tsx +275 -0
- package/src/components/common/EmptyState.tsx +183 -0
- package/src/components/common/ErrorBoundary.tsx +98 -0
- package/src/components/common/ErrorDetailsDialog.tsx +153 -0
- package/src/components/common/ErrorFallback.tsx +218 -0
- package/src/components/common/Input.tsx +109 -0
- package/src/components/common/Skeleton.tsx +184 -0
- package/src/components/common/SplashScreen.tsx +81 -0
- package/src/components/common/Toast.tsx +155 -0
- package/src/components/common/Tooltip.tsx +79 -0
- package/src/components/common/UpdateNotification.tsx +320 -0
- package/src/components/comparison/ComparisonWindow.tsx +374 -0
- package/src/components/comparison/SideBySideDiff.tsx +486 -0
- package/src/components/comparison/index.ts +8 -0
- package/src/components/document/DocumentUploader.tsx +288 -0
- package/src/components/document/HyperlinkPreview.tsx +430 -0
- package/src/components/document/HyperlinkService.md +1484 -0
- package/src/components/document/Hyperlink_Technical_Documentation.md +496 -0
- package/src/components/document/InlineChangesView.tsx +707 -0
- package/src/components/document/ProcessingProgress.tsx +303 -0
- package/src/components/document/ProcessingResults.tsx +256 -0
- package/src/components/document/TrackedChangesDetail.tsx +530 -0
- package/src/components/document/TrackedChangesPanel.tsx +546 -0
- package/src/components/document/VirtualDocumentList.tsx +240 -0
- package/src/components/editor/DocumentEditor.tsx +723 -0
- package/src/components/editor/DocumentEditorModal.tsx +640 -0
- package/src/components/editor/EditorQuickActions.tsx +502 -0
- package/src/components/editor/EditorToolbar.tsx +312 -0
- package/src/components/editor/TableEditor.tsx +926 -0
- package/src/components/editor/index.ts +18 -0
- package/src/components/layout/Header.tsx +190 -0
- package/src/components/layout/Sidebar.tsx +313 -0
- package/src/components/layout/TitleBar.tsx +190 -0
- package/src/components/navigation/CommandPalette.tsx +233 -0
- package/src/components/navigation/KeyboardShortcutsModal.tsx +173 -0
- package/src/components/sessions/ChangeItem.tsx +408 -0
- package/src/components/sessions/ChangeViewer.tsx +1155 -0
- package/src/components/sessions/DocumentComparisonModal.tsx +314 -0
- package/src/components/sessions/ProcessingOptions.tsx +297 -0
- package/src/components/sessions/ReplacementsTab.tsx +438 -0
- package/src/components/sessions/RevisionHandlingOptions.tsx +87 -0
- package/src/components/sessions/SessionManager.tsx +188 -0
- package/src/components/sessions/StylesEditor.tsx +1335 -0
- package/src/components/sessions/TabContainer.tsx +151 -0
- package/src/components/sessions/VirtualSessionList.tsx +157 -0
- package/src/components/sessions/sessionToProcessorManager.tsx +420 -0
- package/src/components/settings/CertificateManager.tsx +410 -0
- package/src/components/settings/SegmentedControl.tsx +88 -0
- package/src/components/settings/SettingRow.tsx +52 -0
- package/src/contexts/GlobalStatsContext.tsx +396 -0
- package/src/contexts/SessionContext.tsx +2129 -0
- package/src/contexts/ThemeContext.tsx +428 -0
- package/src/contexts/UserSettingsContext.tsx +290 -0
- package/src/contexts/__tests__/GlobalStatsContext.test.tsx +390 -0
- package/src/global.d.ts +273 -0
- package/src/hooks/useDocumentQueue.tsx +210 -0
- package/src/hooks/useToast.tsx +55 -0
- package/src/main.tsx +10 -0
- package/src/pages/Analytics.tsx +386 -0
- package/src/pages/CurrentSession.tsx +1174 -0
- package/src/pages/Dashboard.tsx +319 -0
- package/src/pages/Documents.tsx +317 -0
- package/src/pages/Projects.tsx +250 -0
- package/src/pages/Reporting.tsx +386 -0
- package/src/pages/Search.tsx +349 -0
- package/src/pages/Sessions.tsx +285 -0
- package/src/pages/Settings.tsx +2662 -0
- package/src/services/HyperlinkService.ts +1085 -0
- package/src/services/document/DocXMLaterProcessor.ts +617 -0
- package/src/services/document/DocumentProcessingComparison.ts +856 -0
- package/src/services/document/DocumentSnapshotService.ts +575 -0
- package/src/services/document/WordDocumentProcessor.ts +10509 -0
- package/src/services/document/__tests__/DocXMLaterProcessor.hyperlinks.test.md +311 -0
- package/src/services/document/__tests__/WordDocumentProcessor.integration.test.ts +515 -0
- package/src/services/document/__tests__/WordDocumentProcessor.test.ts +812 -0
- package/src/services/document/blanklines/BlankLineManager.ts +658 -0
- package/src/services/document/blanklines/__tests__/paragraphChecks.test.ts +281 -0
- package/src/services/document/blanklines/helpers/blankLineInsertion.ts +87 -0
- package/src/services/document/blanklines/helpers/blankLineSnapshot.ts +251 -0
- package/src/services/document/blanklines/helpers/clearCustom.ts +121 -0
- package/src/services/document/blanklines/helpers/contextChecks.ts +117 -0
- package/src/services/document/blanklines/helpers/imageChecks.ts +51 -0
- package/src/services/document/blanklines/helpers/paragraphChecks.ts +236 -0
- package/src/services/document/blanklines/helpers/removeBlanksBetweenListItems.ts +91 -0
- package/src/services/document/blanklines/helpers/removeTrailingBlanks.ts +35 -0
- package/src/services/document/blanklines/helpers/tableGuards.ts +21 -0
- package/src/services/document/blanklines/index.ts +67 -0
- package/src/services/document/blanklines/rules/additionRules.ts +337 -0
- package/src/services/document/blanklines/rules/indentationRules.ts +317 -0
- package/src/services/document/blanklines/rules/removalRules.ts +362 -0
- package/src/services/document/blanklines/rules/ruleTypes.ts +92 -0
- package/src/services/document/blanklines/types.ts +29 -0
- package/src/services/document/helpers/ImageBorderCropper.ts +377 -0
- package/src/services/document/helpers/__tests__/whitespace.test.ts +272 -0
- package/src/services/document/helpers/whitespace.ts +117 -0
- package/src/services/document/list/ListNormalizer.ts +947 -0
- package/src/services/document/list/index.ts +45 -0
- package/src/services/document/list/list-detection.ts +275 -0
- package/src/services/document/list/list-types.ts +162 -0
- package/src/services/document/processors/HyperlinkProcessor.ts +370 -0
- package/src/services/document/processors/ListProcessor.ts +257 -0
- package/src/services/document/processors/StructureProcessor.ts +176 -0
- package/src/services/document/processors/StyleProcessor.ts +389 -0
- package/src/services/document/processors/TableProcessor.ts +2238 -0
- package/src/services/document/processors/__tests__/HyperlinkProcessor.test.ts +314 -0
- package/src/services/document/processors/__tests__/ListProcessor.test.ts +291 -0
- package/src/services/document/processors/__tests__/StructureProcessor.test.ts +257 -0
- package/src/services/document/processors/__tests__/TableProcessor.hlp-tips-bullets.test.ts +459 -0
- package/src/services/document/processors/__tests__/TableProcessor.test.ts +1604 -0
- package/src/services/document/processors/index.ts +28 -0
- package/src/services/document/types/docx-processing.ts +310 -0
- package/src/services/editor/EditorActionHandlers.ts +901 -0
- package/src/services/editor/index.ts +13 -0
- package/src/setupTests.ts +47 -0
- package/src/styles/global.css +782 -0
- package/src/types/backup.ts +132 -0
- package/src/types/dictionary.ts +125 -0
- package/src/types/document-processing.ts +331 -0
- package/src/types/docxmlater-augments.d.ts +142 -0
- package/src/types/editor.ts +280 -0
- package/src/types/electron.ts +340 -0
- package/src/types/globalStats.ts +155 -0
- package/src/types/hyperlink.ts +471 -0
- package/src/types/operations.ts +354 -0
- package/src/types/session.ts +427 -0
- package/src/types/settings.ts +112 -0
- package/src/utils/MemoryMonitor.ts +248 -0
- package/src/utils/cn.ts +6 -0
- package/src/utils/colorConvert.ts +306 -0
- package/src/utils/diffUtils.ts +347 -0
- package/src/utils/documentUtils.ts +202 -0
- package/src/utils/electronGuard.ts +62 -0
- package/src/utils/indexedDB.ts +915 -0
- package/src/utils/logger.ts +717 -0
- package/src/utils/pathSecurity.ts +232 -0
- package/src/utils/pathValidator.ts +236 -0
- package/src/utils/processingTimeEstimator.ts +153 -0
- package/src/utils/safeJsonParse.ts +62 -0
- package/src/utils/textSanitizer.ts +162 -0
- package/src/utils/urlHelpers.ts +304 -0
- package/src/utils/urlPatterns.ts +198 -0
- package/src/utils/urlSanitizer.ts +152 -0
- package/src/vite-env.d.ts +11 -0
- package/tsconfig.electron.json +19 -0
- package/tsconfig.json +36 -0
- package/tsconfig.node.json +12 -0
- package/typedoc.json +45 -0
- 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
|