@beyondwork/docx-react-component 1.0.1 → 1.0.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/README.md +44 -104
- package/package.json +76 -46
- package/src/README.md +85 -0
- package/src/api/README.md +22 -0
- package/src/api/public-types.ts +525 -0
- package/src/compare/diff-engine.ts +530 -0
- package/src/compare/export-redlines.ts +162 -0
- package/src/compare/snapshot.ts +37 -0
- package/src/component-inventory.md +99 -0
- package/src/core/README.md +10 -0
- package/src/core/commands/README.md +3 -0
- package/src/core/commands/formatting-commands.ts +161 -0
- package/src/core/commands/image-commands.ts +144 -0
- package/src/core/commands/index.ts +1013 -0
- package/src/core/commands/list-commands.ts +370 -0
- package/src/core/commands/review-commands.ts +108 -0
- package/src/core/commands/text-commands.ts +119 -0
- package/src/core/schema/README.md +3 -0
- package/src/core/schema/text-schema.ts +512 -0
- package/src/core/selection/README.md +3 -0
- package/src/core/selection/mapping.ts +238 -0
- package/src/core/selection/review-anchors.ts +94 -0
- package/src/core/state/README.md +3 -0
- package/src/core/state/editor-state.ts +580 -0
- package/src/core/state/text-transaction.ts +276 -0
- package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
- package/src/formats/xlsx/io/parse-sheet.ts +289 -0
- package/src/formats/xlsx/io/parse-styles.ts +57 -0
- package/src/formats/xlsx/io/parse-workbook.ts +75 -0
- package/src/formats/xlsx/io/xlsx-session.ts +306 -0
- package/src/formats/xlsx/model/cell.ts +189 -0
- package/src/formats/xlsx/model/sheet.ts +244 -0
- package/src/formats/xlsx/model/styles.ts +118 -0
- package/src/formats/xlsx/model/workbook.ts +449 -0
- package/src/index.ts +45 -0
- package/src/io/README.md +10 -0
- package/src/io/docx-session.ts +1763 -0
- package/src/io/export/README.md +3 -0
- package/src/io/export/export-session.ts +165 -0
- package/src/io/export/minimal-docx.ts +115 -0
- package/src/io/export/reattach-preserved-parts.ts +54 -0
- package/src/io/export/serialize-comments.ts +876 -0
- package/src/io/export/serialize-footnotes.ts +217 -0
- package/src/io/export/serialize-headers-footers.ts +200 -0
- package/src/io/export/serialize-main-document.ts +982 -0
- package/src/io/export/serialize-numbering.ts +97 -0
- package/src/io/export/serialize-revisions.ts +389 -0
- package/src/io/export/serialize-runtime-revisions.ts +265 -0
- package/src/io/export/serialize-tables.ts +147 -0
- package/src/io/export/split-review-boundaries.ts +194 -0
- package/src/io/normalize/README.md +3 -0
- package/src/io/normalize/normalize-text.ts +437 -0
- package/src/io/ooxml/README.md +3 -0
- package/src/io/ooxml/parse-comments.ts +779 -0
- package/src/io/ooxml/parse-complex-content.ts +287 -0
- package/src/io/ooxml/parse-fields.ts +438 -0
- package/src/io/ooxml/parse-footnotes.ts +403 -0
- package/src/io/ooxml/parse-headers-footers.ts +483 -0
- package/src/io/ooxml/parse-inline-media.ts +431 -0
- package/src/io/ooxml/parse-main-document.ts +1846 -0
- package/src/io/ooxml/parse-numbering.ts +425 -0
- package/src/io/ooxml/parse-revisions.ts +658 -0
- package/src/io/ooxml/parse-shapes.ts +271 -0
- package/src/io/ooxml/parse-tables.ts +568 -0
- package/src/io/ooxml/parse-theme.ts +314 -0
- package/src/io/ooxml/part-manifest.ts +136 -0
- package/src/io/ooxml/revision-boundaries.ts +351 -0
- package/src/io/opc/README.md +3 -0
- package/src/io/opc/corrupt-package.ts +166 -0
- package/src/io/opc/docx-package.ts +74 -0
- package/src/io/opc/package-reader.ts +320 -0
- package/src/io/opc/package-writer.ts +273 -0
- package/src/legal/bookmarks.ts +196 -0
- package/src/legal/cross-references.ts +356 -0
- package/src/legal/defined-terms.ts +203 -0
- package/src/model/README.md +3 -0
- package/src/model/canonical-document.ts +1911 -0
- package/src/model/cds-1.0.0.ts +196 -0
- package/src/model/snapshot.ts +393 -0
- package/src/preservation/README.md +3 -0
- package/src/preservation/markup-compatibility.ts +48 -0
- package/src/preservation/opaque-fragment-store.ts +89 -0
- package/src/preservation/opaque-region.ts +233 -0
- package/src/preservation/package-preservation.ts +120 -0
- package/src/preservation/preserved-part-manifest.ts +56 -0
- package/src/preservation/relationship-retention.ts +57 -0
- package/src/preservation/store.ts +185 -0
- package/src/review/README.md +16 -0
- package/src/review/store/README.md +3 -0
- package/src/review/store/comment-anchors.ts +70 -0
- package/src/review/store/comment-remapping.ts +154 -0
- package/src/review/store/comment-store.ts +331 -0
- package/src/review/store/comment-thread.ts +109 -0
- package/src/review/store/revision-actions.ts +394 -0
- package/src/review/store/revision-store.ts +303 -0
- package/src/review/store/revision-types.ts +168 -0
- package/src/review/store/runtime-comment-store.ts +43 -0
- package/src/runtime/README.md +3 -0
- package/src/runtime/ai-action-policy.ts +764 -0
- package/src/runtime/document-runtime.ts +967 -0
- package/src/runtime/read-only-diagnostics-runtime.ts +232 -0
- package/src/runtime/review-runtime.ts +44 -0
- package/src/runtime/revision-runtime.ts +107 -0
- package/src/runtime/session-capabilities.ts +138 -0
- package/src/runtime/surface-projection.ts +570 -0
- package/src/runtime/table-commands.ts +87 -0
- package/src/runtime/table-schema.ts +140 -0
- package/src/runtime/virtualized-rendering.ts +258 -0
- package/src/ui/README.md +30 -0
- package/src/ui/WordReviewEditor.tsx +1504 -0
- package/src/ui/comments/README.md +3 -0
- package/src/ui/compatibility/README.md +3 -0
- package/src/ui/editor-surface/README.md +3 -0
- package/src/ui/headless/comment-decoration-model.ts +124 -0
- package/src/ui/headless/revision-decoration-model.ts +128 -0
- package/src/ui/headless/selection-helpers.ts +34 -0
- package/src/ui/headless/use-editor-keyboard.ts +98 -0
- package/src/ui/review/README.md +3 -0
- package/src/ui/shared/revision-filters.ts +31 -0
- package/src/ui/status/README.md +3 -0
- package/src/ui/theme/README.md +3 -0
- package/src/ui/toolbar/README.md +3 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +48 -0
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +44 -0
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
- package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +139 -0
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +98 -0
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
- package/src/ui-tailwind/editor-surface/pm-schema.ts +452 -0
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +327 -0
- package/src/ui-tailwind/editor-surface/search-plugin.ts +157 -0
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +118 -0
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +52 -0
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +215 -0
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +122 -0
- package/src/ui-tailwind/index.ts +61 -0
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +276 -0
- package/src/ui-tailwind/review/tw-health-panel.tsx +120 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +120 -0
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
- package/src/ui-tailwind/status/tw-status-bar.tsx +58 -0
- package/src/ui-tailwind/theme/editor-theme.css +190 -0
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +48 -0
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +231 -0
- package/src/ui-tailwind/tw-review-workspace.tsx +140 -0
- package/src/validation/README.md +3 -0
- package/src/validation/compatibility-engine.ts +317 -0
- package/src/validation/compatibility-report.ts +160 -0
- package/src/validation/diagnostics.ts +203 -0
- package/src/validation/import-diagnostics.ts +128 -0
- package/src/validation/low-priority-word-surfaces.ts +373 -0
- package/dist/chunk-32W6IVQE.js +0 -7725
- package/dist/chunk-32W6IVQE.js.map +0 -1
- package/dist/index.cjs +0 -23722
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -7
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -16011
- package/dist/index.js.map +0 -1
- package/dist/public-types-DqCURAz8.d.cts +0 -1152
- package/dist/public-types-DqCURAz8.d.ts +0 -1152
- package/dist/tailwind.cjs +0 -8295
- package/dist/tailwind.cjs.map +0 -1
- package/dist/tailwind.d.cts +0 -323
- package/dist/tailwind.d.ts +0 -323
- package/dist/tailwind.js +0 -553
- package/dist/tailwind.js.map +0 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { parseMainDocumentXml } from "../io/ooxml/parse-main-document.ts";
|
|
2
|
+
import type {
|
|
3
|
+
CanonicalDocument,
|
|
4
|
+
DocumentNode,
|
|
5
|
+
ParagraphNode,
|
|
6
|
+
} from "../model/canonical-document.ts";
|
|
7
|
+
|
|
8
|
+
export interface DefinedTermOccurrence {
|
|
9
|
+
paragraphIndex: number;
|
|
10
|
+
label: string;
|
|
11
|
+
kind: "definition" | "reference";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface DefinedTerm {
|
|
15
|
+
term: string;
|
|
16
|
+
normalizedTerm: string;
|
|
17
|
+
definitionStyle: "quoted" | "bare";
|
|
18
|
+
definitions: DefinedTermOccurrence[];
|
|
19
|
+
references: DefinedTermOccurrence[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const QUOTED_DEFINITION_PATTERN =
|
|
23
|
+
/["“]([A-Z][A-Za-z0-9]*(?:[ -][A-Z][A-Za-z0-9]*){0,5})["”]\s+(?:means|has the meaning(?: set forth)?|shall mean|refers to)\b/g;
|
|
24
|
+
const BARE_DEFINITION_PATTERN =
|
|
25
|
+
/\b([A-Z][A-Za-z0-9]*(?:\s+[A-Z][A-Za-z0-9]*){0,5})\s+(?:means|has the meaning(?: set forth)?|shall mean|refers to)\b/g;
|
|
26
|
+
const BLOCKED_BARE_TERMS = new Set([
|
|
27
|
+
"This Agreement",
|
|
28
|
+
"Such Term",
|
|
29
|
+
"The Company",
|
|
30
|
+
"This Section",
|
|
31
|
+
"This Clause",
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
export function collectDefinedTermsFromDocumentXml(xml: string): DefinedTerm[] {
|
|
35
|
+
const parsed = parseMainDocumentXml(xml);
|
|
36
|
+
const paragraphs = parsed.blocks
|
|
37
|
+
.filter((block): block is typeof parsed.blocks[number] & { type: "paragraph" } => block.type === "paragraph")
|
|
38
|
+
.map(flattenParagraphText);
|
|
39
|
+
|
|
40
|
+
return buildDefinedTermCatalog(paragraphs);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function collectDefinedTermsFromCanonicalDocument(
|
|
44
|
+
document: Pick<CanonicalDocument, "content"> | DocumentNode,
|
|
45
|
+
): DefinedTerm[] {
|
|
46
|
+
const root = "content" in document ? document.content : document;
|
|
47
|
+
const paragraphs: string[] = [];
|
|
48
|
+
|
|
49
|
+
walkDocument(root, (node) => {
|
|
50
|
+
if (node.type === "paragraph") {
|
|
51
|
+
paragraphs.push(flattenParagraphText(node));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
return buildDefinedTermCatalog(paragraphs);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function buildDefinedTermCatalog(paragraphs: readonly string[]): DefinedTerm[] {
|
|
59
|
+
const terms = new Map<string, DefinedTerm>();
|
|
60
|
+
|
|
61
|
+
paragraphs.forEach((paragraph, paragraphIndex) => {
|
|
62
|
+
for (const candidate of extractDefinitionCandidates(paragraph)) {
|
|
63
|
+
const normalized = normalizeTerm(candidate.term);
|
|
64
|
+
const existing = terms.get(normalized) ?? {
|
|
65
|
+
term: candidate.term,
|
|
66
|
+
normalizedTerm: normalized,
|
|
67
|
+
definitionStyle: candidate.definitionStyle,
|
|
68
|
+
definitions: [],
|
|
69
|
+
references: [],
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
if (!terms.has(normalized)) {
|
|
73
|
+
terms.set(normalized, existing);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
existing.definitions.push({
|
|
77
|
+
paragraphIndex,
|
|
78
|
+
label: candidate.term,
|
|
79
|
+
kind: "definition",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
paragraphs.forEach((paragraph, paragraphIndex) => {
|
|
85
|
+
for (const term of terms.values()) {
|
|
86
|
+
const references = findTermReferences(paragraph, term.term);
|
|
87
|
+
if (references === 0) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const hasDefinitionInParagraph = term.definitions.some(
|
|
92
|
+
(definition) => definition.paragraphIndex === paragraphIndex,
|
|
93
|
+
);
|
|
94
|
+
const referenceCount = hasDefinitionInParagraph ? 0 : references;
|
|
95
|
+
|
|
96
|
+
for (let count = 0; count < referenceCount; count += 1) {
|
|
97
|
+
term.references.push({
|
|
98
|
+
paragraphIndex,
|
|
99
|
+
label: term.term,
|
|
100
|
+
kind: "reference",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return Array.from(terms.values()).sort((left, right) => left.term.localeCompare(right.term));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
interface DefinitionCandidate {
|
|
110
|
+
term: string;
|
|
111
|
+
definitionStyle: DefinedTerm["definitionStyle"];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function extractDefinitionCandidates(paragraph: string): DefinitionCandidate[] {
|
|
115
|
+
const candidates: DefinitionCandidate[] = [];
|
|
116
|
+
|
|
117
|
+
for (const match of paragraph.matchAll(QUOTED_DEFINITION_PATTERN)) {
|
|
118
|
+
const term = match[1]?.trim();
|
|
119
|
+
if (!term) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
candidates.push({
|
|
124
|
+
term,
|
|
125
|
+
definitionStyle: "quoted",
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (const match of paragraph.matchAll(BARE_DEFINITION_PATTERN)) {
|
|
130
|
+
const term = match[1]?.trim();
|
|
131
|
+
if (!term || BLOCKED_BARE_TERMS.has(term) || isQuotedTerm(term, paragraph)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
candidates.push({
|
|
136
|
+
term,
|
|
137
|
+
definitionStyle: "bare",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return candidates;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function normalizeTerm(term: string): string {
|
|
145
|
+
return term.trim().replace(/\s+/g, " ").toLowerCase();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function isQuotedTerm(term: string, paragraph: string): boolean {
|
|
149
|
+
return paragraph.includes(`"${term}"`) || paragraph.includes(`“${term}”`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function findTermReferences(paragraph: string, term: string): number {
|
|
153
|
+
const escapedTerm = escapeRegExp(term);
|
|
154
|
+
const pattern = new RegExp(`(?:^|[^A-Za-z0-9])(?:\"|“)?(${escapedTerm})(?:\"|”)?(?=[^A-Za-z0-9]|$)`, "g");
|
|
155
|
+
return Array.from(paragraph.matchAll(pattern)).length;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function escapeRegExp(value: string): string {
|
|
159
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function flattenParagraphText(paragraph: ParagraphNode): string {
|
|
163
|
+
return paragraph.children
|
|
164
|
+
.map((child) => {
|
|
165
|
+
switch (child.type) {
|
|
166
|
+
case "text":
|
|
167
|
+
return child.text;
|
|
168
|
+
case "hyperlink":
|
|
169
|
+
case "field":
|
|
170
|
+
return child.children
|
|
171
|
+
.map((nested) => (nested.type === "text" ? nested.text : nested.type === "tab" ? "\t" : ""))
|
|
172
|
+
.join("");
|
|
173
|
+
case "tab":
|
|
174
|
+
return "\t";
|
|
175
|
+
case "hard_break":
|
|
176
|
+
case "column_break":
|
|
177
|
+
return "\n";
|
|
178
|
+
default:
|
|
179
|
+
return "";
|
|
180
|
+
}
|
|
181
|
+
})
|
|
182
|
+
.join("");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {
|
|
186
|
+
visit(node);
|
|
187
|
+
|
|
188
|
+
if ("children" in node && Array.isArray(node.children)) {
|
|
189
|
+
for (const child of node.children) {
|
|
190
|
+
walkDocument(child, visit);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (node.type === "table") {
|
|
195
|
+
for (const row of node.rows) {
|
|
196
|
+
walkDocument(row, visit);
|
|
197
|
+
}
|
|
198
|
+
} else if (node.type === "table_row") {
|
|
199
|
+
for (const cell of node.cells) {
|
|
200
|
+
walkDocument(cell, visit);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|