postext 1.58.2 → 1.59.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 (195) hide show
  1. package/dist/__tests__/exercises/config.test.d.ts +2 -0
  2. package/dist/__tests__/exercises/config.test.d.ts.map +1 -0
  3. package/dist/__tests__/exercises/config.test.js +63 -0
  4. package/dist/__tests__/exercises/config.test.js.map +1 -0
  5. package/dist/__tests__/exercises/digital.test.d.ts +2 -0
  6. package/dist/__tests__/exercises/digital.test.d.ts.map +1 -0
  7. package/dist/__tests__/exercises/digital.test.js +163 -0
  8. package/dist/__tests__/exercises/digital.test.js.map +1 -0
  9. package/dist/__tests__/exercises/languages.test.d.ts +2 -0
  10. package/dist/__tests__/exercises/languages.test.d.ts.map +1 -0
  11. package/dist/__tests__/exercises/languages.test.js +109 -0
  12. package/dist/__tests__/exercises/languages.test.js.map +1 -0
  13. package/dist/__tests__/exercises/layout.test.d.ts +2 -0
  14. package/dist/__tests__/exercises/layout.test.d.ts.map +1 -0
  15. package/dist/__tests__/exercises/layout.test.js +77 -0
  16. package/dist/__tests__/exercises/layout.test.js.map +1 -0
  17. package/dist/__tests__/exercises/model.test.d.ts +2 -0
  18. package/dist/__tests__/exercises/model.test.d.ts.map +1 -0
  19. package/dist/__tests__/exercises/model.test.js +90 -0
  20. package/dist/__tests__/exercises/model.test.js.map +1 -0
  21. package/dist/__tests__/exercises/parse.test.d.ts +2 -0
  22. package/dist/__tests__/exercises/parse.test.d.ts.map +1 -0
  23. package/dist/__tests__/exercises/parse.test.js +37 -0
  24. package/dist/__tests__/exercises/parse.test.js.map +1 -0
  25. package/dist/__tests__/exercises/refs.test.d.ts +2 -0
  26. package/dist/__tests__/exercises/refs.test.d.ts.map +1 -0
  27. package/dist/__tests__/exercises/refs.test.js +46 -0
  28. package/dist/__tests__/exercises/refs.test.js.map +1 -0
  29. package/dist/__tests__/exercises/solutions.test.d.ts +2 -0
  30. package/dist/__tests__/exercises/solutions.test.d.ts.map +1 -0
  31. package/dist/__tests__/exercises/solutions.test.js +53 -0
  32. package/dist/__tests__/exercises/solutions.test.js.map +1 -0
  33. package/dist/__tests__/exports.test.js +14 -0
  34. package/dist/__tests__/exports.test.js.map +1 -1
  35. package/dist/__tests__/parse/containers.test.js +2 -2
  36. package/dist/__tests__/parse/containers.test.js.map +1 -1
  37. package/dist/__tests__/pipeline/pageShorterThanLine.test.d.ts +2 -0
  38. package/dist/__tests__/pipeline/pageShorterThanLine.test.d.ts.map +1 -0
  39. package/dist/__tests__/pipeline/pageShorterThanLine.test.js +29 -0
  40. package/dist/__tests__/pipeline/pageShorterThanLine.test.js.map +1 -0
  41. package/dist/__tests__/pipeline/spanHeadingMidPage.test.js +11 -0
  42. package/dist/__tests__/pipeline/spanHeadingMidPage.test.js.map +1 -1
  43. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  44. package/dist/canvas-backend/blockRender.js +18 -0
  45. package/dist/canvas-backend/blockRender.js.map +1 -1
  46. package/dist/canvas-backend/chip.d.ts +3 -0
  47. package/dist/canvas-backend/chip.d.ts.map +1 -1
  48. package/dist/canvas-backend/chip.js +31 -1
  49. package/dist/canvas-backend/chip.js.map +1 -1
  50. package/dist/configWarnings.d.ts +3 -1
  51. package/dist/configWarnings.d.ts.map +1 -1
  52. package/dist/configWarnings.js +5 -1
  53. package/dist/configWarnings.js.map +1 -1
  54. package/dist/defaults/chipStyles.d.ts.map +1 -1
  55. package/dist/defaults/chipStyles.js +7 -0
  56. package/dist/defaults/chipStyles.js.map +1 -1
  57. package/dist/defaults/exercises.d.ts +111 -0
  58. package/dist/defaults/exercises.d.ts.map +1 -0
  59. package/dist/defaults/exercises.js +255 -0
  60. package/dist/defaults/exercises.js.map +1 -0
  61. package/dist/defaults/index.d.ts +2 -0
  62. package/dist/defaults/index.d.ts.map +1 -1
  63. package/dist/defaults/index.js +16 -0
  64. package/dist/defaults/index.js.map +1 -1
  65. package/dist/defaults/shared.d.ts +4 -0
  66. package/dist/defaults/shared.d.ts.map +1 -1
  67. package/dist/defaults/shared.js +6 -0
  68. package/dist/defaults/shared.js.map +1 -1
  69. package/dist/design/elementKeys.d.ts +2 -0
  70. package/dist/design/elementKeys.d.ts.map +1 -1
  71. package/dist/design/elementKeys.js +1 -1
  72. package/dist/design/elementKeys.js.map +1 -1
  73. package/dist/exercises/build.d.ts +60 -0
  74. package/dist/exercises/build.d.ts.map +1 -0
  75. package/dist/exercises/build.js +177 -0
  76. package/dist/exercises/build.js.map +1 -0
  77. package/dist/exercises/configWarnings.d.ts +11 -0
  78. package/dist/exercises/configWarnings.d.ts.map +1 -0
  79. package/dist/exercises/configWarnings.js +175 -0
  80. package/dist/exercises/configWarnings.js.map +1 -0
  81. package/dist/exercises/designs.d.ts +38 -0
  82. package/dist/exercises/designs.d.ts.map +1 -0
  83. package/dist/exercises/designs.js +143 -0
  84. package/dist/exercises/designs.js.map +1 -0
  85. package/dist/exercises/digital.d.ts +69 -0
  86. package/dist/exercises/digital.d.ts.map +1 -0
  87. package/dist/exercises/digital.js +58 -0
  88. package/dist/exercises/digital.js.map +1 -0
  89. package/dist/exercises/expand.d.ts +74 -0
  90. package/dist/exercises/expand.d.ts.map +1 -0
  91. package/dist/exercises/expand.js +1089 -0
  92. package/dist/exercises/expand.js.map +1 -0
  93. package/dist/exercises/grids.d.ts +62 -0
  94. package/dist/exercises/grids.d.ts.map +1 -0
  95. package/dist/exercises/grids.js +535 -0
  96. package/dist/exercises/grids.js.map +1 -0
  97. package/dist/exercises/model.d.ts +24 -0
  98. package/dist/exercises/model.d.ts.map +1 -0
  99. package/dist/exercises/model.js +360 -0
  100. package/dist/exercises/model.js.map +1 -0
  101. package/dist/exercises/record.d.ts +94 -0
  102. package/dist/exercises/record.d.ts.map +1 -0
  103. package/dist/exercises/record.js +9 -0
  104. package/dist/exercises/record.js.map +1 -0
  105. package/dist/exercises/runtime.d.ts +65 -0
  106. package/dist/exercises/runtime.d.ts.map +1 -0
  107. package/dist/exercises/runtime.js +1261 -0
  108. package/dist/exercises/runtime.js.map +1 -0
  109. package/dist/exercises/shuffle.d.ts +13 -0
  110. package/dist/exercises/shuffle.d.ts.map +1 -0
  111. package/dist/exercises/shuffle.js +56 -0
  112. package/dist/exercises/shuffle.js.map +1 -0
  113. package/dist/exercises/styles.d.ts +51 -0
  114. package/dist/exercises/styles.d.ts.map +1 -0
  115. package/dist/exercises/styles.js +221 -0
  116. package/dist/exercises/styles.js.map +1 -0
  117. package/dist/exercises/text.d.ts +31 -0
  118. package/dist/exercises/text.d.ts.map +1 -0
  119. package/dist/exercises/text.js +82 -0
  120. package/dist/exercises/text.js.map +1 -0
  121. package/dist/exercises/types.d.ts +125 -0
  122. package/dist/exercises/types.d.ts.map +1 -0
  123. package/dist/exercises/types.js +9 -0
  124. package/dist/exercises/types.js.map +1 -0
  125. package/dist/exercises/warnings.d.ts +16 -0
  126. package/dist/exercises/warnings.d.ts.map +1 -0
  127. package/dist/exercises/warnings.js +55 -0
  128. package/dist/exercises/warnings.js.map +1 -0
  129. package/dist/html-backend.d.ts +6 -0
  130. package/dist/html-backend.d.ts.map +1 -1
  131. package/dist/html-backend.js +67 -6
  132. package/dist/html-backend.js.map +1 -1
  133. package/dist/index.d.ts +6 -0
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +4 -0
  136. package/dist/index.js.map +1 -1
  137. package/dist/measure/cache.d.ts.map +1 -1
  138. package/dist/measure/cache.js +6 -1
  139. package/dist/measure/cache.js.map +1 -1
  140. package/dist/measure/rich.d.ts.map +1 -1
  141. package/dist/measure/rich.js +11 -1
  142. package/dist/measure/rich.js.map +1 -1
  143. package/dist/migrate/markdownRuns.js +1 -1
  144. package/dist/migrate/markdownRuns.js.map +1 -1
  145. package/dist/numbering.d.ts +3 -0
  146. package/dist/numbering.d.ts.map +1 -1
  147. package/dist/numbering.js +6 -0
  148. package/dist/numbering.js.map +1 -1
  149. package/dist/parse/blockParser.d.ts.map +1 -1
  150. package/dist/parse/blockParser.js +47 -4
  151. package/dist/parse/blockParser.js.map +1 -1
  152. package/dist/parse/exerciseGaps.d.ts +50 -0
  153. package/dist/parse/exerciseGaps.d.ts.map +1 -0
  154. package/dist/parse/exerciseGaps.js +151 -0
  155. package/dist/parse/exerciseGaps.js.map +1 -0
  156. package/dist/parse/index.d.ts +1 -1
  157. package/dist/parse/index.d.ts.map +1 -1
  158. package/dist/parse/index.js.map +1 -1
  159. package/dist/parse/sourceMapping.d.ts.map +1 -1
  160. package/dist/parse/sourceMapping.js +21 -0
  161. package/dist/parse/sourceMapping.js.map +1 -1
  162. package/dist/parse/types.d.ts +49 -1
  163. package/dist/parse/types.d.ts.map +1 -1
  164. package/dist/pipeline/build.d.ts.map +1 -1
  165. package/dist/pipeline/build.js +51 -9
  166. package/dist/pipeline/build.js.map +1 -1
  167. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  168. package/dist/pipeline/calloutLayout.js +1 -0
  169. package/dist/pipeline/calloutLayout.js.map +1 -1
  170. package/dist/pipeline/chips.d.ts.map +1 -1
  171. package/dist/pipeline/chips.js +2 -0
  172. package/dist/pipeline/chips.js.map +1 -1
  173. package/dist/pipeline/config.d.ts.map +1 -1
  174. package/dist/pipeline/config.js +6 -0
  175. package/dist/pipeline/config.js.map +1 -1
  176. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  177. package/dist/pipeline/contentWarnings.js +29 -1
  178. package/dist/pipeline/contentWarnings.js.map +1 -1
  179. package/dist/pipeline/continuation.d.ts.map +1 -1
  180. package/dist/pipeline/continuation.js +21 -6
  181. package/dist/pipeline/continuation.js.map +1 -1
  182. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  183. package/dist/pipeline/measureContentBlock.js +3 -2
  184. package/dist/pipeline/measureContentBlock.js.map +1 -1
  185. package/dist/pipeline/outline.d.ts.map +1 -1
  186. package/dist/pipeline/outline.js +1 -0
  187. package/dist/pipeline/outline.js.map +1 -1
  188. package/dist/pipeline/textWrap.js +1 -1
  189. package/dist/pipeline/textWrap.js.map +1 -1
  190. package/dist/types.d.ts +303 -2
  191. package/dist/types.d.ts.map +1 -1
  192. package/dist/vdt.d.ts +67 -0
  193. package/dist/vdt.d.ts.map +1 -1
  194. package/dist/vdt.js.map +1 -1
  195. package/package.json +1 -1
