@stll/folio-core 0.28.1 → 0.30.0
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/controller/folioEditor.d.ts +28 -1
- package/dist/controller/folioEditor.js +37 -26
- package/dist/controller/fontReadiness.js +28 -24
- package/dist/controller/hiddenEditorManager.d.ts +2 -7
- package/dist/controller/layoutPipeline.js +33 -3
- package/dist/controller/noteEditorManager.d.ts +3 -6
- package/dist/docx/metafileSvg.d.ts +12 -0
- package/dist/docx/metafileSvg.js +462 -0
- package/dist/docx/paragraphTextBoxEnrichment.js +55 -4
- package/dist/docx/parser.d.ts +2 -2
- package/dist/docx/parser.js +26 -0
- package/dist/docx/runParser.js +2 -1
- package/dist/docx/serializer/runSerializer.js +14 -2
- package/dist/docx/styleParser.js +2 -1
- package/dist/docx/textBoxParser.js +14 -0
- package/dist/docx/vmlImageParser.js +72 -152
- package/dist/docx/vmlPreview.d.ts +31 -0
- package/dist/docx/vmlPreview.js +535 -0
- package/dist/docx/wrapTypes.d.ts +2 -36
- package/dist/docx/wrapTypes.js +1 -39
- package/dist/fonts/fontAlternates.d.ts +8 -0
- package/dist/fonts/fontAlternates.js +16 -0
- package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
- package/dist/layout-bridge/convert/footnoteLayout.js +34 -3
- package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
- package/dist/layout-bridge/convert/headerFooterLayout.js +5 -0
- package/dist/layout-bridge/convert/toFlowBlocks.d.ts +4 -2
- package/dist/layout-bridge/convert/toFlowBlocks.js +136 -120
- package/dist/layout-bridge/dom/noteStoryDom.d.ts +1 -1
- package/dist/layout-bridge/engine/selectionRects.js +3 -1
- package/dist/layout-engine/index.js +65 -32
- package/dist/layout-engine/justifiedLineFit.d.ts +7 -0
- package/dist/layout-engine/justifiedLineFit.js +6 -0
- package/dist/layout-engine/keep-together.js +15 -10
- package/dist/layout-engine/measure/complexScriptFormatting.d.ts +6 -1
- package/dist/layout-engine/measure/complexScriptFormatting.js +11 -2
- package/dist/layout-engine/measure/floatingTablePosition.d.ts +16 -1
- package/dist/layout-engine/measure/floatingTablePosition.js +29 -6
- package/dist/layout-engine/measure/lineBreakProvider.js +67 -8
- package/dist/layout-engine/measure/listMarkerWidth.d.ts +1 -0
- package/dist/layout-engine/measure/listMarkerWidth.js +23 -10
- package/dist/layout-engine/measure/measureBlocks.d.ts +15 -0
- package/dist/layout-engine/measure/measureBlocks.js +197 -30
- package/dist/layout-engine/measure/measureContainer.js +20 -24
- package/dist/layout-engine/measure/measureHelpers.d.ts +1 -1
- package/dist/layout-engine/measure/measureHelpers.js +14 -8
- package/dist/layout-engine/measure/measureParagraph.js +111 -37
- package/dist/layout-engine/measure/measureTypes.d.ts +3 -0
- package/dist/layout-engine/measure/tabCalculator.d.ts +123 -0
- package/dist/layout-engine/measure/tabCalculator.js +144 -0
- package/dist/layout-engine/measure/tableCellFlow.d.ts +21 -1
- package/dist/layout-engine/measure/tableCellFlow.js +45 -8
- package/dist/layout-engine/measure/tableInlinePlacement.d.ts +10 -2
- package/dist/layout-engine/measure/tableInlinePlacement.js +17 -15
- package/dist/layout-engine/paginator.d.ts +26 -2
- package/dist/layout-engine/paginator.js +76 -14
- package/dist/layout-engine/paragraphSpacing.d.ts +3 -1
- package/dist/layout-engine/paragraphSpacing.js +4 -3
- package/dist/layout-engine/renderedBreakReconciliation.d.ts +14 -3
- package/dist/layout-engine/renderedBreakReconciliation.js +45 -14
- package/dist/layout-engine/section-breaks.d.ts +3 -1
- package/dist/layout-engine/section-breaks.js +6 -2
- package/dist/layout-engine/types.d.ts +18 -1
- package/dist/layout-engine/types.js +1 -1
- package/dist/layout-painter/imageLayout.d.ts +1 -1
- package/dist/layout-painter/renderPage.js +6 -1
- package/dist/layout-painter/renderParagraph.js +169 -82
- package/dist/layout-painter/renderTable.d.ts +1 -1
- package/dist/layout-painter/renderTable.js +18 -7
- package/dist/layout-painter/renderTextBox.d.ts +1 -1
- package/dist/layout-painter/renderTextBox.js +6 -1
- package/dist/markdown/renderParagraph.js +7 -2
- package/dist/model.d.ts +3 -3
- package/dist/model.js +2 -2
- package/dist/paged-layout/sectionBlockWidths.d.ts +14 -0
- package/dist/paged-layout/sectionBlockWidths.js +103 -14
- package/dist/prosemirror/attrs/index.js +14 -2
- package/dist/prosemirror/bookmarkBoundaryAttrs.d.ts +8 -0
- package/dist/prosemirror/bookmarkBoundaryAttrs.js +66 -0
- package/dist/prosemirror/conversion/fromProseDoc.js +176 -54
- package/dist/prosemirror/conversion/toProseDoc.js +179 -64
- package/dist/prosemirror/extensions/StarterKit.js +11 -3
- package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +8 -4
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +4 -1
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +9 -5
- package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +10 -23
- package/dist/prosemirror/extensions/features/pasteCleanup.js +77 -22
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.js +9 -5
- package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.js +67 -0
- package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +10 -4
- package/dist/prosemirror/extensions/nodes/FieldExtension.js +77 -59
- package/dist/prosemirror/extensions/nodes/TableExtension.js +2 -0
- package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.d.ts +4 -1
- package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.js +4 -3
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +6 -2
- package/dist/prosemirror/listMarker.d.ts +58 -0
- package/dist/prosemirror/listMarker.js +185 -0
- package/dist/prosemirror/numberedRefFields.d.ts +24 -0
- package/dist/prosemirror/numberedRefFields.js +276 -0
- package/dist/prosemirror/paraText.js +56 -17
- package/dist/prosemirror/plugins/anonymizationDecorations.js +1 -1
- package/dist/prosemirror/plugins/pmTextScan.d.ts +3 -1
- package/dist/prosemirror/plugins/pmTextScan.js +28 -7
- package/dist/prosemirror/plugins/templateDirectives.js +2 -2
- package/dist/prosemirror/schema/index.d.ts +2 -2
- package/dist/prosemirror/schema/nodes.d.ts +17 -1
- package/dist/prosemirror/utils/tabCalculator.d.ts +2 -123
- package/dist/prosemirror/utils/tabCalculator.js +1 -140
- package/dist/prosemirror/validation.js +93 -0
- package/dist/render-dom/RemoteSelectionOverlay.d.ts +4 -4
- package/dist/types/documentEnumValues.d.ts +4 -1
- package/dist/types/documentEnumValues.js +12 -1
- package/dist/types/editor-story.d.ts +8 -0
- package/dist/types/editor-story.js +0 -0
- package/dist/types/remote-selection.d.ts +11 -0
- package/dist/types/remote-selection.js +0 -0
- package/dist/types/wrap.d.ts +36 -0
- package/dist/types/wrap.js +40 -0
- package/dist/utils/fontResolver.d.ts +1 -1
- package/dist/utils/fontResolver.js +42 -2
- package/dist/utils/formatToStyle.js +4 -2
- package/dist/utils/horizontalScale.d.ts +28 -0
- package/dist/utils/horizontalScale.js +42 -0
- package/package.json +2 -2
|
@@ -71,7 +71,7 @@ const scanDirectives = (doc) => {
|
|
|
71
71
|
const last = chunks.at(-1);
|
|
72
72
|
ranges.push({
|
|
73
73
|
from: chunks[0]?.start ?? 0,
|
|
74
|
-
to: last ? last.start + last.text.length : 0,
|
|
74
|
+
to: last ? last.end ?? last.start + last.text.length : 0,
|
|
75
75
|
kind: sole.meta.kind,
|
|
76
76
|
expr: directiveExpr(sole.meta),
|
|
77
77
|
block: true
|
|
@@ -82,7 +82,7 @@ const scanDirectives = (doc) => {
|
|
|
82
82
|
const clauseVersion = marker.meta.kind === "clause" ? marker.meta.version : void 0;
|
|
83
83
|
ranges.push({
|
|
84
84
|
from: offsetToDocPos(chunks, marker.start),
|
|
85
|
-
to: offsetToDocPos(chunks, marker.end),
|
|
85
|
+
to: offsetToDocPos(chunks, marker.end, "end"),
|
|
86
86
|
kind: marker.meta.kind,
|
|
87
87
|
expr: directiveExpr(marker.meta),
|
|
88
88
|
block: false,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, LanguageAttrs, RunFormattingOverrideAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, UnderlineAttrs } from "./marks.js";
|
|
2
|
-
import { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "./nodes.js";
|
|
2
|
+
import { BlockSdtAttrs, BookmarkBoundaryAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "./nodes.js";
|
|
3
3
|
import { ExtensionManager } from "../extensions/ExtensionManager.js";
|
|
4
4
|
//#region src/prosemirror/schema/index.d.ts
|
|
5
5
|
declare const singletonManager: ExtensionManager;
|
|
@@ -11,4 +11,4 @@ type DocxSchema = typeof schema;
|
|
|
11
11
|
type DocxNode = ReturnType<typeof schema.node>;
|
|
12
12
|
type DocxMark = ReturnType<typeof schema.mark>;
|
|
13
13
|
//#endregion
|
|
14
|
-
export { type BlockSdtAttrs, type CharacterSpacingAttrs, type CharacterStyleAttrs, type CommentAttrs, DocxMark, DocxNode, DocxSchema, type EmphasisMarkAttrs, type FieldAttrs, type FontFamilyAttrs, type FontSizeAttrs, type FootnoteRefAttrs, type HardBreakAttrs, type HighlightAttrs, type HyperlinkAttrs, type ImageAttrs, type ImagePositionAttrs, type LanguageAttrs, type MathAttrs, type ParagraphAttrs, type ParagraphPropertyChangeAttrs, type RunFormattingOverrideAttrs, type RunPropertyChangeMarkAttrs, type RunShadingAttrs, type SdtAttrs, type ShapeAttrs, type StrikeAttrs, type SymbolAttrs, type TabAttrs, type TableAttrs, type TableCellAttrs, type TableRowAttrs, type TextBoxAttrs, type TextColorAttrs, type TextEffectAttrs, type TrackedChangeMarkAttrs, type UnderlineAttrs, schema, singletonManager };
|
|
14
|
+
export { type BlockSdtAttrs, type BookmarkBoundaryAttrs, type CharacterSpacingAttrs, type CharacterStyleAttrs, type CommentAttrs, DocxMark, DocxNode, DocxSchema, type EmphasisMarkAttrs, type FieldAttrs, type FontFamilyAttrs, type FontSizeAttrs, type FootnoteRefAttrs, type HardBreakAttrs, type HighlightAttrs, type HyperlinkAttrs, type ImageAttrs, type ImagePositionAttrs, type LanguageAttrs, type MathAttrs, type ParagraphAttrs, type ParagraphPropertyChangeAttrs, type RunFormattingOverrideAttrs, type RunPropertyChangeMarkAttrs, type RunShadingAttrs, type SdtAttrs, type ShapeAttrs, type StrikeAttrs, type SymbolAttrs, type TabAttrs, type TableAttrs, type TableCellAttrs, type TableRowAttrs, type TextBoxAttrs, type TextColorAttrs, type TextEffectAttrs, type TrackedChangeMarkAttrs, type UnderlineAttrs, schema, singletonManager };
|
|
@@ -15,6 +15,16 @@ type SymbolAttrs = {
|
|
|
15
15
|
font: string;
|
|
16
16
|
char: string;
|
|
17
17
|
};
|
|
18
|
+
type BookmarkBoundaryAttrs = {
|
|
19
|
+
type: "start";
|
|
20
|
+
id: number;
|
|
21
|
+
name: string;
|
|
22
|
+
colFirst?: number;
|
|
23
|
+
colLast?: number;
|
|
24
|
+
} | {
|
|
25
|
+
type: "end";
|
|
26
|
+
id: number;
|
|
27
|
+
};
|
|
18
28
|
/**
|
|
19
29
|
* Paragraph node attributes - maps to ParagraphFormatting
|
|
20
30
|
*/
|
|
@@ -292,6 +302,8 @@ type FieldAttrs = {
|
|
|
292
302
|
instruction: string;
|
|
293
303
|
/** Current/cached display text */
|
|
294
304
|
displayText: string;
|
|
305
|
+
/** Imported cache that proved numbered REF resolution for this field. */
|
|
306
|
+
_numberedRefBaseline?: string;
|
|
295
307
|
/** Whether the field came from w:fldSimple or a complex fldChar range */
|
|
296
308
|
fieldKind: "simple" | "complex";
|
|
297
309
|
/** Field is locked */
|
|
@@ -559,6 +571,8 @@ type TableAttrs = {
|
|
|
559
571
|
borders?: document_d_exports.TableBorders;
|
|
560
572
|
/** Effective table indent after style resolution. PM-only; never serialized. */
|
|
561
573
|
_resolvedIndent?: NonNullable<document_d_exports.TableFormatting["indent"]>;
|
|
574
|
+
/** Style-derived table justification fallback. PM-only; never serialized. */
|
|
575
|
+
_resolvedJustification?: NonNullable<document_d_exports.TableFormatting["justification"]>;
|
|
562
576
|
/** Effective table direction after style resolution. PM-only; never serialized. */
|
|
563
577
|
_resolvedBidi?: boolean;
|
|
564
578
|
/** Original table formatting from DOCX for lossless round-trip serialization */
|
|
@@ -584,6 +598,8 @@ type TableRowAttrs = {
|
|
|
584
598
|
isHeader?: boolean;
|
|
585
599
|
/** Whether the row is hidden (`w:hidden`) */
|
|
586
600
|
hidden?: boolean;
|
|
601
|
+
/** Style-derived row justification fallback. PM-only; never serialized. */
|
|
602
|
+
_resolvedJustification?: NonNullable<document_d_exports.TableRowFormatting["justification"]>;
|
|
587
603
|
/** Original row formatting from DOCX for lossless round-trip serialization */
|
|
588
604
|
_originalFormatting?: document_d_exports.TableRowFormatting;
|
|
589
605
|
/** Tracked row property changes (w:trPrChange) for round-trip + accept/reject */
|
|
@@ -706,4 +722,4 @@ type TableCellAttrs = {
|
|
|
706
722
|
_docxVMergeContinuationCells?: document_d_exports.TableCell[];
|
|
707
723
|
};
|
|
708
724
|
//#endregion
|
|
709
|
-
export { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SuggestedStructuralMarker, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAnchorAttrs, TextBoxAttrs };
|
|
725
|
+
export { BlockSdtAttrs, BookmarkBoundaryAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SuggestedStructuralMarker, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAnchorAttrs, TextBoxAttrs };
|
|
@@ -1,123 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Tab Width Calculator
|
|
4
|
-
*
|
|
5
|
-
* Computes tab widths based on position and tab stops.
|
|
6
|
-
* Follows OOXML tab stop semantics:
|
|
7
|
-
* - Default tab interval: 720 twips (0.5 inch, 48px at 96dpi)
|
|
8
|
-
* - Tab stops can be start (left), end (right), center, decimal, or bar
|
|
9
|
-
* - Explicit tab stops override default stops
|
|
10
|
-
*
|
|
11
|
-
* Based on ECMA-376 specification and clean-room understanding of tab layout.
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* Tab alignment types
|
|
15
|
-
*/
|
|
16
|
-
type TabAlignment = "start" | "end" | "center" | "decimal" | "bar" | "clear";
|
|
17
|
-
/**
|
|
18
|
-
* Tab leader (fill character) types
|
|
19
|
-
*/
|
|
20
|
-
type TabLeader = "none" | "dot" | "hyphen" | "underscore" | "middleDot" | "heavy";
|
|
21
|
-
/**
|
|
22
|
-
* Tab stop definition
|
|
23
|
-
*/
|
|
24
|
-
type TabStop = {
|
|
25
|
-
/** Tab alignment mode */
|
|
26
|
-
val: TabAlignment;
|
|
27
|
-
/** Position in twips from left margin */
|
|
28
|
-
pos: number;
|
|
29
|
-
/** Optional leader character */
|
|
30
|
-
leader?: TabLeader;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Context for tab calculations
|
|
34
|
-
*/
|
|
35
|
-
type TabContext = {
|
|
36
|
-
/** Explicit tab stops from paragraph or style */
|
|
37
|
-
explicitStops?: TabStop[];
|
|
38
|
-
/** Default tab interval in twips (default: 720 = 0.5 inch) */
|
|
39
|
-
defaultTabInterval?: number;
|
|
40
|
-
/** Left indent in twips */
|
|
41
|
-
leftIndent?: number;
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Result of tab width calculation
|
|
45
|
-
*/
|
|
46
|
-
type TabWidthResult = {
|
|
47
|
-
/** Width of the tab in pixels */
|
|
48
|
-
width: number;
|
|
49
|
-
/** Leader character to render (if any) */
|
|
50
|
-
leader?: TabLeader;
|
|
51
|
-
/** Alignment that was applied */
|
|
52
|
-
alignment: TabAlignment | "default";
|
|
53
|
-
};
|
|
54
|
-
/** Default tab interval: 720 twips = 0.5 inch */
|
|
55
|
-
declare const DEFAULT_TAB_INTERVAL_TWIPS = 720;
|
|
56
|
-
/** Twips per inch */
|
|
57
|
-
declare const TWIPS_PER_INCH = 1440;
|
|
58
|
-
/** Pixels per inch (96 dpi standard for CSS) */
|
|
59
|
-
declare const PIXELS_PER_INCH = 96;
|
|
60
|
-
/**
|
|
61
|
-
* Convert twips to pixels
|
|
62
|
-
* @param twips - Value in twips (1/1440 inch)
|
|
63
|
-
* @returns Value in pixels (at 96 dpi)
|
|
64
|
-
*/
|
|
65
|
-
declare function twipsToPixels(twips: number): number;
|
|
66
|
-
/**
|
|
67
|
-
* Convert pixels to twips
|
|
68
|
-
* @param pixels - Value in pixels (at 96 dpi)
|
|
69
|
-
* @returns Value in twips (1/1440 inch)
|
|
70
|
-
*/
|
|
71
|
-
declare function pixelsToTwips(pixels: number): number;
|
|
72
|
-
/**
|
|
73
|
-
* Compute the list of effective tab stops for a paragraph
|
|
74
|
-
*
|
|
75
|
-
* Merges explicit stops with default stops at regular intervals.
|
|
76
|
-
* Explicit stops before the left indent remain available to a hanging first
|
|
77
|
-
* line. Continuation lines naturally skip them because their cursor already
|
|
78
|
-
* starts at the left indent.
|
|
79
|
-
*
|
|
80
|
-
* @param context - Tab context with explicit stops and settings
|
|
81
|
-
* @returns Sorted array of tab stops in twips
|
|
82
|
-
*/
|
|
83
|
-
declare function computeTabStops(context: TabContext): TabStop[];
|
|
84
|
-
/**
|
|
85
|
-
* Pixel widths of the content after a tab, needed to position non-left stops.
|
|
86
|
-
*
|
|
87
|
-
* Caller measures its own runs (the painter and the layout measurer have
|
|
88
|
-
* different run models and measurement paths) and passes the result here, so
|
|
89
|
-
* this module owns the stop grid + alignment math without owning measurement.
|
|
90
|
-
*/
|
|
91
|
-
type TabFollowingContent = {
|
|
92
|
-
/** Total width of the runs after the tab. Used for `end` and `center` stops. */
|
|
93
|
-
followingWidth?: number;
|
|
94
|
-
/** Width of the content before the decimal separator. Used for `decimal` stops. */
|
|
95
|
-
decimalPrefixWidth?: number;
|
|
96
|
-
};
|
|
97
|
-
/**
|
|
98
|
-
* Calculate the width of a tab character.
|
|
99
|
-
*
|
|
100
|
-
* Finds the next tab stop after the current position and computes the width
|
|
101
|
-
* needed to reach it. For `end`/`center`/`decimal` stops the content after the
|
|
102
|
-
* tab is anchored against the stop, so the caller supplies its measured width
|
|
103
|
-
* via {@link TabFollowingContent}.
|
|
104
|
-
*
|
|
105
|
-
* @param currentXPx - Current horizontal position in pixels (from the content
|
|
106
|
-
* area's left edge — the same origin tab stop positions are measured from)
|
|
107
|
-
* @param context - Tab context with stops and settings
|
|
108
|
-
* @param following - Measured widths of the content after the tab
|
|
109
|
-
* @returns Tab width result with width in pixels
|
|
110
|
-
*/
|
|
111
|
-
declare function calculateTabWidth(currentXPx: number, context: TabContext, following?: TabFollowingContent): TabWidthResult;
|
|
112
|
-
/**
|
|
113
|
-
* Calculate tab width with simple default stops
|
|
114
|
-
*
|
|
115
|
-
* Simplified version for basic tab rendering without explicit stops.
|
|
116
|
-
* Uses the default 0.5 inch (48px) tab interval.
|
|
117
|
-
*
|
|
118
|
-
* @param currentXPx - Current horizontal position in pixels
|
|
119
|
-
* @returns Width of the tab in pixels
|
|
120
|
-
*/
|
|
121
|
-
declare function calculateSimpleTabWidth(currentXPx: number): number;
|
|
122
|
-
//#endregion
|
|
123
|
-
export { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, TabAlignment, TabContext, TabFollowingContent, TabLeader, TabStop, TabWidthResult, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels };
|
|
1
|
+
import { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, TabAlignment, TabContext, TabFollowingContent, TabLeader, TabStop, TabWidthResult, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels } from "../../layout-engine/measure/tabCalculator.js";
|
|
2
|
+
export { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, type TabAlignment, type TabContext, type TabFollowingContent, type TabLeader, type TabStop, type TabWidthResult, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels };
|
|
@@ -1,141 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
/** Default tab interval: 720 twips = 0.5 inch */
|
|
3
|
-
const DEFAULT_TAB_INTERVAL_TWIPS = 720;
|
|
4
|
-
/** Twips per inch */
|
|
5
|
-
const TWIPS_PER_INCH = 1440;
|
|
6
|
-
/** Pixels per inch (96 dpi standard for CSS) */
|
|
7
|
-
const PIXELS_PER_INCH = 96;
|
|
8
|
-
/** Ignore sub-twip round trips when the cursor already occupies a tab stop. */
|
|
9
|
-
const TAB_POSITION_EPSILON_TWIPS = .01;
|
|
10
|
-
/**
|
|
11
|
-
* Convert twips to pixels
|
|
12
|
-
* @param twips - Value in twips (1/1440 inch)
|
|
13
|
-
* @returns Value in pixels (at 96 dpi)
|
|
14
|
-
*/
|
|
15
|
-
function twipsToPixels(twips) {
|
|
16
|
-
return twips / TWIPS_PER_INCH * 96;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Convert pixels to twips
|
|
20
|
-
* @param pixels - Value in pixels (at 96 dpi)
|
|
21
|
-
* @returns Value in twips (1/1440 inch)
|
|
22
|
-
*/
|
|
23
|
-
function pixelsToTwips(pixels) {
|
|
24
|
-
return pixels / 96 * TWIPS_PER_INCH;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Compute the list of effective tab stops for a paragraph
|
|
28
|
-
*
|
|
29
|
-
* Merges explicit stops with default stops at regular intervals.
|
|
30
|
-
* Explicit stops before the left indent remain available to a hanging first
|
|
31
|
-
* line. Continuation lines naturally skip them because their cursor already
|
|
32
|
-
* starts at the left indent.
|
|
33
|
-
*
|
|
34
|
-
* @param context - Tab context with explicit stops and settings
|
|
35
|
-
* @returns Sorted array of tab stops in twips
|
|
36
|
-
*/
|
|
37
|
-
function computeTabStops(context) {
|
|
38
|
-
const { explicitStops = [], defaultTabInterval = 720, leftIndent = 0 } = context;
|
|
39
|
-
const validExplicitStops = explicitStops.filter((stop) => stop.val !== "clear" && stop.val !== "bar");
|
|
40
|
-
const clearPositions = explicitStops.filter((stop) => stop.val === "clear").map((stop) => stop.pos);
|
|
41
|
-
let maxExplicit = 0;
|
|
42
|
-
for (const stop of validExplicitStops) maxExplicit = Math.max(maxExplicit, stop.pos);
|
|
43
|
-
const stops = explicitStops.filter((stop) => stop.val !== "clear");
|
|
44
|
-
const hasLeftIndentClear = clearPositions.some((p) => Math.abs(p - leftIndent) < 20);
|
|
45
|
-
const addsImplicitLeftIndent = leftIndent > 0 && !hasLeftIndentClear && !validExplicitStops.some((stop) => stop.pos <= leftIndent);
|
|
46
|
-
if (addsImplicitLeftIndent) stops.push({
|
|
47
|
-
val: "start",
|
|
48
|
-
pos: leftIndent,
|
|
49
|
-
leader: "none"
|
|
50
|
-
});
|
|
51
|
-
let pos = Math.floor(Math.max(maxExplicit, leftIndent) / defaultTabInterval) * defaultTabInterval;
|
|
52
|
-
const limitPos = leftIndent + 14400;
|
|
53
|
-
while (pos < limitPos) {
|
|
54
|
-
pos += defaultTabInterval;
|
|
55
|
-
let hasExplicitStop = false;
|
|
56
|
-
for (const stop of stops) if (Math.abs(stop.pos - pos) < 20) {
|
|
57
|
-
hasExplicitStop = true;
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
let hasClearStop = false;
|
|
61
|
-
for (const clearPos of clearPositions) if (Math.abs(clearPos - pos) < 20) {
|
|
62
|
-
hasClearStop = true;
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
const isAtLeftIndent = addsImplicitLeftIndent && Math.abs(pos - leftIndent) < 20;
|
|
66
|
-
if (!hasExplicitStop && !hasClearStop && !isAtLeftIndent) stops.push({
|
|
67
|
-
val: "start",
|
|
68
|
-
pos,
|
|
69
|
-
leader: "none"
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return stops.toSorted((a, b) => a.pos - b.pos);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Calculate the width of a tab character.
|
|
76
|
-
*
|
|
77
|
-
* Finds the next tab stop after the current position and computes the width
|
|
78
|
-
* needed to reach it. For `end`/`center`/`decimal` stops the content after the
|
|
79
|
-
* tab is anchored against the stop, so the caller supplies its measured width
|
|
80
|
-
* via {@link TabFollowingContent}.
|
|
81
|
-
*
|
|
82
|
-
* @param currentXPx - Current horizontal position in pixels (from the content
|
|
83
|
-
* area's left edge — the same origin tab stop positions are measured from)
|
|
84
|
-
* @param context - Tab context with stops and settings
|
|
85
|
-
* @param following - Measured widths of the content after the tab
|
|
86
|
-
* @returns Tab width result with width in pixels
|
|
87
|
-
*/
|
|
88
|
-
function calculateTabWidth(currentXPx, context, following = {}) {
|
|
89
|
-
const { defaultTabInterval = 720 } = context;
|
|
90
|
-
const currentXTwips = pixelsToTwips(currentXPx);
|
|
91
|
-
const nextStop = computeTabStops(context).find((stop) => stop.pos > currentXTwips + TAB_POSITION_EPSILON_TWIPS);
|
|
92
|
-
if (!nextStop) {
|
|
93
|
-
const defaultTabPx = twipsToPixels(defaultTabInterval);
|
|
94
|
-
let tabWidth = defaultTabPx - currentXPx % defaultTabPx;
|
|
95
|
-
if (tabWidth <= 0) tabWidth = defaultTabPx;
|
|
96
|
-
return {
|
|
97
|
-
width: tabWidth,
|
|
98
|
-
alignment: "default"
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
let width = twipsToPixels(nextStop.pos) - currentXPx;
|
|
102
|
-
if (nextStop.val === "center") width -= (following.followingWidth ?? 0) / 2;
|
|
103
|
-
else if (nextStop.val === "end") width -= following.followingWidth ?? 0;
|
|
104
|
-
else if (nextStop.val === "decimal") width -= following.decimalPrefixWidth ?? 0;
|
|
105
|
-
else if (nextStop.val === "bar") return {
|
|
106
|
-
width: 0,
|
|
107
|
-
...nextStop.leader !== void 0 ? { leader: nextStop.leader } : {},
|
|
108
|
-
alignment: "bar"
|
|
109
|
-
};
|
|
110
|
-
if (width <= 0) {
|
|
111
|
-
const defaultTabPx = twipsToPixels(defaultTabInterval);
|
|
112
|
-
let fallbackWidth = defaultTabPx - currentXPx % defaultTabPx;
|
|
113
|
-
if (fallbackWidth <= 0) fallbackWidth = defaultTabPx;
|
|
114
|
-
return {
|
|
115
|
-
width: fallbackWidth,
|
|
116
|
-
alignment: "default"
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
return {
|
|
120
|
-
width,
|
|
121
|
-
...nextStop.leader !== void 0 ? { leader: nextStop.leader } : {},
|
|
122
|
-
alignment: nextStop.val
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Calculate tab width with simple default stops
|
|
127
|
-
*
|
|
128
|
-
* Simplified version for basic tab rendering without explicit stops.
|
|
129
|
-
* Uses the default 0.5 inch (48px) tab interval.
|
|
130
|
-
*
|
|
131
|
-
* @param currentXPx - Current horizontal position in pixels
|
|
132
|
-
* @returns Width of the tab in pixels
|
|
133
|
-
*/
|
|
134
|
-
function calculateSimpleTabWidth(currentXPx) {
|
|
135
|
-
const defaultTabPx = twipsToPixels(720);
|
|
136
|
-
let tabWidth = defaultTabPx - currentXPx % defaultTabPx;
|
|
137
|
-
if (tabWidth < defaultTabPx / 4) tabWidth += defaultTabPx;
|
|
138
|
-
return tabWidth;
|
|
139
|
-
}
|
|
140
|
-
//#endregion
|
|
1
|
+
import { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels } from "../../layout-engine/measure/tabCalculator.js";
|
|
141
2
|
export { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readLanguageMarkAttrs, readMathAttrs, readParagraphAttrs, readRunFormattingOverrideMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs } from "./attrs/index.js";
|
|
2
|
+
import { readBookmarkBoundaryAttrs } from "./bookmarkBoundaryAttrs.js";
|
|
2
3
|
import { readTextBoxAnchorAttrs } from "./textBoxAnchorAttrs.js";
|
|
3
4
|
//#region src/prosemirror/validation.ts
|
|
4
5
|
var ProseMirrorDocumentValidationError = class extends Error {
|
|
@@ -18,11 +19,71 @@ const validateProseMirrorDocument = (doc) => {
|
|
|
18
19
|
message: `Expected doc, got ${doc.type.name}.`
|
|
19
20
|
});
|
|
20
21
|
validateNode(doc, "doc", issues);
|
|
22
|
+
validateBookmarkBoundaryStructure(doc, issues);
|
|
21
23
|
return {
|
|
22
24
|
valid: issues.length === 0,
|
|
23
25
|
issues
|
|
24
26
|
};
|
|
25
27
|
};
|
|
28
|
+
const validateBookmarkBoundaryStructure = (doc, issues) => {
|
|
29
|
+
const open = /* @__PURE__ */ new Map();
|
|
30
|
+
const startedIds = /* @__PURE__ */ new Set();
|
|
31
|
+
const registerStart = (id, path) => {
|
|
32
|
+
if (startedIds.has(id)) {
|
|
33
|
+
issues.push({
|
|
34
|
+
path,
|
|
35
|
+
message: `Bookmark id ${id} has more than one start boundary.`
|
|
36
|
+
});
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
startedIds.add(id);
|
|
40
|
+
open.set(id, {
|
|
41
|
+
id,
|
|
42
|
+
path
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const registerEnd = (id, path) => {
|
|
46
|
+
if (!open.get(id)) {
|
|
47
|
+
issues.push({
|
|
48
|
+
path,
|
|
49
|
+
message: `Bookmark id ${id} has no open start boundary.`
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
open.delete(id);
|
|
54
|
+
};
|
|
55
|
+
const visit = (node, path) => {
|
|
56
|
+
const paragraphAttrs = node.type.name === "paragraph" ? readParagraphAttrs(node) : null;
|
|
57
|
+
if (paragraphAttrs?.ok) for (const [index, bookmark] of (paragraphAttrs.value.bookmarks ?? []).entries()) registerStart(bookmark.id, `${path}.paragraph.attrs.bookmarks[${index}]`);
|
|
58
|
+
if (node.type.name === "bookmarkBoundary") {
|
|
59
|
+
const result = readBookmarkBoundaryAttrs(node);
|
|
60
|
+
if (result.ok) {
|
|
61
|
+
const attrs = result.value;
|
|
62
|
+
const hasHyperlink = node.marks.some((mark) => mark.type.name === "hyperlink");
|
|
63
|
+
const trackedChanges = node.marks.filter((mark) => mark.type.name === "insertion" || mark.type.name === "deletion");
|
|
64
|
+
if (trackedChanges.length > 1) issues.push({
|
|
65
|
+
path,
|
|
66
|
+
message: "Bookmark boundaries cannot carry multiple tracked-change parents."
|
|
67
|
+
});
|
|
68
|
+
else if (trackedChanges.length === 1 && !hasHyperlink) issues.push({
|
|
69
|
+
path,
|
|
70
|
+
message: "Bookmark boundaries inside tracked changes require a hyperlink serialization parent."
|
|
71
|
+
});
|
|
72
|
+
if (attrs.type === "start") registerStart(attrs.id, path);
|
|
73
|
+
else registerEnd(attrs.id, path);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
node.forEach((child, _offset, index) => {
|
|
77
|
+
visit(child, `${path}.content[${index}]`);
|
|
78
|
+
});
|
|
79
|
+
if (paragraphAttrs?.ok) for (const [index, bookmark] of (paragraphAttrs.value.bookmarks ?? []).entries()) registerEnd(bookmark.id, `${path}.paragraph.attrs.bookmarks[${index}]`);
|
|
80
|
+
};
|
|
81
|
+
visit(doc, "doc");
|
|
82
|
+
for (const boundary of open.values()) issues.push({
|
|
83
|
+
path: boundary.path,
|
|
84
|
+
message: `Bookmark id ${boundary.id} has no matching end boundary.`
|
|
85
|
+
});
|
|
86
|
+
};
|
|
26
87
|
const assertValidProseMirrorDocument = (doc, context) => {
|
|
27
88
|
if (validDocumentCache.has(doc)) return;
|
|
28
89
|
const validation = validateProseMirrorDocument(doc);
|
|
@@ -50,6 +111,9 @@ const validateNodeAttrs = (node, path, issues) => {
|
|
|
50
111
|
case "horizontalRule":
|
|
51
112
|
case "pageBreak":
|
|
52
113
|
case "renderedPageBreak": return;
|
|
114
|
+
case "bookmarkBoundary":
|
|
115
|
+
appendAttrIssues(path, readBookmarkBoundaryAttrs(node), issues);
|
|
116
|
+
return;
|
|
53
117
|
case "tab":
|
|
54
118
|
appendAttrIssues(path, readTabAttrs(node), issues);
|
|
55
119
|
return;
|
|
@@ -77,6 +141,35 @@ const validateNodeAttrs = (node, path, issues) => {
|
|
|
77
141
|
return;
|
|
78
142
|
case "field":
|
|
79
143
|
appendAttrIssues(path, readFieldAttrs(node), issues);
|
|
144
|
+
if (node.childCount > 0) issues.push({
|
|
145
|
+
path: `${path}.content`,
|
|
146
|
+
message: "Ordinary fields cannot contain structured result children."
|
|
147
|
+
});
|
|
148
|
+
return;
|
|
149
|
+
case "structuredField":
|
|
150
|
+
{
|
|
151
|
+
const fieldAttrs = readFieldAttrs(node);
|
|
152
|
+
appendAttrIssues(path, fieldAttrs, issues);
|
|
153
|
+
if (fieldAttrs.ok) {
|
|
154
|
+
const hasStructuredHyperlink = node.content.content.some((child) => child.marks.some((mark) => mark.type.name === "hyperlink"));
|
|
155
|
+
if (fieldAttrs.value.fieldKind === "complex") issues.push({
|
|
156
|
+
path: `${path}.content`,
|
|
157
|
+
message: "Complex fields cannot contain structured result children."
|
|
158
|
+
});
|
|
159
|
+
else if (!hasStructuredHyperlink) issues.push({
|
|
160
|
+
path: `${path}.content`,
|
|
161
|
+
message: "Structured simple fields require hyperlink content."
|
|
162
|
+
});
|
|
163
|
+
node.forEach((child, _offset, index) => {
|
|
164
|
+
const childPath = `${path}.content[${index}]`;
|
|
165
|
+
const hasHyperlink = child.marks.some((mark) => mark.type.name === "hyperlink");
|
|
166
|
+
if (child.type.name === "bookmarkBoundary" && !hasHyperlink) issues.push({
|
|
167
|
+
path: childPath,
|
|
168
|
+
message: "Bookmark boundaries inside fields require a hyperlink parent."
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
80
173
|
return;
|
|
81
174
|
case "math":
|
|
82
175
|
appendAttrIssues(path, readMathAttrs(node), issues);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RemoteSelection } from "../types/remote-selection.js";
|
|
2
2
|
import { RenderedDomContext, RenderedDomPoint, RenderedDomRect } from "./RenderedDomContext.js";
|
|
3
3
|
//#region src/render-dom/RemoteSelectionOverlay.d.ts
|
|
4
4
|
type SyncRemoteSelectionOverlayOptions = {
|
|
5
5
|
pagesContainer: HTMLElement;
|
|
6
|
-
selections: readonly
|
|
6
|
+
selections: readonly RemoteSelection[];
|
|
7
7
|
zoom: number;
|
|
8
8
|
zIndex?: number;
|
|
9
9
|
renderedDomContext?: RenderedDomContext;
|
|
@@ -11,9 +11,9 @@ type SyncRemoteSelectionOverlayOptions = {
|
|
|
11
11
|
type RemoteSelectionOverlayGeometry = {
|
|
12
12
|
caret: RenderedDomPoint | null;
|
|
13
13
|
rects: RenderedDomRect[];
|
|
14
|
-
selection:
|
|
14
|
+
selection: RemoteSelection;
|
|
15
15
|
};
|
|
16
|
-
declare const resolveRemoteSelectionOverlayGeometry: (renderedDomContext: RenderedDomContext, selections: readonly
|
|
16
|
+
declare const resolveRemoteSelectionOverlayGeometry: (renderedDomContext: RenderedDomContext, selections: readonly RemoteSelection[]) => RemoteSelectionOverlayGeometry[];
|
|
17
17
|
/** Paint collaborative cursors and selections over the rendered page DOM. */
|
|
18
18
|
declare class RemoteSelectionOverlay {
|
|
19
19
|
clear(pagesContainer: HTMLElement): void;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { document_d_exports } from "./document.js";
|
|
1
2
|
//#region src/types/documentEnumValues.d.ts
|
|
3
|
+
declare const SHAPE_TEXT_ANCHOR_VALUES: readonly ["top", "middle", "bottom", "distributed", "justified"];
|
|
4
|
+
declare const normalizeShapeTextAnchor: (value: unknown) => document_d_exports.ShapeTextBody["anchor"] | undefined;
|
|
2
5
|
declare const THEME_COLOR_SLOT_VALUES: readonly ["dk1", "lt1", "dk2", "lt2", "accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "hlink", "folHlink", "background1", "text1", "background2", "text2"];
|
|
3
6
|
declare const BORDER_STYLE_VALUES: readonly ["none", "single", "double", "dotted", "dashed", "thick", "triple", "thinThickSmallGap", "thickThinSmallGap", "thinThickMediumGap", "thickThinMediumGap", "thinThickLargeGap", "thickThinLargeGap", "wave", "doubleWave", "dashSmallGap", "dashDotStroked", "threeDEmboss", "threeDEngrave", "outset", "inset", "nil"];
|
|
4
7
|
declare const UNDERLINE_STYLE_VALUES: readonly ["none", "single", "words", "double", "thick", "dotted", "dottedHeavy", "dash", "dashedHeavy", "dashLong", "dashLongHeavy", "dotDash", "dashDotHeavy", "dotDotDash", "dashDotDotHeavy", "wave", "wavyHeavy", "wavyDouble"];
|
|
@@ -90,4 +93,4 @@ type OutlineStyleAttr = (typeof OUTLINE_STYLE_ATTR_VALUES)[number];
|
|
|
90
93
|
declare const NUMBER_FORMAT_VALUES: readonly ["decimal", "upperRoman", "lowerRoman", "upperLetter", "lowerLetter", "ordinal", "cardinalText", "ordinalText", "hex", "chicago", "ideographDigital", "japaneseCounting", "aiueo", "iroha", "decimalFullWidth", "decimalHalfWidth", "japaneseLegal", "japaneseDigitalTenThousand", "decimalEnclosedCircle", "decimalFullWidth2", "aiueoFullWidth", "irohaFullWidth", "decimalZero", "decimalZero3", "decimalZero4", "decimalZero5", "bullet", "ganada", "chosung", "decimalEnclosedFullstop", "decimalEnclosedParen", "decimalEnclosedCircleChinese", "ideographEnclosedCircle", "ideographTraditional", "ideographZodiac", "ideographZodiacTraditional", "taiwaneseCounting", "ideographLegalTraditional", "taiwaneseCountingThousand", "taiwaneseDigital", "chineseCounting", "chineseLegalSimplified", "chineseCountingThousand", "koreanDigital", "koreanCounting", "koreanLegal", "koreanDigital2", "vietnameseCounting", "russianLower", "russianUpper", "none", "numberInDash", "hebrew1", "hebrew2", "arabicAlpha", "arabicAbjad", "hindiVowels", "hindiConsonants", "hindiNumbers", "hindiCounting", "thaiLetters", "thaiNumbers", "thaiCounting"];
|
|
91
94
|
declare const LEVEL_SUFFIX_VALUES: readonly ["tab", "space", "nothing"];
|
|
92
95
|
//#endregion
|
|
93
|
-
export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, OutlineStyleAttr, OutlineStyleCssAlias, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES };
|
|
96
|
+
export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, OutlineStyleAttr, OutlineStyleCssAlias, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TEXT_ANCHOR_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES, normalizeShapeTextAnchor };
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
//#region src/types/documentEnumValues.ts
|
|
2
|
+
const SHAPE_TEXT_ANCHOR_VALUES = [
|
|
3
|
+
"top",
|
|
4
|
+
"middle",
|
|
5
|
+
"bottom",
|
|
6
|
+
"distributed",
|
|
7
|
+
"justified"
|
|
8
|
+
];
|
|
9
|
+
const normalizeShapeTextAnchor = (value) => {
|
|
10
|
+
if (value === "center") return "middle";
|
|
11
|
+
for (const anchor of SHAPE_TEXT_ANCHOR_VALUES) if (value === anchor) return anchor;
|
|
12
|
+
};
|
|
2
13
|
const THEME_COLOR_SLOT_VALUES = [
|
|
3
14
|
"dk1",
|
|
4
15
|
"lt1",
|
|
@@ -708,4 +719,4 @@ const LEVEL_SUFFIX_VALUES = [
|
|
|
708
719
|
"nothing"
|
|
709
720
|
];
|
|
710
721
|
//#endregion
|
|
711
|
-
export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES };
|
|
722
|
+
export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TEXT_ANCHOR_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES, normalizeShapeTextAnchor };
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/types/remote-selection.d.ts
|
|
2
|
+
/** Serializable collaborator selection projected into ProseMirror positions. */
|
|
3
|
+
type RemoteSelection = {
|
|
4
|
+
anchor: number;
|
|
5
|
+
clientId: number;
|
|
6
|
+
color: string;
|
|
7
|
+
head: number;
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { RemoteSelection };
|
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//#region src/types/wrap.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Wrap-type predicates shared across the layout pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors eigenpal docx-editor `wrapTypes` so that the new textBoxFlow
|
|
6
|
+
* predicates (eigenpal #474) and the existing image classifiers agree on
|
|
7
|
+
* which OOXML wrap variants are floating, which paint over body text, and
|
|
8
|
+
* which wrap around it.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* OOXML text-wrap variants for a drawing anchor (`wp:inline` vs the
|
|
12
|
+
* `wp:wrap*` elements). `inline` keeps the object in the text run; every other
|
|
13
|
+
* variant takes it out of inline flow. Mirrors the eigenpal docx-editor union
|
|
14
|
+
* so adapters share one wrap vocabulary.
|
|
15
|
+
*/
|
|
16
|
+
type WrapType = "inline" | "square" | "tight" | "through" | "topAndBottom" | "behind" | "inFront";
|
|
17
|
+
/**
|
|
18
|
+
* `true` for any wrap type that takes the object out of inline flow.
|
|
19
|
+
* Includes `topAndBottom` and the wrapNone variants (`behind`/`inFront`):
|
|
20
|
+
* those are anchored at absolute coordinates even though they don't shrink
|
|
21
|
+
* line widths.
|
|
22
|
+
*/
|
|
23
|
+
declare function isFloatingWrapType(wrapType: string | undefined): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* `true` for `behind` and `inFront` — wrapNone variants that don't shrink
|
|
26
|
+
* line widths; text paints over or under the object.
|
|
27
|
+
*/
|
|
28
|
+
declare function isWrapNone(wrapType: string | undefined): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* `true` for wrap types that actually divert lines around the object
|
|
31
|
+
* (`square` / `tight` / `through`). Excludes `topAndBottom` (block flow)
|
|
32
|
+
* and the wrapNone variants.
|
|
33
|
+
*/
|
|
34
|
+
declare function wrapsAroundText(wrapType: string | undefined): boolean;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { WrapType, isFloatingWrapType, isWrapNone, wrapsAroundText };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region src/types/wrap.ts
|
|
2
|
+
const FLOATING_WRAP_TYPES = /* @__PURE__ */ new Set([
|
|
3
|
+
"square",
|
|
4
|
+
"tight",
|
|
5
|
+
"through",
|
|
6
|
+
"topAndBottom",
|
|
7
|
+
"behind",
|
|
8
|
+
"inFront"
|
|
9
|
+
]);
|
|
10
|
+
const TEXT_WRAPPING_TYPES = /* @__PURE__ */ new Set([
|
|
11
|
+
"square",
|
|
12
|
+
"tight",
|
|
13
|
+
"through"
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* `true` for any wrap type that takes the object out of inline flow.
|
|
17
|
+
* Includes `topAndBottom` and the wrapNone variants (`behind`/`inFront`):
|
|
18
|
+
* those are anchored at absolute coordinates even though they don't shrink
|
|
19
|
+
* line widths.
|
|
20
|
+
*/
|
|
21
|
+
function isFloatingWrapType(wrapType) {
|
|
22
|
+
return wrapType !== void 0 && FLOATING_WRAP_TYPES.has(wrapType);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* `true` for `behind` and `inFront` — wrapNone variants that don't shrink
|
|
26
|
+
* line widths; text paints over or under the object.
|
|
27
|
+
*/
|
|
28
|
+
function isWrapNone(wrapType) {
|
|
29
|
+
return wrapType === "behind" || wrapType === "inFront";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* `true` for wrap types that actually divert lines around the object
|
|
33
|
+
* (`square` / `tight` / `through`). Excludes `topAndBottom` (block flow)
|
|
34
|
+
* and the wrapNone variants.
|
|
35
|
+
*/
|
|
36
|
+
function wrapsAroundText(wrapType) {
|
|
37
|
+
return wrapType !== void 0 && TEXT_WRAPPING_TYPES.has(wrapType);
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { isFloatingWrapType, isWrapNone, wrapsAroundText };
|
|
@@ -47,7 +47,7 @@ declare const CJK_FALLBACK_FONT_FAMILY = "MS Mincho";
|
|
|
47
47
|
declare const setGoogleFontsEnabled: (enabled: boolean) => void;
|
|
48
48
|
declare const getGoogleFontsEnabled: () => boolean;
|
|
49
49
|
declare const setEmbeddedFontFamilyMap: (map: ReadonlyMap<string, string> | null) => void;
|
|
50
|
-
declare function resolveFontFamily(docxFontName: string): ResolvedFont;
|
|
50
|
+
declare function resolveFontFamily(docxFontName: string, alternateFontName?: string): ResolvedFont;
|
|
51
51
|
/**
|
|
52
52
|
* Split a CSS `font-family` list built by `quoteFontName` back into family
|
|
53
53
|
* names: the inverse of the quoting and escaping applied there. Quoted entries
|