@usejunior/docx-core 0.22.1 → 0.23.1
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/dist/.tsbuildinfo +1 -1
- package/dist/integration/generation-probes.d.ts.map +1 -1
- package/dist/integration/generation-probes.js +26 -21
- package/dist/integration/generation-probes.js.map +1 -1
- package/dist/integration/libreoffice-oracle.d.ts +6 -1
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
- package/dist/integration/libreoffice-oracle.js +113 -44
- package/dist/integration/libreoffice-oracle.js.map +1 -1
- package/dist/integration/soffice-lock.d.ts +30 -0
- package/dist/integration/soffice-lock.d.ts.map +1 -0
- package/dist/integration/soffice-lock.js +308 -0
- package/dist/integration/soffice-lock.js.map +1 -0
- package/dist/primitives/accept_changes.d.ts +27 -1
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +57 -2
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +2 -2
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/document_view-headings.d.ts.map +1 -1
- package/dist/primitives/document_view-headings.js +16 -6
- package/dist/primitives/document_view-headings.js.map +1 -1
- package/dist/primitives/footnotes.js +2 -2
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/formatting_tags.d.ts +6 -3
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +50 -44
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +1 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/paragraph-index.d.ts +28 -2
- package/dist/primitives/paragraph-index.d.ts.map +1 -1
- package/dist/primitives/paragraph-index.js +25 -6
- package/dist/primitives/paragraph-index.js.map +1 -1
- package/dist/primitives/structural_validation.d.ts +54 -0
- package/dist/primitives/structural_validation.d.ts.map +1 -0
- package/dist/primitives/structural_validation.js +301 -0
- package/dist/primitives/structural_validation.js.map +1 -0
- package/dist/primitives/styles.d.ts +110 -20
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +535 -45
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/zip.d.ts +6 -0
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +7 -1
- package/dist/primitives/zip.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paragraph-index.js","sourceRoot":"","sources":["../../src/primitives/paragraph-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"paragraph-index.js","sourceRoot":"","sources":["../../src/primitives/paragraph-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { DocumentViewNode } from './document_view-types.js';
|
|
2
|
+
export type StructuralDiagnosticSeverity = 'warning' | 'error';
|
|
3
|
+
export type StructuralDiagnosticEvidence = {
|
|
4
|
+
anchor_level: number | null;
|
|
5
|
+
intended_level: number | null;
|
|
6
|
+
first_descendant_id?: string;
|
|
7
|
+
first_descendant_level?: number;
|
|
8
|
+
style_source_id?: string;
|
|
9
|
+
anchor_num_id?: string;
|
|
10
|
+
style_source_num_id?: string;
|
|
11
|
+
bonded_heading_style?: string;
|
|
12
|
+
bonded_body_style?: string;
|
|
13
|
+
bonded_body_style_candidates?: string[];
|
|
14
|
+
};
|
|
15
|
+
export type StructuralDiagnostic = {
|
|
16
|
+
code: 'PARENT_CHILD_SLICE' | 'LIST_LEVEL_MISMATCH' | 'MID_LIST_RENUMBERING' | 'BONDED_PARAGRAPH_PAIR_REQUIRED' | 'RUN_IN_PAIR_ORDER' | 'BONDED_PARAGRAPH_PAIR_AMBIGUOUS';
|
|
17
|
+
severity: StructuralDiagnosticSeverity;
|
|
18
|
+
operation_id: string;
|
|
19
|
+
anchor_id: string;
|
|
20
|
+
message: string;
|
|
21
|
+
evidence: StructuralDiagnosticEvidence;
|
|
22
|
+
suggested_anchor_id?: string;
|
|
23
|
+
/** Position to use with `suggested_anchor_id`; omitted when it matches the original position. */
|
|
24
|
+
suggested_position?: 'BEFORE' | 'AFTER';
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Source evidence the node view does not carry. `runInHeadingIds` names
|
|
28
|
+
* paragraphs whose paragraph mark is a Word style separator (`w:specVanish`),
|
|
29
|
+
* so the heading renders run-in with the following paragraph. Only those
|
|
30
|
+
* paragraphs can anchor a bonded heading/body pair; a repeated
|
|
31
|
+
* `Heading1 → Normal` transition by itself is ordinary section structure.
|
|
32
|
+
*/
|
|
33
|
+
export type StructuralValidationOptions = {
|
|
34
|
+
runInHeadingIds?: ReadonlySet<string>;
|
|
35
|
+
};
|
|
36
|
+
export type ResolvedInsertionContext = {
|
|
37
|
+
operationId: string;
|
|
38
|
+
position: 'BEFORE' | 'AFTER';
|
|
39
|
+
anchorId: string;
|
|
40
|
+
styleSourceId?: string;
|
|
41
|
+
};
|
|
42
|
+
export type StructuralValidator = (nodes: readonly DocumentViewNode[], context: ResolvedInsertionContext) => StructuralDiagnostic[];
|
|
43
|
+
export declare const structuralValidators: readonly StructuralValidator[];
|
|
44
|
+
export declare function validateStructuralInsertion(nodes: readonly DocumentViewNode[], context: ResolvedInsertionContext): StructuralDiagnostic[];
|
|
45
|
+
export declare function validateStructuralInsertions(nodes: readonly DocumentViewNode[], contexts: readonly ResolvedInsertionContext[], options?: StructuralValidationOptions): StructuralDiagnostic[];
|
|
46
|
+
/**
|
|
47
|
+
* Paragraph ids whose paragraph mark carries `w:specVanish` (Word's style
|
|
48
|
+
* separator), i.e. headings that render run-in with the next paragraph.
|
|
49
|
+
*/
|
|
50
|
+
export declare function collectRunInHeadingIds(paragraphs: Iterable<Element>): Set<string>;
|
|
51
|
+
export declare function isRunInHeadingParagraph(paragraph: Element): boolean;
|
|
52
|
+
/** True only for the explicit two-operation form of a source-proven bonded pair. */
|
|
53
|
+
export declare function isRecognizedBondedInsertionPair(nodes: readonly DocumentViewNode[], contexts: readonly ResolvedInsertionContext[], options?: StructuralValidationOptions): boolean;
|
|
54
|
+
//# sourceMappingURL=structural_validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural_validation.d.ts","sourceRoot":"","sources":["../../src/primitives/structural_validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,MAAM,MAAM,4BAA4B,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,GAAG,sBAAsB,GACvE,gCAAgC,GAAG,mBAAmB,GACtD,iCAAiC,CAAC;IACtC,QAAQ,EAAE,4BAA4B,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,4BAA4B,CAAC;IACvC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iGAAiG;IACjG,kBAAkB,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACzC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,OAAO,EAAE,wBAAwB,KAC9B,oBAAoB,EAAE,CAAC;AAiH5B,eAAO,MAAM,oBAAoB,EAAE,SAAS,mBAAmB,EAI9D,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,OAAO,EAAE,wBAAwB,GAChC,oBAAoB,EAAE,CAExB;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,EAC7C,OAAO,GAAE,2BAAgC,GACxC,oBAAoB,EAAE,CAIxB;AA4HD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAQjF;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAOnE;AAED,oFAAoF;AACpF,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,EAC7C,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAgBT"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { getParagraphBookmarkId } from './bookmarks.js';
|
|
2
|
+
import { getDirectChildrenByName } from './dom-helpers.js';
|
|
3
|
+
function hierarchyLevel(node) {
|
|
4
|
+
if (!node)
|
|
5
|
+
return null;
|
|
6
|
+
if (node.heading?.level != null && (node.heading.source === 'word_style'
|
|
7
|
+
|| node.heading.source === 'list_metadata'
|
|
8
|
+
|| node.heading.source === 'outline_level'))
|
|
9
|
+
return node.heading.level;
|
|
10
|
+
if (node.numbering.is_auto_numbered && node.numbering.ilvl != null)
|
|
11
|
+
return node.numbering.ilvl + 1;
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
function structuralStyle(node) {
|
|
15
|
+
return node?.paragraph_style_id ?? node?.style ?? '';
|
|
16
|
+
}
|
|
17
|
+
const parentChildSlicing = (nodes, context) => {
|
|
18
|
+
const anchorIndex = nodes.findIndex((node) => node.id === context.anchorId);
|
|
19
|
+
const source = nodes.find((node) => node.id === (context.styleSourceId ?? context.anchorId));
|
|
20
|
+
if (anchorIndex < 0 || !source)
|
|
21
|
+
return [];
|
|
22
|
+
const intendedLevel = hierarchyLevel(source);
|
|
23
|
+
if (intendedLevel == null)
|
|
24
|
+
return [];
|
|
25
|
+
// The insertion lands in the gap between `gapIndex` and `gapIndex + 1`.
|
|
26
|
+
const gapIndex = context.position === 'AFTER' ? anchorIndex : anchorIndex - 1;
|
|
27
|
+
// The run the new paragraph would capture: every following paragraph until
|
|
28
|
+
// one at or above the intended level.
|
|
29
|
+
let firstCaptured;
|
|
30
|
+
let lastCapturedId;
|
|
31
|
+
for (let index = gapIndex + 1; index < nodes.length; index += 1) {
|
|
32
|
+
const level = hierarchyLevel(nodes[index]);
|
|
33
|
+
if (level != null && level <= intendedLevel)
|
|
34
|
+
break;
|
|
35
|
+
if (level != null && !firstCaptured)
|
|
36
|
+
firstCaptured = { id: nodes[index].id, level };
|
|
37
|
+
lastCapturedId = nodes[index].id;
|
|
38
|
+
}
|
|
39
|
+
if (!firstCaptured)
|
|
40
|
+
return [];
|
|
41
|
+
// Slicing only happens when the captured paragraph already has a parent
|
|
42
|
+
// before the gap: the insertion would steal it from that parent.
|
|
43
|
+
let hasExistingParent = false;
|
|
44
|
+
for (let index = gapIndex; index >= 0; index -= 1) {
|
|
45
|
+
const level = hierarchyLevel(nodes[index]);
|
|
46
|
+
if (level != null && level < firstCaptured.level) {
|
|
47
|
+
hasExistingParent = true;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (!hasExistingParent)
|
|
52
|
+
return [];
|
|
53
|
+
const suggestedAnchorId = lastCapturedId;
|
|
54
|
+
return [{
|
|
55
|
+
code: 'PARENT_CHILD_SLICE',
|
|
56
|
+
severity: 'error',
|
|
57
|
+
operation_id: context.operationId,
|
|
58
|
+
anchor_id: context.anchorId,
|
|
59
|
+
message: `Insertion ${context.operationId} would separate ${firstCaptured.id} from its existing parent; insert after ${suggestedAnchorId} instead.`,
|
|
60
|
+
evidence: {
|
|
61
|
+
anchor_level: hierarchyLevel(nodes[anchorIndex]),
|
|
62
|
+
intended_level: intendedLevel,
|
|
63
|
+
first_descendant_id: firstCaptured.id,
|
|
64
|
+
first_descendant_level: firstCaptured.level,
|
|
65
|
+
style_source_id: context.styleSourceId,
|
|
66
|
+
},
|
|
67
|
+
suggested_anchor_id: suggestedAnchorId,
|
|
68
|
+
suggested_position: 'AFTER',
|
|
69
|
+
}];
|
|
70
|
+
};
|
|
71
|
+
const listLevelMismatch = (nodes, context) => {
|
|
72
|
+
const anchor = nodes.find((node) => node.id === context.anchorId);
|
|
73
|
+
const source = nodes.find((node) => node.id === (context.styleSourceId ?? context.anchorId));
|
|
74
|
+
if (!anchor?.numbering.is_auto_numbered || !source?.numbering.is_auto_numbered)
|
|
75
|
+
return [];
|
|
76
|
+
if (anchor.numbering.ilvl == null || source.numbering.ilvl == null || anchor.numbering.ilvl === source.numbering.ilvl)
|
|
77
|
+
return [];
|
|
78
|
+
return [{
|
|
79
|
+
code: 'LIST_LEVEL_MISMATCH',
|
|
80
|
+
severity: 'warning',
|
|
81
|
+
operation_id: context.operationId,
|
|
82
|
+
anchor_id: context.anchorId,
|
|
83
|
+
message: `Insertion ${context.operationId} uses list level ${source.numbering.ilvl} beside level ${anchor.numbering.ilvl}; confirm that nesting is intentional.`,
|
|
84
|
+
evidence: {
|
|
85
|
+
anchor_level: anchor.numbering.ilvl + 1,
|
|
86
|
+
intended_level: source.numbering.ilvl + 1,
|
|
87
|
+
style_source_id: context.styleSourceId,
|
|
88
|
+
anchor_num_id: anchor.numbering.num_id ?? undefined,
|
|
89
|
+
style_source_num_id: source.numbering.num_id ?? undefined,
|
|
90
|
+
},
|
|
91
|
+
}];
|
|
92
|
+
};
|
|
93
|
+
const midListRenumbering = (nodes, context) => {
|
|
94
|
+
const anchorIndex = nodes.findIndex((node) => node.id === context.anchorId);
|
|
95
|
+
const source = nodes.find((node) => node.id === (context.styleSourceId ?? context.anchorId));
|
|
96
|
+
if (anchorIndex < 0 || !source?.numbering.is_auto_numbered)
|
|
97
|
+
return [];
|
|
98
|
+
const anchor = nodes[anchorIndex];
|
|
99
|
+
const neighbor = context.position === 'AFTER' ? nodes[anchorIndex + 1] : nodes[anchorIndex - 1];
|
|
100
|
+
if (!anchor.numbering.is_auto_numbered || !neighbor?.numbering.is_auto_numbered)
|
|
101
|
+
return [];
|
|
102
|
+
const sameListWindow = anchor.numbering.num_id != null
|
|
103
|
+
&& anchor.numbering.num_id === neighbor.numbering.num_id
|
|
104
|
+
&& anchor.numbering.ilvl === neighbor.numbering.ilvl;
|
|
105
|
+
if (!sameListWindow || source.numbering.num_id == null || source.numbering.num_id === anchor.numbering.num_id)
|
|
106
|
+
return [];
|
|
107
|
+
return [{
|
|
108
|
+
code: 'MID_LIST_RENUMBERING',
|
|
109
|
+
severity: 'error',
|
|
110
|
+
operation_id: context.operationId,
|
|
111
|
+
anchor_id: context.anchorId,
|
|
112
|
+
message: `Insertion ${context.operationId} would introduce numbering ${source.numbering.num_id} inside list ${anchor.numbering.num_id}; use a peer from the surrounding list.`,
|
|
113
|
+
evidence: {
|
|
114
|
+
anchor_level: hierarchyLevel(anchor),
|
|
115
|
+
intended_level: hierarchyLevel(source),
|
|
116
|
+
style_source_id: context.styleSourceId,
|
|
117
|
+
anchor_num_id: anchor.numbering.num_id ?? undefined,
|
|
118
|
+
style_source_num_id: source.numbering.num_id ?? undefined,
|
|
119
|
+
},
|
|
120
|
+
suggested_anchor_id: anchor.id,
|
|
121
|
+
}];
|
|
122
|
+
};
|
|
123
|
+
export const structuralValidators = [
|
|
124
|
+
parentChildSlicing,
|
|
125
|
+
listLevelMismatch,
|
|
126
|
+
midListRenumbering,
|
|
127
|
+
];
|
|
128
|
+
export function validateStructuralInsertion(nodes, context) {
|
|
129
|
+
return structuralValidators.flatMap((validator) => validator(nodes, context));
|
|
130
|
+
}
|
|
131
|
+
export function validateStructuralInsertions(nodes, contexts, options = {}) {
|
|
132
|
+
const diagnostics = contexts.flatMap((context) => validateStructuralInsertion(nodes, context));
|
|
133
|
+
diagnostics.push(...validateBondedPairs(nodes, contexts, options));
|
|
134
|
+
return diagnostics;
|
|
135
|
+
}
|
|
136
|
+
function sourceNode(nodes, context) {
|
|
137
|
+
return nodes.find((node) => node.id === (context.styleSourceId ?? context.anchorId));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* A heading style is bonded to a follower style only when the source shows the
|
|
141
|
+
* Word run-in construction (a style-separator paragraph mark on the heading)
|
|
142
|
+
* followed by the same follower style at the same indent, at least twice.
|
|
143
|
+
* Title casing and punctuation are not structural authorities.
|
|
144
|
+
*/
|
|
145
|
+
function bondedTransitions(nodes, options) {
|
|
146
|
+
const runInHeadingIds = options.runInHeadingIds;
|
|
147
|
+
if (!runInHeadingIds || runInHeadingIds.size === 0)
|
|
148
|
+
return [];
|
|
149
|
+
const transitions = new Map();
|
|
150
|
+
for (let index = 0; index < nodes.length - 1; index += 1) {
|
|
151
|
+
const heading = nodes[index];
|
|
152
|
+
const body = nodes[index + 1];
|
|
153
|
+
if (!runInHeadingIds.has(heading.id))
|
|
154
|
+
continue;
|
|
155
|
+
if (hierarchyLevel(heading) == null || hierarchyLevel(body) != null)
|
|
156
|
+
continue;
|
|
157
|
+
if (Math.abs(heading.paragraph_indents_pt.left - body.paragraph_indents_pt.left) > 0.5)
|
|
158
|
+
continue;
|
|
159
|
+
const headingStyle = structuralStyle(heading);
|
|
160
|
+
const bodyStyle = structuralStyle(body);
|
|
161
|
+
if (!headingStyle || !bodyStyle || headingStyle === bodyStyle)
|
|
162
|
+
continue;
|
|
163
|
+
const key = `${headingStyle}\u0000${bodyStyle}`;
|
|
164
|
+
const current = transitions.get(key);
|
|
165
|
+
transitions.set(key, { headingStyle, bodyStyle, count: (current?.count ?? 0) + 1 });
|
|
166
|
+
}
|
|
167
|
+
return [...transitions.values()].filter((transition) => transition.count >= 2);
|
|
168
|
+
}
|
|
169
|
+
function validateBondedPairs(nodes, contexts, options) {
|
|
170
|
+
const bonded = bondedTransitions(nodes, options);
|
|
171
|
+
if (bonded.length === 0)
|
|
172
|
+
return [];
|
|
173
|
+
const diagnostics = [];
|
|
174
|
+
// Group operations by insertion slot. Repeated AFTER insertion lands each
|
|
175
|
+
// new paragraph directly after the anchor, so the slot's document order is
|
|
176
|
+
// the reverse of operation order; repeated BEFORE preserves operation order.
|
|
177
|
+
const slots = new Map();
|
|
178
|
+
contexts.forEach((context, index) => {
|
|
179
|
+
const key = `${context.anchorId}\u0000${context.position}`;
|
|
180
|
+
slots.set(key, [...(slots.get(key) ?? []), index]);
|
|
181
|
+
});
|
|
182
|
+
for (const operationIndexes of slots.values()) {
|
|
183
|
+
const position = contexts[operationIndexes[0]].position;
|
|
184
|
+
const documentOrder = position === 'AFTER' ? [...operationIndexes].reverse() : operationIndexes;
|
|
185
|
+
const styleOf = (operationIndex) => structuralStyle(sourceNode(nodes, contexts[operationIndex]));
|
|
186
|
+
const consumedBodies = new Set();
|
|
187
|
+
const unpaired = [];
|
|
188
|
+
documentOrder.forEach((operationIndex, slotIndex) => {
|
|
189
|
+
// Only a run-in heading source binds a body; an ordinary paragraph that
|
|
190
|
+
// happens to share the run-in style (e.g. a Heading2 with Heading3
|
|
191
|
+
// children) does not.
|
|
192
|
+
const headingSource = sourceNode(nodes, contexts[operationIndex]);
|
|
193
|
+
if (!headingSource || !options.runInHeadingIds?.has(headingSource.id))
|
|
194
|
+
return;
|
|
195
|
+
const candidatePairs = bonded.filter((transition) => transition.headingStyle === styleOf(operationIndex));
|
|
196
|
+
if (candidatePairs.length === 0)
|
|
197
|
+
return;
|
|
198
|
+
const next = documentOrder[slotIndex + 1];
|
|
199
|
+
const nextStyle = next == null ? undefined : styleOf(next);
|
|
200
|
+
const adjacentPair = candidatePairs.find((pair) => pair.bodyStyle === nextStyle);
|
|
201
|
+
if (next != null && adjacentPair && !consumedBodies.has(next)) {
|
|
202
|
+
consumedBodies.add(next);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
unpaired.push({ operationIndex, candidatePairs });
|
|
206
|
+
});
|
|
207
|
+
for (const { operationIndex, candidatePairs } of unpaired) {
|
|
208
|
+
const context = contexts[operationIndex];
|
|
209
|
+
const source = sourceNode(nodes, context);
|
|
210
|
+
const availableBodyStyles = new Set(operationIndexes
|
|
211
|
+
.filter((index) => !consumedBodies.has(index))
|
|
212
|
+
.map(styleOf));
|
|
213
|
+
const matchingPairs = candidatePairs.filter((pair) => availableBodyStyles.has(pair.bodyStyle));
|
|
214
|
+
const baseEvidence = {
|
|
215
|
+
anchor_level: hierarchyLevel(nodes.find((node) => node.id === context.anchorId)),
|
|
216
|
+
intended_level: hierarchyLevel(source),
|
|
217
|
+
style_source_id: context.styleSourceId,
|
|
218
|
+
};
|
|
219
|
+
if (candidatePairs.length > 1 && matchingPairs.length !== 1) {
|
|
220
|
+
const candidates = candidatePairs.map((pair) => pair.bodyStyle).sort();
|
|
221
|
+
diagnostics.push({
|
|
222
|
+
code: 'BONDED_PARAGRAPH_PAIR_AMBIGUOUS', severity: 'error', operation_id: context.operationId,
|
|
223
|
+
anchor_id: context.anchorId,
|
|
224
|
+
message: `Style ${structuralStyle(source)} has multiple repeated run-in body followers (${candidates.join(', ')}); supply exactly one matching body peer immediately after the heading in this insertion slot.`,
|
|
225
|
+
evidence: { ...baseEvidence, bonded_heading_style: structuralStyle(source), bonded_body_style_candidates: candidates },
|
|
226
|
+
});
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const pair = matchingPairs[0] ?? candidatePairs[0];
|
|
230
|
+
const evidence = { ...baseEvidence, bonded_heading_style: pair.headingStyle, bonded_body_style: pair.bodyStyle };
|
|
231
|
+
if (matchingPairs.length === 0) {
|
|
232
|
+
diagnostics.push({
|
|
233
|
+
code: 'BONDED_PARAGRAPH_PAIR_REQUIRED', severity: 'error', operation_id: context.operationId,
|
|
234
|
+
anchor_id: context.anchorId,
|
|
235
|
+
message: `Style ${pair.headingStyle} is a run-in heading repeatedly followed by ${pair.bodyStyle}; insert both paragraphs with distinct structural peers.`,
|
|
236
|
+
evidence,
|
|
237
|
+
});
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const requiredOrder = position === 'AFTER'
|
|
241
|
+
? `${pair.bodyStyle} immediately before ${pair.headingStyle}`
|
|
242
|
+
: `${pair.headingStyle} immediately before ${pair.bodyStyle}`;
|
|
243
|
+
diagnostics.push({
|
|
244
|
+
code: 'RUN_IN_PAIR_ORDER', severity: 'error', operation_id: context.operationId,
|
|
245
|
+
anchor_id: context.anchorId,
|
|
246
|
+
message: `For repeated ${position} insertion, order operations ${requiredOrder} so the document yields each heading directly followed by its body.`,
|
|
247
|
+
evidence,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return diagnostics;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Paragraph ids whose paragraph mark carries `w:specVanish` (Word's style
|
|
255
|
+
* separator), i.e. headings that render run-in with the next paragraph.
|
|
256
|
+
*/
|
|
257
|
+
export function collectRunInHeadingIds(paragraphs) {
|
|
258
|
+
const ids = new Set();
|
|
259
|
+
for (const paragraph of paragraphs) {
|
|
260
|
+
if (!isRunInHeadingParagraph(paragraph))
|
|
261
|
+
continue;
|
|
262
|
+
const id = getParagraphBookmarkId(paragraph);
|
|
263
|
+
if (id)
|
|
264
|
+
ids.add(id);
|
|
265
|
+
}
|
|
266
|
+
return ids;
|
|
267
|
+
}
|
|
268
|
+
export function isRunInHeadingParagraph(paragraph) {
|
|
269
|
+
const pPr = getDirectChildrenByName(paragraph, 'pPr')[0];
|
|
270
|
+
const markRPr = pPr ? getDirectChildrenByName(pPr, 'rPr')[0] : undefined;
|
|
271
|
+
const specVanish = markRPr ? getDirectChildrenByName(markRPr, 'specVanish')[0] : undefined;
|
|
272
|
+
if (!specVanish)
|
|
273
|
+
return false;
|
|
274
|
+
const value = (specVanish.getAttribute('w:val') ?? '').trim().toLowerCase();
|
|
275
|
+
return value !== '0' && value !== 'false' && value !== 'off';
|
|
276
|
+
}
|
|
277
|
+
/** True only for the explicit two-operation form of a source-proven bonded pair. */
|
|
278
|
+
export function isRecognizedBondedInsertionPair(nodes, contexts, options = {}) {
|
|
279
|
+
if (contexts.length !== 2)
|
|
280
|
+
return false;
|
|
281
|
+
const [first, second] = contexts;
|
|
282
|
+
if (!first || !second || first.anchorId !== second.anchorId || first.position !== second.position)
|
|
283
|
+
return false;
|
|
284
|
+
const sources = contexts.map((context) => sourceNode(nodes, context));
|
|
285
|
+
if (!sources[0] || !sources[1] || structuralStyle(sources[0]) === structuralStyle(sources[1]))
|
|
286
|
+
return false;
|
|
287
|
+
const headingIndex = sources.findIndex((source) => hierarchyLevel(source) != null);
|
|
288
|
+
const bodyIndex = sources.findIndex((source) => hierarchyLevel(source) == null);
|
|
289
|
+
if (headingIndex < 0 || bodyIndex < 0)
|
|
290
|
+
return false;
|
|
291
|
+
if (!options.runInHeadingIds?.has(sources[headingIndex].id))
|
|
292
|
+
return false;
|
|
293
|
+
const headingStyle = structuralStyle(sources[headingIndex]);
|
|
294
|
+
const bodyStyle = structuralStyle(sources[bodyIndex]);
|
|
295
|
+
const proven = bondedTransitions(nodes, options)
|
|
296
|
+
.some((transition) => transition.headingStyle === headingStyle && transition.bodyStyle === bodyStyle);
|
|
297
|
+
if (!proven)
|
|
298
|
+
return false;
|
|
299
|
+
return !validateBondedPairs(nodes, contexts, options).length;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=structural_validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural_validation.js","sourceRoot":"","sources":["../../src/primitives/structural_validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,39 @@ export type StyleDef = {
|
|
|
5
5
|
basedOn: string | null;
|
|
6
6
|
pPr: Element | null;
|
|
7
7
|
rPr: Element | null;
|
|
8
|
+
/**
|
|
9
|
+
* Table styles only: the style's own `w:tblPr` (read for
|
|
10
|
+
* `w:tblStyleRowBandSize` / `w:tblStyleColBandSize`), and the `w:rPr` of
|
|
11
|
+
* each conditional `w:tblStylePr`, keyed by its `w:type`. Optional so
|
|
12
|
+
* hand-built models remain source-compatible.
|
|
13
|
+
*/
|
|
14
|
+
tblPr?: Element | null;
|
|
15
|
+
conditionalRPrs?: Map<string, Element>;
|
|
8
16
|
};
|
|
9
17
|
export type StylesModel = {
|
|
10
18
|
byId: Map<string, StyleDef>;
|
|
19
|
+
/**
|
|
20
|
+
* `w:docDefaults/w:rPrDefault/w:rPr`, when the styles part declares one.
|
|
21
|
+
* {@link extractEffectiveRunFormatting} reads it as the lowest-precedence
|
|
22
|
+
* run-property layer (#753). Optional so callers that build the `{ byId }`
|
|
23
|
+
* shape by hand remain source-compatible; such a model has no document
|
|
24
|
+
* defaults.
|
|
25
|
+
*/
|
|
26
|
+
docDefaultsRPr?: Element | null;
|
|
27
|
+
/**
|
|
28
|
+
* The `w:styleId` of the default table style (`w:type="table"` with
|
|
29
|
+
* `w:default="1"`), which applies to a table that names no `w:tblStyle`.
|
|
30
|
+
*/
|
|
31
|
+
defaultTableStyleId?: string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Every `w:rPr` carried by a table style, including the conditional
|
|
34
|
+
* `w:tblStylePr/w:rPr` blocks.
|
|
35
|
+
*
|
|
36
|
+
* @deprecated No longer read: {@link extractEffectiveRunFormatting} resolves
|
|
37
|
+
* table styles from the run's table context since #1159. Still populated so
|
|
38
|
+
* existing readers keep compiling.
|
|
39
|
+
*/
|
|
40
|
+
tableStyleRPrs?: Element[];
|
|
11
41
|
};
|
|
12
42
|
export type ThemeModel = {
|
|
13
43
|
fonts: Map<string, string>;
|
|
@@ -34,22 +64,41 @@ export type ParagraphFormatting = {
|
|
|
34
64
|
outlineLevel: number | null;
|
|
35
65
|
};
|
|
36
66
|
export declare function extractParagraphFormatting(pPr: Element | null, styles: StylesModel): ParagraphFormatting;
|
|
67
|
+
/**
|
|
68
|
+
* Effective run formatting. `null` means the resolver could not establish the
|
|
69
|
+
* property, and never stands in for a rendered default. That happens when:
|
|
70
|
+
* - the nearest layer that declares it does so through a theme colour or
|
|
71
|
+
* theme font reference that cannot be resolved (no theme, or no matching
|
|
72
|
+
* theme entry, and no explicit fallback value); or
|
|
73
|
+
* - it has no OOXML default (`fontName`, `fontSizePt`) and no consulted layer,
|
|
74
|
+
* `w:docDefaults` included, declares it.
|
|
75
|
+
*
|
|
76
|
+
* A property declared nowhere in the document resolves to its OOXML default:
|
|
77
|
+
* `false` for toggles and `underline`, `false` for `highlightVal` (no
|
|
78
|
+
* highlight), and `'auto'` for `colorHex`. Explicit "off" declarations
|
|
79
|
+
* (`w:b w:val="0"`, `w:u w:val="none"`, `w:highlight w:val="none"`,
|
|
80
|
+
* `w:color w:val="auto"`) resolve to the same values, and like any other
|
|
81
|
+
* declaration they stop inheritance: `w:color w:val="auto"` on a run hides a
|
|
82
|
+
* character style's red, and `w:highlight w:val="none"` hides its highlight.
|
|
83
|
+
*
|
|
84
|
+
* @see https://github.com/UseJunior/safe-docx/issues/752
|
|
85
|
+
*/
|
|
37
86
|
export type RunFormatting = {
|
|
38
|
-
bold: boolean;
|
|
39
|
-
italic: boolean;
|
|
40
|
-
caps: boolean;
|
|
41
|
-
smallCaps: boolean;
|
|
42
|
-
strike: boolean;
|
|
43
|
-
emboss: boolean;
|
|
44
|
-
imprint: boolean;
|
|
45
|
-
outline: boolean;
|
|
46
|
-
shadow: boolean;
|
|
47
|
-
vanish: boolean;
|
|
48
|
-
underline: boolean;
|
|
49
|
-
highlightVal: string | null;
|
|
50
|
-
fontName: string;
|
|
51
|
-
fontSizePt: number;
|
|
52
|
-
colorHex: string | null;
|
|
87
|
+
bold: boolean | null;
|
|
88
|
+
italic: boolean | null;
|
|
89
|
+
caps: boolean | null;
|
|
90
|
+
smallCaps: boolean | null;
|
|
91
|
+
strike: boolean | null;
|
|
92
|
+
emboss: boolean | null;
|
|
93
|
+
imprint: boolean | null;
|
|
94
|
+
outline: boolean | null;
|
|
95
|
+
shadow: boolean | null;
|
|
96
|
+
vanish: boolean | null;
|
|
97
|
+
underline: boolean | null;
|
|
98
|
+
highlightVal: string | false | null;
|
|
99
|
+
fontName: string | null;
|
|
100
|
+
fontSizePt: number | null;
|
|
101
|
+
colorHex: string | 'auto' | null;
|
|
53
102
|
};
|
|
54
103
|
/**
|
|
55
104
|
* Tri-state run formatting resolved from a named style's `basedOn` chain: `null` means no
|
|
@@ -71,8 +120,9 @@ export declare function extractStyleRunFormatting(styles: StylesModel, styleId:
|
|
|
71
120
|
* the run declares. Ordinary properties are taken from the first layer that
|
|
72
121
|
* specifies them: direct `w:rPr` on the run, then the `w:rStyle`
|
|
73
122
|
* character-style `basedOn` chain, then the paragraph mark's `w:rPr` inside
|
|
74
|
-
* `pPr`, then the paragraph style's `basedOn` chain
|
|
75
|
-
*
|
|
123
|
+
* `pPr`, then the paragraph style's `basedOn` chain, then — for a run inside
|
|
124
|
+
* a table — the table style, and finally the document defaults
|
|
125
|
+
* (`w:docDefaults/w:rPrDefault/w:rPr`).
|
|
76
126
|
*
|
|
77
127
|
* Each property is resolved independently down the chain — a style that
|
|
78
128
|
* specifies only color does not mask an ancestor's bold.
|
|
@@ -84,9 +134,24 @@ export declare function extractStyleRunFormatting(styles: StylesModel, styleId:
|
|
|
84
134
|
* `w:caps`, `w:smallCaps`, `w:strike`, `w:emboss`, `w:imprint`, `w:outline`,
|
|
85
135
|
* `w:shadow`, and `w:vanish`.
|
|
86
136
|
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
137
|
+
* Document defaults seed toggle evaluation as an absolute base value rather
|
|
138
|
+
* than acting as another parity level (see {@link resolveToggleProperty}).
|
|
139
|
+
*
|
|
140
|
+
* Table styles (#1159): the table context is read from the run's ancestors —
|
|
141
|
+
* the innermost `w:tbl`, its `w:tblStyle` (or the default table style), the
|
|
142
|
+
* `basedOn` chain, `w:tblLook`, and the cell's row and column. The style's
|
|
143
|
+
* `w:rPr` and every conditional `w:tblStylePr/w:rPr` that applies to the
|
|
144
|
+
* cell merge into one layer between the document defaults and the paragraph
|
|
145
|
+
* style (see {@link tableStyleLayers} for the order). For toggles the
|
|
146
|
+
* merged layer's nearest declaration resets the value rather than toggling
|
|
147
|
+
* it: the standard says a table style toggles like any other style, but Word
|
|
148
|
+
* assigns the declared value (MS-OI29500 note on § 17.7.6), and this follows
|
|
149
|
+
* Word.
|
|
150
|
+
*
|
|
151
|
+
* @see https://learn.microsoft.com/en-us/openspecs/office_standards/ms-oi29500/14452bbe-be4d-4dbb-90e6-3d23ae9361bc
|
|
152
|
+
*
|
|
153
|
+
* Numbering-level `rPr` formats only the list label (`w:lvlText`), never the
|
|
154
|
+
* paragraph's runs, so it is out of scope.
|
|
90
155
|
*
|
|
91
156
|
* Part of docx-core's public surface (see `src/index.ts`) so external
|
|
92
157
|
* diagnostics — `scripts/check_docx_formatting_loss.mjs` today, the planned
|
|
@@ -101,8 +166,14 @@ export declare function extractStyleRunFormatting(styles: StylesModel, styleId:
|
|
|
101
166
|
* @param params.theme the model produced by {@link parseThemeXml}; when
|
|
102
167
|
* omitted, direct font/color fallbacks retain their previous behavior
|
|
103
168
|
*
|
|
169
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.7.2
|
|
104
170
|
* @conformance ECMA-376 edition 5, Part 1 § 17.7.3
|
|
171
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.7.5.1
|
|
172
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.7.6
|
|
105
173
|
* @see https://github.com/UseJunior/safe-docx/issues/737
|
|
174
|
+
* @see https://github.com/UseJunior/safe-docx/issues/752
|
|
175
|
+
* @see https://github.com/UseJunior/safe-docx/issues/753
|
|
176
|
+
* @see https://github.com/UseJunior/safe-docx/issues/1159
|
|
106
177
|
*/
|
|
107
178
|
export declare function extractEffectiveRunFormatting(params: {
|
|
108
179
|
run: Element;
|
|
@@ -111,4 +182,23 @@ export declare function extractEffectiveRunFormatting(params: {
|
|
|
111
182
|
styles: StylesModel;
|
|
112
183
|
theme?: ThemeModel | null;
|
|
113
184
|
}): RunFormatting;
|
|
185
|
+
/**
|
|
186
|
+
* Effective run formatting for annotation bodies (comments, footnotes), whose
|
|
187
|
+
* `tagged_text` is emitted in `full` mode and read back by docx-markdoc.
|
|
188
|
+
* Toggles, underline and highlight resolve through every layer, document
|
|
189
|
+
* defaults included. Colour, size and font are reported only when a layer
|
|
190
|
+
* above `w:docDefaults` declares them, otherwise as not declared (`'auto'` /
|
|
191
|
+
* `null`), so the inherited document font is not tagged as `face` on every run
|
|
192
|
+
* and a direct value that restates the document default is still emitted
|
|
193
|
+
* over a character style that would otherwise show through on import.
|
|
194
|
+
*
|
|
195
|
+
* @see https://github.com/UseJunior/safe-docx/issues/753
|
|
196
|
+
*/
|
|
197
|
+
export declare function extractAnnotationRunFormatting(params: {
|
|
198
|
+
run: Element;
|
|
199
|
+
paragraphPPr: Element | null;
|
|
200
|
+
paragraphStyleId: string | null;
|
|
201
|
+
styles: StylesModel;
|
|
202
|
+
theme?: ThemeModel | null;
|
|
203
|
+
}): RunFormatting;
|
|
114
204
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/primitives/styles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/primitives/styles.ts"],"names":[],"mappings":"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"}
|