@@ -22,6 +22,9 @@ import { stampCentralBaselines } from './verticalMetrics.js';
22
22
  import { orientLinesToFrames } from './mirrorFrame.js';
23
23
  import { verseMarginTopPx } from './buildBlockKind.js';
24
24
  import { verseLinesSettings, versesLineByLine } from './verseLines.js';
25
+ import { exerciseOutline, exerciseSettingsFor, expandDocumentExercises, markTurnedBoxes, nameExerciseAnchors, needsExerciseExpansion, withExerciseStyles } from '../exercises/build.js';
26
+ import { hasExercises } from '../exercises/model.js';
27
+ import { exerciseDigitalOf } from '../exercises/digital.js';
25
28
  import { arabicNumbersOf, resolveAllConfig, computeBaselineGrid, computeColumnBboxes, resolvedDirection, resolvedLocale, validateConfigCache } from './config.js';
26
29
  import { resolveDebugConfig } from '../defaults/debug.js';
27
30
  import { defaultFontSet, documentFontFaces, faceRequestKey, fontFallbacks } from '../fonts/faces.js';
@@ -75,6 +78,7 @@ import { enumerateCurrentPageSlots, measureFloatBand, floatGapAbove, floatGapBel
75
78
  import { computeHeadingContext, computeResourceNumberingState, } from './resourceNumbering.js';
76
79
  import { documentLocale, effectiveResourceTypes } from '../defaults/resourceTypes.js';
77
80
  import { resolveCalloutStylesConfig } from '../defaults/calloutStyles.js';
81
+ import { relinkToPalette } from '../defaults/shared.js';
78
82
  import { codeBoxStyle, codeParseOptions, wrapCodeBlocks } from './codeBlocks.js';
79
83
  import { expandScoreBlocks, scoreInfoOf, scoreKeepHeight } from './scoreBlocks.js';
80
84
  import { buildCodeLineNumbers, codeOverflowWarnings } from './codeLines.js';
@@ -288,7 +292,9 @@ function placeDocumentPass(content, config, cache, options, hints) {
288
292
  * band above (a page-span box, a top float band) or a caption below has
289
293
  * shortened it, so what does not fit it may still fit a full column. */
290
294
  const shortSideColumn = (page, col) => col.bbox.height < page.contentArea.height - 0.5;
291
- const resolved = resolveAllConfig(config);
295
+ // Rebound once the content is read when it holds exercises (#1227): the
296
+ // config then also carries their chip and paragraph styles.
297
+ let resolved = resolveAllConfig(config);
292
298
  // Bitmaps sized by the document's `layout.bitmapResolution` carry it as
293
299
  // their own `resolution` from here on (#631); under the default policy
294
300
  // the content is untouched.
@@ -506,7 +512,21 @@ function placeDocumentPass(content, config, cache, options, hints) {
506
512
  // The citations of resource captions and notes (#529), formatted with
507
513
  // the text's.
508
514
  const captionCitations = citationsApplied && citationsApplied.captions.size > 0 ? citationsApplied.captions : undefined;
509
- const footnoteSplit = splitFootnoteDefinitions(citationsApplied?.blocks ?? parsedBody);
515
+ // Exercises (#1227): each set as a box of ordinary blocks, its solutions
516
+ // where the book prints them.
517
+ const exerciseExpansion = needsExerciseExpansion(citationsApplied?.blocks ?? parsedBody)
518
+ ? expandDocumentExercises(citationsApplied?.blocks ?? parsedBody, resolved, computeColumnBboxes(pageMetrics.contentArea, resolved)[0]?.width ?? pageMetrics.contentArea.width, continuation, content.outline)
519
+ : undefined;
520
+ if (exerciseExpansion) {
521
+ resolved = withExerciseStyles(resolved);
522
+ // The document's config names the exercises' chip and paragraph
523
+ // styles too: an output that styles its text from the config (a
524
+ // reflowable EPUB, #1231) finds them there.
525
+ doc.config = resolved;
526
+ doc.exercises = exerciseExpansion.records;
527
+ doc.exerciseDigital = exerciseDigitalOf(exerciseSettingsFor(resolved));
528
+ }
529
+ const footnoteSplit = splitFootnoteDefinitions(exerciseExpansion?.blocks ?? citationsApplied?.blocks ?? parsedBody);
510
530
  const footnoteDefs = footnoteSplit.defs;
511
531
  // Numbered by page or column (`numbering: 'page'`), a note takes the
512
532
  // number the previous build gave it where it landed; the first build
@@ -534,7 +554,10 @@ function placeDocumentPass(content, config, cache, options, hints) {
534
554
  const resourceIds = new Set((content.resources ?? []).map((r) => r.id));
535
555
  const anchorRefs = hasAnchorRefs(parsedBlocks, resourceIds);
536
556
  const outline = content.outline
537
- ?? (hasTocDirective(parsedBlocks) || hasIndexDirective(parsedBlocks) || anchorRefs ? computeOutline(parsedBlocks, resolved, headingStart, continuation?.statementCounters) : undefined);
557
+ ?? (hasTocDirective(parsedBlocks) || hasIndexDirective(parsedBlocks) || anchorRefs
558
+ // A reference to an exercise prints its name (#1225).
559
+ ? nameExerciseAnchors(computeOutline(parsedBlocks, resolved, headingStart, continuation?.statementCounters), exerciseExpansion?.records ?? [])
560
+ : undefined);
538
561
  // A story carried in from another chapter (#943) may refer to anchors too.
539
562
  const carriedRefs = continuation?.jumps?.some((j) => j.outline) === true;
540
563
  const anchorRefContext = anchorRefs || carriedRefs
@@ -630,6 +653,8 @@ function placeDocumentPass(content, config, cache, options, hints) {
630
653
  const syntheticBoxes = [
631
654
  ...(spanEmbeds.wrapped ? [spanEmbedStyle(bodyStyle.lineHeightPx, resolved.layout.inlineResourceGap !== 'above')] : []),
632
655
  ...(codeBoxes.wrapped ? [codeBoxStyle(resolved)] : []),
656
+ // The boxes exercises are set in (#1227).
657
+ ...(exerciseExpansion?.wrapped ? exerciseExpansion.boxes : []),
633
658
  // The frameless box of a composed page's story (#855).
634
659
  ...(composedWrap.wrapped || comicText.wrapped ? [frameBoxStyle(Math.max(resolved.bodyText.avoidOrphans ? resolved.bodyText.orphanMinLines : 1, resolved.bodyText.avoidWidows ? resolved.bodyText.widowMinLines : 1))] : []),
635
660
  // The boxes of main-flow groups: sub-columns a body line apart in the
@@ -638,12 +663,16 @@ function placeDocumentPass(content, config, cache, options, hints) {
638
663
  ? flowColumnsStyles(bodyStyle.lineHeightPx, dimensionToPx(resolved.layout.gutterWidth, resolved.page.dpi, bodyStyle.fontSizePx), resolved.bodyText.paragraphSpacing === false ? { value: 0, unit: 'px' } : { value: bodyStyle.marginBottomPx, unit: 'px' }, Math.max(resolved.bodyText.avoidOrphans ? resolved.bodyText.orphanMinLines : 1, resolved.bodyText.avoidWidows ? resolved.bodyText.widowMinLines : 1))
639
664
  : []),
640
665
  ];
666
+ const exerciseBoxIds = new Set(exerciseExpansion?.wrapped ? exerciseExpansion.boxes.map((b) => b.id) : []);
641
667
  const calloutStyles = syntheticBoxes.length > 0
642
- ? [...resolved.calloutStyles, ...resolveCalloutStylesConfig(syntheticBoxes, resolved.bodyText, resolved.headings, resolved.unorderedLists, config?.locale)]
668
+ ? [...resolved.calloutStyles, ...resolveCalloutStylesConfig(syntheticBoxes, resolved.bodyText, resolved.headings, resolved.unorderedLists, config?.locale)
669
+ // The exercise boxes' defaults (a solutions title, a bank's frame)
670
+ // link to `main-color`: set them to the document's palette.
671
+ .map((s) => (exerciseBoxIds.has(s.id) ? relinkToPalette(s, config?.colorPalette) : s))]
643
672
  : resolved.calloutStyles;
644
673
  // A box nested in another looks its style up in the configuration it is
645
674
  // laid out with: the listings' box among them.
646
- const calloutResolved = codeBoxes.wrapped || flowGroups.wrapped || composedWrap.wrapped || comicText.wrapped ? { ...resolved, calloutStyles } : resolved;
675
+ const calloutResolved = codeBoxes.wrapped || flowGroups.wrapped || composedWrap.wrapped || comicText.wrapped || exerciseExpansion?.wrapped ? { ...resolved, calloutStyles } : resolved;
647
676
  const blockquoteStyle = resolveBlockquoteStyle(resolved);
648
677
  const listLevelIndentsPx = computeLevelIndentsPx(resolved, bodyStyle.fontSizePx);
649
678
  const orderedMetrics = computeOrderedListRunMetrics(contentBlocks, resolved, bodyStyle.fontSizePx);
@@ -8747,8 +8776,12 @@ function placeDocumentPass(content, config, cache, options, hints) {
8747
8776
  }
8748
8777
  // Empty column with less than a line of room (a band cap cutting right
8749
8778
  // under a float band, a column swallowed by reservations): nothing can
8750
- // go here — move on. The next column, or a fresh page, has room.
8751
- if (curCol.availableHeight < style.lineHeightPx - 0.01 && totalRemainHeight > curCol.availableHeight + 0.01) {
8779
+ // go here — move on. The next column, or a fresh page, has room —
8780
+ // unless the page's whole content area is shorter than a line (#1222):
8781
+ // no column ever has, and the block is set here, as one taller than
8782
+ // the page.
8783
+ if (curCol.availableHeight < style.lineHeightPx - 0.01 && totalRemainHeight > curCol.availableHeight + 0.01
8784
+ && contentArea.height >= style.lineHeightPx - 0.01) {
8752
8785
  pendingSpacing = 0;
8753
8786
  advanceToNextColumn(doc, cursor, geomResolved, contentArea, pageWidthPx, pageHeightPx, onNewPage);
8754
8787
  continue;
@@ -9072,6 +9105,9 @@ export function* buildDocumentGen(content, config, cache, options) {
9072
9105
  syncFontSet(fontSet);
9073
9106
  validateConfigCache(config);
9074
9107
  const doc = yield* buildDocumentRounds(content, config, cache, options);
9108
+ // Boxes printed upside down (#1229): their blocks learn the point they
9109
+ // turn about.
9110
+ markTurnedBoxes(doc);
9075
9111
  // References and markup the source names wrongly: read from the source
9076
9112
  // once, located on the pages of the finished layout. Kept apart from
9077
9113
  // `doc.warnings`, whose entries keep their postext 1.4 shape.
@@ -9387,10 +9423,10 @@ function* buildDocumentRounds(content, config, cache, options) {
9387
9423
  if (!hasAnchorRefs(parsed, new Set((content.resources ?? []).map((r) => r.id))))
9388
9424
  return false;
9389
9425
  const resolved = resolveAllConfig(config);
9390
- return printsAnchorPages(parsed, anchorTargetsOf(computeOutline(parsed, resolved, content.continuation?.headings, content.continuation?.statementCounters)), resolved.crossRefs.defaultStyle);
9426
+ return printsAnchorPages(parsed, anchorTargetsOf(ownOutline(parsed, resolved, content.continuation)), resolved.crossRefs.defaultStyle);
9391
9427
  };
9392
9428
  if (hasTocDirective(parsed) || hasIndexDirective(parsed) || pageRefs()) {
9393
- let outline = computeOutline(parsed, resolveAllConfig(config), content.continuation?.headings, content.continuation?.statementCounters);
9429
+ let outline = ownOutline(parsed, resolveAllConfig(config), content.continuation);
9394
9430
  let doc = withIndexMarks(yield* buildDocumentNumbered({ ...content, outline }, config, cache, options, 0, citing), content);
9395
9431
  for (let round = 0; round < MAX_TOC_ROUNDS; round++) {
9396
9432
  const after = outlineFromDoc(doc, outline);
@@ -9404,6 +9440,12 @@ function* buildDocumentRounds(content, config, cache, options) {
9404
9440
  }
9405
9441
  return withIndexMarks(yield* buildDocumentNumbered(content, config, cache, options, 0, citing), content);
9406
9442
  }
9443
+ /** A document's own outline, its exercises' anchors named as a reference
9444
+ * prints them ("Exercise 3", #1225). */
9445
+ function ownOutline(parsed, resolved, continuation) {
9446
+ const outline = computeOutline(parsed, resolved, continuation?.headings, continuation?.statementCounters);
9447
+ return hasExercises(parsed) ? nameExerciseAnchors(outline, exerciseOutline(parsed, resolved, continuation).records) : outline;
9448
+ }
9407
9449
  /** The number each note's marker prints in `doc` (its first marker). */
9408
9450
  function printedFootnoteNumbers(doc) {
9409
9451
  const out = new Map();