@bendyline/squisq 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +24 -0
- package/dist/{ContentContainer-BXUlIf18.d.ts → ContentContainer-B2w9sUoL.d.ts} +15 -0
- package/dist/{Doc-DynJleo-.d.ts → Doc-BubIpWsp.d.ts} +1 -1
- package/dist/{ImageEditDoc-Ca4Tr9uN.d.ts → ImageEditDoc-CGxk5CHc.d.ts} +1 -1
- package/dist/{annotationCoercion-Dr_DY9Hx.d.ts → annotationCoercion-PtRQhk5V.d.ts} +1 -1
- package/dist/chunk-2L55443L.js +0 -0
- package/dist/{chunk-VWCJ2WXC.js → chunk-2ZWIXGAC.js} +0 -1
- package/dist/{chunk-VYFRI7R6.js → chunk-32R2RZAO.js} +72 -3
- package/dist/chunk-3IGPAPQ7.js +645 -0
- package/dist/{chunk-QE7TWGVT.js → chunk-4VOD55SX.js} +0 -1
- package/dist/{chunk-3E5F2XMR.js → chunk-67L6WRJN.js} +0 -1
- package/dist/{chunk-5DKBFXPY.js → chunk-6ECMNUIP.js} +26 -18
- package/dist/{chunk-JI77MGAK.js → chunk-7ARJZYQY.js} +159 -120
- package/dist/{chunk-DBS6RIFL.js → chunk-7N4G32LG.js} +0 -1
- package/dist/{chunk-JOQYPRDZ.js → chunk-7YEZFHLS.js} +10 -8
- package/dist/{chunk-2UQOHYE2.js → chunk-7ZAAICW4.js} +0 -1
- package/dist/{chunk-66QO7XFB.js → chunk-ACZOVWX3.js} +117 -7
- package/dist/{chunk-5J4HKRJF.js → chunk-BAOV476U.js} +0 -1
- package/dist/chunk-BCCXTMN5.js +699 -0
- package/dist/{chunk-JHZWYRSW.js → chunk-C33GTPUZ.js} +11 -4
- package/dist/{chunk-QUUPYOSP.js → chunk-CB45YGAM.js} +2 -3
- package/dist/{chunk-XNLB57UD.js → chunk-DYPMOPIW.js} +18 -2
- package/dist/{chunk-VR7UPJ7C.js → chunk-FCG3BIZN.js} +12 -1
- package/dist/{chunk-5UYI3RJB.js → chunk-FDYDYL77.js} +54 -40
- package/dist/{chunk-OTKVFVL6.js → chunk-I2O6W7DX.js} +116 -44
- package/dist/{chunk-Q7LROV2H.js → chunk-NKNMGIIN.js} +0 -1
- package/dist/chunk-OPO5K4DZ.js +241 -0
- package/dist/{chunk-TUWMK62B.js → chunk-PUS54YU6.js} +45 -2
- package/dist/chunk-QKPXHDLR.js +0 -0
- package/dist/{chunk-GZY66SDN.js → chunk-R3KTTOMS.js} +0 -1
- package/dist/{chunk-ILWDXLUK.js → chunk-RS5AP3J4.js} +49 -10
- package/dist/chunk-WV5ARNDA.js +0 -0
- package/dist/{chunk-4X3JQXNM.js → chunk-XOFT65EX.js} +1 -2
- package/dist/{chunk-FVTQSNR7.js → chunk-XRW6P7IF.js} +13 -5
- package/dist/chunk-XWNNA3KE.js +0 -0
- package/dist/chunk-YZNGMV3G.js +0 -0
- package/dist/{chunk-R2YZTCLO.js → chunk-ZQKZSJAX.js} +1 -2
- package/dist/doc/index.d.ts +27 -12
- package/dist/doc/index.js +16 -17
- package/dist/generate/index.d.ts +2 -2
- package/dist/generate/index.js +2 -3
- package/dist/icons/index.js +3 -4
- package/dist/icons/inlineIconMarker.js +1 -2
- package/dist/imageEdit/index.d.ts +48 -17
- package/dist/imageEdit/index.js +3 -4
- package/dist/index.d.ts +11 -11
- package/dist/index.js +60 -33
- package/dist/jsonForm/index.d.ts +10 -3
- package/dist/jsonForm/index.js +8 -7
- package/dist/markdown/index.d.ts +75 -11
- package/dist/markdown/index.js +32 -7
- package/dist/{materializePageSection-DDzubQXo.d.ts → materializePageSection-wSLA2A1g.d.ts} +2 -2
- package/dist/narration/index.d.ts +16 -3
- package/dist/narration/index.js +13 -14
- package/dist/random/index.d.ts +11 -2
- package/dist/random/index.js +2 -3
- package/dist/recommend/index.d.ts +1 -1
- package/dist/recommend/index.js +3 -4
- package/dist/schemas/index.d.ts +5 -5
- package/dist/schemas/index.js +5 -6
- package/dist/spatial/index.d.ts +2 -1
- package/dist/spatial/index.js +1 -2
- package/dist/storage/index.d.ts +4 -2
- package/dist/storage/index.js +1 -2
- package/dist/{themeLibrary-B72m0W1y.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
- package/dist/timing/index.js +3 -4
- package/dist/transform/index.d.ts +3 -3
- package/dist/transform/index.js +6 -7
- package/dist/{types-C4kiRn_k.d.ts → types-8QjefM9J.d.ts} +38 -2
- package/dist/{types-BwMPl2CB.d.ts → types-CUNc9biN.d.ts} +24 -1
- package/dist/versions/index.d.ts +14 -11
- package/dist/versions/index.js +2 -3
- package/package.json +4 -2
- package/dist/chunk-2UQOHYE2.js.map +0 -1
- package/dist/chunk-3E5F2XMR.js.map +0 -1
- package/dist/chunk-4X3JQXNM.js.map +0 -1
- package/dist/chunk-5DKBFXPY.js.map +0 -1
- package/dist/chunk-5J4HKRJF.js.map +0 -1
- package/dist/chunk-5UYI3RJB.js.map +0 -1
- package/dist/chunk-66QO7XFB.js.map +0 -1
- package/dist/chunk-AMIR72JP.js +0 -380
- package/dist/chunk-AMIR72JP.js.map +0 -1
- package/dist/chunk-DBS6RIFL.js.map +0 -1
- package/dist/chunk-DNJKBAI7.js +0 -1
- package/dist/chunk-DNJKBAI7.js.map +0 -1
- package/dist/chunk-ET53IIEP.js +0 -1
- package/dist/chunk-ET53IIEP.js.map +0 -1
- package/dist/chunk-FVTQSNR7.js.map +0 -1
- package/dist/chunk-GZY66SDN.js.map +0 -1
- package/dist/chunk-ILWDXLUK.js.map +0 -1
- package/dist/chunk-JHZWYRSW.js.map +0 -1
- package/dist/chunk-JI77MGAK.js.map +0 -1
- package/dist/chunk-JOQYPRDZ.js.map +0 -1
- package/dist/chunk-OTKVFVL6.js.map +0 -1
- package/dist/chunk-PGGGKYWG.js +0 -1
- package/dist/chunk-PGGGKYWG.js.map +0 -1
- package/dist/chunk-Q7LROV2H.js.map +0 -1
- package/dist/chunk-QE7TWGVT.js.map +0 -1
- package/dist/chunk-QUUPYOSP.js.map +0 -1
- package/dist/chunk-R2GC6RLD.js +0 -344
- package/dist/chunk-R2GC6RLD.js.map +0 -1
- package/dist/chunk-R2YZTCLO.js.map +0 -1
- package/dist/chunk-S7A5D7ZJ.js +0 -174
- package/dist/chunk-S7A5D7ZJ.js.map +0 -1
- package/dist/chunk-TUWMK62B.js.map +0 -1
- package/dist/chunk-V543AI2F.js +0 -1
- package/dist/chunk-V543AI2F.js.map +0 -1
- package/dist/chunk-VR7UPJ7C.js.map +0 -1
- package/dist/chunk-VWCJ2WXC.js.map +0 -1
- package/dist/chunk-VYFRI7R6.js.map +0 -1
- package/dist/chunk-XNLB57UD.js.map +0 -1
- package/dist/chunk-ZLQKNOZQ.js +0 -1
- package/dist/chunk-ZLQKNOZQ.js.map +0 -1
- package/dist/doc/index.js.map +0 -1
- package/dist/generate/index.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/icons/inlineIconMarker.js.map +0 -1
- package/dist/imageEdit/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jsonForm/index.js.map +0 -1
- package/dist/markdown/index.js.map +0 -1
- package/dist/narration/index.js.map +0 -1
- package/dist/random/index.js.map +0 -1
- package/dist/recommend/index.js.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/spatial/index.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/timing/index.js.map +0 -1
- package/dist/transform/index.js.map +0 -1
- package/dist/versions/index.js.map +0 -1
- package/src/__tests__/animationUtils.test.ts +0 -117
- package/src/__tests__/annotationCoercion.test.ts +0 -243
- package/src/__tests__/applyNarrationTiming.test.ts +0 -190
- package/src/__tests__/applyRenderStyle.test.ts +0 -146
- package/src/__tests__/asciiDiagramBattle.test.ts +0 -246
- package/src/__tests__/asciiDiagramDetect.test.ts +0 -162
- package/src/__tests__/asciiDiagramMapping.test.ts +0 -38
- package/src/__tests__/asciiDiagramParse.test.ts +0 -233
- package/src/__tests__/asciiDiagramPipeline.test.ts +0 -273
- package/src/__tests__/asciiDiagramRender.test.ts +0 -162
- package/src/__tests__/asciiDiagramRepair.test.ts +0 -84
- package/src/__tests__/asciiTimelineDetect.test.ts +0 -157
- package/src/__tests__/asciiTimelineParse.test.ts +0 -205
- package/src/__tests__/asciiTimelinePipeline.test.ts +0 -349
- package/src/__tests__/asciiTimelineRender.test.ts +0 -376
- package/src/__tests__/atmosphereLayers.test.ts +0 -108
- package/src/__tests__/attrTokens.test.ts +0 -167
- package/src/__tests__/colorUtils.test.ts +0 -112
- package/src/__tests__/contentContainer.test.ts +0 -325
- package/src/__tests__/contentExtractor.test.ts +0 -243
- package/src/__tests__/coverBlock.test.ts +0 -310
- package/src/__tests__/customTemplateSample.test.ts +0 -144
- package/src/__tests__/customTemplatesFrontmatter.test.ts +0 -221
- package/src/__tests__/customThemesFrontmatter.test.ts +0 -146
- package/src/__tests__/dataTable.test.ts +0 -145
- package/src/__tests__/diagramBlock.test.ts +0 -122
- package/src/__tests__/diagramLayout.test.ts +0 -134
- package/src/__tests__/diagramText.test.ts +0 -26
- package/src/__tests__/docToMarkdownMedia.test.ts +0 -83
- package/src/__tests__/drawing.test.ts +0 -109
- package/src/__tests__/drawingBlock.test.ts +0 -124
- package/src/__tests__/drawingLayout.test.ts +0 -171
- package/src/__tests__/fixtures/asciiDiagramBattle.ts +0 -512
- package/src/__tests__/fixtures/asciiDiagrams.ts +0 -287
- package/src/__tests__/fixtures/asciiTimelines.ts +0 -35
- package/src/__tests__/fixtures/treeviewFixtures.ts +0 -243
- package/src/__tests__/geohash.test.ts +0 -110
- package/src/__tests__/getLayers.test.ts +0 -243
- package/src/__tests__/getLayersFallback.test.ts +0 -103
- package/src/__tests__/haversine.test.ts +0 -63
- package/src/__tests__/iconResolve.test.ts +0 -122
- package/src/__tests__/imageEditExportSvg.test.ts +0 -70
- package/src/__tests__/imageEditState.test.ts +0 -74
- package/src/__tests__/imageEditVersions.test.ts +0 -243
- package/src/__tests__/inferDocumentTitle.test.ts +0 -50
- package/src/__tests__/inlineIconMarker.test.ts +0 -36
- package/src/__tests__/inputDescriptors.test.ts +0 -162
- package/src/__tests__/jsonForm.chooseControl.test.ts +0 -86
- package/src/__tests__/jsonForm.evaluateWhen.test.ts +0 -59
- package/src/__tests__/jsonForm.inferSchema.test.ts +0 -25
- package/src/__tests__/jsonForm.pointer.test.ts +0 -149
- package/src/__tests__/jsonForm.tokens.test.ts +0 -84
- package/src/__tests__/layoutBlock.test.ts +0 -83
- package/src/__tests__/layoutLayout.test.ts +0 -169
- package/src/__tests__/localForageAdapter.test.ts +0 -155
- package/src/__tests__/majorApiTypes.test.ts +0 -18
- package/src/__tests__/markdown.test.ts +0 -1009
- package/src/__tests__/markdownIcons.test.ts +0 -104
- package/src/__tests__/markdownSanitize.test.ts +0 -81
- package/src/__tests__/markdownToDoc.test.ts +0 -957
- package/src/__tests__/matchFontFamily.test.ts +0 -114
- package/src/__tests__/materializeBlockLayers.test.ts +0 -167
- package/src/__tests__/materializePageSections.test.ts +0 -404
- package/src/__tests__/materializeTestUtils.ts +0 -17
- package/src/__tests__/mediaAnnotations.test.ts +0 -91
- package/src/__tests__/mediaSchedule.test.ts +0 -118
- package/src/__tests__/narrationAlign.test.ts +0 -150
- package/src/__tests__/narrationFeatures.test.ts +0 -71
- package/src/__tests__/narrationNuclei.test.ts +0 -45
- package/src/__tests__/narrationPacing.test.ts +0 -189
- package/src/__tests__/narrationScript.test.ts +0 -149
- package/src/__tests__/narrationSessionRepro.test.ts +0 -62
- package/src/__tests__/narrationSidecar.test.ts +0 -88
- package/src/__tests__/narrationSyllables.test.ts +0 -65
- package/src/__tests__/narrationTestSignals.ts +0 -167
- package/src/__tests__/narrationVad.test.ts +0 -66
- package/src/__tests__/pageStyle.test.ts +0 -258
- package/src/__tests__/pandocAttrParse.test.ts +0 -187
- package/src/__tests__/recommendTemplates.test.ts +0 -183
- package/src/__tests__/resolveDocTheme.test.ts +0 -69
- package/src/__tests__/rootExports.test.ts +0 -61
- package/src/__tests__/scopedContentContainer.test.ts +0 -109
- package/src/__tests__/seededRandom.test.ts +0 -142
- package/src/__tests__/shapeGeometry.test.ts +0 -138
- package/src/__tests__/shapeVocabulary.test.ts +0 -133
- package/src/__tests__/storage.test.ts +0 -60
- package/src/__tests__/structuredData.test.ts +0 -249
- package/src/__tests__/surface.test.ts +0 -68
- package/src/__tests__/templateAnnotationParse.test.ts +0 -173
- package/src/__tests__/templateInputs.test.ts +0 -69
- package/src/__tests__/templateMetadata.test.ts +0 -32
- package/src/__tests__/templates.test.ts +0 -710
- package/src/__tests__/themeCompile.test.ts +0 -225
- package/src/__tests__/themeValidator.test.ts +0 -131
- package/src/__tests__/timing.test.ts +0 -167
- package/src/__tests__/transformProvenance.test.ts +0 -160
- package/src/__tests__/transformV2.test.ts +0 -163
- package/src/__tests__/transitionNormalize.test.ts +0 -61
- package/src/__tests__/treeviewBattle.test.ts +0 -76
- package/src/__tests__/treeviewDetect.test.ts +0 -168
- package/src/__tests__/treeviewParse.test.ts +0 -118
- package/src/__tests__/treeviewPipeline.test.ts +0 -183
- package/src/__tests__/treeviewRender.test.ts +0 -91
- package/src/__tests__/validateDoc.test.ts +0 -260
- package/src/__tests__/versions.test.ts +0 -459
- package/src/doc/annotationBlocks.ts +0 -117
- package/src/doc/applyNarrationTiming.ts +0 -244
- package/src/doc/asciiDiagram/chars.ts +0 -210
- package/src/doc/asciiDiagram/detect.ts +0 -175
- package/src/doc/asciiDiagram/index.ts +0 -38
- package/src/doc/asciiDiagram/mapping.ts +0 -225
- package/src/doc/asciiDiagram/parse.ts +0 -1095
- package/src/doc/asciiDiagram/render.ts +0 -963
- package/src/doc/asciiDiagram/repair.ts +0 -400
- package/src/doc/asciiDiagram/types.ts +0 -65
- package/src/doc/asciiTimeline/detect.ts +0 -138
- package/src/doc/asciiTimeline/index.ts +0 -26
- package/src/doc/asciiTimeline/mapping.ts +0 -43
- package/src/doc/asciiTimeline/parse.ts +0 -870
- package/src/doc/asciiTimeline/render.ts +0 -427
- package/src/doc/asciiTimeline/types.ts +0 -73
- package/src/doc/asciiTimeline/wrappedFlow.ts +0 -427
- package/src/doc/audioMapping.ts +0 -442
- package/src/doc/customTemplatesFrontmatter.ts +0 -273
- package/src/doc/customThemesFrontmatter.ts +0 -95
- package/src/doc/docToMarkdown.ts +0 -284
- package/src/doc/index.ts +0 -161
- package/src/doc/markdownToDoc.ts +0 -1054
- package/src/doc/materializeBlockLayers.ts +0 -465
- package/src/doc/mediaAnnotations.ts +0 -120
- package/src/doc/page/PageSection.ts +0 -174
- package/src/doc/page/materializePageSection.ts +0 -616
- package/src/doc/page/resolvePageBlock.ts +0 -108
- package/src/doc/page/sectionExtractors.ts +0 -466
- package/src/doc/pageCss.ts +0 -628
- package/src/doc/resolveDocTheme.ts +0 -56
- package/src/doc/standaloneAnnotation.ts +0 -58
- package/src/doc/structuredData.ts +0 -301
- package/src/doc/templateInputs.ts +0 -424
- package/src/doc/templates/__tests__/customTemplate.test.ts +0 -170
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +0 -124
- package/src/doc/templates/__tests__/listBlock.test.ts +0 -64
- package/src/doc/templates/accentImage.ts +0 -362
- package/src/doc/templates/captionUtils.ts +0 -56
- package/src/doc/templates/comparisonBar.ts +0 -173
- package/src/doc/templates/coverBlock.ts +0 -255
- package/src/doc/templates/customTemplate.ts +0 -51
- package/src/doc/templates/dataTable.ts +0 -102
- package/src/doc/templates/dateEvent.ts +0 -147
- package/src/doc/templates/definitionCard.ts +0 -140
- package/src/doc/templates/diagramBlock.ts +0 -403
- package/src/doc/templates/diagramLayout.ts +0 -159
- package/src/doc/templates/drawingBlock.ts +0 -325
- package/src/doc/templates/drawingLayout.ts +0 -539
- package/src/doc/templates/factCard.ts +0 -146
- package/src/doc/templates/fallbackBlock.ts +0 -123
- package/src/doc/templates/featureBlock.ts +0 -209
- package/src/doc/templates/fullBleedQuote.ts +0 -83
- package/src/doc/templates/imageWithCaption.ts +0 -186
- package/src/doc/templates/index.ts +0 -642
- package/src/doc/templates/inputDescriptors.ts +0 -451
- package/src/doc/templates/layoutBlock.ts +0 -43
- package/src/doc/templates/layoutLayout.ts +0 -243
- package/src/doc/templates/listBlock.ts +0 -207
- package/src/doc/templates/mapBlock.ts +0 -138
- package/src/doc/templates/metadata.ts +0 -130
- package/src/doc/templates/persistentLayers.ts +0 -526
- package/src/doc/templates/photoGrid.ts +0 -190
- package/src/doc/templates/pullQuote.ts +0 -141
- package/src/doc/templates/quoteBlock.ts +0 -141
- package/src/doc/templates/registry.ts +0 -88
- package/src/doc/templates/sectionHeader.ts +0 -120
- package/src/doc/templates/statHighlight.ts +0 -146
- package/src/doc/templates/templateNames.ts +0 -22
- package/src/doc/templates/timelineBlock.ts +0 -613
- package/src/doc/templates/titleBlock.ts +0 -150
- package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +0 -487
- package/src/doc/templates/tokens/resolveTokens.ts +0 -453
- package/src/doc/templates/treeBlock.ts +0 -131
- package/src/doc/templates/twoColumn.ts +0 -263
- package/src/doc/templates/videoPullQuote.ts +0 -142
- package/src/doc/templates/videoWithCaption.ts +0 -135
- package/src/doc/treeview/chars.ts +0 -72
- package/src/doc/treeview/detect.ts +0 -145
- package/src/doc/treeview/index.ts +0 -30
- package/src/doc/treeview/mapping.ts +0 -95
- package/src/doc/treeview/parse.ts +0 -201
- package/src/doc/treeview/render.ts +0 -41
- package/src/doc/treeview/types.ts +0 -43
- package/src/doc/utils/animationUtils.ts +0 -399
- package/src/doc/utils/applyRenderStyle.ts +0 -106
- package/src/doc/utils/diagramText.ts +0 -78
- package/src/doc/utils/imageTreatment.ts +0 -70
- package/src/doc/utils/nearest.ts +0 -59
- package/src/doc/utils/shapeGeometry.ts +0 -614
- package/src/doc/utils/themeUtils.ts +0 -243
- package/src/doc/validate.ts +0 -575
- package/src/generate/contentExtractor.ts +0 -921
- package/src/generate/index.ts +0 -18
- package/src/generate/templateMapper.ts +0 -177
- package/src/icons/iconData.ts +0 -31
- package/src/icons/index.ts +0 -26
- package/src/icons/inlineIconMarker.ts +0 -73
- package/src/icons/resolve.ts +0 -139
- package/src/imageEdit/ImageEditVersionManager.ts +0 -73
- package/src/imageEdit/export.ts +0 -410
- package/src/imageEdit/index.ts +0 -72
- package/src/imageEdit/persistence.ts +0 -113
- package/src/imageEdit/state.ts +0 -112
- package/src/imageEdit/versionPaths.ts +0 -44
- package/src/imageEdit/versions.ts +0 -152
- package/src/index.ts +0 -15
- package/src/internal/immutable.ts +0 -58
- package/src/jsonForm/chooseControl.ts +0 -88
- package/src/jsonForm/evaluateWhen.ts +0 -59
- package/src/jsonForm/index.ts +0 -32
- package/src/jsonForm/inferSchema.ts +0 -25
- package/src/jsonForm/pointer.ts +0 -154
- package/src/jsonForm/tokens.ts +0 -78
- package/src/jsonForm/types.ts +0 -167
- package/src/markdown/annotationCoercion.ts +0 -295
- package/src/markdown/attrTokens.ts +0 -243
- package/src/markdown/convert.ts +0 -1353
- package/src/markdown/htmlParse.ts +0 -212
- package/src/markdown/index.ts +0 -152
- package/src/markdown/parse.ts +0 -103
- package/src/markdown/sanitize.ts +0 -318
- package/src/markdown/stringify.ts +0 -207
- package/src/markdown/types.ts +0 -710
- package/src/markdown/utils.ts +0 -459
- package/src/narration/align.ts +0 -514
- package/src/narration/features.ts +0 -231
- package/src/narration/index.ts +0 -86
- package/src/narration/nuclei.ts +0 -118
- package/src/narration/pacing.ts +0 -211
- package/src/narration/script.ts +0 -239
- package/src/narration/session.ts +0 -100
- package/src/narration/sidecar.ts +0 -187
- package/src/narration/syllables.ts +0 -85
- package/src/narration/trace.ts +0 -50
- package/src/narration/types.ts +0 -299
- package/src/narration/vad.ts +0 -131
- package/src/ngeohash.d.ts +0 -11
- package/src/random/SeededRandom.ts +0 -127
- package/src/random/index.ts +0 -1
- package/src/recommend/index.ts +0 -16
- package/src/recommend/numberHighlight.ts +0 -25
- package/src/recommend/templates.ts +0 -393
- package/src/schemas/BlockTemplates.ts +0 -1046
- package/src/schemas/CustomTemplates.ts +0 -126
- package/src/schemas/Doc.ts +0 -1073
- package/src/schemas/ImageEditDoc.ts +0 -102
- package/src/schemas/LayoutStrategy.ts +0 -178
- package/src/schemas/Media.ts +0 -179
- package/src/schemas/MediaProvider.ts +0 -70
- package/src/schemas/PageStyle.ts +0 -213
- package/src/schemas/Theme.ts +0 -413
- package/src/schemas/Transitions.ts +0 -224
- package/src/schemas/Types.ts +0 -15
- package/src/schemas/Viewport.ts +0 -91
- package/src/schemas/colorUtils.ts +0 -219
- package/src/schemas/fontStacks.ts +0 -339
- package/src/schemas/index.ts +0 -31
- package/src/schemas/pageStyleDefaults.ts +0 -204
- package/src/schemas/themeCompile.ts +0 -244
- package/src/schemas/themeConstants.ts +0 -2
- package/src/schemas/themeLibrary.ts +0 -60
- package/src/schemas/themeValidator.ts +0 -609
- package/src/schemas/themes/bold.json +0 -77
- package/src/schemas/themes/cinematic.json +0 -143
- package/src/schemas/themes/documentary.json +0 -125
- package/src/schemas/themes/gezellig.json +0 -123
- package/src/schemas/themes/index.ts +0 -53
- package/src/schemas/themes/magazine.json +0 -126
- package/src/schemas/themes/minimalist.json +0 -74
- package/src/schemas/themes/morning-light.json +0 -117
- package/src/schemas/themes/standard-dark.json +0 -109
- package/src/schemas/themes/standard.json +0 -98
- package/src/schemas/themes/tech-dark.json +0 -143
- package/src/schemas/themes/warm-earth.json +0 -74
- package/src/spatial/Geohash.ts +0 -196
- package/src/spatial/Haversine.ts +0 -59
- package/src/spatial/index.ts +0 -2
- package/src/storage/ContentContainer.ts +0 -220
- package/src/storage/LocalForageAdapter.ts +0 -103
- package/src/storage/LocalStorageAdapter.ts +0 -57
- package/src/storage/MediaProviderFromContainer.ts +0 -92
- package/src/storage/MemoryStorageAdapter.ts +0 -37
- package/src/storage/ScopedContentContainer.ts +0 -143
- package/src/storage/Storage.ts +0 -28
- package/src/storage/index.ts +0 -9
- package/src/timing/index.ts +0 -17
- package/src/timing/narrationTiming.ts +0 -220
- package/src/timing/readingTime.ts +0 -94
- package/src/transform/applyTransform.ts +0 -122
- package/src/transform/blockAnalyzer.ts +0 -181
- package/src/transform/index.ts +0 -23
- package/src/transform/registry.ts +0 -217
- package/src/transform/styles/dataDriven.ts +0 -18
- package/src/transform/styles/documentary.ts +0 -18
- package/src/transform/styles/index.ts +0 -5
- package/src/transform/styles/magazine.ts +0 -19
- package/src/transform/styles/minimal.ts +0 -18
- package/src/transform/styles/narrative.ts +0 -19
- package/src/transform/templateSelector.ts +0 -389
- package/src/transform/timingAllocator.ts +0 -257
- package/src/transform/types.ts +0 -158
- package/src/versions/DocumentVersionManager.ts +0 -70
- package/src/versions/gitignore.ts +0 -34
- package/src/versions/index.ts +0 -56
- package/src/versions/operations.ts +0 -144
- package/src/versions/paths.ts +0 -51
- package/src/versions/snapshotStore.ts +0 -202
- package/src/versions/timestamp.ts +0 -48
- package/src/versions/types.ts +0 -93
|
@@ -1,465 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical block-to-layer materialization contract.
|
|
3
|
-
*
|
|
4
|
-
* Timeline scheduling and UI components both delegate here so template
|
|
5
|
-
* lookup, custom templates, ownership, render style, persistent layers,
|
|
6
|
-
* failure policy, and diagnostics cannot drift by render mode.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { Block, Layer, MermaidLayer, Position } from '../schemas/Doc.js';
|
|
10
|
-
import type {
|
|
11
|
-
DocBlock,
|
|
12
|
-
PersistentLayerConfig,
|
|
13
|
-
TemplateBlock,
|
|
14
|
-
TemplateContext,
|
|
15
|
-
} from '../schemas/BlockTemplates.js';
|
|
16
|
-
import type { CustomTemplateDefinition } from '../schemas/CustomTemplates.js';
|
|
17
|
-
import type { Theme } from '../schemas/Theme.js';
|
|
18
|
-
import type { ViewportConfig } from '../schemas/Viewport.js';
|
|
19
|
-
import type { MarkdownCodeBlock } from '../markdown/types.js';
|
|
20
|
-
import { createTemplateContext, isTemplateBlock } from '../schemas/BlockTemplates.js';
|
|
21
|
-
import { DEFAULT_THEME } from '../schemas/themeLibrary.js';
|
|
22
|
-
import { VIEWPORT_PRESETS } from '../schemas/Viewport.js';
|
|
23
|
-
import { cloneData } from '../internal/immutable.js';
|
|
24
|
-
import { applyRenderStyleToLayers } from './utils/applyRenderStyle.js';
|
|
25
|
-
import { coerceTemplateParams } from './templates/inputDescriptors.js';
|
|
26
|
-
import { fallbackBlockLayers } from './templates/fallbackBlock.js';
|
|
27
|
-
import { expandPersistentLayers, wrapWithPersistentLayers } from './templates/persistentLayers.js';
|
|
28
|
-
import { resolveTemplateName } from './templates/templateNames.js';
|
|
29
|
-
import {
|
|
30
|
-
buildRegistry,
|
|
31
|
-
templateRegistry,
|
|
32
|
-
type RuntimeTemplateRegistry,
|
|
33
|
-
} from './templates/registry.js';
|
|
34
|
-
|
|
35
|
-
/** Internal result from executing one template function. */
|
|
36
|
-
type TemplateLayerMaterialization =
|
|
37
|
-
| { status: 'ok'; layers: Layer[] }
|
|
38
|
-
| { status: 'unknown-template'; layers: [] }
|
|
39
|
-
| { status: 'invalid-result'; layers: []; receivedType: string }
|
|
40
|
-
| { status: 'error'; layers: []; error: unknown };
|
|
41
|
-
|
|
42
|
-
/** How a failed template render is represented in the returned layer graph. */
|
|
43
|
-
export type LayerMaterializationFailureMode = 'fallback' | 'empty';
|
|
44
|
-
|
|
45
|
-
/** A structured, inspectable explanation for a template render failure. */
|
|
46
|
-
export type LayerMaterializationDiagnostic =
|
|
47
|
-
| {
|
|
48
|
-
code: 'unknown-template';
|
|
49
|
-
template: string;
|
|
50
|
-
message: string;
|
|
51
|
-
}
|
|
52
|
-
| {
|
|
53
|
-
code: 'invalid-template-result';
|
|
54
|
-
template: string;
|
|
55
|
-
message: string;
|
|
56
|
-
receivedType: string;
|
|
57
|
-
}
|
|
58
|
-
| {
|
|
59
|
-
code: 'template-error';
|
|
60
|
-
template: string;
|
|
61
|
-
message: string;
|
|
62
|
-
cause: unknown;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
/** Identifies which path produced a materialized layer graph. */
|
|
66
|
-
export type LayerMaterializationSource =
|
|
67
|
-
| 'authored'
|
|
68
|
-
| 'template'
|
|
69
|
-
| 'rich-content'
|
|
70
|
-
| 'fallback'
|
|
71
|
-
| 'empty';
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Complete result from {@link materializeBlockLayers}. Failures are data, not
|
|
75
|
-
* console side effects: callers can display, report, or ignore the diagnostic.
|
|
76
|
-
*/
|
|
77
|
-
export interface BlockLayerMaterialization {
|
|
78
|
-
layers: Layer[];
|
|
79
|
-
source: LayerMaterializationSource;
|
|
80
|
-
diagnostic?: LayerMaterializationDiagnostic;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* The single public context for turning a block into renderable layers.
|
|
85
|
-
*
|
|
86
|
-
* Theme persistent layers are inherited by default. Pass
|
|
87
|
-
* `persistentLayers: false` to opt out, or a config to replace the theme's
|
|
88
|
-
* persistent layers wholesale.
|
|
89
|
-
*/
|
|
90
|
-
export interface MaterializeBlockLayersOptions {
|
|
91
|
-
/** Theme used by templates and render-style post-processing. */
|
|
92
|
-
theme?: Theme;
|
|
93
|
-
/** Target viewport. Defaults to the landscape preset. */
|
|
94
|
-
viewport?: ViewportConfig;
|
|
95
|
-
/** Theme inheritance override for persistent layers. */
|
|
96
|
-
persistentLayers?: PersistentLayerConfig | false;
|
|
97
|
-
/** Zero-based position in the flattened render sequence. */
|
|
98
|
-
blockIndex?: number;
|
|
99
|
-
/** Number of blocks in the flattened render sequence. */
|
|
100
|
-
totalBlocks?: number;
|
|
101
|
-
/** Document-scoped custom templates; built-ins win name collisions. */
|
|
102
|
-
customTemplates?: readonly CustomTemplateDefinition[];
|
|
103
|
-
/** Failed templates render a visible fallback by default. */
|
|
104
|
-
failureMode?: LayerMaterializationFailureMode;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** Pre-expanded scheduling cache; not part of the public materialization API. */
|
|
108
|
-
export interface ExpandedPersistentLayerSet {
|
|
109
|
-
bottomLayers: Layer[];
|
|
110
|
-
topLayers: Layer[];
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/** Internal dependencies and compatibility switches supplied by orchestrators. */
|
|
114
|
-
export interface MaterializationRuntime {
|
|
115
|
-
registry: RuntimeTemplateRegistry;
|
|
116
|
-
templateContext?: TemplateContext;
|
|
117
|
-
applyRenderStyle?: boolean;
|
|
118
|
-
expandedPersistentLayers?: ExpandedPersistentLayerSet;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Turn any doc block into an owned, render-ready layer graph.
|
|
123
|
-
*
|
|
124
|
-
* This is the only recommended public materialization entry point.
|
|
125
|
-
*/
|
|
126
|
-
export function materializeBlockLayers(
|
|
127
|
-
block: DocBlock,
|
|
128
|
-
options: MaterializeBlockLayersOptions = {},
|
|
129
|
-
): BlockLayerMaterialization {
|
|
130
|
-
const registry =
|
|
131
|
-
options.customTemplates && options.customTemplates.length > 0
|
|
132
|
-
? buildRegistry(options.customTemplates)
|
|
133
|
-
: (templateRegistry as unknown as RuntimeTemplateRegistry);
|
|
134
|
-
return materializeBlockLayersWithRuntime(block, options, { registry });
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/** Internal entry point for schedulers that cache registry and persistent expansion. */
|
|
138
|
-
export function materializeBlockLayersWithRuntime(
|
|
139
|
-
block: DocBlock,
|
|
140
|
-
options: MaterializeBlockLayersOptions,
|
|
141
|
-
runtime: MaterializationRuntime,
|
|
142
|
-
): BlockLayerMaterialization {
|
|
143
|
-
const theme = options.theme ?? DEFAULT_THEME;
|
|
144
|
-
const viewport = options.viewport ?? VIEWPORT_PRESETS.landscape;
|
|
145
|
-
const blockIndex = options.blockIndex ?? 0;
|
|
146
|
-
const totalBlocks = options.totalBlocks ?? 1;
|
|
147
|
-
const effectivePersistentLayers =
|
|
148
|
-
options.persistentLayers === false
|
|
149
|
-
? undefined
|
|
150
|
-
: (options.persistentLayers ?? theme.persistentLayers);
|
|
151
|
-
|
|
152
|
-
const existingLayers = (block as Block).layers;
|
|
153
|
-
if (existingLayers && existingLayers.length > 0 && !isTemplateBlock(block)) {
|
|
154
|
-
const layers = appendMermaidLayers(cloneData(existingLayers), block as Block, theme, viewport);
|
|
155
|
-
return {
|
|
156
|
-
layers: injectPersistentLayers(
|
|
157
|
-
layers,
|
|
158
|
-
block,
|
|
159
|
-
theme,
|
|
160
|
-
effectivePersistentLayers,
|
|
161
|
-
runtime.expandedPersistentLayers,
|
|
162
|
-
),
|
|
163
|
-
source: 'authored',
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if (!isTemplateBlock(block)) {
|
|
168
|
-
const layers = appendMermaidLayers([], block as Block, theme, viewport);
|
|
169
|
-
return {
|
|
170
|
-
layers: injectPersistentLayers(
|
|
171
|
-
layers,
|
|
172
|
-
block,
|
|
173
|
-
theme,
|
|
174
|
-
effectivePersistentLayers,
|
|
175
|
-
runtime.expandedPersistentLayers,
|
|
176
|
-
),
|
|
177
|
-
source: layers.length > 0 ? 'rich-content' : 'empty',
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const context = runtime.templateContext
|
|
182
|
-
? cloneData(runtime.templateContext)
|
|
183
|
-
: createTemplateContext(theme, blockIndex, totalBlocks, viewport);
|
|
184
|
-
context.block = cloneData(block as Block);
|
|
185
|
-
|
|
186
|
-
const execution = executeTemplateMaterialization(block, context, runtime.registry);
|
|
187
|
-
if (execution.status === 'ok') {
|
|
188
|
-
const styledLayers =
|
|
189
|
-
runtime.applyRenderStyle !== false
|
|
190
|
-
? applyRenderStyleToLayers(execution.layers, block as Block, theme)
|
|
191
|
-
: execution.layers;
|
|
192
|
-
const layers = appendMermaidLayers(styledLayers, block as Block, theme, viewport);
|
|
193
|
-
return {
|
|
194
|
-
layers: injectPersistentLayers(
|
|
195
|
-
layers,
|
|
196
|
-
block,
|
|
197
|
-
theme,
|
|
198
|
-
effectivePersistentLayers,
|
|
199
|
-
runtime.expandedPersistentLayers,
|
|
200
|
-
),
|
|
201
|
-
source: 'template',
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
const diagnostic = toLayerMaterializationDiagnostic(block.template, execution);
|
|
206
|
-
if ((options.failureMode ?? 'fallback') === 'empty') {
|
|
207
|
-
const layers = appendMermaidLayers([], block as Block, theme, viewport);
|
|
208
|
-
return {
|
|
209
|
-
layers: injectPersistentLayers(
|
|
210
|
-
layers,
|
|
211
|
-
block,
|
|
212
|
-
theme,
|
|
213
|
-
effectivePersistentLayers,
|
|
214
|
-
runtime.expandedPersistentLayers,
|
|
215
|
-
),
|
|
216
|
-
source: layers.length > 0 ? 'rich-content' : 'empty',
|
|
217
|
-
diagnostic,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const fallbackLayers = appendMermaidLayers(
|
|
222
|
-
fallbackBlockLayers(block, context, diagnostic.message),
|
|
223
|
-
block as Block,
|
|
224
|
-
theme,
|
|
225
|
-
viewport,
|
|
226
|
-
);
|
|
227
|
-
return {
|
|
228
|
-
layers: injectPersistentLayers(
|
|
229
|
-
fallbackLayers,
|
|
230
|
-
block,
|
|
231
|
-
theme,
|
|
232
|
-
effectivePersistentLayers,
|
|
233
|
-
runtime.expandedPersistentLayers,
|
|
234
|
-
),
|
|
235
|
-
source: 'fallback',
|
|
236
|
-
diagnostic,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
interface LayerRect {
|
|
241
|
-
x: number;
|
|
242
|
-
y: number;
|
|
243
|
-
width: number;
|
|
244
|
-
height: number;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/** Mermaid fences are explicit author intent and never inferred from other code. */
|
|
248
|
-
function mermaidSources(block: Block): string[] {
|
|
249
|
-
return (block.contents ?? [])
|
|
250
|
-
.filter(
|
|
251
|
-
(node): node is MarkdownCodeBlock =>
|
|
252
|
-
node.type === 'code' && node.lang?.trim().toLowerCase() === 'mermaid',
|
|
253
|
-
)
|
|
254
|
-
.map((node) => node.value)
|
|
255
|
-
.filter((source) => source.trim().length > 0);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function resolvePositionValue(value: number | string | undefined, dimension: number): number {
|
|
259
|
-
if (value === undefined) return 0;
|
|
260
|
-
if (typeof value === 'number') return value;
|
|
261
|
-
const percent = value.match(/^\s*(-?\d+(?:\.\d+)?)%\s*$/);
|
|
262
|
-
if (percent) return (Number(percent[1]) / 100) * dimension;
|
|
263
|
-
const numeric = Number.parseFloat(value);
|
|
264
|
-
return Number.isFinite(numeric) ? numeric : 0;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function positionRect(
|
|
268
|
-
position: Position,
|
|
269
|
-
viewport: ViewportConfig,
|
|
270
|
-
fallbackWidth: number,
|
|
271
|
-
fallbackHeight: number,
|
|
272
|
-
): LayerRect {
|
|
273
|
-
const width = position.width
|
|
274
|
-
? resolvePositionValue(position.width, viewport.width)
|
|
275
|
-
: fallbackWidth;
|
|
276
|
-
const height = position.height
|
|
277
|
-
? resolvePositionValue(position.height, viewport.height)
|
|
278
|
-
: fallbackHeight;
|
|
279
|
-
let x = resolvePositionValue(position.x, viewport.width);
|
|
280
|
-
let y = resolvePositionValue(position.y, viewport.height);
|
|
281
|
-
const anchor = position.anchor ?? 'top-left';
|
|
282
|
-
if (anchor === 'center') {
|
|
283
|
-
x -= width / 2;
|
|
284
|
-
y -= height / 2;
|
|
285
|
-
} else {
|
|
286
|
-
if (anchor.endsWith('right')) x -= width;
|
|
287
|
-
if (anchor.startsWith('bottom')) y -= height;
|
|
288
|
-
}
|
|
289
|
-
return { x, y, width, height };
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
function overlapArea(a: LayerRect, b: LayerRect): number {
|
|
293
|
-
const width = Math.max(0, Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x));
|
|
294
|
-
const height = Math.max(0, Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y));
|
|
295
|
-
return width * height;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Pick the least-obstructed media region when a template already owns the
|
|
300
|
-
* slide. Background shapes/paths are deliberately ignored; text and existing
|
|
301
|
-
* rich media are what the Mermaid inset must avoid.
|
|
302
|
-
*/
|
|
303
|
-
function mermaidRegion(layers: readonly Layer[], viewport: ViewportConfig): LayerRect {
|
|
304
|
-
const occupied = layers
|
|
305
|
-
.filter((layer) => layer.type !== 'shape' && layer.type !== 'path' && layer.type !== 'mermaid')
|
|
306
|
-
.map((layer) =>
|
|
307
|
-
positionRect(
|
|
308
|
-
layer.position,
|
|
309
|
-
viewport,
|
|
310
|
-
layer.type === 'text' ? viewport.width * 0.45 : viewport.width * 0.5,
|
|
311
|
-
layer.type === 'text' ? viewport.height * 0.2 : viewport.height * 0.55,
|
|
312
|
-
),
|
|
313
|
-
);
|
|
314
|
-
if (occupied.length === 0) {
|
|
315
|
-
return {
|
|
316
|
-
x: viewport.width * 0.06,
|
|
317
|
-
y: viewport.height * 0.08,
|
|
318
|
-
width: viewport.width * 0.88,
|
|
319
|
-
height: viewport.height * 0.84,
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
const candidates: LayerRect[] = [
|
|
324
|
-
{
|
|
325
|
-
x: viewport.width * 0.52,
|
|
326
|
-
y: viewport.height * 0.12,
|
|
327
|
-
width: viewport.width * 0.44,
|
|
328
|
-
height: viewport.height * 0.76,
|
|
329
|
-
},
|
|
330
|
-
{
|
|
331
|
-
x: viewport.width * 0.04,
|
|
332
|
-
y: viewport.height * 0.12,
|
|
333
|
-
width: viewport.width * 0.44,
|
|
334
|
-
height: viewport.height * 0.76,
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
x: viewport.width * 0.15,
|
|
338
|
-
y: viewport.height * 0.53,
|
|
339
|
-
width: viewport.width * 0.7,
|
|
340
|
-
height: viewport.height * 0.41,
|
|
341
|
-
},
|
|
342
|
-
];
|
|
343
|
-
return candidates.reduce((best, candidate) => {
|
|
344
|
-
const score = occupied.reduce((sum, rect) => sum + overlapArea(candidate, rect), 0);
|
|
345
|
-
const bestScore = occupied.reduce((sum, rect) => sum + overlapArea(best, rect), 0);
|
|
346
|
-
return score < bestScore ? candidate : best;
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/** Add every Mermaid fence as a responsive rich-media layer. */
|
|
351
|
-
function appendMermaidLayers(
|
|
352
|
-
layers: Layer[],
|
|
353
|
-
block: Block,
|
|
354
|
-
theme: Theme,
|
|
355
|
-
viewport: ViewportConfig,
|
|
356
|
-
): Layer[] {
|
|
357
|
-
const sources = mermaidSources(block);
|
|
358
|
-
if (sources.length === 0 || layers.some((layer) => layer.type === 'mermaid')) return layers;
|
|
359
|
-
|
|
360
|
-
const region = mermaidRegion(layers, viewport);
|
|
361
|
-
const columns = sources.length === 1 ? 1 : 2;
|
|
362
|
-
const rows = Math.ceil(sources.length / columns);
|
|
363
|
-
const gap = Math.min(viewport.width, viewport.height) * 0.018;
|
|
364
|
-
const width = (region.width - gap * (columns - 1)) / columns;
|
|
365
|
-
const height = (region.height - gap * (rows - 1)) / rows;
|
|
366
|
-
const mermaidLayers: MermaidLayer[] = sources.map((source, index) => ({
|
|
367
|
-
id: `${block.id}-mermaid-${index + 1}`,
|
|
368
|
-
type: 'mermaid',
|
|
369
|
-
position: {
|
|
370
|
-
x: region.x + (index % columns) * (width + gap),
|
|
371
|
-
y: region.y + Math.floor(index / columns) * (height + gap),
|
|
372
|
-
width,
|
|
373
|
-
height,
|
|
374
|
-
},
|
|
375
|
-
content: {
|
|
376
|
-
source,
|
|
377
|
-
background: theme.colors.backgroundLight,
|
|
378
|
-
foreground: theme.colors.text,
|
|
379
|
-
padding: Math.max(12, Math.round(Math.min(width, height) * 0.025)),
|
|
380
|
-
},
|
|
381
|
-
}));
|
|
382
|
-
return [...layers, ...mermaidLayers];
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
function executeTemplateMaterialization(
|
|
386
|
-
templateBlock: TemplateBlock,
|
|
387
|
-
context: TemplateContext,
|
|
388
|
-
registry: RuntimeTemplateRegistry,
|
|
389
|
-
): TemplateLayerMaterialization {
|
|
390
|
-
const safeTemplateBlock = cloneData(templateBlock);
|
|
391
|
-
const safeContext = cloneData(context);
|
|
392
|
-
const maybeChildren = (safeTemplateBlock as Block).children;
|
|
393
|
-
if ((!safeContext.children || safeContext.children.length === 0) && maybeChildren?.length) {
|
|
394
|
-
safeContext.children = maybeChildren;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
const templateFn = registry[resolveTemplateName(safeTemplateBlock.template)];
|
|
398
|
-
if (!templateFn) return { status: 'unknown-template', layers: [] };
|
|
399
|
-
|
|
400
|
-
const { templateData, templateOverrides } = safeTemplateBlock as Block;
|
|
401
|
-
const input =
|
|
402
|
-
templateData || templateOverrides
|
|
403
|
-
? ({
|
|
404
|
-
...safeTemplateBlock,
|
|
405
|
-
...templateData,
|
|
406
|
-
...coerceTemplateParams(safeTemplateBlock.template, templateOverrides ?? {}).input,
|
|
407
|
-
} as TemplateBlock)
|
|
408
|
-
: safeTemplateBlock;
|
|
409
|
-
|
|
410
|
-
try {
|
|
411
|
-
const renderedLayers = templateFn(input, safeContext);
|
|
412
|
-
if (!Array.isArray(renderedLayers)) {
|
|
413
|
-
return {
|
|
414
|
-
status: 'invalid-result',
|
|
415
|
-
layers: [],
|
|
416
|
-
receivedType: typeof renderedLayers,
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
return { status: 'ok', layers: cloneData(renderedLayers) };
|
|
420
|
-
} catch (error: unknown) {
|
|
421
|
-
return { status: 'error', layers: [], error };
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
function toLayerMaterializationDiagnostic(
|
|
426
|
-
template: string,
|
|
427
|
-
execution: Exclude<TemplateLayerMaterialization, { status: 'ok' }>,
|
|
428
|
-
): LayerMaterializationDiagnostic {
|
|
429
|
-
if (execution.status === 'unknown-template') {
|
|
430
|
-
return {
|
|
431
|
-
code: 'unknown-template',
|
|
432
|
-
template,
|
|
433
|
-
message: `Unknown template "${template}"`,
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
if (execution.status === 'invalid-result') {
|
|
437
|
-
return {
|
|
438
|
-
code: 'invalid-template-result',
|
|
439
|
-
template,
|
|
440
|
-
receivedType: execution.receivedType,
|
|
441
|
-
message: `Template "${template}" returned ${execution.receivedType}, not a layer array`,
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
return {
|
|
445
|
-
code: 'template-error',
|
|
446
|
-
template,
|
|
447
|
-
cause: execution.error,
|
|
448
|
-
message: `Template "${template}" failed`,
|
|
449
|
-
};
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
function injectPersistentLayers(
|
|
453
|
-
layers: Layer[],
|
|
454
|
-
block: DocBlock,
|
|
455
|
-
theme: Theme,
|
|
456
|
-
persistentLayers?: PersistentLayerConfig,
|
|
457
|
-
expanded?: ExpandedPersistentLayerSet,
|
|
458
|
-
): Layer[] {
|
|
459
|
-
if (!persistentLayers) return layers;
|
|
460
|
-
const bottomLayers =
|
|
461
|
-
expanded?.bottomLayers ?? expandPersistentLayers(persistentLayers.bottomLayers, theme);
|
|
462
|
-
const topLayers =
|
|
463
|
-
expanded?.topLayers ?? expandPersistentLayers(persistentLayers.topLayers, theme);
|
|
464
|
-
return wrapWithPersistentLayers(layers, block as TemplateBlock, bottomLayers, topLayers);
|
|
465
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Media-annotation extraction.
|
|
3
|
-
*
|
|
4
|
-
* Lifts standalone body-level media annotations — `{[audio …]}` / `{[video …]}`
|
|
5
|
-
* — out of a block's markdown contents into typed {@link MediaClip}s. A block
|
|
6
|
-
* can hold several clips (unlike the single heading annotation). An annotation
|
|
7
|
-
* flagged `anchor=document` (or `span=document`) becomes a document-spanning
|
|
8
|
-
* clip instead. The annotation grammar is the shared one used for heading
|
|
9
|
-
* annotations, so quoting/escaping behave identically.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { parseTimeSeconds } from '../markdown/annotationCoercion.js';
|
|
13
|
-
import type { MarkdownBlockNode } from '../markdown/types.js';
|
|
14
|
-
import type { MediaClip } from '../schemas/Media.js';
|
|
15
|
-
import { parseStandaloneAnnotation, type ParsedAnnotation } from './standaloneAnnotation.js';
|
|
16
|
-
|
|
17
|
-
/** Annotation template names that produce a timed media clip. */
|
|
18
|
-
const MEDIA_TEMPLATES = new Set(['audio', 'video', 'media']);
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Whether a standalone-annotation template name is a media name
|
|
22
|
-
* (`audio`/`video`/`media`). The standalone template-block extractor uses
|
|
23
|
-
* this to leave media annotations to {@link extractMediaFromContents}.
|
|
24
|
-
*/
|
|
25
|
-
export function isMediaAnnotationName(name: string | undefined): boolean {
|
|
26
|
-
return name != null && MEDIA_TEMPLATES.has(name);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function time(raw: string | undefined): number | null {
|
|
30
|
-
if (raw == null) return null;
|
|
31
|
-
return parseTimeSeconds(raw);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Build a {@link MediaClip} from a parsed media annotation, or null if invalid. */
|
|
35
|
-
function toMediaClip(parsed: ParsedAnnotation, id: string): MediaClip | null {
|
|
36
|
-
const { template, params } = parsed;
|
|
37
|
-
if (!template || !MEDIA_TEMPLATES.has(template)) return null;
|
|
38
|
-
const src = params.src;
|
|
39
|
-
if (!src) return null;
|
|
40
|
-
|
|
41
|
-
const kind: MediaClip['kind'] = template === 'video' ? 'video' : 'audio';
|
|
42
|
-
const anchor: MediaClip['anchor'] =
|
|
43
|
-
params.anchor === 'document' || params.span === 'document' ? 'document' : 'block';
|
|
44
|
-
// `startAt` is canonical; `startTime` is accepted as an alias (it is the
|
|
45
|
-
// heading-attribute spelling, so authors reach for it here too).
|
|
46
|
-
const clip: MediaClip = {
|
|
47
|
-
id,
|
|
48
|
-
src,
|
|
49
|
-
kind,
|
|
50
|
-
startAt: time(params.startAt ?? params.startTime) ?? 0,
|
|
51
|
-
anchor,
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const clipStart = time(params.clipStart);
|
|
55
|
-
const clipEnd = time(params.clipEnd);
|
|
56
|
-
if (clipStart != null) clip.clipStart = clipStart;
|
|
57
|
-
if (clipEnd != null) clip.clipEnd = clipEnd;
|
|
58
|
-
// `spillover` or `spillover=true` → true; absent/`false` → omitted.
|
|
59
|
-
if (params.spillover === 'true' || params.spillover === '') clip.spillover = true;
|
|
60
|
-
|
|
61
|
-
return clip;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface MediaExtraction {
|
|
65
|
-
/** Block-anchored clips (anchor='block'). */
|
|
66
|
-
media: MediaClip[];
|
|
67
|
-
/** Document-spanning clips (anchor='document'). */
|
|
68
|
-
documentMedia: MediaClip[];
|
|
69
|
-
/** Contents with the lifted media-annotation paragraphs removed. */
|
|
70
|
-
remaining: MarkdownBlockNode[];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Walk `contents`, lifting every standalone media annotation into a
|
|
75
|
-
* {@link MediaClip}. `makeId(src, index)` produces stable clip ids.
|
|
76
|
-
* When `blockId` is given, each clip records its round-trip `origin` —
|
|
77
|
-
* the owning block, its position in the ORIGINAL contents array, and
|
|
78
|
-
* the annotation paragraph's exact text — so `docToMarkdown` can
|
|
79
|
-
* re-insert it byte-stably.
|
|
80
|
-
*/
|
|
81
|
-
export function extractMediaFromContents(
|
|
82
|
-
contents: MarkdownBlockNode[] | undefined,
|
|
83
|
-
makeId: (src: string, index: number) => string,
|
|
84
|
-
blockId?: string,
|
|
85
|
-
): MediaExtraction {
|
|
86
|
-
const media: MediaClip[] = [];
|
|
87
|
-
const documentMedia: MediaClip[] = [];
|
|
88
|
-
const remaining: MarkdownBlockNode[] = [];
|
|
89
|
-
let index = 0;
|
|
90
|
-
let originalIndex = 0;
|
|
91
|
-
|
|
92
|
-
for (const node of contents ?? []) {
|
|
93
|
-
const parsed = parseStandaloneAnnotation(node);
|
|
94
|
-
const clip = parsed ? toMediaClip(parsed, '') : null;
|
|
95
|
-
if (parsed && clip) {
|
|
96
|
-
clip.id = makeId(clip.src, index++);
|
|
97
|
-
const line = node.position?.start.line;
|
|
98
|
-
if (line != null) clip.sourceLine = line;
|
|
99
|
-
if (blockId !== undefined) {
|
|
100
|
-
// parseStandaloneAnnotation only matches a paragraph with exactly
|
|
101
|
-
// one text child, so this read is safe when `parsed` is non-null.
|
|
102
|
-
const rawText =
|
|
103
|
-
node.type === 'paragraph' && node.children?.[0]?.type === 'text'
|
|
104
|
-
? node.children[0].value.trim()
|
|
105
|
-
: undefined;
|
|
106
|
-
clip.origin = {
|
|
107
|
-
blockId,
|
|
108
|
-
index: originalIndex,
|
|
109
|
-
...(rawText !== undefined ? { raw: rawText } : {}),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
(clip.anchor === 'document' ? documentMedia : media).push(clip);
|
|
113
|
-
} else {
|
|
114
|
-
remaining.push(node);
|
|
115
|
-
}
|
|
116
|
-
originalIndex++;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return { media, documentMedia, remaining };
|
|
120
|
-
}
|