@stll/folio-core 0.54.2 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/dist/ai-edits/apply.js +22 -1
  2. package/dist/ai-edits/headless.js +1 -0
  3. package/dist/compare/content-types.d.ts +3 -15
  4. package/dist/controller/canonicalComposition.d.ts +36 -0
  5. package/dist/controller/canonicalComposition.js +168 -0
  6. package/dist/controller/canonicalInput.d.ts +45 -0
  7. package/dist/controller/canonicalInput.js +338 -0
  8. package/dist/controller/canonicalOperations.d.ts +22 -0
  9. package/dist/controller/canonicalOperations.js +85 -0
  10. package/dist/controller/canonicalReview.d.ts +12 -0
  11. package/dist/controller/canonicalReview.js +19 -0
  12. package/dist/controller/canonicalSession.d.ts +149 -0
  13. package/dist/controller/canonicalSession.js +1038 -0
  14. package/dist/controller/canonicalStoryEditor.d.ts +34 -0
  15. package/dist/controller/canonicalStoryEditor.js +82 -0
  16. package/dist/controller/canonicalStructure.d.ts +16 -0
  17. package/dist/controller/canonicalStructure.js +269 -0
  18. package/dist/controller/folioEditor.d.ts +1 -1
  19. package/dist/controller/folioEditor.js +9 -0
  20. package/dist/controller/headerFooterEditorManager.d.ts +4 -0
  21. package/dist/controller/headerFooterEditorManager.js +71 -3
  22. package/dist/controller/hiddenEditorApi.d.ts +35 -0
  23. package/dist/controller/hiddenEditorApi.js +25 -8
  24. package/dist/controller/hiddenEditorManager.d.ts +11 -2
  25. package/dist/controller/hiddenEditorManager.js +456 -30
  26. package/dist/controller/layoutPipeline.d.ts +1 -1
  27. package/dist/controller/layoutPipeline.js +2 -0
  28. package/dist/controller/noteEditorManager.d.ts +4 -0
  29. package/dist/controller/noteEditorManager.js +113 -15
  30. package/dist/docx/attributeRemainder.js +1 -0
  31. package/dist/docx/canonicalSessionInput.d.ts +11 -0
  32. package/dist/docx/canonicalSessionInput.js +27 -0
  33. package/dist/docx/canonicalStoryRepack.d.ts +10 -0
  34. package/dist/docx/canonicalStoryRepack.js +41 -0
  35. package/dist/docx/contentTypeRegistry.d.ts +8 -0
  36. package/dist/docx/contentTypeRegistry.js +64 -0
  37. package/dist/docx/ensureParaIds.d.ts +7 -1
  38. package/dist/docx/ensureParaIds.js +163 -211
  39. package/dist/docx/foldedListNumberFields.d.ts +85 -0
  40. package/dist/docx/foldedListNumberFields.js +267 -0
  41. package/dist/docx/headerFooterVerbatim.d.ts +14 -1
  42. package/dist/docx/headerFooterVerbatim.js +95 -2
  43. package/dist/docx/noteIds.d.ts +5 -0
  44. package/dist/docx/noteIds.js +6 -2
  45. package/dist/docx/noteReferenceMark.d.ts +3 -1
  46. package/dist/docx/noteReferenceMark.js +15 -14
  47. package/dist/docx/numberingParser.d.ts +3 -1
  48. package/dist/docx/numberingParser.js +17 -3
  49. package/dist/docx/packageParts.d.ts +3 -1
  50. package/dist/docx/packageParts.js +65 -16
  51. package/dist/docx/paragraphMarkPropertyPresence.d.ts +9 -0
  52. package/dist/docx/paragraphMarkPropertyPresence.js +21 -0
  53. package/dist/docx/paragraphParser.js +101 -53
  54. package/dist/docx/paragraphPropertySource.d.ts +15 -1
  55. package/dist/docx/paragraphPropertySource.js +76 -22
  56. package/dist/docx/parser.js +2 -1
  57. package/dist/docx/reviewHistoryNamespace.d.ts +4 -0
  58. package/dist/docx/reviewHistoryNamespace.js +4 -0
  59. package/dist/docx/reviewResolutionProvenance.d.ts +25 -0
  60. package/dist/docx/reviewResolutionProvenance.js +153 -0
  61. package/dist/docx/rezip.d.ts +7 -3
  62. package/dist/docx/rezip.js +107 -45
  63. package/dist/docx/runConsolidator.d.ts +2 -58
  64. package/dist/docx/runConsolidator.js +3 -175
  65. package/dist/docx/runParser.d.ts +2 -1
  66. package/dist/docx/runParser.js +156 -116
  67. package/dist/docx/saveDiagnostics.d.ts +11 -0
  68. package/dist/docx/saveDiagnostics.js +0 -0
  69. package/dist/docx/selectiveSave.d.ts +2 -1
  70. package/dist/docx/selectiveSave.js +4 -1
  71. package/dist/docx/selectiveXmlPatch.d.ts +16 -8
  72. package/dist/docx/selectiveXmlPatch.js +74 -2
  73. package/dist/docx/serializer/headerFooterSerializer.d.ts +5 -1
  74. package/dist/docx/serializer/headerFooterSerializer.js +19 -11
  75. package/dist/docx/serializer/noteSerializer.d.ts +2 -2
  76. package/dist/docx/serializer/noteSerializer.js +24 -8
  77. package/dist/docx/serializer/paragraphSerializer.js +41 -4
  78. package/dist/docx/serializer/partNamespaces.js +2 -1
  79. package/dist/docx/serializer/runSerializer.js +3 -1
  80. package/dist/docx/settingsHeaderFooterUpdate.d.ts +5 -0
  81. package/dist/docx/settingsHeaderFooterUpdate.js +90 -0
  82. package/dist/docx/settingsParser.d.ts +1 -2
  83. package/dist/docx/settingsParser.js +5 -6
  84. package/dist/docx/storyBlockReplay.d.ts +11 -0
  85. package/dist/docx/storyBlockReplay.js +367 -0
  86. package/dist/docx/streamingXmlParser.d.ts +22 -1
  87. package/dist/docx/streamingXmlParser.js +49 -3
  88. package/dist/docx/structuralXmlPatch.js +8 -1
  89. package/dist/docx/verbatimCapture.d.ts +3 -1
  90. package/dist/docx/verbatimCapture.js +49 -6
  91. package/dist/i18n/messages/ar.gen.d.ts +5 -0
  92. package/dist/i18n/messages/ar.gen.js +656 -0
  93. package/dist/i18n/messages/cs.gen.d.ts +5 -0
  94. package/dist/i18n/messages/cs.gen.js +656 -0
  95. package/dist/i18n/messages/de.gen.d.ts +5 -0
  96. package/dist/i18n/messages/de.gen.js +656 -0
  97. package/dist/i18n/messages/en.gen.d.ts +5 -0
  98. package/dist/i18n/messages/en.gen.js +656 -0
  99. package/dist/i18n/messages/es.gen.d.ts +5 -0
  100. package/dist/i18n/messages/es.gen.js +656 -0
  101. package/dist/i18n/messages/et.gen.d.ts +5 -0
  102. package/dist/i18n/messages/et.gen.js +656 -0
  103. package/dist/i18n/messages/fr.gen.d.ts +5 -0
  104. package/dist/i18n/messages/fr.gen.js +656 -0
  105. package/dist/i18n/messages/he.gen.d.ts +5 -0
  106. package/dist/i18n/messages/he.gen.js +656 -0
  107. package/dist/i18n/messages/hi.gen.d.ts +5 -0
  108. package/dist/i18n/messages/hi.gen.js +656 -0
  109. package/dist/i18n/messages/hu.gen.d.ts +5 -0
  110. package/dist/i18n/messages/hu.gen.js +656 -0
  111. package/dist/i18n/messages/locales.d.ts +5 -0
  112. package/dist/i18n/messages/locales.js +22 -0
  113. package/dist/i18n/messages/lt.gen.d.ts +5 -0
  114. package/dist/i18n/messages/lt.gen.js +656 -0
  115. package/dist/i18n/messages/lv.gen.d.ts +5 -0
  116. package/dist/i18n/messages/lv.gen.js +656 -0
  117. package/dist/i18n/messages/pl.gen.d.ts +5 -0
  118. package/dist/i18n/messages/pl.gen.js +656 -0
  119. package/dist/i18n/messages/pt-BR.gen.d.ts +5 -0
  120. package/dist/i18n/messages/pt-BR.gen.js +656 -0
  121. package/dist/i18n/messages/sk.gen.d.ts +5 -0
  122. package/dist/i18n/messages/sk.gen.js +656 -0
  123. package/dist/i18n/messages/tr.gen.d.ts +5 -0
  124. package/dist/i18n/messages/tr.gen.js +656 -0
  125. package/dist/i18n/messages/zh-CN.gen.d.ts +5 -0
  126. package/dist/i18n/messages/zh-CN.gen.js +656 -0
  127. package/dist/i18n/messages.d.ts +2 -3
  128. package/dist/i18n/messages.js +1 -19
  129. package/dist/internal/noteMarkerAttrs.d.ts +8 -0
  130. package/dist/internal/noteMarkerAttrs.js +16 -0
  131. package/dist/internal/pageBreakRunSourceDescendantIndex.js +1 -0
  132. package/dist/internal/prosemirrorAttrBoundary.d.ts +21 -0
  133. package/dist/internal/prosemirrorAttrBoundary.js +50 -0
  134. package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
  135. package/dist/layout-bridge/convert/footnoteLayout.js +3 -3
  136. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
  137. package/dist/layout-bridge/convert/headerFooterLayout.js +1 -0
  138. package/dist/layout-bridge/convert/noteReferences.d.ts +1 -3
  139. package/dist/layout-bridge/convert/noteReferences.js +1 -6
  140. package/dist/layout-bridge/convert/paragraphRuns.js +2 -4
  141. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +2 -2
  142. package/dist/layout-bridge/convert/toFlowBlocks.js +2 -2
  143. package/dist/managers/DocumentLoaderManager.d.ts +1 -0
  144. package/dist/managers/DocumentLoaderManager.js +8 -1
  145. package/dist/markdown/renderBlock.js +15 -1
  146. package/dist/markdown/renderParagraph.js +9 -13
  147. package/dist/markdown/renderRuns.js +3 -2
  148. package/dist/markdown/renderTable.js +2 -0
  149. package/dist/markdown/types.d.ts +3 -9
  150. package/dist/prosemirror/attrs/index.d.ts +2 -12
  151. package/dist/prosemirror/attrs/index.js +22 -48
  152. package/dist/prosemirror/bookmarkBoundaryAttrs.d.ts +2 -1
  153. package/dist/prosemirror/canonicalCommands.d.ts +97 -0
  154. package/dist/prosemirror/canonicalCommands.js +28 -0
  155. package/dist/prosemirror/commands/pageBreak.js +15 -1
  156. package/dist/prosemirror/commentReferenceAttrs.d.ts +2 -1
  157. package/dist/prosemirror/conversion/fromProseDoc.js +91 -19
  158. package/dist/prosemirror/conversion/listRenderingDefinition.d.ts +6 -0
  159. package/dist/prosemirror/conversion/listRenderingDefinition.js +97 -0
  160. package/dist/prosemirror/conversion/toProseDoc.d.ts +4 -3
  161. package/dist/prosemirror/conversion/toProseDoc.js +51 -11
  162. package/dist/prosemirror/executeEditorCommand.d.ts +11 -0
  163. package/dist/prosemirror/executeEditorCommand.js +26 -0
  164. package/dist/prosemirror/extensions/StarterKit.js +2 -0
  165. package/dist/prosemirror/extensions/core/ParagraphExtension.js +50 -19
  166. package/dist/prosemirror/extensions/features/ListExtension.js +18 -5
  167. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +5 -2
  168. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +13 -1
  169. package/dist/prosemirror/extensions/marks/TextColorExtension.js +3 -2
  170. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +2 -0
  171. package/dist/prosemirror/extensions/marks/markUtils.js +70 -8
  172. package/dist/prosemirror/extensions/nodes/NoteMarkerExtension.d.ts +6 -0
  173. package/dist/prosemirror/extensions/nodes/NoteMarkerExtension.js +36 -0
  174. package/dist/prosemirror/extensions/nodes/PreservedXmlExtension.js +4 -2
  175. package/dist/prosemirror/listMarker.d.ts +1 -0
  176. package/dist/prosemirror/listMarker.js +16 -7
  177. package/dist/prosemirror/listNumbering.js +26 -5
  178. package/dist/prosemirror/listRenderingAttrs.d.ts +1 -0
  179. package/dist/prosemirror/listRenderingAttrs.js +3 -0
  180. package/dist/prosemirror/markupViewNotes.js +3 -2
  181. package/dist/prosemirror/moveRangeBoundaryAttrs.d.ts +2 -1
  182. package/dist/prosemirror/noteReferenceReview.js +5 -3
  183. package/dist/prosemirror/plugins/suggestionMode.js +50 -2
  184. package/dist/prosemirror/rangeAnchorAttrs.d.ts +2 -1
  185. package/dist/prosemirror/runFormattingFromMarks.d.ts +4 -1
  186. package/dist/prosemirror/runFormattingFromMarks.js +15 -1
  187. package/dist/prosemirror/runFormattingInlineCarriers.d.ts +2 -1
  188. package/dist/prosemirror/runFormattingInlineCarriers.js +4 -1
  189. package/dist/prosemirror/schema/marks.d.ts +2 -0
  190. package/dist/prosemirror/schema/nodes.d.ts +10 -2
  191. package/dist/prosemirror/textBoxAnchorAttrs.d.ts +2 -1
  192. package/dist/prosemirror/textInput.js +5 -1
  193. package/dist/prosemirror/trackedRevisionPath.js +2 -1
  194. package/dist/prosemirror/trackedRunInlineAtoms.d.ts +1 -0
  195. package/dist/prosemirror/trackedRunInlineAtoms.js +1 -0
  196. package/dist/prosemirror/validation.js +4 -0
  197. package/dist/types/content.d.ts +2 -2
  198. package/dist/utils/createDocument.js +2 -2
  199. package/package.json +14 -2
