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,311 @@
|
|
|
1
|
+
# Test Cases for Enhanced Hyperlink Processing
|
|
2
|
+
|
|
3
|
+
**Status:** To Be Implemented
|
|
4
|
+
**Related Issue:** #004 - Implement docXMLater Built-in Hyperlink Functions
|
|
5
|
+
|
|
6
|
+
## Test Coverage Needed
|
|
7
|
+
|
|
8
|
+
### 1. Hyperlinks in Tables
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
describe('DocXMLaterProcessor - Table Hyperlinks', () => {
|
|
12
|
+
it('should extract hyperlinks from table cells', async () => {
|
|
13
|
+
// Create document with table containing hyperlinks
|
|
14
|
+
const doc = Document.create();
|
|
15
|
+
const table = doc.createTable(2, 2);
|
|
16
|
+
const cell = table.getCell(0, 0);
|
|
17
|
+
const para = cell?.createParagraph();
|
|
18
|
+
para?.addHyperlink(Hyperlink.createExternal('https://example.com', 'Link'));
|
|
19
|
+
|
|
20
|
+
// Extract
|
|
21
|
+
const processor = new DocXMLaterProcessor();
|
|
22
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
23
|
+
|
|
24
|
+
// Verify
|
|
25
|
+
expect(hyperlinks).toHaveLength(1);
|
|
26
|
+
expect(hyperlinks[0].url).toBe('https://example.com');
|
|
27
|
+
expect(hyperlinks[0].text).toBe('Link');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should update URLs in table cells', async () => {
|
|
31
|
+
// Create document with table hyperlinks
|
|
32
|
+
const doc = Document.create();
|
|
33
|
+
const table = doc.createTable(1, 1);
|
|
34
|
+
const cell = table.getCell(0, 0);
|
|
35
|
+
const para = cell?.createParagraph();
|
|
36
|
+
para?.addHyperlink(Hyperlink.createExternal('https://old.com', 'Link'));
|
|
37
|
+
|
|
38
|
+
// Update
|
|
39
|
+
const processor = new DocXMLaterProcessor();
|
|
40
|
+
const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
|
|
41
|
+
|
|
42
|
+
// Verify
|
|
43
|
+
expect(result.success).toBe(true);
|
|
44
|
+
expect(result.data?.modifiedHyperlinks).toBe(1);
|
|
45
|
+
|
|
46
|
+
// Extract and verify URL changed
|
|
47
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
48
|
+
expect(hyperlinks[0].url).toBe('https://new.com');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. Hyperlinks in Headers
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
describe('DocXMLaterProcessor - Header Hyperlinks', () => {
|
|
57
|
+
it('should extract hyperlinks from headers', async () => {
|
|
58
|
+
// Create document with header containing hyperlinks
|
|
59
|
+
const doc = Document.create();
|
|
60
|
+
const header = Header.create();
|
|
61
|
+
const para = header.addParagraph();
|
|
62
|
+
para.addHyperlink(Hyperlink.createExternal('https://header.com', 'Header Link'));
|
|
63
|
+
doc.setHeader(header);
|
|
64
|
+
|
|
65
|
+
// Extract
|
|
66
|
+
const processor = new DocXMLaterProcessor();
|
|
67
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
68
|
+
|
|
69
|
+
// Verify
|
|
70
|
+
expect(hyperlinks).toHaveLength(1);
|
|
71
|
+
expect(hyperlinks[0].url).toBe('https://header.com');
|
|
72
|
+
expect(hyperlinks[0].text).toBe('Header Link');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should update URLs in headers', async () => {
|
|
76
|
+
// Create document with header hyperlinks
|
|
77
|
+
const doc = Document.create();
|
|
78
|
+
const header = Header.create();
|
|
79
|
+
const para = header.addParagraph();
|
|
80
|
+
para.addHyperlink(Hyperlink.createExternal('https://old-header.com', 'Link'));
|
|
81
|
+
doc.setHeader(header);
|
|
82
|
+
|
|
83
|
+
// Update
|
|
84
|
+
const processor = new DocXMLaterProcessor();
|
|
85
|
+
const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
|
|
86
|
+
|
|
87
|
+
// Verify
|
|
88
|
+
expect(result.success).toBe(true);
|
|
89
|
+
expect(result.data?.modifiedHyperlinks).toBe(1);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 3. Hyperlinks in Footers
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
describe('DocXMLaterProcessor - Footer Hyperlinks', () => {
|
|
98
|
+
it('should extract hyperlinks from footers', async () => {
|
|
99
|
+
// Create document with footer containing hyperlinks
|
|
100
|
+
const doc = Document.create();
|
|
101
|
+
const footer = Footer.create();
|
|
102
|
+
const para = footer.addParagraph();
|
|
103
|
+
para.addHyperlink(Hyperlink.createExternal('https://footer.com', 'Footer Link'));
|
|
104
|
+
doc.setFooter(footer);
|
|
105
|
+
|
|
106
|
+
// Extract
|
|
107
|
+
const processor = new DocXMLaterProcessor();
|
|
108
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
109
|
+
|
|
110
|
+
// Verify
|
|
111
|
+
expect(hyperlinks).toHaveLength(1);
|
|
112
|
+
expect(hyperlinks[0].url).toBe('https://footer.com');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should update URLs in footers', async () => {
|
|
116
|
+
// Create document with footer hyperlinks
|
|
117
|
+
const doc = Document.create();
|
|
118
|
+
const footer = Footer.create();
|
|
119
|
+
const para = footer.addParagraph();
|
|
120
|
+
para.addHyperlink(Hyperlink.createExternal('https://old-footer.com', 'Link'));
|
|
121
|
+
doc.setFooter(footer);
|
|
122
|
+
|
|
123
|
+
// Update
|
|
124
|
+
const processor = new DocXMLaterProcessor();
|
|
125
|
+
const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
|
|
126
|
+
|
|
127
|
+
// Verify
|
|
128
|
+
expect(result.success).toBe(true);
|
|
129
|
+
expect(result.data?.modifiedHyperlinks).toBe(1);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 4. Comprehensive Coverage
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
describe('DocXMLaterProcessor - Comprehensive Hyperlink Coverage', () => {
|
|
138
|
+
it('should extract hyperlinks from all document parts', async () => {
|
|
139
|
+
// Create document with hyperlinks in multiple locations
|
|
140
|
+
const doc = Document.create();
|
|
141
|
+
|
|
142
|
+
// Body hyperlink
|
|
143
|
+
doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://body.com', 'Body'));
|
|
144
|
+
|
|
145
|
+
// Table hyperlink
|
|
146
|
+
const table = doc.createTable(1, 1);
|
|
147
|
+
const cell = table.getCell(0, 0);
|
|
148
|
+
cell?.createParagraph().addHyperlink(Hyperlink.createExternal('https://table.com', 'Table'));
|
|
149
|
+
|
|
150
|
+
// Header hyperlink
|
|
151
|
+
const header = Header.create();
|
|
152
|
+
header.addParagraph().addHyperlink(Hyperlink.createExternal('https://header.com', 'Header'));
|
|
153
|
+
doc.setHeader(header);
|
|
154
|
+
|
|
155
|
+
// Footer hyperlink
|
|
156
|
+
const footer = Footer.create();
|
|
157
|
+
footer.addParagraph().addHyperlink(Hyperlink.createExternal('https://footer.com', 'Footer'));
|
|
158
|
+
doc.setFooter(footer);
|
|
159
|
+
|
|
160
|
+
// Extract
|
|
161
|
+
const processor = new DocXMLaterProcessor();
|
|
162
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
163
|
+
|
|
164
|
+
// Verify all 4 hyperlinks found
|
|
165
|
+
expect(hyperlinks).toHaveLength(4);
|
|
166
|
+
expect(hyperlinks.map((h) => h.url).sort()).toEqual([
|
|
167
|
+
'https://body.com',
|
|
168
|
+
'https://footer.com',
|
|
169
|
+
'https://header.com',
|
|
170
|
+
'https://table.com',
|
|
171
|
+
]);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('should update URLs across all document parts in one operation', async () => {
|
|
175
|
+
// Create document with hyperlinks in multiple locations
|
|
176
|
+
const doc = Document.create();
|
|
177
|
+
doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://old1.com', 'Link 1'));
|
|
178
|
+
doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://old2.com', 'Link 2'));
|
|
179
|
+
|
|
180
|
+
const table = doc.createTable(1, 1);
|
|
181
|
+
const cell = table.getCell(0, 0);
|
|
182
|
+
cell?.createParagraph().addHyperlink(Hyperlink.createExternal('https://old3.com', 'Link 3'));
|
|
183
|
+
|
|
184
|
+
// Update all at once
|
|
185
|
+
const processor = new DocXMLaterProcessor();
|
|
186
|
+
const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
|
|
187
|
+
|
|
188
|
+
// Verify all updated
|
|
189
|
+
expect(result.success).toBe(true);
|
|
190
|
+
expect(result.data?.modifiedHyperlinks).toBe(3);
|
|
191
|
+
|
|
192
|
+
// Extract and verify all URLs changed
|
|
193
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
194
|
+
expect(hyperlinks.every((h) => h.url?.includes('new'))).toBe(true);
|
|
195
|
+
expect(hyperlinks.every((h) => !h.url?.includes('old'))).toBe(true);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 5. Performance Benchmarks
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
describe('DocXMLaterProcessor - Performance', () => {
|
|
204
|
+
it('should be faster than manual extraction for large documents', async () => {
|
|
205
|
+
// Create document with 500 hyperlinks
|
|
206
|
+
const doc = Document.create();
|
|
207
|
+
for (let i = 0; i < 500; i++) {
|
|
208
|
+
doc
|
|
209
|
+
.createParagraph()
|
|
210
|
+
.addHyperlink(Hyperlink.createExternal(`https://example${i}.com`, `Link ${i}`));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const processor = new DocXMLaterProcessor();
|
|
214
|
+
|
|
215
|
+
// Measure extraction time
|
|
216
|
+
const start = performance.now();
|
|
217
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
218
|
+
const duration = performance.now() - start;
|
|
219
|
+
|
|
220
|
+
// Verify
|
|
221
|
+
expect(hyperlinks).toHaveLength(500);
|
|
222
|
+
expect(duration).toBeLessThan(200); // Should be faster than 200ms
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('should be faster than manual updates for large documents', async () => {
|
|
226
|
+
// Create document with 500 hyperlinks
|
|
227
|
+
const doc = Document.create();
|
|
228
|
+
for (let i = 0; i < 500; i++) {
|
|
229
|
+
doc
|
|
230
|
+
.createParagraph()
|
|
231
|
+
.addHyperlink(Hyperlink.createExternal(`https://old${i}.com`, `Link ${i}`));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const processor = new DocXMLaterProcessor();
|
|
235
|
+
|
|
236
|
+
// Measure update time
|
|
237
|
+
const start = performance.now();
|
|
238
|
+
const result = await processor.modifyHyperlinks(doc, (url) => url.replace('old', 'new'));
|
|
239
|
+
const duration = performance.now() - start;
|
|
240
|
+
|
|
241
|
+
// Verify
|
|
242
|
+
expect(result.success).toBe(true);
|
|
243
|
+
expect(result.data?.modifiedHyperlinks).toBe(500);
|
|
244
|
+
expect(duration).toBeLessThan(250); // Should be faster than 250ms
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### 6. Error Handling
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
describe('DocXMLaterProcessor - Error Handling', () => {
|
|
253
|
+
it('should handle transform errors gracefully', async () => {
|
|
254
|
+
const doc = Document.create();
|
|
255
|
+
doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://valid.com', 'Link'));
|
|
256
|
+
|
|
257
|
+
const processor = new DocXMLaterProcessor();
|
|
258
|
+
const result = await processor.modifyHyperlinks(doc, (url) => {
|
|
259
|
+
throw new Error('Transform failed');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// Verify error handled
|
|
263
|
+
expect(result.success).toBe(false);
|
|
264
|
+
expect(result.error).toContain('Failed to modify hyperlinks');
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it('should preserve document if URL update fails', async () => {
|
|
268
|
+
const doc = Document.create();
|
|
269
|
+
doc.createParagraph().addHyperlink(Hyperlink.createExternal('https://original.com', 'Link'));
|
|
270
|
+
|
|
271
|
+
const processor = new DocXMLaterProcessor();
|
|
272
|
+
|
|
273
|
+
// Try to update with failing transform
|
|
274
|
+
await processor.modifyHyperlinks(doc, (url) => {
|
|
275
|
+
throw new Error('Transform failed');
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// Verify original URL preserved
|
|
279
|
+
const hyperlinks = await processor.extractHyperlinks(doc);
|
|
280
|
+
expect(hyperlinks[0].url).toBe('https://original.com');
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## Test Implementation Priority
|
|
286
|
+
|
|
287
|
+
1. **High Priority:**
|
|
288
|
+
- Comprehensive coverage test (all document parts)
|
|
289
|
+
- Table hyperlinks extraction/update
|
|
290
|
+
- Header/footer hyperlinks extraction/update
|
|
291
|
+
|
|
292
|
+
2. **Medium Priority:**
|
|
293
|
+
- Performance benchmarks
|
|
294
|
+
- Error handling tests
|
|
295
|
+
|
|
296
|
+
3. **Low Priority:**
|
|
297
|
+
- Edge cases (nested tables, multiple headers/footers)
|
|
298
|
+
- Stress tests (very large documents)
|
|
299
|
+
|
|
300
|
+
## Notes
|
|
301
|
+
|
|
302
|
+
- These tests require docxmlater v1.15.0 or later
|
|
303
|
+
- Test infrastructure needs to be set up (jest/vitest configuration)
|
|
304
|
+
- Real document testing should be done with integration tests
|
|
305
|
+
- Performance benchmarks are estimates and may vary by system
|
|
306
|
+
|
|
307
|
+
## Related Files
|
|
308
|
+
|
|
309
|
+
- Implementation: `src/services/document/DocXMLaterProcessor.ts`
|
|
310
|
+
- Existing tests: `src/services/document/__tests__/WordDocumentProcessor.test.ts`
|
|
311
|
+
- Integration tests: `src/services/document/__tests__/WordDocumentProcessor.integration.test.ts`
|