@superdoc/mcp 1.5.0-next.4 → 1.5.0-next.6

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.
Files changed (2) hide show
  1. package/dist/index.js +946 -753
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -31443,7 +31443,7 @@ var init_host = __esm(() => {
31443
31443
  });
31444
31444
 
31445
31445
  // ../../packages/sdk/langs/node/src/runtime/sdk-version.generated.ts
31446
- var SDK_VERSION = "2.18.0-next.4";
31446
+ var SDK_VERSION = "2.18.0-next.6";
31447
31447
 
31448
31448
  // ../../packages/sdk/langs/node/src/runtime/embedded-platform.ts
31449
31449
  import { accessSync, chmodSync, constants, existsSync, statSync } from "node:fs";
@@ -164868,6 +164868,39 @@ function stripParagraphPropertyChange(pPrXml) {
164868
164868
  const stripped = pPrXml.slice(0, open.index) + pPrXml.slice(end);
164869
164869
  return /^<([\w.-]+):pPr\b[^>]*>\s*<\/\1:pPr>$/.test(stripped.trim()) ? "" : stripped;
164870
164870
  }
164871
+ function replaceDirectParagraphStyleId(pPrXml, newStyleId) {
164872
+ const pPr = readValidatedXmlNodeAt(pPrXml, 0);
164873
+ if (!pPr || pPr.kind !== "element" || xmlLocalName(pPr.qname) !== "pPr" || pPr.selfClosing) {
164874
+ return pPrXml;
164875
+ }
164876
+ let cursor = pPr.openEnd;
164877
+ while (cursor < pPr.closeStart) {
164878
+ const childStart = pPrXml.indexOf("<", cursor);
164879
+ if (childStart < 0 || childStart >= pPr.closeStart)
164880
+ return pPrXml;
164881
+ const child = readValidatedXmlNodeAt(pPrXml, childStart);
164882
+ if (!child || child.end > pPr.closeStart)
164883
+ return pPrXml;
164884
+ if (child.kind === "element" && xmlLocalName(child.qname) === "pStyle") {
164885
+ const openTag = pPrXml.slice(childStart, child.openEnd);
164886
+ let valAttr;
164887
+ for (const attribute of scanRawXmlAttributes(openTag)) {
164888
+ if (attribute.name === "xmlns" || attribute.prefix === "xmlns")
164889
+ continue;
164890
+ if (attribute.localName === "val") {
164891
+ valAttr = attribute;
164892
+ break;
164893
+ }
164894
+ }
164895
+ if (!valAttr)
164896
+ return pPrXml;
164897
+ const rewrittenOpenTag = openTag.slice(0, valAttr.valueStart) + escapeXmlAttribute(newStyleId) + openTag.slice(valAttr.valueEnd);
164898
+ return pPrXml.slice(0, childStart) + rewrittenOpenTag + pPrXml.slice(child.openEnd);
164899
+ }
164900
+ cursor = child.end;
164901
+ }
164902
+ return pPrXml;
164903
+ }
164871
164904
  function stripParagraphMarkRevisionMarkers(pPrXml, inheritedNamespaceBindings = {}) {
164872
164905
  if (!pPrXml)
164873
164906
  return pPrXml;
@@ -214889,7 +214922,7 @@ function sliceParagraphContentAt(input) {
214889
214922
  const plan = planCut(map3.pieces, regionStart, input, map3.pieces);
214890
214923
  if (plan.kind === "reject")
214891
214924
  return { ok: false, reason: plan.reason };
214892
- return assembleHalves(src, regionStart, regionEnd, plan);
214925
+ return { ...assembleHalves(src, regionStart, regionEnd, plan), terminal: input.offset === total };
214893
214926
  }
214894
214927
  function pieceStart(piece, input, rootPieces) {
214895
214928
  const base2 = input.space === "tracked" ? piece.trackedStart : piece.visibleStart;
@@ -215869,6 +215902,566 @@ var init_paragraph_drawing_delete = __esm(() => {
215869
215902
  init_tracked_paragraph_content();
215870
215903
  });
215871
215904
 
215905
+ // ../../../v2/editor-core/dist/document/transactions/insertion-formatting-context.js
215906
+ function resolveInsertionFormattingContext(state, input) {
215907
+ const inheritance = input.inheritance ?? "anchor";
215908
+ const numberingProperties = input.numberingProperties ?? null;
215909
+ const paragraphXml = input.anchor ? readAnchorParagraphXml(state, input.anchor.entry) : null;
215910
+ if (input.anchor && paragraphXml == null && !input.styleRef) {
215911
+ return { ok: false, reason: "paragraph-target-not-found" };
215912
+ }
215913
+ const style = resolveInsertionStyle(state, paragraphXml, input.anchor, input.styleRef, inheritance, input.fallbackToDocumentDefaultStyle ?? false);
215914
+ if (!style.ok)
215915
+ return style;
215916
+ const direct = inheritance === "anchor" && paragraphXml != null ? resolveDirectInsertionFormatting(paragraphXml, input.anchor.placement, readAnchorNamespaceBindings(state, input.anchor.entry)) : {
215917
+ paragraphPropertiesXml: null,
215918
+ paragraphMarkRunPropertiesXml: null,
215919
+ runPropertiesXml: null,
215920
+ skippedReason: directFormattingSkippedReason(inheritance)
215921
+ };
215922
+ if ("reason" in direct)
215923
+ return direct;
215924
+ const paragraphPropertiesXml = composeParagraphPropertiesXml({
215925
+ styleId: style.styleId,
215926
+ numberingProperties,
215927
+ inheritedParagraphPropertiesXml: direct.paragraphPropertiesXml
215928
+ });
215929
+ return {
215930
+ ok: true,
215931
+ context: {
215932
+ styleId: style.styleId,
215933
+ numberingProperties,
215934
+ paragraphPropertiesXml,
215935
+ runPropertiesXml: direct.runPropertiesXml,
215936
+ provenance: {
215937
+ inheritedParagraphProperties: direct.paragraphPropertiesXml != null,
215938
+ inheritedParagraphMarkProperties: direct.paragraphMarkRunPropertiesXml != null,
215939
+ inheritedRunProperties: direct.runPropertiesXml != null,
215940
+ explicitStyleOverride: Boolean(input.styleRef),
215941
+ explicitNumberingOverride: numberingProperties != null,
215942
+ ...direct.skippedReason ? { skippedReason: direct.skippedReason } : {}
215943
+ }
215944
+ }
215945
+ };
215946
+ }
215947
+ function directFormattingSkippedReason(inheritance) {
215948
+ if (inheritance === "style")
215949
+ return "direct-inheritance-disabled";
215950
+ if (inheritance === "none")
215951
+ return "inheritance-disabled";
215952
+ return "no-anchor";
215953
+ }
215954
+ function readAnchorParagraphXml(state, entry) {
215955
+ const bytes = state.packageBytes.get(entry.partUri);
215956
+ if (!bytes)
215957
+ return null;
215958
+ if (entry.byteEnd <= entry.byteStart)
215959
+ return "";
215960
+ return TD51.decode(bytes.subarray(entry.byteStart, entry.byteEnd));
215961
+ }
215962
+ function readAnchorNamespaceBindings(state, entry) {
215963
+ const mainOverlay = state.mainStorySourceOverlay;
215964
+ if (entry.directBodyChildOrdinal != null && mainOverlay?.partUri === entry.partUri && mainOverlay.storyId === entry.storyId) {
215965
+ return mainOverlay.rootNamespaceBindings;
215966
+ }
215967
+ const bytes = state.packageBytes.get(entry.partUri);
215968
+ return bytes ? namespaceBindingsAtPosition(bytes, entry.byteStart) : {};
215969
+ }
215970
+ function resolveInsertionStyle(state, anchorParagraphXml, anchor, explicitStyleRef, inheritance, fallbackToDocumentDefaultStyle) {
215971
+ if (explicitStyleRef)
215972
+ return { ok: true, styleId: explicitStyleRef };
215973
+ if (!anchor || inheritance === "none") {
215974
+ return {
215975
+ ok: true,
215976
+ styleId: fallbackToDocumentDefaultStyle ? resolveDefaultParagraphStyleId(state) : null
215977
+ };
215978
+ }
215979
+ if (anchorParagraphXml == null)
215980
+ return { ok: false, reason: "paragraph-target-not-found" };
215981
+ const paragraphStyle = readDirectParagraphStyleId(anchorParagraphXml);
215982
+ if (paragraphStyle.presence === "malformed") {
215983
+ return { ok: false, reason: "paragraph-style-ambiguous" };
215984
+ }
215985
+ const targetStyle = paragraphStyle.styleId;
215986
+ if (anchor.placement === "after" && targetStyle) {
215987
+ const next = lookupNextStyle(state, targetStyle);
215988
+ if (!next.ok)
215989
+ return next;
215990
+ if (next.styleId)
215991
+ return { ok: true, styleId: next.styleId };
215992
+ }
215993
+ if (targetStyle)
215994
+ return { ok: true, styleId: targetStyle };
215995
+ return {
215996
+ ok: true,
215997
+ styleId: fallbackToDocumentDefaultStyle ? resolveDefaultParagraphStyleId(state) : null
215998
+ };
215999
+ }
216000
+ function resolveDefaultParagraphStyleId(state) {
216001
+ const defaultStyle = resolveDefaultParagraphStyle(state);
216002
+ return defaultStyle.ok ? defaultStyle.styleId ?? "Normal" : "Normal";
216003
+ }
216004
+ function resolveDefaultParagraphStyle(state) {
216005
+ const inspection = inspectStyleDefinitionsPartUriFromState(state);
216006
+ if (!inspection.valid)
216007
+ return { ok: true, styleId: null };
216008
+ const bytes = inspection.partUri ? ensurePackagePartBytes(state, inspection.partUri) : null;
216009
+ if (!bytes)
216010
+ return { ok: true, styleId: null };
216011
+ const xml = TD51.decode(bytes);
216012
+ const namespaceUri = inspectStyleDefinitionsXmlDialect(xml);
216013
+ if (!namespaceUri)
216014
+ return { ok: true, styleId: null };
216015
+ let depth = 0;
216016
+ const defaults = [];
216017
+ let valid = true;
216018
+ const parsed = walkXmlElements(xml, {
216019
+ onOpenTag({ tag }) {
216020
+ depth += 1;
216021
+ if (depth !== 2 || tag.namespaceUri !== namespaceUri || tag.localName !== "style")
216022
+ return;
216023
+ if (readWordAttribute2(tag, namespaceUri, "type") !== "paragraph" || !["1", "true", "on"].includes(readWordAttribute2(tag, namespaceUri, "default") ?? ""))
216024
+ return;
216025
+ const id = readWordAttribute2(tag, namespaceUri, "styleId");
216026
+ if (!id)
216027
+ valid = false;
216028
+ else
216029
+ defaults.push(id);
216030
+ },
216031
+ onCloseTag() {
216032
+ depth -= 1;
216033
+ }
216034
+ });
216035
+ if (!valid || parsed.errors.length || defaults.length > 1)
216036
+ return { ok: true, styleId: null };
216037
+ return { ok: true, styleId: defaults[0] ?? null };
216038
+ }
216039
+ function lookupNextStyle(state, styleId) {
216040
+ const inspection = inspectStyleDefinitionsPartUriFromState(state);
216041
+ if (!inspection.valid)
216042
+ return { ok: false, reason: "paragraph-style-ambiguous" };
216043
+ const stylesBytes = inspection.partUri ? ensurePackagePartBytes(state, inspection.partUri) : null;
216044
+ if (!stylesBytes)
216045
+ return { ok: true, styleId: null };
216046
+ const xml = TD51.decode(stylesBytes);
216047
+ const namespaceUri = inspectStyleDefinitionsXmlDialect(xml);
216048
+ if (!namespaceUri)
216049
+ return { ok: false, reason: "paragraph-style-ambiguous" };
216050
+ let depth = 0;
216051
+ let targetStyleDepth = -1;
216052
+ let foundTargetStyle = false;
216053
+ let nextStyleId = null;
216054
+ const parsed = walkXmlElements(xml, {
216055
+ onOpenTag({ tag }) {
216056
+ depth += 1;
216057
+ if (!foundTargetStyle && depth === 2 && tag.namespaceUri === namespaceUri && tag.localName === "style" && readWordAttribute2(tag, namespaceUri, "styleId") === styleId) {
216058
+ foundTargetStyle = true;
216059
+ targetStyleDepth = depth;
216060
+ return;
216061
+ }
216062
+ if (targetStyleDepth >= 0 && depth === targetStyleDepth + 1 && tag.namespaceUri === namespaceUri && tag.localName === "next") {
216063
+ nextStyleId = readWordAttribute2(tag, namespaceUri, "val") ?? null;
216064
+ }
216065
+ },
216066
+ onCloseTag({ tag }) {
216067
+ if (depth === targetStyleDepth && tag.localName === "style")
216068
+ targetStyleDepth = -1;
216069
+ depth -= 1;
216070
+ }
216071
+ });
216072
+ if (parsed.errors.length > 0)
216073
+ return { ok: false, reason: "paragraph-style-ambiguous" };
216074
+ return { ok: true, styleId: nextStyleId };
216075
+ }
216076
+ function readWordAttribute2(tag, namespaceUri, localName2) {
216077
+ return readXmlAttribute(tag, namespaceUri, localName2)?.value;
216078
+ }
216079
+ function resolveDirectInsertionFormatting(paragraphXml, placement2, inheritedNamespaceBindings = {}) {
216080
+ const paragraphPropertiesXml = cloneDirectParagraphPropertiesForInsert(paragraphXml);
216081
+ const paragraphMarkRunPropertiesXml = cloneParagraphMarkRunPropertiesForInsert(paragraphXml);
216082
+ const adjacentRunProperties = cloneAdjacentRunPropertiesForInsert(paragraphXml, placement2, paragraphMarkRunPropertiesXml, inheritedNamespaceBindings);
216083
+ if (!adjacentRunProperties.ok)
216084
+ return adjacentRunProperties;
216085
+ const runPropertiesXml = adjacentRunProperties.runPropertiesXml;
216086
+ return {
216087
+ paragraphPropertiesXml,
216088
+ paragraphMarkRunPropertiesXml,
216089
+ runPropertiesXml,
216090
+ ...!paragraphPropertiesXml && !runPropertiesXml ? { skippedReason: "no-direct-formatting" } : {}
216091
+ };
216092
+ }
216093
+ function cloneAdjacentRunPropertiesCarrierForInsertion(paragraphXml, placement2, inheritedNamespaceBindings = {}) {
216094
+ const paragraphWithoutNestedTextboxes = stripElements(paragraphXml, "txbxContent");
216095
+ const run = adjacentFormattingCarrierRun(paragraphWithoutNestedTextboxes, placement2, inheritedNamespaceBindings);
216096
+ if (!run.ok)
216097
+ return run;
216098
+ if (!run.run)
216099
+ return { ok: true, carrier: null };
216100
+ const carrierRun = run.run;
216101
+ const runPropertiesXml = readRunPropertiesXml(carrierRun.xml);
216102
+ if (!runPropertiesXml)
216103
+ return { ok: true, carrier: null };
216104
+ const namespaceSource = namespaceSourceForRunProperties(paragraphWithoutNestedTextboxes, carrierRun, runPropertiesXml, inheritedNamespaceBindings);
216105
+ if (!namespaceSource)
216106
+ return { ok: true, carrier: null };
216107
+ const { openTag: namespaceSourceOpenTag, hasParagraphRootMarkupCompatibilityAttributes, hasInheritedMarkupCompatibilityAttributes, hasUnresolvedInheritedAttributeNamespaces } = namespaceSource;
216108
+ const hasForeignRevisionLikeRunProperties = runPropertiesContainForeignRevisionLikeElement(runPropertiesXml, namespaceSourceOpenTag);
216109
+ if (hasForeignRevisionLikeRunProperties == null)
216110
+ return { ok: true, carrier: null };
216111
+ if (hasForeignRevisionLikeRunProperties) {
216112
+ return {
216113
+ ok: true,
216114
+ carrier: {
216115
+ runPropertiesXml,
216116
+ namespaceSourceOpenTag,
216117
+ hasForeignRevisionLikeRunProperties,
216118
+ hasNonWordMarkup: runPropertiesContainNonWordMarkup(runPropertiesXml, namespaceSourceOpenTag),
216119
+ hasParagraphRootMarkupCompatibilityAttributes,
216120
+ hasInheritedMarkupCompatibilityAttributes,
216121
+ hasUnresolvedInheritedAttributeNamespaces
216122
+ }
216123
+ };
216124
+ }
216125
+ const normalizedRunProperties = normalizeClonedRunProperties(runPropertiesXml);
216126
+ const normalizedRunPropertiesXml = normalizedRunProperties && carrierRun.insideHyperlink ? stripHyperlinkRunStyle(normalizedRunProperties, namespaceSourceOpenTag) : normalizedRunProperties;
216127
+ return {
216128
+ ok: true,
216129
+ carrier: normalizedRunPropertiesXml ? {
216130
+ runPropertiesXml: normalizedRunPropertiesXml,
216131
+ namespaceSourceOpenTag,
216132
+ hasForeignRevisionLikeRunProperties: false,
216133
+ hasNonWordMarkup: runPropertiesContainNonWordMarkup(normalizedRunPropertiesXml, namespaceSourceOpenTag),
216134
+ hasParagraphRootMarkupCompatibilityAttributes,
216135
+ hasInheritedMarkupCompatibilityAttributes,
216136
+ hasUnresolvedInheritedAttributeNamespaces
216137
+ } : null
216138
+ };
216139
+ }
216140
+ function cloneDirectParagraphPropertiesForInsert(paraXml) {
216141
+ const inner = paragraphInnerXml(paraXml);
216142
+ if (inner == null)
216143
+ return null;
216144
+ const { pPr } = splitLeadingParagraphPropertyBlock(inner);
216145
+ if (!pPr)
216146
+ return null;
216147
+ let direct = stripParagraphPropertyChange(pPr);
216148
+ if (!direct)
216149
+ return null;
216150
+ for (const localName2 of ["pStyle", "numPr", "sectPr"]) {
216151
+ direct = stripElements(direct, localName2);
216152
+ }
216153
+ direct = replaceParagraphMarkRunProperties(direct);
216154
+ return paragraphPropertiesXmlIsEmpty(direct) ? null : direct;
216155
+ }
216156
+ function replaceParagraphMarkRunProperties(pPrXml) {
216157
+ const markProperties = extractParagraphMarkRunProperties(pPrXml);
216158
+ if (markProperties == null)
216159
+ return stripElements(pPrXml, "rPr");
216160
+ const span = topLevelMarkRPrSpan(pPrXml);
216161
+ if (!span)
216162
+ return pPrXml;
216163
+ return pPrXml.slice(0, span.start) + markProperties + pPrXml.slice(span.end);
216164
+ }
216165
+ function topLevelMarkRPrSpan(pPrXml) {
216166
+ const changeOffset = pPrXml.search(/<[\w.-]+:pPrChange\b/);
216167
+ const limit = changeOffset >= 0 ? changeOffset : pPrXml.length;
216168
+ const openOffset = pPrXml.search(/<[\w.-]+:rPr\b/);
216169
+ if (openOffset < 0 || openOffset >= limit)
216170
+ return null;
216171
+ const span = matchLeadingElement(pPrXml.slice(openOffset), "rPr");
216172
+ if (!span)
216173
+ return null;
216174
+ return { start: openOffset, end: openOffset + span.length };
216175
+ }
216176
+ function cloneAdjacentRunPropertiesForInsert(paraXml, placement2, paragraphMarkRunPropertiesXml, inheritedNamespaceBindings = {}) {
216177
+ const carrierResult = cloneAdjacentRunPropertiesCarrierForInsertion(paraXml, placement2, inheritedNamespaceBindings);
216178
+ if (!carrierResult.ok)
216179
+ return carrierResult;
216180
+ const carrier = carrierResult.carrier;
216181
+ if (!carrier) {
216182
+ return {
216183
+ ok: true,
216184
+ runPropertiesXml: paragraphMarkRunPropertiesXml || null
216185
+ };
216186
+ }
216187
+ if (carrier.hasForeignRevisionLikeRunProperties || carrier.hasInheritedMarkupCompatibilityAttributes && carrier.hasNonWordMarkup !== false || carrier.hasUnresolvedInheritedAttributeNamespaces) {
216188
+ return { ok: false, reason: "unsupported-context" };
216189
+ }
216190
+ if (carrier.hasParagraphRootMarkupCompatibilityAttributes && carrier.hasNonWordMarkup !== false) {
216191
+ return { ok: false, reason: "unsupported-context" };
216192
+ }
216193
+ const runPropertiesXml = namespaceCloseRunPropertiesForRelocation(carrier.runPropertiesXml, carrier.namespaceSourceOpenTag, inheritedNamespaceBindings);
216194
+ if (!runPropertiesXml)
216195
+ return { ok: false, reason: "unsupported-context" };
216196
+ return {
216197
+ ok: true,
216198
+ runPropertiesXml
216199
+ };
216200
+ }
216201
+ function adjacentFormattingCarrierRun(paragraphXml, placement2, inheritedNamespaceBindings = {}) {
216202
+ const paragraphPrefix = /^<(?:(?<prefix>[\w.-]+):)?p\b/.exec(paragraphXml)?.groups?.prefix ?? "";
216203
+ const additionalNamespaces = xmlFragmentAdditionalNamespaces(paragraphXml, new Map(Object.entries(inheritedNamespaceBindings)), { w: NS_W, [paragraphPrefix]: NS_W });
216204
+ const parsed = collectXmlElementRanges(paragraphXml, { additionalNamespaces });
216205
+ if (parsed.errors.length > 0)
216206
+ return { ok: true, run: undefined };
216207
+ const carrier = adjacentFormattingCarrierPiece(parseParagraphInlineMap(paragraphXml, inheritedNamespaceBindings).pieces, placement2);
216208
+ if (!carrier.ok)
216209
+ return carrier;
216210
+ const carrierPiece = carrier.piece;
216211
+ if (!carrierPiece)
216212
+ return { ok: true, run: undefined };
216213
+ const payloadLocalName = carrierPiece.kind === "text" ? "t" : carrierPiece.control;
216214
+ const run = parsed.ranges.find((range) => range.start === carrierPiece.runCharStart && range.end === carrierPiece.runCharEnd && range.tag.namespaceUri === NS_W && range.tag.localName === "r");
216215
+ const payload = parsed.ranges.find((range) => range.start === carrierPiece.charStart && range.end === carrierPiece.charEnd && range.tag.namespaceUri === NS_W && range.tag.localName === payloadLocalName);
216216
+ if (!run || !payload)
216217
+ return { ok: true, run: undefined };
216218
+ const hyperlinkRanges = parsed.ranges.filter((range) => range.tag.namespaceUri === NS_W && range.tag.localName === "hyperlink");
216219
+ return {
216220
+ ok: true,
216221
+ run: {
216222
+ start: run.start,
216223
+ end: run.end,
216224
+ xml: paragraphXml.slice(run.start, run.end),
216225
+ insideHyperlink: hyperlinkRanges.some((hyperlink) => hyperlink.start < run.start && run.end <= hyperlink.end)
216226
+ }
216227
+ };
216228
+ }
216229
+ function adjacentFormattingCarrierPiece(pieces, placement2) {
216230
+ const candidates = placement2 === "before" ? pieces : [...pieces].reverse();
216231
+ for (const piece of candidates) {
216232
+ if (piece.kind === "marker")
216233
+ continue;
216234
+ if (piece.kind === "text") {
216235
+ if (piece.textRole === "visible")
216236
+ return { ok: true, piece };
216237
+ continue;
216238
+ }
216239
+ if (piece.kind === "control") {
216240
+ if (!piece.deleted)
216241
+ return { ok: true, piece };
216242
+ continue;
216243
+ }
216244
+ if (piece.kind === "tracked") {
216245
+ if (piece.removesVisible)
216246
+ continue;
216247
+ const nested = adjacentFormattingCarrierPiece(piece.children, placement2);
216248
+ if (!nested.ok || nested.piece)
216249
+ return nested;
216250
+ if (piece.visibleStart === piece.visibleEnd)
216251
+ continue;
216252
+ return { ok: true, piece: undefined };
216253
+ }
216254
+ if (piece.kind === "container") {
216255
+ if (piece.policy === "fail-closed")
216256
+ return { ok: false, reason: "unsupported-context" };
216257
+ if (piece.policy === "atomic") {
216258
+ if (piece.containerKind === "math")
216259
+ return { ok: true, piece: undefined };
216260
+ continue;
216261
+ }
216262
+ const nested = adjacentFormattingCarrierPiece(piece.children, placement2);
216263
+ if (!nested.ok || nested.piece)
216264
+ return nested;
216265
+ if (piece.visibleStart === piece.visibleEnd)
216266
+ continue;
216267
+ return { ok: true, piece: undefined };
216268
+ }
216269
+ if (piece.kind === "noteReference") {
216270
+ continue;
216271
+ }
216272
+ return { ok: true, piece: undefined };
216273
+ }
216274
+ return { ok: true, piece: undefined };
216275
+ }
216276
+ function runPropertiesContainForeignRevisionLikeElement(rPrXml, namespaceSourceOpenTag) {
216277
+ const runPropertiesNode = readXmlNodeAt(rPrXml, 0);
216278
+ if (!runPropertiesNode || runPropertiesNode.kind !== "element" || runPropertiesNode.selfClosing || xmlLocalName(runPropertiesNode.qname) !== "rPr" || runPropertiesNode.end !== rPrXml.length) {
216279
+ return null;
216280
+ }
216281
+ const parsedXml = namespaceSourceOpenTag + rPrXml.slice(runPropertiesNode.openEnd, runPropertiesNode.closeStart) + rPrXml.slice(runPropertiesNode.closeStart);
216282
+ const additionalNamespaces = xmlFragmentAdditionalNamespaces(parsedXml, new Map, { w: NS_W });
216283
+ const parsed = collectXmlElementRanges(parsedXml, { additionalNamespaces });
216284
+ if (parsed.errors.length > 0)
216285
+ return null;
216286
+ return parsed.ranges.some((range) => range.tag.localName === "rPrChange" && range.tag.namespaceUri !== NS_W);
216287
+ }
216288
+ function runPropertiesContainNonWordMarkup(rPrXml, namespaceSourceOpenTag) {
216289
+ const runPropertiesNode = readXmlNodeAt(rPrXml, 0);
216290
+ if (!runPropertiesNode || runPropertiesNode.kind !== "element" || runPropertiesNode.selfClosing || xmlLocalName(runPropertiesNode.qname) !== "rPr" || runPropertiesNode.end !== rPrXml.length) {
216291
+ return null;
216292
+ }
216293
+ const parsedXml = namespaceSourceOpenTag + rPrXml.slice(runPropertiesNode.openEnd, runPropertiesNode.closeStart) + rPrXml.slice(runPropertiesNode.closeStart);
216294
+ const additionalNamespaces = xmlFragmentAdditionalNamespaces(parsedXml, new Map, { w: NS_W });
216295
+ const parsed = collectXmlElementRanges(parsedXml, { additionalNamespaces });
216296
+ if (parsed.errors.length > 0)
216297
+ return null;
216298
+ return parsed.ranges.some((range) => range.tag.namespaceUri !== NS_W || range.tag.attributes.some((attribute) => attribute.prefix !== "xmlns" && attribute.name !== "xmlns" && attribute.namespaceUri !== "" && attribute.namespaceUri !== NS_W && attribute.namespaceUri !== NS_XML));
216299
+ }
216300
+ function stripHyperlinkRunStyle(rPrXml, namespaceSourceOpenTag) {
216301
+ const runPropertiesNode = readXmlNodeAt(rPrXml, 0);
216302
+ if (!runPropertiesNode || runPropertiesNode.kind !== "element" || runPropertiesNode.selfClosing || xmlLocalName(runPropertiesNode.qname) !== "rPr" || runPropertiesNode.end !== rPrXml.length) {
216303
+ return null;
216304
+ }
216305
+ const parsedXml = namespaceSourceOpenTag + rPrXml.slice(runPropertiesNode.openEnd, runPropertiesNode.closeStart) + rPrXml.slice(runPropertiesNode.closeStart);
216306
+ const additionalNamespaces = xmlFragmentAdditionalNamespaces(parsedXml, new Map, { w: NS_W });
216307
+ const parsed = collectXmlElementRanges(parsedXml, { additionalNamespaces });
216308
+ if (parsed.errors.length > 0)
216309
+ return null;
216310
+ const openTagDelta = namespaceSourceOpenTag.length - runPropertiesNode.openEnd;
216311
+ const styleSpans = parsed.ranges.filter((range) => range.tag.namespaceUri === NS_W && range.tag.localName === "rStyle" && readXmlAttribute(range.tag, NS_W, "val")?.value === "Hyperlink").map((range) => ({ start: range.start - openTagDelta, end: range.end - openTagDelta })).filter((range) => range.start >= runPropertiesNode.openEnd && range.end <= runPropertiesNode.closeStart).sort((left, right) => right.start - left.start);
216312
+ let stripped = rPrXml;
216313
+ for (const span of styleSpans)
216314
+ stripped = stripped.slice(0, span.start) + stripped.slice(span.end);
216315
+ return runPropertiesXmlIsEmpty(stripped) ? null : stripped;
216316
+ }
216317
+ function namespaceSourceForRunProperties(paragraphXml, run, runPropertiesXml, inheritedNamespaceBindings) {
216318
+ const runProperties = findFirstElement(run.xml, "rPr");
216319
+ const runPropertiesNode = readXmlNodeAt(runPropertiesXml, 0);
216320
+ if (!runProperties || !runPropertiesNode || runPropertiesNode.kind !== "element" || xmlLocalName(runPropertiesNode.qname) !== "rPr") {
216321
+ return null;
216322
+ }
216323
+ const runPropertiesOpenTag = runPropertiesXml.slice(0, runPropertiesNode.openEnd);
216324
+ const targetStart = run.start + runProperties.start;
216325
+ const inheritedScopes = [];
216326
+ const inheritedCompatibilityScopes = [];
216327
+ const unresolvedInheritedAttributeScopes = [];
216328
+ const compatibilityStack = [];
216329
+ const unresolvedAttributeStack = [];
216330
+ let hasParagraphRootMarkupCompatibilityAttributes = false;
216331
+ const additionalNamespaces = xmlFragmentAdditionalNamespaces(paragraphXml, new Map(Object.entries(inheritedNamespaceBindings)), { w: NS_W });
216332
+ const parsed = walkXmlElements(paragraphXml, {
216333
+ additionalNamespaces,
216334
+ onOpenTag(event) {
216335
+ const parentHasCompatibilityAttributes = compatibilityStack.at(-1) ?? false;
216336
+ const parentHasUnresolvedAttributeNamespaces = unresolvedAttributeStack.at(-1) ?? false;
216337
+ if (event.start === targetStart && event.tag.namespaceUri === NS_W && event.tag.localName === "rPr") {
216338
+ const inherited = { ...event.namespaceBindings };
216339
+ for (const prefix of Object.keys(event.tag.namespaceBindings))
216340
+ delete inherited[prefix];
216341
+ inheritedScopes.push(inherited);
216342
+ inheritedCompatibilityScopes.push(parentHasCompatibilityAttributes);
216343
+ unresolvedInheritedAttributeScopes.push(parentHasUnresolvedAttributeNamespaces);
216344
+ }
216345
+ const isParagraphRoot = event.start === 0 && event.tag.namespaceUri === NS_W && event.tag.localName === "p";
216346
+ if (isParagraphRoot) {
216347
+ hasParagraphRootMarkupCompatibilityAttributes = event.tag.attributes.some((attribute) => attribute.namespaceUri === NS_MC);
216348
+ }
216349
+ const hasLocalCompatibilityAttributes = !isParagraphRoot && event.tag.attributes.some((attribute) => attribute.namespaceUri === NS_MC);
216350
+ compatibilityStack.push(parentHasCompatibilityAttributes || hasLocalCompatibilityAttributes);
216351
+ const hasUnresolvedAttributeNamespaces = event.tag.attributes.some((attribute) => attribute.namespaceUri.startsWith("urn:superdoc:unresolved-namespace-prefix:"));
216352
+ unresolvedAttributeStack.push(parentHasUnresolvedAttributeNamespaces || hasUnresolvedAttributeNamespaces);
216353
+ },
216354
+ onCloseTag() {
216355
+ compatibilityStack.pop();
216356
+ unresolvedAttributeStack.pop();
216357
+ }
216358
+ });
216359
+ const inheritedBindings = inheritedScopes[0];
216360
+ const hasInheritedMarkupCompatibilityAttributes = inheritedCompatibilityScopes[0];
216361
+ const hasUnresolvedInheritedAttributeNamespaces = unresolvedInheritedAttributeScopes[0];
216362
+ if (parsed.errors.length > 0 || !inheritedBindings || hasInheritedMarkupCompatibilityAttributes == null || hasUnresolvedInheritedAttributeNamespaces == null) {
216363
+ return null;
216364
+ }
216365
+ let declarations = "";
216366
+ for (const [prefix, namespaceUri] of Object.entries(inheritedBindings)) {
216367
+ if (prefix === "xml")
216368
+ continue;
216369
+ declarations += prefix.length > 0 ? ` xmlns:${prefix}="${escapeXmlAttribute(namespaceUri)}"` : ` xmlns="${escapeXmlAttribute(namespaceUri)}"`;
216370
+ }
216371
+ return {
216372
+ openTag: declarations.length > 0 ? runPropertiesOpenTag.replace(/>$/, `${declarations}>`) : runPropertiesOpenTag,
216373
+ hasParagraphRootMarkupCompatibilityAttributes,
216374
+ hasInheritedMarkupCompatibilityAttributes,
216375
+ hasUnresolvedInheritedAttributeNamespaces
216376
+ };
216377
+ }
216378
+ function readRunPropertiesXml(runXml) {
216379
+ const inner = runInnerXml(runXml);
216380
+ if (inner == null)
216381
+ return null;
216382
+ const leading = /^\s*/.exec(inner)?.[0] ?? "";
216383
+ const rPrXml = matchLeadingElement(inner.slice(leading.length), "rPr");
216384
+ return rPrXml || null;
216385
+ }
216386
+ function cloneParagraphMarkRunPropertiesForInsert(paraXml) {
216387
+ const inner = paragraphInnerXml(paraXml);
216388
+ if (inner == null)
216389
+ return null;
216390
+ const { pPr } = splitLeadingParagraphPropertyBlock(inner);
216391
+ if (!pPr)
216392
+ return null;
216393
+ const markProperties = extractParagraphMarkRunProperties(stripParagraphPropertyChange(pPr));
216394
+ return markProperties && !runPropertiesXmlIsEmpty(markProperties) ? markProperties : null;
216395
+ }
216396
+ function normalizeClonedRunProperties(rPrXml) {
216397
+ const stripped = stripElements(rPrXml, "rPrChange");
216398
+ return runPropertiesXmlIsEmpty(stripped) ? null : stripped;
216399
+ }
216400
+ function paragraphInnerXml(paraXml) {
216401
+ const openTag = /^<[\w.-]+:p\b[^>]*>/.exec(paraXml)?.[0];
216402
+ const closeTag = /<\/[\w.-]+:p>\s*$/.exec(paraXml)?.[0];
216403
+ if (!openTag || !closeTag)
216404
+ return null;
216405
+ return paraXml.slice(openTag.length, paraXml.length - closeTag.length);
216406
+ }
216407
+ function runInnerXml(runXml) {
216408
+ const openTag = /^<[\w.-]+:r\b[^>]*>/.exec(runXml)?.[0];
216409
+ const closeTag = /<\/[\w.-]+:r>\s*$/.exec(runXml)?.[0];
216410
+ if (!openTag || !closeTag)
216411
+ return null;
216412
+ return runXml.slice(openTag.length, runXml.length - closeTag.length);
216413
+ }
216414
+ function composeParagraphPropertiesXml(input) {
216415
+ const explicit = renderParagraphProperties2(input.styleId, input.numberingProperties);
216416
+ const explicitChildren = paragraphPropertiesChildrenXml(explicit);
216417
+ const inheritedChildren = paragraphPropertiesChildrenXml(input.inheritedParagraphPropertiesXml);
216418
+ const children = `${explicitChildren}${inheritedChildren}`;
216419
+ const namespaceAttrs = paragraphPropertiesNamespaceAttrs(input.inheritedParagraphPropertiesXml);
216420
+ return children.trim().length > 0 ? `<w:pPr${namespaceAttrs}>${children}</w:pPr>` : null;
216421
+ }
216422
+ function paragraphPropertiesChildrenXml(pPrXml) {
216423
+ if (!pPrXml)
216424
+ return "";
216425
+ const trimmed = pPrXml.trim();
216426
+ const selfClosing = /^<[\w.-]+:pPr\b[^>]*\/>$/.exec(trimmed);
216427
+ if (selfClosing)
216428
+ return "";
216429
+ const open = /^<[\w.-]+:pPr\b[^>]*>/.exec(trimmed)?.[0];
216430
+ const close = /<\/[\w.-]+:pPr>\s*$/.exec(trimmed)?.[0];
216431
+ if (!open || !close)
216432
+ return "";
216433
+ return trimmed.slice(open.length, trimmed.length - close.length);
216434
+ }
216435
+ function paragraphPropertiesNamespaceAttrs(pPrXml) {
216436
+ if (!pPrXml)
216437
+ return "";
216438
+ const trimmed = pPrXml.trim();
216439
+ const openAttrs = /^<[\w.-]+:pPr\b([^>]*)\/?>/.exec(trimmed)?.[1] ?? "";
216440
+ return openAttrs.match(/\s+xmlns(?::[\w.-]+)?=(?:"[^"]*"|'[^']*')/g)?.join("") ?? "";
216441
+ }
216442
+ function paragraphPropertiesXmlIsEmpty(pPrXml) {
216443
+ const trimmed = pPrXml.trim();
216444
+ return /^<[\w.-]+:pPr\b[^>]*\/>$/.test(trimmed) || /^<([\w.-]+):pPr\b[^>]*>\s*<\/\1:pPr>$/.test(trimmed);
216445
+ }
216446
+ function runPropertiesXmlIsEmpty(rPrXml) {
216447
+ const trimmed = rPrXml.trim();
216448
+ return /^<[\w.-]+:rPr\b[^>]*\/>$/.test(trimmed) || /^<([\w.-]+):rPr\b[^>]*>\s*<\/\1:rPr>$/.test(trimmed);
216449
+ }
216450
+ var TD51;
216451
+ var init_insertion_formatting_context = __esm(() => {
216452
+ init_sd_document_state();
216453
+ init_style_definitions_part();
216454
+ init_style_definitions_xml();
216455
+ init_paragraph_inline_model();
216456
+ init_xml_text();
216457
+ init_xml_sax();
216458
+ init_paragraph_contribution();
216459
+ init_direct_paragraph_list_properties();
216460
+ init_paragraph_property_block();
216461
+ init_paragraph_para_id_attrs();
216462
+ TD51 = new TextDecoder;
216463
+ });
216464
+
215872
216465
  // ../../../v2/editor-core/dist/document/transactions/field-paragraph-owner.js
215873
216466
  function createPackedFieldParagraphOwnerResolver(input) {
215874
216467
  if (parseXmlForError(input.xml, { namespaceAware: true }) != null) {
@@ -216250,7 +216843,7 @@ function resolveOwnerFromOpeningTag(bytes, entry) {
216250
216843
  }
216251
216844
  if (tagEnd < 0)
216252
216845
  return { resolved: false };
216253
- const tag = parseRawXmlElementTag(TD51.decode(bytes.subarray(entry.byteStart, tagEnd)));
216846
+ const tag = parseRawXmlElementTag(TD52.decode(bytes.subarray(entry.byteStart, tagEnd)));
216254
216847
  if (!tag || tag.isClose || tag.prefix !== "w" || tag.localName !== "p")
216255
216848
  return { resolved: false };
216256
216849
  const paraIds = [...scanRawXmlAttributes(tag.attrs)].filter((attribute) => attribute.localName === "paraId");
@@ -216280,13 +216873,13 @@ async function parseXmlForErrorCooperatively(xml, checkpoint) {
216280
216873
  }
216281
216874
  return !parseError;
216282
216875
  }
216283
- var TD51, XML_PARSE_CHUNK_CODE_UNITS, MAX_PARAGRAPH_OPEN_TAG_BYTES;
216876
+ var TD52, XML_PARSE_CHUNK_CODE_UNITS, MAX_PARAGRAPH_OPEN_TAG_BYTES;
216284
216877
  var init_field_paragraph_owner = __esm(() => {
216285
216878
  init_sd_document_state();
216286
216879
  init_paragraph_index();
216287
216880
  init_xml_text();
216288
216881
  init_xml_sax();
216289
- TD51 = new TextDecoder;
216882
+ TD52 = new TextDecoder;
216290
216883
  XML_PARSE_CHUNK_CODE_UNITS = 512 * 1024;
216291
216884
  MAX_PARAGRAPH_OPEN_TAG_BYTES = 64 * 1024;
216292
216885
  });
@@ -216382,7 +216975,7 @@ async function screenFieldCandidatesCooperatively(xml, checkpoint) {
216382
216975
  return false;
216383
216976
  }
216384
216977
  function buildFieldCatalog(input) {
216385
- const xml = input.sharedXml ?? TD52.decode(input.bytes);
216978
+ const xml = input.sharedXml ?? TD53.decode(input.bytes);
216386
216979
  if (!hasFieldCandidates(xml))
216387
216980
  return emptyFieldCatalog(input.storyId, input.partUri, xml.length);
216388
216981
  return buildFieldCatalogFromXml(input, xml, buildSparseFieldUtf8OffsetIndex(xml));
@@ -216873,12 +217466,12 @@ function getOrBuildFieldCatalogForStory(state, storyId) {
216873
217466
  return existing.catalog;
216874
217467
  }
216875
217468
  if (!hasFieldByteCandidates(bytes)) {
216876
- const catalog2 = emptyFieldCatalog(storyId, partUri, () => TD52.decode(bytes).length);
217469
+ const catalog2 = emptyFieldCatalog(storyId, partUri, () => TD53.decode(bytes).length);
216877
217470
  perStory.set(storyId, { catalog: catalog2, partBytes: bytes });
216878
217471
  return catalog2;
216879
217472
  }
216880
217473
  const shared = peekPartWmlScanFacts(state, partUri);
216881
- const xml = shared?.bytes === bytes ? shared.xml : DECODED_PART_IN_FLIGHT.get(bytes)?.xml ?? TD52.decode(bytes);
217474
+ const xml = shared?.bytes === bytes ? shared.xml : DECODED_PART_IN_FLIGHT.get(bytes)?.xml ?? TD53.decode(bytes);
216882
217475
  if (!hasFieldCandidates(xml)) {
216883
217476
  const catalog2 = emptyFieldCatalog(storyId, partUri, xml.length);
216884
217477
  perStory.set(storyId, { catalog: catalog2, partBytes: bytes });
@@ -216958,7 +217551,7 @@ async function buildFieldCatalogForStoryCooperatively(input) {
216958
217551
  if (decoded)
216959
217552
  decoded.users += 1;
216960
217553
  else {
216961
- decoded = { xml: TD52.decode(input.bytes), users: 1 };
217554
+ decoded = { xml: TD53.decode(input.bytes), users: 1 };
216962
217555
  DECODED_PART_IN_FLIGHT.set(input.bytes, decoded);
216963
217556
  }
216964
217557
  let syncWinner = null;
@@ -217092,7 +217685,7 @@ function listFieldCatalogsForState(state) {
217092
217685
  }
217093
217686
  return out;
217094
217687
  }
217095
- var TD52, UTF8_OFFSET_CHECKPOINT_STRIDE = 256, FIELD_CANDIDATE_BYTES, FIELD_CANDIDATE_SEARCHES, STATE_CACHE2, STATE_IN_FLIGHT, DECODED_PART_IN_FLIGHT;
217688
+ var TD53, UTF8_OFFSET_CHECKPOINT_STRIDE = 256, FIELD_CANDIDATE_BYTES, FIELD_CANDIDATE_SEARCHES, STATE_CACHE2, STATE_IN_FLIGHT, DECODED_PART_IN_FLIGHT;
217096
217689
  var init_field_catalog = __esm(() => {
217097
217690
  init_sd_document_state();
217098
217691
  init_xml_text();
@@ -217100,7 +217693,7 @@ var init_field_catalog = __esm(() => {
217100
217693
  init_wml_paragraph_spans();
217101
217694
  init_part_wml_scan_cache();
217102
217695
  init_field_paragraph_owner();
217103
- TD52 = new TextDecoder;
217696
+ TD53 = new TextDecoder;
217104
217697
  FIELD_CANDIDATE_BYTES = [["fldSimple", 3], ["fldChar", 3], ["instrText", 7]];
217105
217698
  FIELD_CANDIDATE_SEARCHES = FIELD_CANDIDATE_BYTES.map(([token, anchorOffset]) => ({
217106
217699
  token: new TextEncoder().encode(token),
@@ -217113,7 +217706,7 @@ var init_field_catalog = __esm(() => {
217113
217706
 
217114
217707
  // ../../../v2/editor-core/dist/document/transactions/range-integrity.js
217115
217708
  function isParagraphRangeMarkerGap(bytes, startByte, endByte) {
217116
- const xml = TD53.decode(bytes.subarray(startByte, endByte));
217709
+ const xml = TD54.decode(bytes.subarray(startByte, endByte));
217117
217710
  if (xml.trim() === "")
217118
217711
  return true;
217119
217712
  const offsetAt = createMonotonicUtf8OffsetResolver(xml);
@@ -217180,7 +217773,7 @@ function validateParagraphRangeIntegrity(input) {
217180
217773
  const markerWindow = selectedParagraphByteWindow(input.bytes, startEntry, endEntry);
217181
217774
  if (markerWindow) {
217182
217775
  recordSDTxPerf("rangeIntegrityBoundedMarkerBytes", markerWindow.byteLength);
217183
- if (!PAIRED_RANGE_MARKER_TAG.test(TD53.decode(markerWindow))) {
217776
+ if (!PAIRED_RANGE_MARKER_TAG.test(TD54.decode(markerWindow))) {
217184
217777
  return { ok: true, removedBookmarkNames: [] };
217185
217778
  }
217186
217779
  }
@@ -217292,7 +217885,7 @@ function createVisiblePointResolver(bytes, index) {
217292
217885
  return null;
217293
217886
  let model = models.get(entry.ordinal);
217294
217887
  if (!model) {
217295
- model = parseParagraphInlineMap(TD53.decode(bytes.subarray(entry.byteStart, entry.byteEnd)));
217888
+ model = parseParagraphInlineMap(TD54.decode(bytes.subarray(entry.byteStart, entry.byteEnd)));
217296
217889
  models.set(entry.ordinal, model);
217297
217890
  }
217298
217891
  return {
@@ -217308,7 +217901,7 @@ function comparePoints(left, right) {
217308
217901
  return left.ordinal - right.ordinal || left.offset - right.offset;
217309
217902
  }
217310
217903
  function collectPairedRangeMarkers(bytes) {
217311
- const xml = TD53.decode(bytes);
217904
+ const xml = TD54.decode(bytes);
217312
217905
  const byteOffsetAt4 = createMonotonicUtf8OffsetResolver(xml);
217313
217906
  const markers = [];
217314
217907
  const scanned = walkXmlElements(xml, {
@@ -217371,13 +217964,13 @@ function incompleteFieldAt(catalog, byteOffset) {
217371
217964
  complete: false
217372
217965
  };
217373
217966
  }
217374
- var TD53, PAIRED_RANGE_MARKER_FAMILIES, PAIRED_RANGE_MARKER_TAG;
217967
+ var TD54, PAIRED_RANGE_MARKER_FAMILIES, PAIRED_RANGE_MARKER_TAG;
217375
217968
  var init_range_integrity = __esm(() => {
217376
217969
  init_paragraph_inline_model();
217377
217970
  init_paragraph_para_id_attrs();
217378
217971
  init_xml_sax();
217379
217972
  init_field_catalog();
217380
- TD53 = new TextDecoder;
217973
+ TD54 = new TextDecoder;
217381
217974
  PAIRED_RANGE_MARKER_FAMILIES = {
217382
217975
  bookmark: "bookmark",
217383
217976
  perm: "permission",
@@ -217714,566 +218307,6 @@ var init_tracked_block_move = __esm(() => {
217714
218307
  init_moved_picture_identities();
217715
218308
  });
217716
218309
 
217717
- // ../../../v2/editor-core/dist/document/transactions/insertion-formatting-context.js
217718
- function resolveInsertionFormattingContext(state, input) {
217719
- const inheritance = input.inheritance ?? "anchor";
217720
- const numberingProperties = input.numberingProperties ?? null;
217721
- const paragraphXml = input.anchor ? readAnchorParagraphXml(state, input.anchor.entry) : null;
217722
- if (input.anchor && paragraphXml == null && !input.styleRef) {
217723
- return { ok: false, reason: "paragraph-target-not-found" };
217724
- }
217725
- const style = resolveInsertionStyle(state, paragraphXml, input.anchor, input.styleRef, inheritance, input.fallbackToDocumentDefaultStyle ?? false);
217726
- if (!style.ok)
217727
- return style;
217728
- const direct = inheritance === "anchor" && paragraphXml != null ? resolveDirectInsertionFormatting(paragraphXml, input.anchor.placement, readAnchorNamespaceBindings(state, input.anchor.entry)) : {
217729
- paragraphPropertiesXml: null,
217730
- paragraphMarkRunPropertiesXml: null,
217731
- runPropertiesXml: null,
217732
- skippedReason: directFormattingSkippedReason(inheritance)
217733
- };
217734
- if ("reason" in direct)
217735
- return direct;
217736
- const paragraphPropertiesXml = composeParagraphPropertiesXml({
217737
- styleId: style.styleId,
217738
- numberingProperties,
217739
- inheritedParagraphPropertiesXml: direct.paragraphPropertiesXml
217740
- });
217741
- return {
217742
- ok: true,
217743
- context: {
217744
- styleId: style.styleId,
217745
- numberingProperties,
217746
- paragraphPropertiesXml,
217747
- runPropertiesXml: direct.runPropertiesXml,
217748
- provenance: {
217749
- inheritedParagraphProperties: direct.paragraphPropertiesXml != null,
217750
- inheritedParagraphMarkProperties: direct.paragraphMarkRunPropertiesXml != null,
217751
- inheritedRunProperties: direct.runPropertiesXml != null,
217752
- explicitStyleOverride: Boolean(input.styleRef),
217753
- explicitNumberingOverride: numberingProperties != null,
217754
- ...direct.skippedReason ? { skippedReason: direct.skippedReason } : {}
217755
- }
217756
- }
217757
- };
217758
- }
217759
- function directFormattingSkippedReason(inheritance) {
217760
- if (inheritance === "style")
217761
- return "direct-inheritance-disabled";
217762
- if (inheritance === "none")
217763
- return "inheritance-disabled";
217764
- return "no-anchor";
217765
- }
217766
- function readAnchorParagraphXml(state, entry) {
217767
- const bytes = state.packageBytes.get(entry.partUri);
217768
- if (!bytes)
217769
- return null;
217770
- if (entry.byteEnd <= entry.byteStart)
217771
- return "";
217772
- return TD54.decode(bytes.subarray(entry.byteStart, entry.byteEnd));
217773
- }
217774
- function readAnchorNamespaceBindings(state, entry) {
217775
- const mainOverlay = state.mainStorySourceOverlay;
217776
- if (entry.directBodyChildOrdinal != null && mainOverlay?.partUri === entry.partUri && mainOverlay.storyId === entry.storyId) {
217777
- return mainOverlay.rootNamespaceBindings;
217778
- }
217779
- const bytes = state.packageBytes.get(entry.partUri);
217780
- return bytes ? namespaceBindingsAtPosition(bytes, entry.byteStart) : {};
217781
- }
217782
- function resolveInsertionStyle(state, anchorParagraphXml, anchor, explicitStyleRef, inheritance, fallbackToDocumentDefaultStyle) {
217783
- if (explicitStyleRef)
217784
- return { ok: true, styleId: explicitStyleRef };
217785
- if (!anchor || inheritance === "none") {
217786
- return {
217787
- ok: true,
217788
- styleId: fallbackToDocumentDefaultStyle ? resolveDefaultParagraphStyleId(state) : null
217789
- };
217790
- }
217791
- if (anchorParagraphXml == null)
217792
- return { ok: false, reason: "paragraph-target-not-found" };
217793
- const paragraphStyle = readDirectParagraphStyleId(anchorParagraphXml);
217794
- if (paragraphStyle.presence === "malformed") {
217795
- return { ok: false, reason: "paragraph-style-ambiguous" };
217796
- }
217797
- const targetStyle = paragraphStyle.styleId;
217798
- if (anchor.placement === "after" && targetStyle) {
217799
- const next = lookupNextStyle(state, targetStyle);
217800
- if (!next.ok)
217801
- return next;
217802
- if (next.styleId)
217803
- return { ok: true, styleId: next.styleId };
217804
- }
217805
- if (targetStyle)
217806
- return { ok: true, styleId: targetStyle };
217807
- return {
217808
- ok: true,
217809
- styleId: fallbackToDocumentDefaultStyle ? resolveDefaultParagraphStyleId(state) : null
217810
- };
217811
- }
217812
- function resolveDefaultParagraphStyleId(state) {
217813
- const defaultStyle = resolveDefaultParagraphStyle(state);
217814
- return defaultStyle.ok ? defaultStyle.styleId ?? "Normal" : "Normal";
217815
- }
217816
- function resolveDefaultParagraphStyle(state) {
217817
- const inspection = inspectStyleDefinitionsPartUriFromState(state);
217818
- if (!inspection.valid)
217819
- return { ok: true, styleId: null };
217820
- const bytes = inspection.partUri ? ensurePackagePartBytes(state, inspection.partUri) : null;
217821
- if (!bytes)
217822
- return { ok: true, styleId: null };
217823
- const xml = TD54.decode(bytes);
217824
- const namespaceUri = inspectStyleDefinitionsXmlDialect(xml);
217825
- if (!namespaceUri)
217826
- return { ok: true, styleId: null };
217827
- let depth = 0;
217828
- const defaults = [];
217829
- let valid = true;
217830
- const parsed = walkXmlElements(xml, {
217831
- onOpenTag({ tag }) {
217832
- depth += 1;
217833
- if (depth !== 2 || tag.namespaceUri !== namespaceUri || tag.localName !== "style")
217834
- return;
217835
- if (readWordAttribute2(tag, namespaceUri, "type") !== "paragraph" || !["1", "true", "on"].includes(readWordAttribute2(tag, namespaceUri, "default") ?? ""))
217836
- return;
217837
- const id = readWordAttribute2(tag, namespaceUri, "styleId");
217838
- if (!id)
217839
- valid = false;
217840
- else
217841
- defaults.push(id);
217842
- },
217843
- onCloseTag() {
217844
- depth -= 1;
217845
- }
217846
- });
217847
- if (!valid || parsed.errors.length || defaults.length > 1)
217848
- return { ok: true, styleId: null };
217849
- return { ok: true, styleId: defaults[0] ?? null };
217850
- }
217851
- function lookupNextStyle(state, styleId) {
217852
- const inspection = inspectStyleDefinitionsPartUriFromState(state);
217853
- if (!inspection.valid)
217854
- return { ok: false, reason: "paragraph-style-ambiguous" };
217855
- const stylesBytes = inspection.partUri ? ensurePackagePartBytes(state, inspection.partUri) : null;
217856
- if (!stylesBytes)
217857
- return { ok: true, styleId: null };
217858
- const xml = TD54.decode(stylesBytes);
217859
- const namespaceUri = inspectStyleDefinitionsXmlDialect(xml);
217860
- if (!namespaceUri)
217861
- return { ok: false, reason: "paragraph-style-ambiguous" };
217862
- let depth = 0;
217863
- let targetStyleDepth = -1;
217864
- let foundTargetStyle = false;
217865
- let nextStyleId = null;
217866
- const parsed = walkXmlElements(xml, {
217867
- onOpenTag({ tag }) {
217868
- depth += 1;
217869
- if (!foundTargetStyle && depth === 2 && tag.namespaceUri === namespaceUri && tag.localName === "style" && readWordAttribute2(tag, namespaceUri, "styleId") === styleId) {
217870
- foundTargetStyle = true;
217871
- targetStyleDepth = depth;
217872
- return;
217873
- }
217874
- if (targetStyleDepth >= 0 && depth === targetStyleDepth + 1 && tag.namespaceUri === namespaceUri && tag.localName === "next") {
217875
- nextStyleId = readWordAttribute2(tag, namespaceUri, "val") ?? null;
217876
- }
217877
- },
217878
- onCloseTag({ tag }) {
217879
- if (depth === targetStyleDepth && tag.localName === "style")
217880
- targetStyleDepth = -1;
217881
- depth -= 1;
217882
- }
217883
- });
217884
- if (parsed.errors.length > 0)
217885
- return { ok: false, reason: "paragraph-style-ambiguous" };
217886
- return { ok: true, styleId: nextStyleId };
217887
- }
217888
- function readWordAttribute2(tag, namespaceUri, localName2) {
217889
- return readXmlAttribute(tag, namespaceUri, localName2)?.value;
217890
- }
217891
- function resolveDirectInsertionFormatting(paragraphXml, placement2, inheritedNamespaceBindings = {}) {
217892
- const paragraphPropertiesXml = cloneDirectParagraphPropertiesForInsert(paragraphXml);
217893
- const paragraphMarkRunPropertiesXml = cloneParagraphMarkRunPropertiesForInsert(paragraphXml);
217894
- const adjacentRunProperties = cloneAdjacentRunPropertiesForInsert(paragraphXml, placement2, paragraphMarkRunPropertiesXml, inheritedNamespaceBindings);
217895
- if (!adjacentRunProperties.ok)
217896
- return adjacentRunProperties;
217897
- const runPropertiesXml = adjacentRunProperties.runPropertiesXml;
217898
- return {
217899
- paragraphPropertiesXml,
217900
- paragraphMarkRunPropertiesXml,
217901
- runPropertiesXml,
217902
- ...!paragraphPropertiesXml && !runPropertiesXml ? { skippedReason: "no-direct-formatting" } : {}
217903
- };
217904
- }
217905
- function cloneAdjacentRunPropertiesCarrierForInsertion(paragraphXml, placement2, inheritedNamespaceBindings = {}) {
217906
- const paragraphWithoutNestedTextboxes = stripElements(paragraphXml, "txbxContent");
217907
- const run = adjacentFormattingCarrierRun(paragraphWithoutNestedTextboxes, placement2, inheritedNamespaceBindings);
217908
- if (!run.ok)
217909
- return run;
217910
- if (!run.run)
217911
- return { ok: true, carrier: null };
217912
- const carrierRun = run.run;
217913
- const runPropertiesXml = readRunPropertiesXml(carrierRun.xml);
217914
- if (!runPropertiesXml)
217915
- return { ok: true, carrier: null };
217916
- const namespaceSource = namespaceSourceForRunProperties(paragraphWithoutNestedTextboxes, carrierRun, runPropertiesXml, inheritedNamespaceBindings);
217917
- if (!namespaceSource)
217918
- return { ok: true, carrier: null };
217919
- const { openTag: namespaceSourceOpenTag, hasParagraphRootMarkupCompatibilityAttributes, hasInheritedMarkupCompatibilityAttributes, hasUnresolvedInheritedAttributeNamespaces } = namespaceSource;
217920
- const hasForeignRevisionLikeRunProperties = runPropertiesContainForeignRevisionLikeElement(runPropertiesXml, namespaceSourceOpenTag);
217921
- if (hasForeignRevisionLikeRunProperties == null)
217922
- return { ok: true, carrier: null };
217923
- if (hasForeignRevisionLikeRunProperties) {
217924
- return {
217925
- ok: true,
217926
- carrier: {
217927
- runPropertiesXml,
217928
- namespaceSourceOpenTag,
217929
- hasForeignRevisionLikeRunProperties,
217930
- hasNonWordMarkup: runPropertiesContainNonWordMarkup(runPropertiesXml, namespaceSourceOpenTag),
217931
- hasParagraphRootMarkupCompatibilityAttributes,
217932
- hasInheritedMarkupCompatibilityAttributes,
217933
- hasUnresolvedInheritedAttributeNamespaces
217934
- }
217935
- };
217936
- }
217937
- const normalizedRunProperties = normalizeClonedRunProperties(runPropertiesXml);
217938
- const normalizedRunPropertiesXml = normalizedRunProperties && carrierRun.insideHyperlink ? stripHyperlinkRunStyle(normalizedRunProperties, namespaceSourceOpenTag) : normalizedRunProperties;
217939
- return {
217940
- ok: true,
217941
- carrier: normalizedRunPropertiesXml ? {
217942
- runPropertiesXml: normalizedRunPropertiesXml,
217943
- namespaceSourceOpenTag,
217944
- hasForeignRevisionLikeRunProperties: false,
217945
- hasNonWordMarkup: runPropertiesContainNonWordMarkup(normalizedRunPropertiesXml, namespaceSourceOpenTag),
217946
- hasParagraphRootMarkupCompatibilityAttributes,
217947
- hasInheritedMarkupCompatibilityAttributes,
217948
- hasUnresolvedInheritedAttributeNamespaces
217949
- } : null
217950
- };
217951
- }
217952
- function cloneDirectParagraphPropertiesForInsert(paraXml) {
217953
- const inner = paragraphInnerXml(paraXml);
217954
- if (inner == null)
217955
- return null;
217956
- const { pPr } = splitLeadingParagraphPropertyBlock(inner);
217957
- if (!pPr)
217958
- return null;
217959
- let direct = stripParagraphPropertyChange(pPr);
217960
- if (!direct)
217961
- return null;
217962
- for (const localName2 of ["pStyle", "numPr", "sectPr"]) {
217963
- direct = stripElements(direct, localName2);
217964
- }
217965
- direct = replaceParagraphMarkRunProperties(direct);
217966
- return paragraphPropertiesXmlIsEmpty(direct) ? null : direct;
217967
- }
217968
- function replaceParagraphMarkRunProperties(pPrXml) {
217969
- const markProperties = extractParagraphMarkRunProperties(pPrXml);
217970
- if (markProperties == null)
217971
- return stripElements(pPrXml, "rPr");
217972
- const span = topLevelMarkRPrSpan(pPrXml);
217973
- if (!span)
217974
- return pPrXml;
217975
- return pPrXml.slice(0, span.start) + markProperties + pPrXml.slice(span.end);
217976
- }
217977
- function topLevelMarkRPrSpan(pPrXml) {
217978
- const changeOffset = pPrXml.search(/<[\w.-]+:pPrChange\b/);
217979
- const limit = changeOffset >= 0 ? changeOffset : pPrXml.length;
217980
- const openOffset = pPrXml.search(/<[\w.-]+:rPr\b/);
217981
- if (openOffset < 0 || openOffset >= limit)
217982
- return null;
217983
- const span = matchLeadingElement(pPrXml.slice(openOffset), "rPr");
217984
- if (!span)
217985
- return null;
217986
- return { start: openOffset, end: openOffset + span.length };
217987
- }
217988
- function cloneAdjacentRunPropertiesForInsert(paraXml, placement2, paragraphMarkRunPropertiesXml, inheritedNamespaceBindings = {}) {
217989
- const carrierResult = cloneAdjacentRunPropertiesCarrierForInsertion(paraXml, placement2, inheritedNamespaceBindings);
217990
- if (!carrierResult.ok)
217991
- return carrierResult;
217992
- const carrier = carrierResult.carrier;
217993
- if (!carrier) {
217994
- return {
217995
- ok: true,
217996
- runPropertiesXml: paragraphMarkRunPropertiesXml || null
217997
- };
217998
- }
217999
- if (carrier.hasForeignRevisionLikeRunProperties || carrier.hasInheritedMarkupCompatibilityAttributes && carrier.hasNonWordMarkup !== false || carrier.hasUnresolvedInheritedAttributeNamespaces) {
218000
- return { ok: false, reason: "unsupported-context" };
218001
- }
218002
- if (carrier.hasParagraphRootMarkupCompatibilityAttributes && carrier.hasNonWordMarkup !== false) {
218003
- return { ok: false, reason: "unsupported-context" };
218004
- }
218005
- const runPropertiesXml = namespaceCloseRunPropertiesForRelocation(carrier.runPropertiesXml, carrier.namespaceSourceOpenTag, inheritedNamespaceBindings);
218006
- if (!runPropertiesXml)
218007
- return { ok: false, reason: "unsupported-context" };
218008
- return {
218009
- ok: true,
218010
- runPropertiesXml
218011
- };
218012
- }
218013
- function adjacentFormattingCarrierRun(paragraphXml, placement2, inheritedNamespaceBindings = {}) {
218014
- const paragraphPrefix = /^<(?:(?<prefix>[\w.-]+):)?p\b/.exec(paragraphXml)?.groups?.prefix ?? "";
218015
- const additionalNamespaces = xmlFragmentAdditionalNamespaces(paragraphXml, new Map(Object.entries(inheritedNamespaceBindings)), { w: NS_W, [paragraphPrefix]: NS_W });
218016
- const parsed = collectXmlElementRanges(paragraphXml, { additionalNamespaces });
218017
- if (parsed.errors.length > 0)
218018
- return { ok: true, run: undefined };
218019
- const carrier = adjacentFormattingCarrierPiece(parseParagraphInlineMap(paragraphXml, inheritedNamespaceBindings).pieces, placement2);
218020
- if (!carrier.ok)
218021
- return carrier;
218022
- const carrierPiece = carrier.piece;
218023
- if (!carrierPiece)
218024
- return { ok: true, run: undefined };
218025
- const payloadLocalName = carrierPiece.kind === "text" ? "t" : carrierPiece.control;
218026
- const run = parsed.ranges.find((range) => range.start === carrierPiece.runCharStart && range.end === carrierPiece.runCharEnd && range.tag.namespaceUri === NS_W && range.tag.localName === "r");
218027
- const payload = parsed.ranges.find((range) => range.start === carrierPiece.charStart && range.end === carrierPiece.charEnd && range.tag.namespaceUri === NS_W && range.tag.localName === payloadLocalName);
218028
- if (!run || !payload)
218029
- return { ok: true, run: undefined };
218030
- const hyperlinkRanges = parsed.ranges.filter((range) => range.tag.namespaceUri === NS_W && range.tag.localName === "hyperlink");
218031
- return {
218032
- ok: true,
218033
- run: {
218034
- start: run.start,
218035
- end: run.end,
218036
- xml: paragraphXml.slice(run.start, run.end),
218037
- insideHyperlink: hyperlinkRanges.some((hyperlink) => hyperlink.start < run.start && run.end <= hyperlink.end)
218038
- }
218039
- };
218040
- }
218041
- function adjacentFormattingCarrierPiece(pieces, placement2) {
218042
- const candidates = placement2 === "before" ? pieces : [...pieces].reverse();
218043
- for (const piece of candidates) {
218044
- if (piece.kind === "marker")
218045
- continue;
218046
- if (piece.kind === "text") {
218047
- if (piece.textRole === "visible")
218048
- return { ok: true, piece };
218049
- continue;
218050
- }
218051
- if (piece.kind === "control") {
218052
- if (!piece.deleted)
218053
- return { ok: true, piece };
218054
- continue;
218055
- }
218056
- if (piece.kind === "tracked") {
218057
- if (piece.removesVisible)
218058
- continue;
218059
- const nested = adjacentFormattingCarrierPiece(piece.children, placement2);
218060
- if (!nested.ok || nested.piece)
218061
- return nested;
218062
- if (piece.visibleStart === piece.visibleEnd)
218063
- continue;
218064
- return { ok: true, piece: undefined };
218065
- }
218066
- if (piece.kind === "container") {
218067
- if (piece.policy === "fail-closed")
218068
- return { ok: false, reason: "unsupported-context" };
218069
- if (piece.policy === "atomic") {
218070
- if (piece.containerKind === "math")
218071
- return { ok: true, piece: undefined };
218072
- continue;
218073
- }
218074
- const nested = adjacentFormattingCarrierPiece(piece.children, placement2);
218075
- if (!nested.ok || nested.piece)
218076
- return nested;
218077
- if (piece.visibleStart === piece.visibleEnd)
218078
- continue;
218079
- return { ok: true, piece: undefined };
218080
- }
218081
- if (piece.kind === "noteReference") {
218082
- continue;
218083
- }
218084
- return { ok: true, piece: undefined };
218085
- }
218086
- return { ok: true, piece: undefined };
218087
- }
218088
- function runPropertiesContainForeignRevisionLikeElement(rPrXml, namespaceSourceOpenTag) {
218089
- const runPropertiesNode = readXmlNodeAt(rPrXml, 0);
218090
- if (!runPropertiesNode || runPropertiesNode.kind !== "element" || runPropertiesNode.selfClosing || xmlLocalName(runPropertiesNode.qname) !== "rPr" || runPropertiesNode.end !== rPrXml.length) {
218091
- return null;
218092
- }
218093
- const parsedXml = namespaceSourceOpenTag + rPrXml.slice(runPropertiesNode.openEnd, runPropertiesNode.closeStart) + rPrXml.slice(runPropertiesNode.closeStart);
218094
- const additionalNamespaces = xmlFragmentAdditionalNamespaces(parsedXml, new Map, { w: NS_W });
218095
- const parsed = collectXmlElementRanges(parsedXml, { additionalNamespaces });
218096
- if (parsed.errors.length > 0)
218097
- return null;
218098
- return parsed.ranges.some((range) => range.tag.localName === "rPrChange" && range.tag.namespaceUri !== NS_W);
218099
- }
218100
- function runPropertiesContainNonWordMarkup(rPrXml, namespaceSourceOpenTag) {
218101
- const runPropertiesNode = readXmlNodeAt(rPrXml, 0);
218102
- if (!runPropertiesNode || runPropertiesNode.kind !== "element" || runPropertiesNode.selfClosing || xmlLocalName(runPropertiesNode.qname) !== "rPr" || runPropertiesNode.end !== rPrXml.length) {
218103
- return null;
218104
- }
218105
- const parsedXml = namespaceSourceOpenTag + rPrXml.slice(runPropertiesNode.openEnd, runPropertiesNode.closeStart) + rPrXml.slice(runPropertiesNode.closeStart);
218106
- const additionalNamespaces = xmlFragmentAdditionalNamespaces(parsedXml, new Map, { w: NS_W });
218107
- const parsed = collectXmlElementRanges(parsedXml, { additionalNamespaces });
218108
- if (parsed.errors.length > 0)
218109
- return null;
218110
- return parsed.ranges.some((range) => range.tag.namespaceUri !== NS_W || range.tag.attributes.some((attribute) => attribute.prefix !== "xmlns" && attribute.name !== "xmlns" && attribute.namespaceUri !== "" && attribute.namespaceUri !== NS_W && attribute.namespaceUri !== NS_XML));
218111
- }
218112
- function stripHyperlinkRunStyle(rPrXml, namespaceSourceOpenTag) {
218113
- const runPropertiesNode = readXmlNodeAt(rPrXml, 0);
218114
- if (!runPropertiesNode || runPropertiesNode.kind !== "element" || runPropertiesNode.selfClosing || xmlLocalName(runPropertiesNode.qname) !== "rPr" || runPropertiesNode.end !== rPrXml.length) {
218115
- return null;
218116
- }
218117
- const parsedXml = namespaceSourceOpenTag + rPrXml.slice(runPropertiesNode.openEnd, runPropertiesNode.closeStart) + rPrXml.slice(runPropertiesNode.closeStart);
218118
- const additionalNamespaces = xmlFragmentAdditionalNamespaces(parsedXml, new Map, { w: NS_W });
218119
- const parsed = collectXmlElementRanges(parsedXml, { additionalNamespaces });
218120
- if (parsed.errors.length > 0)
218121
- return null;
218122
- const openTagDelta = namespaceSourceOpenTag.length - runPropertiesNode.openEnd;
218123
- const styleSpans = parsed.ranges.filter((range) => range.tag.namespaceUri === NS_W && range.tag.localName === "rStyle" && readXmlAttribute(range.tag, NS_W, "val")?.value === "Hyperlink").map((range) => ({ start: range.start - openTagDelta, end: range.end - openTagDelta })).filter((range) => range.start >= runPropertiesNode.openEnd && range.end <= runPropertiesNode.closeStart).sort((left, right) => right.start - left.start);
218124
- let stripped = rPrXml;
218125
- for (const span of styleSpans)
218126
- stripped = stripped.slice(0, span.start) + stripped.slice(span.end);
218127
- return runPropertiesXmlIsEmpty(stripped) ? null : stripped;
218128
- }
218129
- function namespaceSourceForRunProperties(paragraphXml, run, runPropertiesXml, inheritedNamespaceBindings) {
218130
- const runProperties = findFirstElement(run.xml, "rPr");
218131
- const runPropertiesNode = readXmlNodeAt(runPropertiesXml, 0);
218132
- if (!runProperties || !runPropertiesNode || runPropertiesNode.kind !== "element" || xmlLocalName(runPropertiesNode.qname) !== "rPr") {
218133
- return null;
218134
- }
218135
- const runPropertiesOpenTag = runPropertiesXml.slice(0, runPropertiesNode.openEnd);
218136
- const targetStart = run.start + runProperties.start;
218137
- const inheritedScopes = [];
218138
- const inheritedCompatibilityScopes = [];
218139
- const unresolvedInheritedAttributeScopes = [];
218140
- const compatibilityStack = [];
218141
- const unresolvedAttributeStack = [];
218142
- let hasParagraphRootMarkupCompatibilityAttributes = false;
218143
- const additionalNamespaces = xmlFragmentAdditionalNamespaces(paragraphXml, new Map(Object.entries(inheritedNamespaceBindings)), { w: NS_W });
218144
- const parsed = walkXmlElements(paragraphXml, {
218145
- additionalNamespaces,
218146
- onOpenTag(event) {
218147
- const parentHasCompatibilityAttributes = compatibilityStack.at(-1) ?? false;
218148
- const parentHasUnresolvedAttributeNamespaces = unresolvedAttributeStack.at(-1) ?? false;
218149
- if (event.start === targetStart && event.tag.namespaceUri === NS_W && event.tag.localName === "rPr") {
218150
- const inherited = { ...event.namespaceBindings };
218151
- for (const prefix of Object.keys(event.tag.namespaceBindings))
218152
- delete inherited[prefix];
218153
- inheritedScopes.push(inherited);
218154
- inheritedCompatibilityScopes.push(parentHasCompatibilityAttributes);
218155
- unresolvedInheritedAttributeScopes.push(parentHasUnresolvedAttributeNamespaces);
218156
- }
218157
- const isParagraphRoot = event.start === 0 && event.tag.namespaceUri === NS_W && event.tag.localName === "p";
218158
- if (isParagraphRoot) {
218159
- hasParagraphRootMarkupCompatibilityAttributes = event.tag.attributes.some((attribute) => attribute.namespaceUri === NS_MC);
218160
- }
218161
- const hasLocalCompatibilityAttributes = !isParagraphRoot && event.tag.attributes.some((attribute) => attribute.namespaceUri === NS_MC);
218162
- compatibilityStack.push(parentHasCompatibilityAttributes || hasLocalCompatibilityAttributes);
218163
- const hasUnresolvedAttributeNamespaces = event.tag.attributes.some((attribute) => attribute.namespaceUri.startsWith("urn:superdoc:unresolved-namespace-prefix:"));
218164
- unresolvedAttributeStack.push(parentHasUnresolvedAttributeNamespaces || hasUnresolvedAttributeNamespaces);
218165
- },
218166
- onCloseTag() {
218167
- compatibilityStack.pop();
218168
- unresolvedAttributeStack.pop();
218169
- }
218170
- });
218171
- const inheritedBindings = inheritedScopes[0];
218172
- const hasInheritedMarkupCompatibilityAttributes = inheritedCompatibilityScopes[0];
218173
- const hasUnresolvedInheritedAttributeNamespaces = unresolvedInheritedAttributeScopes[0];
218174
- if (parsed.errors.length > 0 || !inheritedBindings || hasInheritedMarkupCompatibilityAttributes == null || hasUnresolvedInheritedAttributeNamespaces == null) {
218175
- return null;
218176
- }
218177
- let declarations = "";
218178
- for (const [prefix, namespaceUri] of Object.entries(inheritedBindings)) {
218179
- if (prefix === "xml")
218180
- continue;
218181
- declarations += prefix.length > 0 ? ` xmlns:${prefix}="${escapeXmlAttribute(namespaceUri)}"` : ` xmlns="${escapeXmlAttribute(namespaceUri)}"`;
218182
- }
218183
- return {
218184
- openTag: declarations.length > 0 ? runPropertiesOpenTag.replace(/>$/, `${declarations}>`) : runPropertiesOpenTag,
218185
- hasParagraphRootMarkupCompatibilityAttributes,
218186
- hasInheritedMarkupCompatibilityAttributes,
218187
- hasUnresolvedInheritedAttributeNamespaces
218188
- };
218189
- }
218190
- function readRunPropertiesXml(runXml) {
218191
- const inner = runInnerXml(runXml);
218192
- if (inner == null)
218193
- return null;
218194
- const leading = /^\s*/.exec(inner)?.[0] ?? "";
218195
- const rPrXml = matchLeadingElement(inner.slice(leading.length), "rPr");
218196
- return rPrXml || null;
218197
- }
218198
- function cloneParagraphMarkRunPropertiesForInsert(paraXml) {
218199
- const inner = paragraphInnerXml(paraXml);
218200
- if (inner == null)
218201
- return null;
218202
- const { pPr } = splitLeadingParagraphPropertyBlock(inner);
218203
- if (!pPr)
218204
- return null;
218205
- const markProperties = extractParagraphMarkRunProperties(stripParagraphPropertyChange(pPr));
218206
- return markProperties && !runPropertiesXmlIsEmpty(markProperties) ? markProperties : null;
218207
- }
218208
- function normalizeClonedRunProperties(rPrXml) {
218209
- const stripped = stripElements(rPrXml, "rPrChange");
218210
- return runPropertiesXmlIsEmpty(stripped) ? null : stripped;
218211
- }
218212
- function paragraphInnerXml(paraXml) {
218213
- const openTag = /^<[\w.-]+:p\b[^>]*>/.exec(paraXml)?.[0];
218214
- const closeTag = /<\/[\w.-]+:p>\s*$/.exec(paraXml)?.[0];
218215
- if (!openTag || !closeTag)
218216
- return null;
218217
- return paraXml.slice(openTag.length, paraXml.length - closeTag.length);
218218
- }
218219
- function runInnerXml(runXml) {
218220
- const openTag = /^<[\w.-]+:r\b[^>]*>/.exec(runXml)?.[0];
218221
- const closeTag = /<\/[\w.-]+:r>\s*$/.exec(runXml)?.[0];
218222
- if (!openTag || !closeTag)
218223
- return null;
218224
- return runXml.slice(openTag.length, runXml.length - closeTag.length);
218225
- }
218226
- function composeParagraphPropertiesXml(input) {
218227
- const explicit = renderParagraphProperties2(input.styleId, input.numberingProperties);
218228
- const explicitChildren = paragraphPropertiesChildrenXml(explicit);
218229
- const inheritedChildren = paragraphPropertiesChildrenXml(input.inheritedParagraphPropertiesXml);
218230
- const children = `${explicitChildren}${inheritedChildren}`;
218231
- const namespaceAttrs = paragraphPropertiesNamespaceAttrs(input.inheritedParagraphPropertiesXml);
218232
- return children.trim().length > 0 ? `<w:pPr${namespaceAttrs}>${children}</w:pPr>` : null;
218233
- }
218234
- function paragraphPropertiesChildrenXml(pPrXml) {
218235
- if (!pPrXml)
218236
- return "";
218237
- const trimmed = pPrXml.trim();
218238
- const selfClosing = /^<[\w.-]+:pPr\b[^>]*\/>$/.exec(trimmed);
218239
- if (selfClosing)
218240
- return "";
218241
- const open = /^<[\w.-]+:pPr\b[^>]*>/.exec(trimmed)?.[0];
218242
- const close = /<\/[\w.-]+:pPr>\s*$/.exec(trimmed)?.[0];
218243
- if (!open || !close)
218244
- return "";
218245
- return trimmed.slice(open.length, trimmed.length - close.length);
218246
- }
218247
- function paragraphPropertiesNamespaceAttrs(pPrXml) {
218248
- if (!pPrXml)
218249
- return "";
218250
- const trimmed = pPrXml.trim();
218251
- const openAttrs = /^<[\w.-]+:pPr\b([^>]*)\/?>/.exec(trimmed)?.[1] ?? "";
218252
- return openAttrs.match(/\s+xmlns(?::[\w.-]+)?=(?:"[^"]*"|'[^']*')/g)?.join("") ?? "";
218253
- }
218254
- function paragraphPropertiesXmlIsEmpty(pPrXml) {
218255
- const trimmed = pPrXml.trim();
218256
- return /^<[\w.-]+:pPr\b[^>]*\/>$/.test(trimmed) || /^<([\w.-]+):pPr\b[^>]*>\s*<\/\1:pPr>$/.test(trimmed);
218257
- }
218258
- function runPropertiesXmlIsEmpty(rPrXml) {
218259
- const trimmed = rPrXml.trim();
218260
- return /^<[\w.-]+:rPr\b[^>]*\/>$/.test(trimmed) || /^<([\w.-]+):rPr\b[^>]*>\s*<\/\1:rPr>$/.test(trimmed);
218261
- }
218262
- var TD54;
218263
- var init_insertion_formatting_context = __esm(() => {
218264
- init_sd_document_state();
218265
- init_style_definitions_part();
218266
- init_style_definitions_xml();
218267
- init_paragraph_inline_model();
218268
- init_xml_text();
218269
- init_xml_sax();
218270
- init_paragraph_contribution();
218271
- init_direct_paragraph_list_properties();
218272
- init_paragraph_property_block();
218273
- init_paragraph_para_id_attrs();
218274
- TD54 = new TextDecoder;
218275
- });
218276
-
218277
218310
  // ../../../v2/editor-core/dist/document/transactions/compile-paragraph-ops.js
218278
218311
  function prepareParagraphInsert(state, op) {
218279
218312
  const site = resolveParagraphInsertSite(state, op);
@@ -219541,7 +219574,17 @@ function prepareParagraphSplit(input) {
219541
219574
  });
219542
219575
  if (!tailProperties.ok)
219543
219576
  return tailProperties;
219544
- const tailXml = tailWithId + tailProperties.paragraphPropertiesXml + slice.tail + closeTag;
219577
+ let tailPropertiesXml = tailProperties.paragraphPropertiesXml;
219578
+ if (slice.terminal && input.resolveTailStyleId) {
219579
+ const sourceStyle = readDirectParagraphStyleId(paragraphXml);
219580
+ if (sourceStyle.presence === "present") {
219581
+ const tailStyleId = input.resolveTailStyleId(sourceStyle.styleId);
219582
+ if (tailStyleId) {
219583
+ tailPropertiesXml = replaceDirectParagraphStyleId(tailPropertiesXml, tailStyleId);
219584
+ }
219585
+ }
219586
+ }
219587
+ const tailXml = tailWithId + tailPropertiesXml + slice.tail + closeTag;
219545
219588
  const headMarkProperties = /<(?:[\w.-]+:)?(?:ins|del|moveFrom|moveTo)\b/.test(pPrXml) ? stripParagraphMarkRevisionMarkers(pPrXml, namespaceBindingsAtPosition(input.partBytes, input.paragraphByteStart, openTag)) : pPrXml;
219546
219589
  const headProperties = stripParagraphPropertyChange(headMarkProperties);
219547
219590
  const headXml = openTag + headProperties + slice.head + closeTag;
@@ -219633,6 +219676,17 @@ function runParagraphSplitCommit(input) {
219633
219676
  const tailParaId = provisionalParaId;
219634
219677
  const splitAllocatedWIds = [];
219635
219678
  const metadataClones = [];
219679
+ const nextStyleCache = new Map;
219680
+ const resolveTailStyleId = (currentStyleId) => {
219681
+ let cached2 = nextStyleCache.get(currentStyleId);
219682
+ if (cached2 === undefined) {
219683
+ cached2 = lookupNextStyle(input.state, currentStyleId);
219684
+ nextStyleCache.set(currentStyleId, cached2);
219685
+ }
219686
+ if (!cached2.ok)
219687
+ return null;
219688
+ return cached2.styleId && cached2.styleId !== currentStyleId ? cached2.styleId : null;
219689
+ };
219636
219690
  const primarySplit = prepareParagraphSplit({
219637
219691
  paragraphXml: paraXml,
219638
219692
  partBytes: bytes,
@@ -219646,7 +219700,8 @@ function runParagraphSplitCommit(input) {
219646
219700
  const wId = allocateRevisionWId(input.state);
219647
219701
  splitAllocatedWIds.push(wId);
219648
219702
  return wId;
219649
- }
219703
+ },
219704
+ resolveTailStyleId
219650
219705
  });
219651
219706
  if (!primarySplit.ok)
219652
219707
  return rejected8(input.txId, primarySplit.reason);
@@ -219685,7 +219740,8 @@ function runParagraphSplitCommit(input) {
219685
219740
  return 0;
219686
219741
  }
219687
219742
  return wId;
219688
- }
219743
+ },
219744
+ resolveTailStyleId
219689
219745
  });
219690
219746
  if (!split.ok)
219691
219747
  return split;
@@ -221250,6 +221306,8 @@ var init_compile_paragraph_ops = __esm(() => {
221250
221306
  init_part_payload();
221251
221307
  init_paragraph_contribution();
221252
221308
  init_paragraph_property_block();
221309
+ init_direct_paragraph_list_properties();
221310
+ init_insertion_formatting_context();
221253
221311
  init_paragraph_para_id_attrs();
221254
221312
  init_paragraph_index();
221255
221313
  init_commit_prepared_mutation();
@@ -278610,6 +278668,17 @@ function storyMatches(a, b) {
278610
278668
  const bn = canonicalStory(b);
278611
278669
  return an === bn;
278612
278670
  }
278671
+ function pickStoryLocator(target, override) {
278672
+ if (override)
278673
+ return override;
278674
+ if (target.story)
278675
+ return target.story;
278676
+ if (target.start.kind === "text" && target.start.story)
278677
+ return target.start.story;
278678
+ if (target.end.kind === "text" && target.end.story)
278679
+ return target.end.story;
278680
+ return;
278681
+ }
278613
278682
  function selectionTargetStoriesMatch(target, overrideStory) {
278614
278683
  const suppliedStories = [
278615
278684
  overrideStory,
@@ -279084,6 +279153,9 @@ function resolveBodySelectionTarget(context, target) {
279084
279153
  const index = getSDDocumentSessionInternalParagraphIndex(context.session);
279085
279154
  if (!index)
279086
279155
  return { error: "PRECONDITION_FAILED", message: "paragraph index is not available." };
279156
+ return resolveStorySelectionTarget(context, target, index);
279157
+ }
279158
+ function resolveStorySelectionTarget(context, target, index) {
279087
279159
  return resolveSelectionTargetToRange({
279088
279160
  target,
279089
279161
  index,
@@ -279093,6 +279165,24 @@ function resolveBodySelectionTarget(context, target) {
279093
279165
  buildOffsetMap: buildSDDocumentSessionInternalParagraphOffsetMap
279094
279166
  });
279095
279167
  }
279168
+ function listStoryPartSources(context) {
279169
+ const body = context.resolveFullStoryLocator({ kind: "story", storyType: "body" });
279170
+ if ("error" in body)
279171
+ throw operationError("TARGET_NOT_FOUND", "body story is not available.");
279172
+ const sources = [{ partUri: body.partUri, storyId: body.storyId }];
279173
+ const seen = new Set([body.partUri]);
279174
+ for (const rel of listSDDocumentSessionInternalHeaderFooterRels(context.session)) {
279175
+ if (seen.has(rel.partUri))
279176
+ continue;
279177
+ const story = { kind: "story", storyType: "headerFooterPart", refId: rel.refId };
279178
+ const resolved = context.resolveFullStoryLocator(story);
279179
+ if ("error" in resolved)
279180
+ continue;
279181
+ seen.add(rel.partUri);
279182
+ sources.push({ partUri: rel.partUri, storyId: resolved.storyId, story });
279183
+ }
279184
+ return sources;
279185
+ }
279096
279186
  function contentTypeForPart2(partUri) {
279097
279187
  if (partUri.endsWith(".rels"))
279098
279188
  return "application/vnd.openxmlformats-package.relationships+xml";
@@ -285967,8 +286057,10 @@ function toCssFontFamily(fontName, options = {}) {
285967
286057
  if (trimmed.includes(";")) {
285968
286058
  trimmed = splitOutsideQuotes(trimmed, ";").join(", ");
285969
286059
  }
285970
- const { fallback, wordFamily } = options;
285971
- const fallbackValue = fallback ?? (wordFamily ? mapWordFamilyFallback(wordFamily) : undefined) ?? inferGenericFallbackFromFontName(trimmed);
286060
+ const { fallback, wordFamily, pitch } = options;
286061
+ const family = typeof wordFamily === "string" ? wordFamily.trim().toLowerCase() : "";
286062
+ const fixedPitch = typeof pitch === "string" && pitch.trim().toLowerCase() === "fixed";
286063
+ const fallbackValue = fallback ?? (fixedPitch ? "monospace" : undefined) ?? (family !== "auto" && Object.hasOwn(FONT_FAMILY_FALLBACKS, family) ? mapWordFamilyFallback(family) : undefined) ?? inferGenericFallbackFromFontName(trimmed);
285972
286064
  const fallbackParts = normalizeParts(fallbackValue);
285973
286065
  if (fallbackParts.length === 0) {
285974
286066
  return trimmed;
@@ -285984,7 +286076,12 @@ var FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", INHERITED_FO
285984
286076
  if (!fontName || typeof fontName !== "string")
285985
286077
  return "";
285986
286078
  return fontName.trim().replace(/^["']|["']$/g, "").toLowerCase();
285987
- }, inferGenericFallbackFromFontName = (fontName) => SERIF_LIKE_FONTS.has(normalizeFontNameForLookup(fontName)) ? "serif" : DEFAULT_GENERIC_FALLBACK, normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
286079
+ }, MONOSPACE_FONTS, inferGenericFallbackFromFontName = (fontName) => {
286080
+ const name = normalizeFontNameForLookup(fontName);
286081
+ if (MONOSPACE_FONTS.has(name))
286082
+ return "monospace";
286083
+ return SERIF_LIKE_FONTS.has(name) ? "serif" : DEFAULT_GENERIC_FALLBACK;
286084
+ }, normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
285988
286085
  if (!str.includes('"') && !str.includes("'")) {
285989
286086
  return str.split(delimiter).map((p) => p.trim()).filter(Boolean);
285990
286087
  }
@@ -286041,6 +286138,17 @@ var init_font_utils = __esm(() => {
286041
286138
  "bodoni mt",
286042
286139
  "constantia"
286043
286140
  ]);
286141
+ MONOSPACE_FONTS = new Set([
286142
+ "courier",
286143
+ "courier new",
286144
+ "consolas",
286145
+ "menlo",
286146
+ "monaco",
286147
+ "lucida console",
286148
+ "liberation mono",
286149
+ "dejavu sans mono",
286150
+ "source code pro"
286151
+ ]);
286044
286152
  });
286045
286153
 
286046
286154
  // ../../../v2/node_modules/.pnpm/@superdoc+style-engine@file+..+public+packages+layout-engine+style-engine/node_modules/@superdoc/style-engine/src/normalize/run-attrs.ts
@@ -286064,7 +286172,9 @@ function normalizeRunAttrsFromOoxml(props, context = {}) {
286064
286172
  if (props.smallCaps != null)
286065
286173
  out.smallCaps = props.smallCaps === true;
286066
286174
  const fontFamily = resolveFontFamily(props, context.themeFontScheme);
286067
- const cssFontFamily = toCssFontFamily(fontFamily);
286175
+ const fontKey = fontFamily?.trim().replace(/^["']|["']$/g, "");
286176
+ const metadata2 = fontKey ? context.fontTable?.[fontKey] ?? context.fontTable?.[fontKey.toLowerCase()] : undefined;
286177
+ const cssFontFamily = toCssFontFamily(fontFamily, { wordFamily: metadata2?.family, pitch: metadata2?.pitch });
286068
286178
  if (cssFontFamily)
286069
286179
  out.fontFamily = cssFontFamily;
286070
286180
  const fontSize = resolveFontSize(props.fontSize);
@@ -328302,7 +328412,112 @@ var init_tracked_structural_wrapper = __esm(() => {
328302
328412
  init_common();
328303
328413
  });
328304
328414
 
328415
+ // ../../../v2/document-api-v2-adapter/dist/address/story-surface.js
328416
+ function resolveStorySurface(session, bodyStoryId, locator) {
328417
+ const resolved = resolveSessionStoryLocator(session, bodyStoryId, locator);
328418
+ if ("error" in resolved) {
328419
+ return { ok: false, failure: classifyStoryLocatorFailure(resolved.error) };
328420
+ }
328421
+ return { ok: true, descriptor: toStorySurfaceDescriptor(resolved) };
328422
+ }
328423
+ function toStorySurfaceDescriptor(resolved) {
328424
+ const descriptor = {
328425
+ storyId: resolved.storyId,
328426
+ partUri: resolved.partUri,
328427
+ storyKind: resolved.storyKind,
328428
+ relationshipOwnerPartUri: resolved.relationshipOwnerPartUri,
328429
+ sourceAvailability: resolved.materialization ? "materialize-on-write" : "available"
328430
+ };
328431
+ if (resolved.storyByteRange)
328432
+ descriptor.storyByteRange = resolved.storyByteRange;
328433
+ if (resolved.refId)
328434
+ descriptor.refId = resolved.refId;
328435
+ if (resolved.noteId)
328436
+ descriptor.noteId = resolved.noteId;
328437
+ if (resolved.textboxId)
328438
+ descriptor.textboxId = resolved.textboxId;
328439
+ if (resolved.materialization)
328440
+ descriptor.materialization = resolved.materialization;
328441
+ if (resolved.slot)
328442
+ descriptor.slot = resolved.slot;
328443
+ if (resolved.resolvedFromSectionId)
328444
+ descriptor.resolvedFromSectionId = resolved.resolvedFromSectionId;
328445
+ return descriptor;
328446
+ }
328447
+ function classifyStoryLocatorFailure(error48) {
328448
+ return {
328449
+ category: storyLocatorFailureCategory(error48),
328450
+ reason: error48,
328451
+ message: storyLocatorFailureMessage(error48)
328452
+ };
328453
+ }
328454
+ function receiptFailureForStoryLocatorError(error48) {
328455
+ const failure4 = classifyStoryLocatorFailure(error48);
328456
+ return {
328457
+ code: failure4.category,
328458
+ message: failure4.message
328459
+ };
328460
+ }
328461
+ function storyLocatorFailureCategory(error48) {
328462
+ switch (error48) {
328463
+ case "not-found":
328464
+ case "unknown-section":
328465
+ case "no-sections":
328466
+ return "TARGET_NOT_FOUND";
328467
+ case "unsupported-story":
328468
+ case "inherited-edit-rejected":
328469
+ case "cross-story-write-rejected":
328470
+ return "CAPABILITY_UNAVAILABLE";
328471
+ case "no-source-for-edit":
328472
+ return "PRECONDITION_FAILED";
328473
+ default: {
328474
+ const _exhaustive = error48;
328475
+ return _exhaustive;
328476
+ }
328477
+ }
328478
+ }
328479
+ function storyLocatorFailureMessage(error48) {
328480
+ switch (error48) {
328481
+ case "not-found":
328482
+ return "the requested story target was not found";
328483
+ case "unknown-section":
328484
+ return "the requested section is not part of this document";
328485
+ case "no-sections":
328486
+ return "the document has no resolvable sections for this story";
328487
+ case "unsupported-story":
328488
+ return "this story family is not supported for the requested operation";
328489
+ case "inherited-edit-rejected":
328490
+ return "the header/footer slot is inherited and cannot be edited under the requested write policy";
328491
+ case "cross-story-write-rejected":
328492
+ return "the requested write would cross story boundaries";
328493
+ case "no-source-for-edit":
328494
+ return "the requested story has no source bytes available for this edit";
328495
+ default:
328496
+ return "the requested story could not be resolved";
328497
+ }
328498
+ }
328499
+ function rangeWithinStorySurface(descriptor, range) {
328500
+ const window2 = descriptor.storyByteRange;
328501
+ if (!window2)
328502
+ return null;
328503
+ if (range.start >= window2[0] && range.end <= window2[1] && range.start <= range.end) {
328504
+ return null;
328505
+ }
328506
+ return {
328507
+ category: "INVALID_CONTEXT",
328508
+ reason: null,
328509
+ message: `byte range [${range.start}, ${range.end}] falls outside the resolved story window ` + `[${window2[0]}, ${window2[1]}] for story ${descriptor.storyId}`
328510
+ };
328511
+ }
328512
+ var init_story_surface = __esm(() => {
328513
+ init_story_locator();
328514
+ });
328515
+
328305
328516
  // ../../../v2/document-api-v2-adapter/dist/permission-ranges/adapter.js
328517
+ function isSupportedStoryKind(storyKind) {
328518
+ return storyKind === "main" || storyKind === "header" || storyKind === "footer";
328519
+ }
328520
+
328306
328521
  class V2PermissionRangesAdapter {
328307
328522
  constructor(context) {
328308
328523
  this.context = context;
@@ -328318,10 +328533,7 @@ class V2PermissionRangesAdapter {
328318
328533
  });
328319
328534
  }
328320
328535
  get(input) {
328321
- const range = listPermissionRanges(this.context).find((entry) => entry.id === input.id);
328322
- if (!range)
328323
- throw operationError("TARGET_NOT_FOUND", `permission range ${input.id} not found.`);
328324
- return stripInternal2(range);
328536
+ return stripInternal2(this.findByIdOrThrow(input.id));
328325
328537
  }
328326
328538
  create(input, options) {
328327
328539
  const mutationGuard = guardDirectOnlyMutation(this.context, input, options);
@@ -328329,11 +328541,12 @@ class V2PermissionRangesAdapter {
328329
328541
  return mutationGuard;
328330
328542
  const wholeControl = resolveWholeControlPermissionTarget(this.context, input.target);
328331
328543
  if (wholeControl) {
328332
- const xml2 = this.readDocumentXml();
328333
- const id2 = input.id ?? allocateRangeId(listPermissionRanges(this.context));
328334
- if (listPermissionRanges(this.context).some((range) => range.id === id2)) {
328335
- throw operationError("INVALID_INPUT", "permission range id already exists.");
328544
+ const xml2 = this.readPartXmlOrThrow(DOCUMENT_PART_URI5);
328545
+ const rawIds2 = listPermissionRangeRawIds(this.context);
328546
+ if (input.id !== undefined && rawIds2.has(input.id)) {
328547
+ throw operationError("DUPLICATE_ID", `permission range id "${input.id}" already exists.`);
328336
328548
  }
328549
+ const id2 = input.id ?? allocateRangeId(rawIds2);
328337
328550
  const rangeXml = buildPermStart(id2, input.principal) + xml2.slice(wholeControl.start, wholeControl.end) + buildPermEnd(id2);
328338
328551
  const nextXml2 = replaceRange2(xml2, wholeControl.start, wholeControl.end, rangeXml);
328339
328552
  if (dryRunRequested(input, options)) {
@@ -328345,14 +328558,38 @@ class V2PermissionRangesAdapter {
328345
328558
  return { success: false, failure: { code: committed2.code, message: committed2.message } };
328346
328559
  return { success: true, range: this.get({ id: id2 }) };
328347
328560
  }
328348
- const resolved = resolveBodySelectionTarget(this.context, input.target);
328561
+ const storyLocator = pickStoryLocator(input.target, undefined);
328562
+ if (storyLocator && storyLocator.storyType !== "headerFooterPart" && storyLocator.storyType !== "body") {
328563
+ throw operationError("CAPABILITY_UNAVAILABLE", "permissionRanges.create only supports body and headerFooterPart story targets.");
328564
+ }
328565
+ const resolvedStory = this.context.resolveFullStoryLocator(storyLocator);
328566
+ if ("error" in resolvedStory) {
328567
+ const failure4 = classifyStoryLocatorFailure(resolvedStory.error);
328568
+ throw operationError(failure4.category, failure4.message);
328569
+ }
328570
+ if (!isSupportedStoryKind(resolvedStory.storyKind) || resolvedStory.materialization) {
328571
+ throw operationError("CAPABILITY_UNAVAILABLE", "permissionRanges.create only supports body and explicit header/footer story targets.");
328572
+ }
328573
+ if (resolvedStory.storyKind !== "main" && this.context.isCollaborativeSession()) {
328574
+ throw operationError("CAPABILITY_UNAVAILABLE", COLLABORATIVE_SECONDARY_STORY_MESSAGE);
328575
+ }
328576
+ const index2 = resolvedStory.storyKind === "main" ? getSDDocumentSessionInternalParagraphIndex(this.context.session) : getSDDocumentSessionInternalStoryParagraphIndex(this.context.session, resolvedStory.storyId);
328577
+ if (!index2)
328578
+ throw operationError("PRECONDITION_FAILED", "paragraph index is not available.");
328579
+ const resolved = resolveStorySelectionTarget(this.context, input.target, index2);
328349
328580
  if ("error" in resolved)
328350
328581
  throw operationError(resolved.error, resolved.message);
328351
328582
  if (resolved.startBlockId !== resolved.endBlockId) {
328352
328583
  throw operationError("INVALID_TARGET", "permissionRanges.create requires a same-paragraph text selection.");
328353
328584
  }
328354
- const xml = this.readDocumentXml();
328355
- const id = input.id ?? allocateRangeId(listPermissionRanges(this.context));
328585
+ const rawIds = listPermissionRangeRawIds(this.context);
328586
+ if (input.id !== undefined && rawIds.has(input.id)) {
328587
+ throw operationError("DUPLICATE_ID", `permission range id "${input.id}" already exists.`);
328588
+ }
328589
+ const id = input.id ?? allocateRangeId(rawIds);
328590
+ const targetPartUri = resolvedStory.partUri;
328591
+ const story = resolvedStory.storyKind === "main" ? undefined : { kind: "story", storyType: "headerFooterPart", refId: resolvedStory.refId };
328592
+ const xml = this.readPartXmlOrThrow(targetPartUri);
328356
328593
  const para = findParagraphById2(xml, resolved.startBlockId);
328357
328594
  if (!para)
328358
328595
  throw operationError("TARGET_NOT_FOUND", `paragraph ${resolved.startBlockId} not found.`);
@@ -328364,13 +328601,14 @@ class V2PermissionRangesAdapter {
328364
328601
  principal: input.principal,
328365
328602
  kind: "inline",
328366
328603
  start: { blockId: resolved.startBlockId, offset: resolved.startOffset },
328367
- end: { blockId: resolved.endBlockId, offset: resolved.endOffset }
328604
+ end: { blockId: resolved.endBlockId, offset: resolved.endOffset },
328605
+ ...story ? { story } : {}
328368
328606
  }
328369
328607
  };
328370
328608
  }
328371
328609
  const wrapped = wrapTextRangeWithPermissionMarkers(para.xml, resolved.startOffset, resolved.endOffset, id, input.principal);
328372
328610
  const nextXml = replaceRange2(xml, para.start, para.end, wrapped);
328373
- const committed = commitWholePartUpdates(this.context, "permission-range-create", { [DOCUMENT_PART_URI5]: encodeXml(nextXml) }, { expectedRevision: expectedRevisionFrom(input, options) });
328611
+ const committed = commitWholePartUpdates(this.context, "permission-range-create", { [targetPartUri]: encodeXml(nextXml) }, { expectedRevision: expectedRevisionFrom(input, options), storyIds: [resolvedStory.storyId] });
328374
328612
  if (!committed.ok)
328375
328613
  return { success: false, failure: { code: committed.code, message: committed.message } };
328376
328614
  return { success: true, range: this.get({ id }) };
@@ -328379,15 +328617,14 @@ class V2PermissionRangesAdapter {
328379
328617
  const mutationGuard = guardDirectOnlyMutation(this.context, input, options);
328380
328618
  if (mutationGuard)
328381
328619
  return mutationGuard;
328382
- const range = listPermissionRanges(this.context).find((entry) => entry.id === input.id);
328383
- if (!range)
328384
- throw operationError("TARGET_NOT_FOUND", `permission range ${input.id} not found.`);
328620
+ const range = this.findByIdOrThrow(input.id);
328621
+ this.guardCollaborativeSecondaryStory(range);
328385
328622
  if (dryRunRequested(input, options))
328386
328623
  return { success: true, id: input.id };
328387
- let xml = this.readDocumentXml();
328624
+ let xml = this.readPartXmlOrThrow(range.partUri);
328388
328625
  xml = removeMarkerAt(xml, range.endTagStart, range.endTagEnd);
328389
328626
  xml = removeMarkerAt(xml, range.startTagStart, range.startTagEnd);
328390
- const committed = commitWholePartUpdates(this.context, "permission-range-remove", { [DOCUMENT_PART_URI5]: encodeXml(xml) }, { expectedRevision: expectedRevisionFrom(input, options) });
328627
+ const committed = commitWholePartUpdates(this.context, "permission-range-remove", { [range.partUri]: encodeXml(xml) }, { expectedRevision: expectedRevisionFrom(input, options), storyIds: [range.storyId] });
328391
328628
  if (!committed.ok)
328392
328629
  return { success: false, failure: { code: committed.code, message: committed.message } };
328393
328630
  return { success: true, id: input.id };
@@ -328396,37 +328633,80 @@ class V2PermissionRangesAdapter {
328396
328633
  const mutationGuard = guardDirectOnlyMutation(this.context, input, options);
328397
328634
  if (mutationGuard)
328398
328635
  return mutationGuard;
328399
- const range = listPermissionRanges(this.context).find((entry) => entry.id === input.id);
328400
- if (!range)
328401
- throw operationError("TARGET_NOT_FOUND", `permission range ${input.id} not found.`);
328636
+ const range = this.findByIdOrThrow(input.id);
328637
+ this.guardCollaborativeSecondaryStory(range);
328402
328638
  if (dryRunRequested(input, options))
328403
328639
  return { success: true, range: stripInternal2(range) };
328404
- const xml = this.readDocumentXml();
328640
+ const xml = this.readPartXmlOrThrow(range.partUri);
328405
328641
  const marker = xml.slice(range.startTagStart, range.startTagEnd);
328406
328642
  const nextMarker = buildPermStart(input.id, input.principal);
328407
328643
  const nextXml = xml.replace(marker, nextMarker);
328408
- const committed = commitWholePartUpdates(this.context, "permission-range-update", { [DOCUMENT_PART_URI5]: encodeXml(nextXml) }, { expectedRevision: expectedRevisionFrom(input, options) });
328644
+ const committed = commitWholePartUpdates(this.context, "permission-range-update", { [range.partUri]: encodeXml(nextXml) }, { expectedRevision: expectedRevisionFrom(input, options), storyIds: [range.storyId] });
328409
328645
  if (!committed.ok)
328410
328646
  return { success: false, failure: { code: committed.code, message: committed.message } };
328411
328647
  return { success: true, range: this.get({ id: input.id }) };
328412
328648
  }
328413
- readDocumentXml() {
328414
- const xml = readPartXml(this.context, DOCUMENT_PART_URI5);
328649
+ findByIdOrThrow(id) {
328650
+ const matches = listPermissionRanges(this.context).filter((entry) => entry.id === id);
328651
+ if (matches.length === 0)
328652
+ throw operationError("TARGET_NOT_FOUND", `permission range ${id} not found.`);
328653
+ if (matches.length > 1) {
328654
+ throw operationError("AMBIGUOUS_MATCH", `permission range id "${id}" exists in more than one part.`);
328655
+ }
328656
+ const [match] = matches;
328657
+ if (match.malformed) {
328658
+ throw operationError("AMBIGUOUS_MATCH", `permission range id "${id}" has duplicated markers within its part and cannot be resolved unambiguously.`);
328659
+ }
328660
+ return match;
328661
+ }
328662
+ readPartXmlOrThrow(partUri) {
328663
+ const xml = readPartXml(this.context, partUri);
328415
328664
  if (!xml)
328416
- throw operationError("PRECONDITION_FAILED", "document.xml bytes are unavailable.");
328665
+ throw operationError("PRECONDITION_FAILED", `${partUri} bytes are unavailable.`);
328417
328666
  return xml;
328418
328667
  }
328668
+ guardCollaborativeSecondaryStory(range) {
328669
+ if (range.story && this.context.isCollaborativeSession()) {
328670
+ throw operationError("CAPABILITY_UNAVAILABLE", COLLABORATIVE_SECONDARY_STORY_MESSAGE);
328671
+ }
328672
+ }
328419
328673
  }
328420
328674
  function listPermissionRanges(context) {
328421
- const xml = readPartXml(context, DOCUMENT_PART_URI5);
328422
- if (!xml)
328423
- return [];
328675
+ const out = [];
328676
+ for (const source of listStoryPartSources(context)) {
328677
+ const xml = readPartXml(context, source.partUri);
328678
+ if (!xml)
328679
+ continue;
328680
+ out.push(...parsePermissionRangesFromXml(xml, source));
328681
+ }
328682
+ return out.sort((a, b) => a.partUri === b.partUri ? a.startTagStart - b.startTagStart : a.partUri.localeCompare(b.partUri));
328683
+ }
328684
+ function listPermissionRangeRawIds(context) {
328685
+ const ids = new Set;
328686
+ const markerRe = /<w:perm(?:Start|End)\b[^>]*\/>/g;
328687
+ for (const source of listStoryPartSources(context)) {
328688
+ const xml = readPartXml(context, source.partUri);
328689
+ if (!xml)
328690
+ continue;
328691
+ for (let match = markerRe.exec(xml);match; match = markerRe.exec(xml)) {
328692
+ const id = attrValue(match[0], "id");
328693
+ if (id)
328694
+ ids.add(id);
328695
+ }
328696
+ }
328697
+ return ids;
328698
+ }
328699
+ function parsePermissionRangesFromXml(xml, source) {
328424
328700
  const starts = new Map;
328701
+ const duplicateStartIds = new Set;
328425
328702
  const startRe = /<w:permStart\b[^>]*\/>/g;
328426
328703
  for (let match = startRe.exec(xml);match; match = startRe.exec(xml)) {
328427
328704
  const id = attrValue(match[0], "id");
328428
- if (id)
328429
- starts.set(id, { start: match.index, end: startRe.lastIndex, tag: match[0] });
328705
+ if (!id)
328706
+ continue;
328707
+ if (starts.has(id))
328708
+ duplicateStartIds.add(id);
328709
+ starts.set(id, { start: match.index, end: startRe.lastIndex, tag: match[0] });
328430
328710
  }
328431
328711
  const out = [];
328432
328712
  const endRe = /<w:permEnd\b[^>]*\/>/g;
@@ -328438,21 +328718,23 @@ function listPermissionRanges(context) {
328438
328718
  if (!start)
328439
328719
  continue;
328440
328720
  const positions = positionsForMarkerEnvelope(xml, start.start, match.index);
328441
- const startPos = positions.start;
328442
- const endPos = positions.end;
328443
328721
  out.push({
328444
328722
  id,
328445
328723
  principal: principalFromPermStart(start.tag),
328446
- kind: startPos.blockId === endPos.blockId ? "inline" : "block",
328447
- start: startPos,
328448
- end: endPos,
328724
+ kind: positions.start.blockId === positions.end.blockId ? "inline" : "block",
328725
+ start: positions.start,
328726
+ end: positions.end,
328727
+ partUri: source.partUri,
328728
+ storyId: source.storyId,
328729
+ malformed: duplicateStartIds.has(id),
328730
+ ...source.story ? { story: source.story } : {},
328449
328731
  startTagStart: start.start,
328450
328732
  startTagEnd: start.end,
328451
328733
  endTagStart: match.index,
328452
328734
  endTagEnd: endRe.lastIndex
328453
328735
  });
328454
328736
  }
328455
- return out.sort((a, b) => a.startTagStart - b.startTagStart);
328737
+ return out;
328456
328738
  }
328457
328739
  function findContentControlXmlRange(xml, id) {
328458
328740
  const parsed = collectXmlElementRanges(xml);
@@ -328500,7 +328782,8 @@ function stripInternal2(range) {
328500
328782
  principal: range.principal,
328501
328783
  kind: range.kind,
328502
328784
  start: range.start,
328503
- end: range.end
328785
+ end: range.end,
328786
+ ...range.story ? { story: range.story } : {}
328504
328787
  };
328505
328788
  }
328506
328789
  function principalFromPermStart(tag) {
@@ -328520,9 +328803,9 @@ function buildPermEnd(id) {
328520
328803
  }
328521
328804
  function wrapTextRangeWithPermissionMarkers(paragraphXml, start, end, id, principal) {
328522
328805
  return replaceTextRangeInParagraph(paragraphXml, start, end, (selected) => [
328523
- `<w:r>${buildPermStart(id, principal)}</w:r>`,
328806
+ buildPermStart(id, principal),
328524
328807
  `<w:r><w:t>${xmlEscapeText(selected)}</w:t></w:r>`,
328525
- `<w:r>${buildPermEnd(id)}</w:r>`
328808
+ buildPermEnd(id)
328526
328809
  ].join(""));
328527
328810
  }
328528
328811
  function positionForXmlIndex(documentXml, index2) {
@@ -328578,10 +328861,13 @@ function replaceTextRangeInParagraph(paragraphXml, start, end, replacement) {
328578
328861
  }
328579
328862
  function removeMarkerAt(xml, start, end) {
328580
328863
  const runStart = findEnclosingRunStart(xml, start);
328581
- const runEnd = xml.indexOf("</w:r>", end);
328582
- if (runStart >= 0 && runEnd >= end) {
328583
- const runXml = xml.slice(runStart, runEnd + "</w:r>".length);
328584
- if (/^<w:r\b[^>]*>\s*<w:perm(?:Start|End)\b[^>]*\/>\s*<\/w:r>$/.test(runXml)) {
328864
+ if (runStart >= 0) {
328865
+ const { runOpenTag, runProperties } = readRunOpenTagAndProperties(xml, runStart);
328866
+ const runContentStart = runStart + runOpenTag.length + runProperties.length;
328867
+ const runEnd = xml.indexOf("</w:r>", end);
328868
+ const beforeMarker = xml.slice(runContentStart, start);
328869
+ const afterMarker = runEnd >= end ? xml.slice(end, runEnd) : null;
328870
+ if (afterMarker !== null && /^\s*$/.test(beforeMarker) && /^\s*$/.test(afterMarker)) {
328585
328871
  return replaceRange2(xml, runStart, runEnd + "</w:r>".length, "");
328586
328872
  }
328587
328873
  }
@@ -328597,14 +328883,19 @@ function extractText2(xml) {
328597
328883
  out += decodeXmlEntities(match[1]);
328598
328884
  return out;
328599
328885
  }
328600
- function allocateRangeId(existing) {
328601
- const max2 = existing.reduce((acc, range) => Math.max(acc, Number(range.id) || 0), 1000);
328886
+ function allocateRangeId(existingIds) {
328887
+ let max2 = 1000;
328888
+ for (const id of existingIds)
328889
+ max2 = Math.max(max2, Number(id) || 0);
328602
328890
  return String(max2 + 1 + Math.floor(Math.random() * 1000));
328603
328891
  }
328892
+ var COLLABORATIVE_SECONDARY_STORY_MESSAGE = "permission ranges in header/footer stories are not supported in collaborative sessions.";
328604
328893
  var init_adapter6 = __esm(() => {
328605
328894
  init_src3();
328606
328895
  init_sd_document_session_internal();
328607
328896
  init_visible_text();
328897
+ init_selection_target();
328898
+ init_story_surface();
328608
328899
  init_shared();
328609
328900
  init_xml();
328610
328901
  });
@@ -328793,9 +329084,9 @@ var init_adapter7 = __esm(() => {
328793
329084
  function documentProtectionAllowsXmlRange(context, partUri, start, end) {
328794
329085
  if (!new V2ProtectionAdapter(context).get().editingRestriction.runtimeEnforced)
328795
329086
  return true;
328796
- if (partUri !== DOCUMENT_PART_URI5 || start < 0 || end < start)
329087
+ if (start < 0 || end < start)
328797
329088
  return false;
328798
- return listPermissionRanges(context).some((range) => range.principal.kind === "everyone" && range.startTagEnd <= start && end <= range.endTagStart);
329089
+ return listPermissionRanges(context).some((range) => range.partUri === partUri && !range.malformed && range.principal.kind === "everyone" && range.startTagEnd <= start && end <= range.endTagStart);
328799
329090
  }
328800
329091
  function requireDocumentProtectionXmlRange(context, partUri, start, end) {
328801
329092
  if (!documentProtectionAllowsXmlRange(context, partUri, start, end)) {
@@ -328820,7 +329111,6 @@ var DOCUMENT_PROTECTION_MESSAGE = "document protection permits edits only within
328820
329111
  var init_mutation_guard = __esm(() => {
328821
329112
  init_shared();
328822
329113
  init_adapter6();
328823
- init_xml();
328824
329114
  init_adapter7();
328825
329115
  });
328826
329116
 
@@ -329557,107 +329847,6 @@ var init_v2_search_ref = __esm(() => {
329557
329847
  init_textbox_story();
329558
329848
  });
329559
329849
 
329560
- // ../../../v2/document-api-v2-adapter/dist/address/story-surface.js
329561
- function resolveStorySurface(session, bodyStoryId, locator) {
329562
- const resolved = resolveSessionStoryLocator(session, bodyStoryId, locator);
329563
- if ("error" in resolved) {
329564
- return { ok: false, failure: classifyStoryLocatorFailure(resolved.error) };
329565
- }
329566
- return { ok: true, descriptor: toStorySurfaceDescriptor(resolved) };
329567
- }
329568
- function toStorySurfaceDescriptor(resolved) {
329569
- const descriptor = {
329570
- storyId: resolved.storyId,
329571
- partUri: resolved.partUri,
329572
- storyKind: resolved.storyKind,
329573
- relationshipOwnerPartUri: resolved.relationshipOwnerPartUri,
329574
- sourceAvailability: resolved.materialization ? "materialize-on-write" : "available"
329575
- };
329576
- if (resolved.storyByteRange)
329577
- descriptor.storyByteRange = resolved.storyByteRange;
329578
- if (resolved.refId)
329579
- descriptor.refId = resolved.refId;
329580
- if (resolved.noteId)
329581
- descriptor.noteId = resolved.noteId;
329582
- if (resolved.textboxId)
329583
- descriptor.textboxId = resolved.textboxId;
329584
- if (resolved.materialization)
329585
- descriptor.materialization = resolved.materialization;
329586
- if (resolved.slot)
329587
- descriptor.slot = resolved.slot;
329588
- if (resolved.resolvedFromSectionId)
329589
- descriptor.resolvedFromSectionId = resolved.resolvedFromSectionId;
329590
- return descriptor;
329591
- }
329592
- function classifyStoryLocatorFailure(error48) {
329593
- return {
329594
- category: storyLocatorFailureCategory(error48),
329595
- reason: error48,
329596
- message: storyLocatorFailureMessage(error48)
329597
- };
329598
- }
329599
- function receiptFailureForStoryLocatorError(error48) {
329600
- const failure5 = classifyStoryLocatorFailure(error48);
329601
- return {
329602
- code: failure5.category,
329603
- message: failure5.message
329604
- };
329605
- }
329606
- function storyLocatorFailureCategory(error48) {
329607
- switch (error48) {
329608
- case "not-found":
329609
- case "unknown-section":
329610
- case "no-sections":
329611
- return "TARGET_NOT_FOUND";
329612
- case "unsupported-story":
329613
- case "inherited-edit-rejected":
329614
- case "cross-story-write-rejected":
329615
- return "CAPABILITY_UNAVAILABLE";
329616
- case "no-source-for-edit":
329617
- return "PRECONDITION_FAILED";
329618
- default: {
329619
- const _exhaustive = error48;
329620
- return _exhaustive;
329621
- }
329622
- }
329623
- }
329624
- function storyLocatorFailureMessage(error48) {
329625
- switch (error48) {
329626
- case "not-found":
329627
- return "the requested story target was not found";
329628
- case "unknown-section":
329629
- return "the requested section is not part of this document";
329630
- case "no-sections":
329631
- return "the document has no resolvable sections for this story";
329632
- case "unsupported-story":
329633
- return "this story family is not supported for the requested operation";
329634
- case "inherited-edit-rejected":
329635
- return "the header/footer slot is inherited and cannot be edited under the requested write policy";
329636
- case "cross-story-write-rejected":
329637
- return "the requested write would cross story boundaries";
329638
- case "no-source-for-edit":
329639
- return "the requested story has no source bytes available for this edit";
329640
- default:
329641
- return "the requested story could not be resolved";
329642
- }
329643
- }
329644
- function rangeWithinStorySurface(descriptor, range) {
329645
- const window2 = descriptor.storyByteRange;
329646
- if (!window2)
329647
- return null;
329648
- if (range.start >= window2[0] && range.end <= window2[1] && range.start <= range.end) {
329649
- return null;
329650
- }
329651
- return {
329652
- category: "INVALID_CONTEXT",
329653
- reason: null,
329654
- message: `byte range [${range.start}, ${range.end}] falls outside the resolved story window ` + `[${window2[0]}, ${window2[1]}] for story ${descriptor.storyId}`
329655
- };
329656
- }
329657
- var init_story_surface = __esm(() => {
329658
- init_story_locator();
329659
- });
329660
-
329661
329850
  // ../../../v2/document-api-v2-adapter/dist/address/raw-block-ref.js
329662
329851
  function resolveRawBlockRefTarget(context, ref5, scope) {
329663
329852
  if (scope) {
@@ -331245,14 +331434,14 @@ var init_effective_inline_uniformity = __esm(() => {
331245
331434
  });
331246
331435
 
331247
331436
  // ../../../v2/document-api-v2-adapter/dist/selection-mutation/adapter.js
331248
- function selectionIsAllowedByDocumentProtection(context, target, index2) {
331437
+ function selectionIsAllowedByDocumentProtection(context, target, index2, storyId) {
331249
331438
  const protection = new V2ProtectionAdapter(context).get().editingRestriction;
331250
331439
  if (!protection.runtimeEnforced)
331251
331440
  return true;
331252
331441
  const { start, end } = target;
331253
331442
  if (start.kind !== "text" || end.kind !== "text")
331254
331443
  return false;
331255
- return listPermissionRanges(context).some((range) => range.principal.kind === "everyone" && textPointIsWithinPermissionRange(start, range, index2) && textPointIsWithinPermissionRange(end, range, index2));
331444
+ return listPermissionRanges(context).some((range) => range.storyId === storyId && !range.malformed && range.principal.kind === "everyone" && textPointIsWithinPermissionRange(start, range, index2) && textPointIsWithinPermissionRange(end, range, index2));
331256
331445
  }
331257
331446
  function textPointIsWithinPermissionRange(point3, range, index2) {
331258
331447
  const pointEntry = index2.byParaId(point3.blockId);
@@ -331276,7 +331465,7 @@ function resolvedTextRangeIsAllowedByDocumentProtection(context, range) {
331276
331465
  kind: "selection",
331277
331466
  start: { kind: "text", blockId: range.startBlockId, offset: range.startOffset },
331278
331467
  end: { kind: "text", blockId: range.endBlockId, offset: range.endOffset }
331279
- }, index2);
331468
+ }, index2, range.storyId);
331280
331469
  }
331281
331470
 
331282
331471
  class V2SelectionMutationAdapter {
@@ -331568,7 +331757,7 @@ class V2SelectionMutationAdapter {
331568
331757
  return failureWithoutResolution("PRECONDITION_FAILED", "paragraph index is not available.");
331569
331758
  }
331570
331759
  const storyResolveMs = nowMs6() - storyResolveStartedAt;
331571
- if (!selectionIsAllowedByDocumentProtection(this.context, target, index2)) {
331760
+ if (!selectionIsAllowedByDocumentProtection(this.context, target, index2, story.storyId)) {
331572
331761
  return failureWithoutResolution("PERMISSION_DENIED", PERMISSION_DENIED_DOC_PROTECTION);
331573
331762
  }
331574
331763
  if ((options?.changeMode ?? "direct") === "tracked" && story.storyKind === "main") {
@@ -332298,7 +332487,7 @@ class V2SelectionMutationAdapter {
332298
332487
  resolved: outcome.resolved
332299
332488
  });
332300
332489
  const index2 = isMainStoryId(outcome.resolved.storyId) ? getSDDocumentSessionInternalParagraphIndex(this.context.session) : getSDDocumentSessionInternalStoryParagraphIndex(this.context.session, outcome.resolved.storyId);
332301
- if (index2 && !selectionIsAllowedByDocumentProtection(this.context, outcome.selectionTarget, index2)) {
332490
+ if (index2 && !selectionIsAllowedByDocumentProtection(this.context, outcome.selectionTarget, index2, outcome.resolved.storyId)) {
332302
332491
  return {
332303
332492
  success: false,
332304
332493
  failure: {
@@ -332333,7 +332522,7 @@ class V2SelectionMutationAdapter {
332333
332522
  if (!index2) {
332334
332523
  return failureWithoutResolution("PRECONDITION_FAILED", "paragraph index is not available.");
332335
332524
  }
332336
- if (!selectionIsAllowedByDocumentProtection(this.context, destination, index2)) {
332525
+ if (!selectionIsAllowedByDocumentProtection(this.context, destination, index2, story.storyId)) {
332337
332526
  return failureWithoutResolution("PERMISSION_DENIED", PERMISSION_DENIED_DOC_PROTECTION);
332338
332527
  }
332339
332528
  const offsetSpace = selectionOffsetSpace(options);
@@ -332478,7 +332667,7 @@ class V2SelectionMutationAdapter {
332478
332667
  if (!index2) {
332479
332668
  return failureWithoutResolution("PRECONDITION_FAILED", "paragraph index is not available.");
332480
332669
  }
332481
- if (!selectionIsAllowedByDocumentProtection(this.context, target, index2)) {
332670
+ if (!selectionIsAllowedByDocumentProtection(this.context, target, index2, story.storyId)) {
332482
332671
  return failureWithoutResolution("PERMISSION_DENIED", PERMISSION_DENIED_DOC_PROTECTION);
332483
332672
  }
332484
332673
  const offsetSpace = selectionOffsetSpace(options);
@@ -332905,7 +333094,7 @@ class V2SelectionMutationAdapter {
332905
333094
  if (!index2 || index2.entries.length === 0) {
332906
333095
  return failureWithoutResolution("PRECONDITION_FAILED", "paragraph index is not available.");
332907
333096
  }
332908
- if (!selectionIsAllowedByDocumentProtection(this.context, target, index2)) {
333097
+ if (!selectionIsAllowedByDocumentProtection(this.context, target, index2, story.storyId)) {
332909
333098
  return failureWithoutResolution("PERMISSION_DENIED", "document protection permits edits only within an everyone permission range.");
332910
333099
  }
332911
333100
  const startEntry = index2.byParaId(target.start.blockId);
@@ -333252,17 +333441,6 @@ function buildInsertedTextEffect(input) {
333252
333441
  insertedText: [{ kind: "insertedText", target, selectionTarget, text: input.text }]
333253
333442
  };
333254
333443
  }
333255
- function pickStoryLocator(target, override) {
333256
- if (override)
333257
- return override;
333258
- if (target.story)
333259
- return target.story;
333260
- if (target.start.kind === "text" && target.start.story)
333261
- return target.start.story;
333262
- if (target.end.kind === "text" && target.end.story)
333263
- return target.end.story;
333264
- return;
333265
- }
333266
333444
  function selectionOffsetSpace(options) {
333267
333445
  const offsetSpace = options?.offsetSpace;
333268
333446
  return offsetSpace === "selection" || offsetSpace === "kernel" ? offsetSpace : undefined;
@@ -422668,6 +422846,15 @@ function nextSeededBlockId(shardId, paragraphIndex, reason) {
422668
422846
  return `sd-${shardToken}-${reason}-${ordinal}`;
422669
422847
  }
422670
422848
  function seedStoryShard(input) {
422849
+ const target = input.doc;
422850
+ const doc2 = "rootDoc" in target ? target.rootDoc : ("doc" in target) ? target.doc : target;
422851
+ let result;
422852
+ doc2.transact(() => {
422853
+ result = seedStoryShardInTransaction(input);
422854
+ }, "story-shard:seed");
422855
+ return result;
422856
+ }
422857
+ function seedStoryShardInTransaction(input) {
422671
422858
  const { shardId, storyId, storyKind, sourcePartUri, paragraphs } = input;
422672
422859
  const editable = input.editable ?? STORY_EDITABLE.get(storyKind) ?? false;
422673
422860
  const scope = resolveStoryShardScope(input.doc);
@@ -448986,6 +449173,12 @@ async function openV2CollaborativeDocumentSession(options) {
448986
449173
  contentUnitIds: Array.from(canonical.contentUnitIds)
448987
449174
  });
448988
449175
  if (!finalized.committed) {
449176
+ if (finalized.classification === ROOM_CLASSIFICATION.v2Committed && options.runtime.validateLateJoin({
449177
+ compatibility: { supports: COLLAB_V2_ROOM_SCHEMA_VERSION },
449178
+ readiness: READINESS_CLASS.bodyEditable
449179
+ }).ok) {
449180
+ throw new CollabV2DiagnosticError(COLLAB_V2_DIAGNOSTICS.COLLAB_V2_ROOM_ALREADY_EXISTS, "another creator committed this v2 collaboration room during open; reopen with join", { rootId: options.runtime.rootId });
449181
+ }
448989
449182
  if (finalized.diagnostics.some((diagnostic2) => diagnostic2.code === COLLAB_V2_DIAGNOSTICS.COLLAB_V2_BOOTSTRAP_CLAIM_LOST)) {
448990
449183
  throw new CollabV2DiagnosticError(COLLAB_V2_DIAGNOSTICS.COLLAB_V2_ROOM_INITIALIZING, "another creator is initializing this v2 collaboration room", { rootId: options.runtime.rootId });
448991
449184
  }