@stll/folio-core 0.11.0 → 0.13.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/ai-edits/apply.d.ts +2 -1
- package/dist/ai-edits/apply.js +693 -63
- package/dist/ai-edits/block-identity.d.ts +4 -0
- package/dist/ai-edits/block-identity.js +9 -0
- package/dist/ai-edits/blockRange.d.ts +28 -1
- package/dist/ai-edits/blockRange.js +68 -2
- package/dist/ai-edits/clean-text.js +2 -1
- package/dist/ai-edits/headless.d.ts +4 -4
- package/dist/ai-edits/headless.js +9 -9
- package/dist/ai-edits/index.d.ts +2 -2
- package/dist/ai-edits/index.js +2 -2
- package/dist/ai-edits/read.d.ts +7 -7
- package/dist/ai-edits/read.js +110 -3
- package/dist/ai-edits/snapshot.js +21 -3
- package/dist/ai-edits/table-cell-mutations.d.ts +48 -0
- package/dist/ai-edits/table-cell-mutations.js +238 -0
- package/dist/ai-edits/table-mutation-plan.d.ts +38 -0
- package/dist/ai-edits/table-mutation-plan.js +90 -0
- package/dist/ai-edits/table-row-column-mutations.d.ts +108 -0
- package/dist/ai-edits/table-row-column-mutations.js +300 -0
- package/dist/ai-edits/table-targets.d.ts +32 -0
- package/dist/ai-edits/table-targets.js +70 -0
- package/dist/ai-edits/types.d.ts +62 -1
- package/dist/ai-edits/word-diff.js +21 -0
- package/dist/compat/eigenpal.d.ts +3 -3
- package/dist/compat/eigenpal.js +3 -3
- package/dist/content-controls/mutateContentControls.js +1 -1
- package/dist/controller/activeEditorStory.d.ts +36 -0
- package/dist/controller/activeEditorStory.js +30 -0
- package/dist/controller/contentControlWidgetController.d.ts +55 -0
- package/dist/controller/contentControlWidgetController.js +141 -0
- package/dist/controller/fontReadiness.js +2 -0
- package/dist/controller/headerFooterEditorManager.js +2 -2
- package/dist/controller/hiddenEditorApi.js +2 -2
- package/dist/controller/hiddenEditorManager.d.ts +12 -1
- package/dist/controller/hiddenEditorManager.js +44 -12
- package/dist/controller/layoutPipeline.d.ts +2 -0
- package/dist/controller/layoutPipeline.js +17 -2
- package/dist/controller/noteEditorManager.d.ts +36 -0
- package/dist/controller/noteEditorManager.js +210 -0
- package/dist/document-operations.d.ts +43 -11
- package/dist/document-operations.js +186 -18
- package/dist/docx/blockContentParser.js +21 -7
- package/dist/docx/commentParser.js +6 -1
- package/dist/docx/commentRangeIntegrity.d.ts +6 -0
- package/dist/docx/commentRangeIntegrity.js +186 -0
- package/dist/docx/conformance.js +62 -1
- package/dist/docx/documentGrid.d.ts +8 -0
- package/dist/docx/documentGrid.js +8 -0
- package/dist/docx/drawingUtils.js +1 -1
- package/dist/docx/encryption/agileDecryption.js +12 -2
- package/dist/docx/encryption/compoundFile.js +6 -1
- package/dist/docx/encryption/encryptionInfo.d.ts +9 -1
- package/dist/docx/encryption/encryptionInfo.js +18 -2
- package/dist/docx/encryption/openEncryptedDocx.js +1 -1
- package/dist/docx/ensureParaIds.js +8 -7
- package/dist/docx/fieldParser.js +1 -1
- package/dist/docx/groupDrawingParser.js +10 -5
- package/dist/docx/hyperlinkParser.js +1 -1
- package/dist/docx/imageParser.js +10 -6
- package/dist/docx/metadataPrivacy.js +17 -3
- package/dist/docx/notePropertiesParser.js +1 -1
- package/dist/docx/numberingParser.js +1 -1
- package/dist/docx/paragraphParser.js +70 -61
- package/dist/docx/paragraphTextBoxEnrichment.d.ts +2 -1
- package/dist/docx/paragraphTextBoxEnrichment.js +67 -13
- package/dist/docx/paragraphTraversal.js +1 -1
- package/dist/docx/parser.js +3 -3
- package/dist/docx/rezip.js +20 -9
- package/dist/docx/runParser.js +17 -6
- package/dist/docx/sdtProperties.js +1 -1
- package/dist/docx/sectionParser.js +18 -5
- package/dist/docx/selectiveSave.js +5 -1
- package/dist/docx/selectiveXmlPatch.d.ts +22 -1
- package/dist/docx/selectiveXmlPatch.js +61 -1
- package/dist/docx/serializer/blockSdtSerializer.js +3 -2
- package/dist/docx/serializer/commentSerializer.js +5 -6
- package/dist/docx/serializer/documentSerializer.js +2 -2
- package/dist/docx/serializer/headerFooterSerializer.js +2 -2
- package/dist/docx/serializer/noteSerializer.js +2 -2
- package/dist/docx/serializer/paragraphSerializer.js +23 -15
- package/dist/docx/serializer/runSerializer.js +25 -21
- package/dist/docx/serializer/sectionPropertiesSerializer.js +2 -1
- package/dist/docx/serializer/stylesSerializer.js +1 -1
- package/dist/docx/serializer/tableSerializer.d.ts +5 -4
- package/dist/docx/serializer/tableSerializer.js +26 -20
- package/dist/docx/serializer/xmlUtils.d.ts +13 -1
- package/dist/docx/serializer/xmlUtils.js +27 -1
- package/dist/docx/server/applyDocxXmlPatchProposal.d.ts +87 -0
- package/dist/docx/server/applyDocxXmlPatchProposal.js +204 -0
- package/dist/docx/server/boundedArchive.d.ts +14 -3
- package/dist/docx/server/boundedArchive.js +56 -11
- package/dist/docx/server/evaluateDocxXmlPatchProposal.d.ts +85 -0
- package/dist/docx/server/evaluateDocxXmlPatchProposal.js +361 -0
- package/dist/docx/server/extractDocxText.js +55 -8
- package/dist/docx/server/inspectDocxPackage.d.ts +70 -0
- package/dist/docx/server/inspectDocxPackage.js +217 -0
- package/dist/docx/server/validateDocxConformance.d.ts +41 -0
- package/dist/docx/server/validateDocxConformance.js +336 -0
- package/dist/docx/settingsParser.js +26 -3
- package/dist/docx/shapeParser.js +1 -1
- package/dist/docx/styleParser.js +4 -2
- package/dist/docx/tableParser.d.ts +8 -1
- package/dist/docx/tableParser.js +31 -10
- package/dist/docx/textBoxParser.d.ts +3 -3
- package/dist/docx/textBoxParser.js +16 -12
- package/dist/docx/unzip.js +1 -0
- package/dist/docx/vmlImageParser.js +11 -3
- package/dist/docx/xmlParser.js +11 -1
- package/dist/docx/xmlSafety.d.ts +5 -0
- package/dist/docx/xmlSafety.js +9 -0
- package/dist/fields/resolveFieldValues.js +1 -3
- package/dist/fonts/embeddedFonts.d.ts +33 -5
- package/dist/fonts/embeddedFonts.js +37 -8
- package/dist/i18n/messages/catalogs.gen.d.ts +17 -0
- package/dist/i18n/messages/catalogs.gen.js +17 -0
- package/dist/i18n/messages/messages.gen.d.ts +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
- package/dist/layout-bridge/convert/footnoteLayout.js +47 -40
- package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
- package/dist/layout-bridge/convert/headerFooterLayout.js +3 -0
- package/dist/layout-bridge/convert/templatePreviewFlow.js +3 -3
- package/dist/layout-bridge/convert/toFlowBlocks.d.ts +4 -2
- package/dist/layout-bridge/convert/toFlowBlocks.js +151 -20
- package/dist/layout-bridge/dom/noteStoryDom.d.ts +6 -0
- package/dist/layout-bridge/dom/noteStoryDom.js +17 -0
- package/dist/layout-bridge/engine/clickToPosition.js +2 -2
- package/dist/layout-engine/index.d.ts +2 -2
- package/dist/layout-engine/index.js +58 -30
- package/dist/layout-engine/justificationCompatibility.d.ts +6 -0
- package/dist/layout-engine/justificationCompatibility.js +8 -0
- package/dist/layout-engine/keep-together.js +11 -1
- package/dist/layout-engine/measure/cache.js +23 -5
- package/dist/layout-engine/measure/effectiveLineBreakPolicy.js +8 -2
- package/dist/layout-engine/measure/lineBreakProvider.d.ts +2 -2
- package/dist/layout-engine/measure/lineBreakProvider.js +56 -37
- package/dist/layout-engine/measure/measureBlocks.js +15 -4
- package/dist/layout-engine/measure/measureContainer.js +1 -1
- package/dist/layout-engine/measure/measureHelpers.d.ts +11 -2
- package/dist/layout-engine/measure/measureHelpers.js +15 -4
- package/dist/layout-engine/measure/measureParagraph.js +85 -25
- package/dist/layout-engine/measure/measureProvider.js +4 -3
- package/dist/layout-engine/measure/tableCellFlow.js +5 -2
- package/dist/layout-engine/measure/textBoxParagraphLayout.d.ts +9 -7
- package/dist/layout-engine/measure/textBoxParagraphLayout.js +22 -6
- package/dist/layout-engine/measure/textMeasurementPolicy.d.ts +3 -1
- package/dist/layout-engine/measure/textMeasurementPolicy.js +7 -1
- package/dist/layout-engine/paginator.js +5 -1
- package/dist/layout-engine/paragraphSpacing.d.ts +28 -4
- package/dist/layout-engine/paragraphSpacing.js +107 -13
- package/dist/layout-engine/renderedBreakReconciliation.js +1 -1
- package/dist/layout-engine/types.d.ts +48 -15
- package/dist/layout-painter/registry/modules/textBox.js +5 -1
- package/dist/layout-painter/renderImage.d.ts +12 -1
- package/dist/layout-painter/renderImage.js +21 -4
- package/dist/layout-painter/renderPage.d.ts +5 -2
- package/dist/layout-painter/renderPage.js +59 -14
- package/dist/layout-painter/renderParagraph.js +55 -15
- package/dist/layout-painter/renderTable.d.ts +5 -1
- package/dist/layout-painter/renderTable.js +7 -3
- package/dist/layout-painter/renderTextBox.d.ts +2 -1
- package/dist/layout-painter/renderTextBox.js +25 -14
- package/dist/layout-painter/renderWatermark.d.ts +1 -1
- package/dist/layout-painter/renderWatermark.js +2 -1
- package/dist/managers/DocumentLoaderManager.js +1 -1
- package/dist/markdown/fromMarkdown.js +1 -1
- package/dist/model.js +1 -1
- package/dist/prosemirror/attrs/index.d.ts +4 -2
- package/dist/prosemirror/attrs/index.js +175 -18
- package/dist/prosemirror/commands/comments.d.ts +79 -4
- package/dist/prosemirror/commands/comments.js +622 -13
- package/dist/prosemirror/commands/contentControls.js +1 -1
- package/dist/prosemirror/commands/hyperlink.js +15 -1
- package/dist/prosemirror/commands/image.js +7 -1
- package/dist/prosemirror/commands/index.d.ts +2 -2
- package/dist/prosemirror/commands/index.js +2 -2
- package/dist/prosemirror/commands/pageBreak.js +1 -1
- package/dist/prosemirror/commands/propertyChangeScope.d.ts +2 -2
- package/dist/prosemirror/commands/propertyChangeScope.js +3 -2
- package/dist/prosemirror/commands/tableCellMergeResolution.d.ts +9 -0
- package/dist/prosemirror/commands/tableCellMergeResolution.js +181 -0
- package/dist/prosemirror/commentIdAllocator.js +13 -3
- package/dist/prosemirror/conversion/fromProseDoc.d.ts +2 -1
- package/dist/prosemirror/conversion/fromProseDoc.js +404 -62
- package/dist/prosemirror/conversion/index.js +1 -1
- package/dist/prosemirror/conversion/sdtAttrs.d.ts +9 -0
- package/dist/prosemirror/conversion/sdtAttrs.js +49 -0
- package/dist/prosemirror/conversion/toProseDoc.d.ts +2 -1
- package/dist/prosemirror/conversion/toProseDoc.js +364 -103
- package/dist/prosemirror/extensions/ExtensionManager.js +1 -1
- package/dist/prosemirror/extensions/StarterKit.js +6 -1
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +6 -2
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +1 -0
- package/dist/prosemirror/extensions/features/ImagePasteExtension.js +10 -2
- package/dist/prosemirror/extensions/features/ListExtension.js +1 -1
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +10 -1
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +93 -2
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +2 -1
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +6 -2
- package/dist/prosemirror/extensions/features/pasteCleanup.js +15 -2
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.js +1 -1
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +30 -4
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.d.ts +9 -1
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +70 -11
- package/dist/prosemirror/extensions/nodes/FieldExtension.js +1 -1
- package/dist/prosemirror/extensions/nodes/RenderedPageBreakExtension.d.ts +7 -0
- package/dist/prosemirror/extensions/nodes/RenderedPageBreakExtension.js +22 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +1 -1
- package/dist/prosemirror/extensions/nodes/TableExtension.js +14 -6
- package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.js +41 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.d.ts +5 -2
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +4 -1
- package/dist/prosemirror/index.d.ts +1 -1
- package/dist/prosemirror/index.js +1 -1
- package/dist/prosemirror/plugins/contentControlWidgets.d.ts +36 -10
- package/dist/prosemirror/plugins/contentControlWidgets.js +128 -94
- package/dist/prosemirror/plugins/revisionIds.d.ts +23 -0
- package/dist/prosemirror/plugins/revisionIds.js +57 -0
- package/dist/prosemirror/plugins/selectionTracker.js +1 -0
- package/dist/prosemirror/plugins/suggestionMode.js +5 -4
- package/dist/prosemirror/runFormattingMarkNames.d.ts +14 -0
- package/dist/prosemirror/runFormattingMarkNames.js +40 -0
- package/dist/prosemirror/schema/index.d.ts +2 -2
- package/dist/prosemirror/schema/marks.d.ts +30 -3
- package/dist/prosemirror/schema/marks.js +15 -0
- package/dist/prosemirror/schema/nodes.d.ts +111 -6
- package/dist/prosemirror/selectionState.js +1 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.js +1 -0
- package/dist/prosemirror/tableCellMergeRevision.d.ts +9 -0
- package/dist/prosemirror/tableCellMergeRevision.js +22 -0
- package/dist/prosemirror/textBoxAnchorAttrs.d.ts +9 -0
- package/dist/prosemirror/textBoxAnchorAttrs.js +33 -0
- package/dist/prosemirror/utils/extractTrackedChanges.d.ts +1 -1
- package/dist/prosemirror/utils/extractTrackedChanges.js +62 -14
- package/dist/prosemirror/validation.js +9 -1
- package/dist/render-dom/RemoteSelectionOverlay.js +2 -2
- package/dist/server.d.ts +7 -3
- package/dist/server.js +7 -3
- package/dist/utils/clipboard.d.ts +10 -1
- package/dist/utils/clipboard.js +33 -6
- package/dist/utils/colorResolver.d.ts +8 -1
- package/dist/utils/colorResolver.js +35 -5
- package/dist/utils/fontFamilyMerge.js +9 -11
- package/dist/utils/fontLoader.js +3 -2
- package/dist/utils/fontResolver.d.ts +2 -1
- package/dist/utils/fontResolver.js +31 -7
- package/dist/utils/fontWeights.d.ts +1 -1
- package/dist/utils/fontWeights.js +1 -1
- package/dist/utils/hexId.d.ts +11 -1
- package/dist/utils/hexId.js +11 -1
- package/dist/utils/paragraphFormattingMerge.js +1 -0
- package/dist/utils/sanitizeImageSrc.d.ts +21 -0
- package/dist/utils/sanitizeImageSrc.js +30 -0
- package/dist/utils/stripXmlDeclarations.d.ts +11 -0
- package/dist/utils/stripXmlDeclarations.js +35 -0
- package/dist/version-comparison.d.ts +22 -2
- package/dist/version-comparison.js +41 -12
- package/dist/watermark/index.d.ts +11 -1
- package/dist/watermark/index.js +22 -1
- package/package.json +3 -2
|
@@ -160,12 +160,14 @@ const pairByStableId = (base, revised) => {
|
|
|
160
160
|
const MAX_LCS_CELLS = 4e6;
|
|
161
161
|
/** True when an `unpairedBaseCount * unpairedRevisedCount` LCS table would exceed {@link MAX_LCS_CELLS}. */
|
|
162
162
|
const exceedsLcsBudget = (unpairedBaseCount, unpairedRevisedCount) => unpairedBaseCount * unpairedRevisedCount > MAX_LCS_CELLS;
|
|
163
|
+
const createLcsBudget = () => ({ remainingCells: MAX_LCS_CELLS });
|
|
163
164
|
/** Pass 2: order-preserving LCS by exact text equality over the blocks pass 1 left unpaired. */
|
|
164
|
-
const pairByExactText = (base, revised) => {
|
|
165
|
+
const pairByExactText = (base, revised, lcsBudget) => {
|
|
165
166
|
const m = base.length;
|
|
166
167
|
const n = revised.length;
|
|
167
168
|
if (m === 0 || n === 0) return [];
|
|
168
|
-
if (exceedsLcsBudget(m, n)) return [];
|
|
169
|
+
if (exceedsLcsBudget(m, n) || lcsBudget.remainingCells <= 0) return [];
|
|
170
|
+
lcsBudget.remainingCells -= m * n;
|
|
169
171
|
const baseTexts = base.map(({ block }) => block.text);
|
|
170
172
|
const revisedTexts = revised.map(({ block }) => block.text);
|
|
171
173
|
const stride = n + 1;
|
|
@@ -205,8 +207,14 @@ const pairByExactText = (base, revised) => {
|
|
|
205
207
|
* snapshots and flatten it into an ordered event stream. Shared by
|
|
206
208
|
* {@link compareDocxVersions} and the redline generator so both interpret
|
|
207
209
|
* one document walk instead of re-deriving it.
|
|
210
|
+
*
|
|
211
|
+
* `lcsBudget` defaults to a fresh, single-call budget so a caller comparing
|
|
212
|
+
* one block pair in isolation (the redline generator) behaves exactly as
|
|
213
|
+
* before. {@link compareDocxVersions} passes one budget object shared across
|
|
214
|
+
* every story pair instead, so pass 2's cell allowance is aggregate across
|
|
215
|
+
* the whole comparison rather than reset per story.
|
|
208
216
|
*/
|
|
209
|
-
const alignFolioBlocks = (baseBlocks, revisedBlocks) => {
|
|
217
|
+
const alignFolioBlocks = (baseBlocks, revisedBlocks, lcsBudget = createLcsBudget()) => {
|
|
210
218
|
const stableIdAnchors = pairByStableId(baseBlocks, revisedBlocks);
|
|
211
219
|
const usedBaseIndexes = new Set(stableIdAnchors.map((anchor) => anchor.baseIndex));
|
|
212
220
|
const usedRevisedIndexes = new Set(stableIdAnchors.map((anchor) => anchor.revisedIndex));
|
|
@@ -224,7 +232,7 @@ const alignFolioBlocks = (baseBlocks, revisedBlocks) => {
|
|
|
224
232
|
index: blockIndex
|
|
225
233
|
});
|
|
226
234
|
});
|
|
227
|
-
const exactTextAnchors = pairByExactText(baseRemaining, revisedRemaining);
|
|
235
|
+
const exactTextAnchors = pairByExactText(baseRemaining, revisedRemaining, lcsBudget);
|
|
228
236
|
const anchors = longestIncreasingByRevisedIndex([...stableIdAnchors, ...exactTextAnchors].toSorted((a, b) => a.baseIndex - b.baseIndex));
|
|
229
237
|
const events = [];
|
|
230
238
|
/** Pass 3: positionally zip the leftover blocks in one gap between anchors. */
|
|
@@ -331,6 +339,20 @@ const meetsMoveWordCount = (text) => {
|
|
|
331
339
|
return false;
|
|
332
340
|
};
|
|
333
341
|
/**
|
|
342
|
+
* Cap on how many same-text `deleted` candidates {@link detectMoves} queues
|
|
343
|
+
* per distinct text. Duplicated boilerplate at or above the word floor
|
|
344
|
+
* (e.g. a repeated long clause) could otherwise grow one text's candidate
|
|
345
|
+
* list without bound; past this cap, further same-text deletions are simply
|
|
346
|
+
* left as `deleted` (never matched to a move) instead of queued.
|
|
347
|
+
*/
|
|
348
|
+
const MAX_MOVE_CANDIDATES_PER_TEXT = 1e4;
|
|
349
|
+
const dequeueDeletedIndex = (queue) => {
|
|
350
|
+
if (!queue || queue.head >= queue.items.length) return;
|
|
351
|
+
const index = queue.items[queue.head];
|
|
352
|
+
queue.head += 1;
|
|
353
|
+
return index;
|
|
354
|
+
};
|
|
355
|
+
/**
|
|
334
356
|
* Re-classify `deleted` + `added` pairs with identical text as
|
|
335
357
|
* `movedFrom` / `movedTo` entries sharing a `moveGroupId`, in place, so each
|
|
336
358
|
* side keeps its slot in the revised-side document order. Matching is FIFO
|
|
@@ -340,17 +362,22 @@ const meetsMoveWordCount = (text) => {
|
|
|
340
362
|
const detectMoves = (changes, counts, firstMoveGroupId) => {
|
|
341
363
|
const deletedIndexesByText = /* @__PURE__ */ new Map();
|
|
342
364
|
changes.forEach((change, index) => {
|
|
343
|
-
if (change.type
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
deletedIndexesByText.set(change.text,
|
|
365
|
+
if (change.type !== "deleted" || !meetsMoveWordCount(change.text)) return;
|
|
366
|
+
const queue = deletedIndexesByText.get(change.text);
|
|
367
|
+
if (!queue) {
|
|
368
|
+
deletedIndexesByText.set(change.text, {
|
|
369
|
+
items: [index],
|
|
370
|
+
head: 0
|
|
371
|
+
});
|
|
372
|
+
return;
|
|
347
373
|
}
|
|
374
|
+
if (queue.items.length < MAX_MOVE_CANDIDATES_PER_TEXT) queue.items.push(index);
|
|
348
375
|
});
|
|
349
376
|
if (deletedIndexesByText.size === 0) return;
|
|
350
377
|
let moveGroupId = firstMoveGroupId - 1;
|
|
351
378
|
changes.forEach((change, index) => {
|
|
352
379
|
if (change.type !== "added") return;
|
|
353
|
-
const deletedIndex = deletedIndexesByText.get(change.text)
|
|
380
|
+
const deletedIndex = dequeueDeletedIndex(deletedIndexesByText.get(change.text));
|
|
354
381
|
if (deletedIndex === void 0) return;
|
|
355
382
|
const deleted = changes[deletedIndex];
|
|
356
383
|
if (!deleted || deleted.type !== "deleted") return;
|
|
@@ -394,10 +421,10 @@ const addSummaryCounts = (target, source) => {
|
|
|
394
421
|
target.metadataChanged += source.metadataChanged;
|
|
395
422
|
target.unchanged += source.unchanged;
|
|
396
423
|
};
|
|
397
|
-
const compareStoryBlocks = ({ baseStory, revisedStory, baseBlocks, revisedBlocks, firstMoveGroupId, includeText, includeFormatting }) => {
|
|
424
|
+
const compareStoryBlocks = ({ baseStory, revisedStory, baseBlocks, revisedBlocks, firstMoveGroupId, includeText, includeFormatting, lcsBudget }) => {
|
|
398
425
|
const changes = [];
|
|
399
426
|
const counts = createSummaryCounts();
|
|
400
|
-
for (const event of alignFolioBlocks(baseBlocks, revisedBlocks)) {
|
|
427
|
+
for (const event of alignFolioBlocks(baseBlocks, revisedBlocks, lcsBudget)) {
|
|
401
428
|
if (event.type === "pair") {
|
|
402
429
|
if (!baseStory || !revisedStory) panic("A paired comparison event requires both story handles");
|
|
403
430
|
const { baseBlock, revisedBlock } = event;
|
|
@@ -554,6 +581,7 @@ const compareDocxVersions = async (base, revised, options = {}) => {
|
|
|
554
581
|
const baseStories = baseReviewer.listStories().map(({ handle }) => handle);
|
|
555
582
|
const revisedStories = revisedReviewer.listStories().map(({ handle }) => handle);
|
|
556
583
|
let nextMoveGroupId = 1;
|
|
584
|
+
const lcsBudget = createLcsBudget();
|
|
557
585
|
for (const pair of pairFolioDocumentStories(baseStories, revisedStories)) {
|
|
558
586
|
const baseBlocks = pair.baseStory ? baseReviewer.readReviewedStory({
|
|
559
587
|
story: pair.baseStory,
|
|
@@ -569,7 +597,8 @@ const compareDocxVersions = async (base, revised, options = {}) => {
|
|
|
569
597
|
revisedBlocks,
|
|
570
598
|
firstMoveGroupId: nextMoveGroupId,
|
|
571
599
|
includeText: scopes.has("text"),
|
|
572
|
-
includeFormatting: scopes.has("formatting")
|
|
600
|
+
includeFormatting: scopes.has("formatting"),
|
|
601
|
+
lcsBudget
|
|
573
602
|
});
|
|
574
603
|
stories.push(storyDiff);
|
|
575
604
|
for (const change of storyDiff.changes) changes.push(change);
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { document_d_exports } from "../types/document.js";
|
|
2
2
|
|
|
3
3
|
//#region src/watermark/index.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Whether `target` is safe to save as a watermark picture's external image
|
|
6
|
+
* relationship. A watermark dialog lets an author type an arbitrary string
|
|
7
|
+
* for this field; without a scheme check it becomes a `TargetMode="External"`
|
|
8
|
+
* relationship verbatim (see `docx/rezip.ts`), which would let a `file:` URL
|
|
9
|
+
* or UNC path (`\\host\share\...`) into the exported `.docx` — a resource
|
|
10
|
+
* whatever later opens the file (e.g. Word) would try to resolve. Only
|
|
11
|
+
* `http:`/`https:` targets are allowed.
|
|
12
|
+
*/
|
|
13
|
+
declare function isAllowedExternalWatermarkImageUrl(target: string): boolean;
|
|
4
14
|
/**
|
|
5
15
|
* Read the document's watermark. Walks every header part and returns
|
|
6
16
|
* the first watermark encountered (header insertion order). Returns
|
|
@@ -36,4 +46,4 @@ declare function ensureWatermarkHeaderCoverage(doc: document_d_exports.Document,
|
|
|
36
46
|
type PictureWatermark = document_d_exports.PictureWatermark;
|
|
37
47
|
type TextWatermark = document_d_exports.TextWatermark;
|
|
38
48
|
type Watermark = document_d_exports.Watermark;
|
|
39
|
-
export { type PictureWatermark, type TextWatermark, type Watermark, ensureWatermarkHeaderCoverage, getDocumentWatermark, setDocumentWatermark };
|
|
49
|
+
export { type PictureWatermark, type TextWatermark, type Watermark, ensureWatermarkHeaderCoverage, getDocumentWatermark, isAllowedExternalWatermarkImageUrl, setDocumentWatermark };
|
package/dist/watermark/index.js
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
//#region src/watermark/index.ts
|
|
2
2
|
/**
|
|
3
|
+
* Schemes allowed for a picture watermark's external image target
|
|
4
|
+
* (`TargetMode="External"` in the saved package's relationships).
|
|
5
|
+
*/
|
|
6
|
+
const ALLOWED_EXTERNAL_IMAGE_SCHEMES = /* @__PURE__ */ new Set(["http:", "https:"]);
|
|
7
|
+
/**
|
|
8
|
+
* Whether `target` is safe to save as a watermark picture's external image
|
|
9
|
+
* relationship. A watermark dialog lets an author type an arbitrary string
|
|
10
|
+
* for this field; without a scheme check it becomes a `TargetMode="External"`
|
|
11
|
+
* relationship verbatim (see `docx/rezip.ts`), which would let a `file:` URL
|
|
12
|
+
* or UNC path (`\\host\share\...`) into the exported `.docx` — a resource
|
|
13
|
+
* whatever later opens the file (e.g. Word) would try to resolve. Only
|
|
14
|
+
* `http:`/`https:` targets are allowed.
|
|
15
|
+
*/
|
|
16
|
+
function isAllowedExternalWatermarkImageUrl(target) {
|
|
17
|
+
try {
|
|
18
|
+
return ALLOWED_EXTERNAL_IMAGE_SCHEMES.has(new URL(target).protocol);
|
|
19
|
+
} catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
3
24
|
* Read the document's watermark. Walks every header part and returns
|
|
4
25
|
* the first watermark encountered (header insertion order). Returns
|
|
5
26
|
* `undefined` when no header carries one.
|
|
@@ -146,4 +167,4 @@ function ensureWatermarkHeaderCoverage(doc, watermark) {
|
|
|
146
167
|
};
|
|
147
168
|
}
|
|
148
169
|
//#endregion
|
|
149
|
-
export { ensureWatermarkHeaderCoverage, getDocumentWatermark, setDocumentWatermark };
|
|
170
|
+
export { ensureWatermarkHeaderCoverage, getDocumentWatermark, isAllowedExternalWatermarkImageUrl, setDocumentWatermark };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stll/folio-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Headless, framework-neutral core of folio: the OOXML (.docx) parser, document model, ProseMirror integration, and page-layout engine. No React.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"document-model",
|
|
@@ -107,11 +107,12 @@
|
|
|
107
107
|
"perf": "bun scripts/profile-editor.ts"
|
|
108
108
|
},
|
|
109
109
|
"dependencies": {
|
|
110
|
-
"@stll/docx-core": "^0.
|
|
110
|
+
"@stll/docx-core": "^0.4.0",
|
|
111
111
|
"@stll/docx-utils": "^0.1.0",
|
|
112
112
|
"@stll/template-conditions": "^0.1.0",
|
|
113
113
|
"better-result": "2.9.2",
|
|
114
114
|
"csstype": "^3.1.3",
|
|
115
|
+
"dompurify": "^3.4.12",
|
|
115
116
|
"fast-xml-parser": "^5.9.3",
|
|
116
117
|
"hyphen": "1.14.1",
|
|
117
118
|
"jszip": "3.10.1",
|