@@ -1,24 +1,6 @@
1
1
  import { CATALOGS as CATALOGS$1 } from "./messages/catalogs.gen.js";
2
+ import { FOLIO_LOCALES } from "./messages/locales.js";
2
3
  //#region src/i18n/messages.ts
3
- const FOLIO_LOCALES = [
4
- "en",
5
- "de",
6
- "fr",
7
- "es",
8
- "cs",
9
- "ar",
10
- "et",
11
- "he",
12
- "hi",
13
- "hu",
14
- "lt",
15
- "lv",
16
- "pl",
17
- "pt-BR",
18
- "sk",
19
- "tr",
20
- "zh-CN"
21
- ];
22
4
  const CATALOGS = CATALOGS$1;
23
5
  const FOLIO_LOCALE_SET = new Set(FOLIO_LOCALES);
24
6
  const isFolioLocale = (locale) => FOLIO_LOCALE_SET.has(locale);
@@ -0,0 +1,8 @@
1
+ import { NoteMarkerAttrs } from "../prosemirror/schema/nodes.js";
2
+ import { ReadProseMirrorAttrsResult } from "./prosemirrorAttrBoundary.js";
3
+ import { Node } from "prosemirror-model";
4
+ //#region src/internal/noteMarkerAttrs.d.ts
5
+ declare const readNoteMarkerAttrs: (node: Node) => ReadProseMirrorAttrsResult<NoteMarkerAttrs>;
6
+ declare const expectNoteMarkerAttrs: (node: Node) => NoteMarkerAttrs;
7
+ //#endregion
8
+ export { expectNoteMarkerAttrs, readNoteMarkerAttrs };
@@ -0,0 +1,16 @@
1
+ import { attrsRecord, attrsResult, expectCachedNodeAttrs, expectNodeType } from "./prosemirrorAttrBoundary.js";
2
+ //#region src/internal/noteMarkerAttrs.ts
3
+ const noteMarkerAttrsCache = /* @__PURE__ */ new WeakMap();
4
+ const readNoteMarkerAttrs = (node) => {
5
+ const attrs = attrsRecord(node.attrs);
6
+ const issues = [];
7
+ expectNodeType(node, "noteMarker", issues);
8
+ if (attrs["kind"] !== "footnote" && attrs["kind"] !== "endnote") issues.push({
9
+ path: "noteMarker.attrs.kind",
10
+ message: "Expected footnote or endnote."
11
+ });
12
+ return attrsResult(attrs, issues);
13
+ };
14
+ const expectNoteMarkerAttrs = (node) => expectCachedNodeAttrs(node, noteMarkerAttrsCache, readNoteMarkerAttrs, "noteMarker attrs");
15
+ //#endregion
16
+ export { expectNoteMarkerAttrs, readNoteMarkerAttrs };
@@ -37,6 +37,7 @@ const buildPageBreakRunSourceDescendantIndex = (rootContent) => {
37
37
  case "footnoteRef":
38
38
  case "instrText":
39
39
  case "noBreakHyphen":
40
+ case "noteMarker":
40
41
  case "preservedXml":
41
42
  case "renderedPageBreak":
42
43
  case "softHyphen":
@@ -0,0 +1,21 @@
1
+ import { Node } from "prosemirror-model";
2
+ //#region src/internal/prosemirrorAttrBoundary.d.ts
3
+ type ProseMirrorAttrIssue = {
4
+ readonly path: string;
5
+ readonly message: string;
6
+ };
7
+ type ReadProseMirrorAttrsResult<T> = {
8
+ ok: true;
9
+ value: T;
10
+ } | {
11
+ ok: false;
12
+ issues: readonly ProseMirrorAttrIssue[];
13
+ };
14
+ declare const attrsRecord: (attrs: unknown) => Record<string, unknown>;
15
+ declare const isRecord: (value: unknown) => value is Record<string, unknown>;
16
+ declare const attrsResult: <T>(attrs: Record<string, unknown>, issues: ProseMirrorAttrIssue[]) => ReadProseMirrorAttrsResult<T>;
17
+ declare const expectAttrs: <T>(result: ReadProseMirrorAttrsResult<T>, label: string) => T;
18
+ declare function expectCachedNodeAttrs<T extends object>(node: Node, cache: WeakMap<Node, T>, reader: (node: Node) => ReadProseMirrorAttrsResult<T>, label: string): T;
19
+ declare const expectNodeType: (node: Node, expected: string, issues: ProseMirrorAttrIssue[]) => void;
20
+ //#endregion
21
+ export { ProseMirrorAttrIssue, ReadProseMirrorAttrsResult, attrsRecord, attrsResult, expectAttrs, expectCachedNodeAttrs, expectNodeType, isRecord };
@@ -0,0 +1,50 @@
1
+ import { panic } from "better-result";
2
+ //#region src/internal/prosemirrorAttrBoundary.ts
3
+ const attrsRecord = (attrs) => {
4
+ if (isRecord(attrs)) return attrs;
5
+ return {};
6
+ };
7
+ const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
8
+ const attrsResult = (attrs, issues) => {
9
+ if (issues.length > 0) return {
10
+ ok: false,
11
+ issues
12
+ };
13
+ let normalizedAttrs;
14
+ return {
15
+ ok: true,
16
+ get value() {
17
+ if (normalizedAttrs !== void 0) return normalizedAttrs;
18
+ const presentAttrs = {};
19
+ for (const key in attrs) {
20
+ if (!Object.hasOwn(attrs, key)) continue;
21
+ const value = attrs[key];
22
+ if (value !== null) presentAttrs[key] = value;
23
+ }
24
+ normalizedAttrs = presentAttrs;
25
+ return normalizedAttrs;
26
+ },
27
+ set value(value) {
28
+ normalizedAttrs = value;
29
+ }
30
+ };
31
+ };
32
+ const expectAttrs = (result, label) => {
33
+ if (result.ok) return result.value;
34
+ panic(`Invalid ProseMirror ${label}:\n${result.issues.map((issue) => `${issue.path}: ${issue.message}`).join("\n")}`);
35
+ };
36
+ function expectCachedNodeAttrs(node, cache, reader, label) {
37
+ const cached = cache.get(node);
38
+ if (cached) return cached;
39
+ const value = expectAttrs(reader(node), label);
40
+ cache.set(node, value);
41
+ return value;
42
+ }
43
+ const expectNodeType = (node, expected, issues) => {
44
+ if (node.type.name !== expected) issues.push({
45
+ path: "node.type.name",
46
+ message: `Expected ${expected}, got ${node.type.name}.`
47
+ });
48
+ };
49
+ //#endregion
50
+ export { attrsRecord, attrsResult, expectAttrs, expectCachedNodeAttrs, expectNodeType, isRecord };
@@ -6,6 +6,7 @@ import "./toFlowBlocks.js";
6
6
  type MeasureBlocksFn = (blocks: FlowBlock[], contentWidth: number) => Measure[];
7
7
  type ConvertFootnoteOptions = {
8
8
  styles?: document_d_exports.StyleDefinitions | null;
9
+ numbering?: document_d_exports.NumberingDefinitions;
9
10
  theme?: document_d_exports.Theme | null;
10
11
  defaultSize?: number;
11
12
  fontAlternates?: ToFlowBlocksOptions["fontAlternates"];
@@ -1,9 +1,8 @@
1
1
  import { measureParagraph } from "../../layout-engine/measure/measureParagraph.js";
2
2
  import { layoutTextBoxContent } from "../../layout-engine/measure/textBoxParagraphLayout.js";
3
3
  import { DEFAULT_TEXTBOX_MARGINS, FOOTNOTE_ENTRY_MARGIN_BOTTOM, FOOTNOTE_FALLBACK_LINE_HEIGHT, FOOTNOTE_SEPARATOR_HEIGHT, isFloatingImageRun, resolveTableWidthPx } from "../../layout-engine/types.js";
4
- import { expectPreservedXmlAttrs } from "../../prosemirror/attrs/index.js";
5
4
  import { footnoteToProseDoc } from "../../prosemirror/conversion/toProseDoc.js";
6
- import { collectNoteRefs, isNoteReferenceMarkXml } from "./noteReferences.js";
5
+ import { collectNoteRefs } from "./noteReferences.js";
7
6
  import { toFlowBlocks } from "./toFlowBlocks.js";
8
7
  //#region src/layout-bridge/convert/footnoteLayout.ts
9
8
  /** Default footnote font size in points */
@@ -203,6 +202,7 @@ function convertNoteStoryToFlowBlocks(content, options, referenceMarkText) {
203
202
  const proseOptions = {};
204
203
  if (options.styles) proseOptions.styles = options.styles;
205
204
  if (options.theme !== void 0) proseOptions.theme = options.theme;
205
+ if (options.numbering !== void 0) proseOptions.numbering = options.numbering;
206
206
  const pmDoc = footnoteToProseDoc(content, proseOptions);
207
207
  const flowOptions = {};
208
208
  if (options.defaultSize !== void 0) flowOptions.defaultSize = options.defaultSize;
@@ -225,7 +225,7 @@ function containsNoteReferenceMark(doc) {
225
225
  let found = false;
226
226
  doc.descendants((node) => {
227
227
  if (found) return false;
228
- if (node.type.name === "preservedXml" && isNoteReferenceMarkXml(expectPreservedXmlAttrs(node).xml)) found = true;
228
+ if (node.type.name === "noteMarker") found = true;
229
229
  return !found;
230
230
  });
231
231
  return found;
@@ -41,6 +41,7 @@ declare function calculateHeaderFooterMarginPushBounds(blocks: FlowBlock[], meas
41
41
  declare function calculateHeaderFooterBodyTopClearance(blocks: FlowBlock[], flowHeight: number, metrics: HeaderFooterMetrics): number | undefined;
42
42
  type ConvertHeaderFooterOptions = {
43
43
  styles?: document_d_exports.StyleDefinitions | null;
44
+ numbering?: document_d_exports.NumberingDefinitions;
44
45
  theme?: document_d_exports.Theme | null;
45
46
  defaultSize?: number;
46
47
  fontAlternates?: ToFlowBlocksOptions["fontAlternates"];
@@ -340,6 +340,7 @@ function convertHeaderFooterToContent(headerFooter, contentWidth, metrics, optio
340
340
  const proseDocOptions = {};
341
341
  if (options.styles) proseDocOptions.styles = options.styles;
342
342
  if (options.theme !== void 0) proseDocOptions.theme = options.theme;
343
+ if (options.numbering !== void 0) proseDocOptions.numbering = options.numbering;
343
344
  const pmDoc = headerFooter.watermarkBlockIndex === void 0 ? headerFooterToProseDoc(headerFooter.content, proseDocOptions) : headerFooterToProseDocWithDetachedWatermarkHost(headerFooter, proseDocOptions);
344
345
  const flowOptions = {};
345
346
  if (options.defaultSize !== void 0) flowOptions.defaultSize = options.defaultSize;
@@ -8,7 +8,5 @@ declare function collectNoteRefs(blocks: readonly FlowBlock[], idKey: "footnoteR
8
8
  noteId: number;
9
9
  pmPos: number;
10
10
  }[];
11
- /** Whether captured run-child markup is a note story's `w:footnoteRef`/`w:endnoteRef`. */
12
- declare function isNoteReferenceMarkXml(xml: string): boolean;
13
11
  //#endregion
14
- export { collectNoteRefs, isNoteReferenceMarkXml };
12
+ export { collectNoteRefs };
@@ -1,5 +1,4 @@
1
1
  //#region src/layout-bridge/convert/noteReferences.ts
2
- const NOTE_REFERENCE_MARK_XML = /^<(?:[^\s:/>]+:)?(?:footnoteRef|endnoteRef)[\s/>]/u;
3
2
  /**
4
3
  * Runs with `idKey` set, in document order: the note references a block list
5
4
  * makes, through table cells (and tables within cells) and text boxes.
@@ -21,9 +20,5 @@ function collectNoteRefs(blocks, idKey) {
21
20
  walk(blocks);
22
21
  return refs;
23
22
  }
24
- /** Whether captured run-child markup is a note story's `w:footnoteRef`/`w:endnoteRef`. */
25
- function isNoteReferenceMarkXml(xml) {
26
- return NOTE_REFERENCE_MARK_XML.test(xml);
27
- }
28
23
  //#endregion
29
- export { collectNoteRefs, isNoteReferenceMarkXml };
24
+ export { collectNoteRefs };
@@ -3,7 +3,6 @@ import { expectFieldAttrs, expectImageAttrs, expectMathAttrs, expectParagraphAtt
3
3
  import { decodeOoxmlSymbolCharacter } from "../../utils/ooxmlSymbol.js";
4
4
  import { tableOfContentsStyleLevel } from "../../utils/tableOfContentsStyle.js";
5
5
  import { buildImageRun, constrainImageToPage, hasPaintableImageSource, hasRelationshipBackedImageBox } from "./imageConversion.js";
6
- import { isNoteReferenceMarkXml } from "./noteReferences.js";
7
6
  import { applyCharacterStyleToggleFormatting, markDefaultBlackTextColorSource, mergeRunFormatting } from "./runFormattingMerge.js";
8
7
  import { extractRunFormatting } from "./runMarkFormatting.js";
9
8
  import { paragraphRunDefaults } from "./textFormattingConversion.js";
@@ -135,9 +134,8 @@ function paragraphToRuns(node, startPos, _options, pageBreaks) {
135
134
  });
136
135
  return;
137
136
  }
138
- if (child.type.name === "preservedXml") {
139
- const { xml, text: capturedText } = expectPreservedXmlAttrs(child);
140
- const text = capturedText === "" && _options.noteReferenceMarkText !== void 0 && isNoteReferenceMarkXml(xml) ? _options.noteReferenceMarkText : capturedText;
137
+ if (child.type.name === "preservedXml" || child.type.name === "noteMarker") {
138
+ const text = child.type.name === "noteMarker" ? _options.noteReferenceMarkText ?? "" : expectPreservedXmlAttrs(child).text;
141
139
  if (text === "") return;
142
140
  const formatting = extractRunFormatting(effectiveMarks, theme, fontAlternates);
143
141
  applyCharacterStyleToggleFormatting({
@@ -1,7 +1,7 @@
1
1
  import { FlowBlock } from "../../layout-engine/types.js";
2
2
  import { formatCounter, resolveListTemplate } from "../../prosemirror/listMarker.js";
3
3
  import { ToFlowBlocksOptions, resetBlockIdCounter } from "./flowConversionShared.js";
4
- import { collectNoteRefs, isNoteReferenceMarkXml } from "./noteReferences.js";
4
+ import { collectNoteRefs } from "./noteReferences.js";
5
5
  import { convertBorderSpecToLayout } from "./flowBorders.js";
6
6
  import { Node } from "prosemirror-model";
7
7
  //#region src/layout-bridge/convert/toFlowBlocks.d.ts
@@ -21,4 +21,4 @@ declare const WORD_UNSPECIFIED_FONT_SIZE = 10;
21
21
  */
22
22
  declare function toFlowBlocks(doc: Node, options?: ToFlowBlocksOptions): FlowBlock[];
23
23
  //#endregion
24
- export { type ToFlowBlocksOptions, WORD_UNSPECIFIED_FONT_SIZE, collectNoteRefs, convertBorderSpecToLayout, formatCounter, isNoteReferenceMarkXml, resetBlockIdCounter, resolveListTemplate, toFlowBlocks };
24
+ export { type ToFlowBlocksOptions, WORD_UNSPECIFIED_FONT_SIZE, collectNoteRefs, convertBorderSpecToLayout, formatCounter, resetBlockIdCounter, resolveListTemplate, toFlowBlocks };
@@ -12,7 +12,7 @@ import { mergeRunInParagraphs, reserveLeadingEmptyOutlineHeight, suppressFinalEm
12
12
  import { convertBorderSpecToLayout } from "./flowBorders.js";
13
13
  import { nextBlockId, resetBlockIdCounter, twipsToPixels } from "./flowConversionShared.js";
14
14
  import { convertImage } from "./imageConversion.js";
15
- import { collectNoteRefs, isNoteReferenceMarkXml } from "./noteReferences.js";
15
+ import { collectNoteRefs } from "./noteReferences.js";
16
16
  import { splitParagraphAtPageBreaks } from "./pageBreakSplitting.js";
17
17
  import { convertParagraph, drawsParagraphBorder } from "./paragraphConversion.js";
18
18
  import { groupParagraphFrames } from "./paragraphFrames.js";
@@ -417,4 +417,4 @@ function toFlowBlocks(doc, options = {}) {
417
417
  }), readFinalSectionStart(doc)), options.splitPageBreakAndParagraphMark === true, sectionBreaksWithoutMarker), nextBlockId);
418
418
  }
419
419
  //#endregion
420
- export { WORD_UNSPECIFIED_FONT_SIZE, collectNoteRefs, convertBorderSpecToLayout, formatCounter, isNoteReferenceMarkXml, resetBlockIdCounter, resolveListTemplate, toFlowBlocks };
420
+ export { WORD_UNSPECIFIED_FONT_SIZE, collectNoteRefs, convertBorderSpecToLayout, formatCounter, resetBlockIdCounter, resolveListTemplate, toFlowBlocks };
@@ -23,6 +23,7 @@ type DocumentLoaderHistory = {
23
23
  type DocumentLoaderCallbacks = {
24
24
  /** Editor history to reset/seed with the loaded document. */
25
25
  history: DocumentLoaderHistory;
26
+ getExperimentalSession?: () => "canonical" | undefined;
26
27
  /**
27
28
  * Receives the identity of the document that just landed in history. Every
28
29
  * load allocates a fresh identity, so the adapter can tell an external load
@@ -1,3 +1,4 @@
1
+ import { prepareCanonicalDocxInput } from "../docx/canonicalSessionInput.js";
1
2
  import { inspectDocxCompatibility } from "../docx/compatibility.js";
2
3
  import { parseDocx } from "../docx/parser.js";
3
4
  import { recordDocumentLoadPhase } from "../layout-engine/layoutInstrumentation.js";
@@ -60,7 +61,13 @@ var DocumentLoaderManager = class {
60
61
  const parseStartedAt = performance.now();
61
62
  let doc;
62
63
  try {
63
- doc = await parseDocx(buffer, {
64
+ let input = buffer;
65
+ if (this.callbacks.getExperimentalSession?.() === "canonical") {
66
+ const prepared = await prepareCanonicalDocxInput(buffer);
67
+ if (prepared.isErr()) throw prepared.error;
68
+ input = prepared.value;
69
+ }
70
+ doc = await parseDocx(input, {
64
71
  detectVariables: false,
65
72
  preloadFonts: false,
66
73
  password: options.password
@@ -129,6 +129,8 @@ const showsNothingOnAccept = (item) => {
129
129
  /** Whether a paragraph keeps no visible content once every change is accepted. */
130
130
  const holdsNothingOnAccept = (paragraph) => paragraph.content.every(showsNothingOnAccept);
131
131
  function renderBlocks(ctx, pkg, blocks) {
132
+ const outerListIndentWidths = ctx.listIndentWidths;
133
+ ctx.listIndentWidths = [];
132
134
  const out = [];
133
135
  let prevWasListItem = false;
134
136
  const ordered = ctx.opts.trackedChanges === "clean" ? mergeAcceptedParagraphBreaks(blocks) : blocks;
@@ -146,7 +148,9 @@ function renderBlocks(ctx, pkg, blocks) {
146
148
  break;
147
149
  }
148
150
  case "table": {
151
+ ctx.listIndentWidths = [];
149
152
  const md = renderTable(ctx, pkg, block);
153
+ ctx.listIndentWidths = [];
150
154
  if (md) {
151
155
  if (out.length) out.push("");
152
156
  out.push(md);
@@ -156,22 +160,32 @@ function renderBlocks(ctx, pkg, blocks) {
156
160
  }
157
161
  case "blockSdt":
158
162
  case "blockCustomXml": {
163
+ ctx.listIndentWidths = [];
159
164
  const nested = renderBlocks(ctx, pkg, block.content);
160
165
  if (nested) {
161
166
  if (out.length) out.push("");
162
167
  out.push(nested);
163
168
  }
169
+ ctx.listIndentWidths = [];
170
+ prevWasListItem = false;
164
171
  break;
165
172
  }
166
- case "preservedBlock":
173
+ case "preservedBlock": {
174
+ const previousLength = out.length;
167
175
  if (isAltChunkMarkup(block.xml)) out.push(block.readerText === void 0 ? ALT_CHUNK_READER_DIAGNOSTIC : `${ALT_CHUNK_READER_DIAGNOSTIC}\n\n${block.readerText}`);
168
176
  else if (opaqueRevisionCarrierName(block.xml) !== void 0) out.push(OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC);
169
177
  else if (isOpaqueNestedRowMarkup(block.xml)) out.push("[Unsupported nested w:tr content]");
178
+ if (out.length !== previousLength) {
179
+ ctx.listIndentWidths = [];
180
+ prevWasListItem = false;
181
+ }
170
182
  break;
183
+ }
171
184
  case "bookmarkStart":
172
185
  case "bookmarkEnd": break;
173
186
  default: panic(`Unsupported block content in markdown: ${JSON.stringify(block)}`);
174
187
  }
188
+ ctx.listIndentWidths = outerListIndentWidths;
175
189
  return out.join("\n");
176
190
  }
177
191
  //#endregion
@@ -36,6 +36,7 @@ function renderParagraphBlock(ctx, pkg, para) {
36
36
  const styleId = para.formatting?.styleId;
37
37
  const headingLevel = markdownHeadingLevel(ctx, para);
38
38
  if (headingLevel !== void 0) {
39
+ ctx.listIndentWidths = [];
39
40
  if (!inline) return {
40
41
  markdown: "",
41
42
  isListItem: false
@@ -50,6 +51,7 @@ function renderParagraphBlock(ctx, pkg, para) {
50
51
  markdown: renderListItem(ctx, para.listRendering, label, inline),
51
52
  isListItem: true
52
53
  };
54
+ ctx.listIndentWidths = [];
53
55
  if (isQuoteStyle(styleId, ctx.builtInStyles)) return {
54
56
  markdown: inline.split("\n").map((line) => `> ${line}`).join("\n"),
55
57
  isListItem: false
@@ -86,21 +88,12 @@ function escapeLeadingBlockMarker(text) {
86
88
  return text.replace(/^(?<ws>[ \t]*)(?<marker>[#>])/gmu, "$<ws>\\$<marker>").replace(/^(?<ws>[ \t]*)(?<marker>[-+*])(?<after>[ \t])/gmu, "$<ws>\\$<marker>$<after>").replace(/^(?<ws>[ \t]*)(?<num>\d{1,9})(?<marker>[.)])(?<after>[ \t])/gmu, "$<ws>$<num>\\$<marker>$<after>");
87
89
  }
88
90
  /**
89
- * A markdown list marker's width when no ancestor at that level has rendered
90
- * yet (e.g. a DOCX paragraph numbered at a level its list skipped over). Two
91
- * spaces is the old fixed-indent behaviour, kept as a fallback rather than a
92
- * guess of zero.
93
- */
94
- const DEFAULT_LIST_INDENT_WIDTH = 2;
95
- /**
96
- * The indent a level's item needs: the combined marker width of every
97
- * shallower level's most recently rendered item (see
98
- * `RenderContext.listIndentWidths`), so a child sits inside its parent's
99
- * content column per CommonMark's list-nesting rule, not a fixed guess.
91
+ * Only emitted Markdown ancestors contribute columns. OOXML levels may skip
92
+ * ancestors or resume after prose; inventing those columns creates code blocks.
100
93
  */
101
94
  function listIndentWidth(ctx, level) {
102
95
  let width = 0;
103
- for (let ancestor = 0; ancestor < level; ancestor++) width += ctx.listIndentWidths[ancestor] ?? DEFAULT_LIST_INDENT_WIDTH;
96
+ for (let ancestor = 0; ancestor < level; ancestor++) width += ctx.listIndentWidths[ancestor] ?? 0;
104
97
  return width;
105
98
  }
106
99
  /**
@@ -116,9 +109,12 @@ function listIndentWidth(ctx, level) {
116
109
  * a following, deeper item can indent correctly under it.
117
110
  */
118
111
  function renderListItem(ctx, list, label, inline) {
112
+ const nativeMarker = list.isBullet || /^\d{1,9}[.)]$/u.test(label);
113
+ if (!nativeMarker) ctx.listIndentWidths = [];
114
+ ctx.listIndentWidths.length = list.level;
119
115
  const indent = " ".repeat(listIndentWidth(ctx, list.level));
120
116
  const marker = list.isBullet ? "- " : `${label} `;
121
- ctx.listIndentWidths[list.level] = marker.length;
117
+ if (nativeMarker) ctx.listIndentWidths[list.level] = marker.length;
122
118
  return `${indent}${marker}${inline}`.trimEnd();
123
119
  }
124
120
  //#endregion
@@ -91,8 +91,8 @@ const punctuationFor = (mark) => (ch) => {
91
91
  if (mark !== "strike" && ch === "*") return false;
92
92
  return /[\p{P}\p{S}]/u.test(ch);
93
93
  };
94
- /** One escape pair (`\*`) or one code point of escaped inline text. */
95
- const INLINE_UNIT = /\\[\s\S]|[\s\S]/gu;
94
+ /** Escape pairs and generated note references are indivisible inline units. */
95
+ const INLINE_UNIT = /\\[\s\S]|\[\^e?\d+\]|[\s\S]/gu;
96
96
  /**
97
97
  * Wrap `inner` in `mark` so a CommonMark reader reads it back. A delimiter
98
98
  * opens only before a character that is not blank, and before punctuation
@@ -213,6 +213,7 @@ function renderRunContent(ctx, pkg, content, paraId) {
213
213
  if (ctx.opts.footnotes === "strip") break;
214
214
  out += numberNoteReference(ctx, item.type === "endnoteRef" ? "endnote" : "footnote", item.id).marker;
215
215
  break;
216
+ case "noteMarker": break;
216
217
  case "drawing": {
217
218
  const ref = resolveRelationshipIdOfType(pkg?.relationships, item.image.rId, RELATIONSHIP_TYPES.image);
218
219
  const media = ref.status === "resolved" ? pkg?.media?.get(ref.relationship.target) : void 0;
@@ -62,6 +62,7 @@ function renderGfmRow(ctx, pkg, row) {
62
62
  return out;
63
63
  }
64
64
  function renderGfmCell(ctx, pkg, cell) {
65
+ ctx.listIndentWidths = [];
65
66
  const blocks = [];
66
67
  const renderBlocks = (content) => {
67
68
  for (const item of content) switch (item.type) {
@@ -278,6 +279,7 @@ function renderHtmlRun(ctx, pkg, run, paraId) {
278
279
  text += `<sup>[${token}]</sup>`;
279
280
  break;
280
281
  }
282
+ case "noteMarker": break;
281
283
  default: break;
282
284
  }
283
285
  if (!text) return "";
@@ -141,15 +141,9 @@ type RenderContext = {
141
141
  /** The document's styles indexed by the built-in they are; classifies headings and quotes. */
142
142
  builtInStyles: BuiltInStyleIndex;
143
143
  /**
144
- * The rendered width (marker text + one trailing space) of the most
145
- * recently emitted list item at each level, indexed by `ListRendering.level`.
146
- * A nested item's indent is the sum of every shallower level's width here,
147
- * not a fixed two spaces: CommonMark only keeps a child nested under its
148
- * parent when the child starts at or past the column where the parent's
149
- * content begins, and a marker like `10. ` or `1. ` is wider than `- `.
150
- * Document order visits a parent before its children, so by the time a
151
- * level-N item renders, levels `0..N-1` already hold the current ancestor
152
- * chain's widths.
144
+ * Active native Markdown ancestor marker widths, indexed by OOXML level.
145
+ * Missing levels contribute no columns. Prose, headings and container
146
+ * boundaries clear the chain; a shallower item truncates descendants.
153
147
  */
154
148
  listIndentWidths: number[];
155
149
  };
@@ -1,19 +1,9 @@
1
1
  import { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, InlineWrapperAttrs, InlineWrapperLayer, LanguageAttrs, RunFormattingOverrideAttrs, RunIdentityMarkAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, TrackedRevisionAncestor, UnderlineAttrs } from "../schema/marks.js";
2
2
  import { BlockCustomXmlAttrs, BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, MathAttrs, PageBreakRunAttrs, ParagraphAttrs, PreservedBlockAttrs, PreservedXmlAttrs, SdtAttrs, ShapeAttrs, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "../schema/nodes.js";
3
3
  import "../schema/index.js";
4
+ import { ProseMirrorAttrIssue, ReadProseMirrorAttrsResult } from "../../internal/prosemirrorAttrBoundary.js";
4
5
  import { Mark, Node } from "prosemirror-model";
5
6
  //#region src/prosemirror/attrs/index.d.ts
6
- type ProseMirrorAttrIssue = {
7
- readonly path: string;
8
- readonly message: string;
9
- };
10
- type ReadProseMirrorAttrsResult<T> = {
11
- ok: true;
12
- value: T;
13
- } | {
14
- ok: false;
15
- issues: readonly ProseMirrorAttrIssue[];
16
- };
17
7
  declare const readParagraphAttrs: (node: Node) => ReadProseMirrorAttrsResult<Readonly<ParagraphAttrs>>;
18
8
  declare const expectParagraphAttrs: (node: Node) => Readonly<ParagraphAttrs>;
19
9
  declare const readHardBreakAttrs: (node: Node) => ReadProseMirrorAttrsResult<HardBreakAttrs>;
@@ -123,4 +113,4 @@ declare const mergeTableRowAttrs: (node: Node, patch: NodeAttrPatch<TableRowAttr
123
113
  */
124
114
  declare const mergeTableCellAttrs: (node: Node, patch: NodeAttrPatch<TableCellAttrs>) => TableCellAttrs;
125
115
  //#endregion
126
- export { ProseMirrorAttrIssue, ReadProseMirrorAttrsResult, expectBlockCustomXmlAttrs, expectBlockSdtAttrs, expectCharacterSpacingMarkAttrs, expectCharacterStyleMarkAttrs, expectCommentMarkAttrs, expectEmphasisMarkAttrs, expectFieldAttrs, expectFontFamilyMarkAttrs, expectFontSizeMarkAttrs, expectFootnoteRefMarkAttrs, expectHardBreakAttrs, expectHighlightMarkAttrs, expectHyperlinkMarkAttrs, expectImageAttrs, expectInlineWrapperMarkAttrs, expectLanguageMarkAttrs, expectMathAttrs, expectPageBreakRunAttrs, expectParagraphAttrs, expectPreservedBlockAttrs, expectPreservedXmlAttrs, expectRunFormattingOverrideMarkAttrs, expectRunIdentityMarkAttrs, expectRunPropertyChangeMarkAttrs, expectRunShadingMarkAttrs, expectSdtAttrs, expectShapeAttrs, expectStrikeMarkAttrs, expectSymbolAttrs, expectTabAttrs, expectTableAttrs, expectTableCellAttrs, expectTableRowAttrs, expectTextBoxAttrs, expectTextColorMarkAttrs, expectTextEffectMarkAttrs, expectTrackedChangeMarkAttrs, expectUnderlineMarkAttrs, isTrackedRevisionAncestorArray, isValidEmptyFieldResultRuns, isValidFieldCode, mergeImageAttrs, mergeParagraphAttrs, mergeTableAttrs, mergeTableCellAttrs, mergeTableRowAttrs, readBlockCustomXmlAttrs, readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readInlineWrapperMarkAttrs, readInlineWrapperStack, readLanguageMarkAttrs, readMathAttrs, readPageBreakRunAttrs, readParagraphAttrs, readPreservedBlockAttrs, readPreservedXmlAttrs, readRunFormattingOverrideMarkAttrs, readRunIdentityMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs };
116
+ export { type ProseMirrorAttrIssue, type ReadProseMirrorAttrsResult, expectBlockCustomXmlAttrs, expectBlockSdtAttrs, expectCharacterSpacingMarkAttrs, expectCharacterStyleMarkAttrs, expectCommentMarkAttrs, expectEmphasisMarkAttrs, expectFieldAttrs, expectFontFamilyMarkAttrs, expectFontSizeMarkAttrs, expectFootnoteRefMarkAttrs, expectHardBreakAttrs, expectHighlightMarkAttrs, expectHyperlinkMarkAttrs, expectImageAttrs, expectInlineWrapperMarkAttrs, expectLanguageMarkAttrs, expectMathAttrs, expectPageBreakRunAttrs, expectParagraphAttrs, expectPreservedBlockAttrs, expectPreservedXmlAttrs, expectRunFormattingOverrideMarkAttrs, expectRunIdentityMarkAttrs, expectRunPropertyChangeMarkAttrs, expectRunShadingMarkAttrs, expectSdtAttrs, expectShapeAttrs, expectStrikeMarkAttrs, expectSymbolAttrs, expectTabAttrs, expectTableAttrs, expectTableCellAttrs, expectTableRowAttrs, expectTextBoxAttrs, expectTextColorMarkAttrs, expectTextEffectMarkAttrs, expectTrackedChangeMarkAttrs, expectUnderlineMarkAttrs, isTrackedRevisionAncestorArray, isValidEmptyFieldResultRuns, isValidFieldCode, mergeImageAttrs, mergeParagraphAttrs, mergeTableAttrs, mergeTableCellAttrs, mergeTableRowAttrs, readBlockCustomXmlAttrs, readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readInlineWrapperMarkAttrs, readInlineWrapperStack, readLanguageMarkAttrs, readMathAttrs, readPageBreakRunAttrs, readParagraphAttrs, readPreservedBlockAttrs, readPreservedXmlAttrs, readRunFormattingOverrideMarkAttrs, readRunIdentityMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs };