@bendyline/squisq 2.0.1 → 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-ylqWKDc_.d.ts → Doc-BubIpWsp.d.ts} +160 -3
- package/dist/{ImageEditDoc-D828IXJ1.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-2ZWIXGAC.js +214 -0
- package/dist/{chunk-2PWOO4ZE.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-X6DUONGT.js → chunk-7ARJZYQY.js} +280 -128
- 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-W4O2TX5I.js → chunk-C33GTPUZ.js} +579 -4
- package/dist/{chunk-MMPBOUK7.js → chunk-CB45YGAM.js} +7 -2
- package/dist/{chunk-CY2R2VPR.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-TFJVXUHH.js → chunk-I2O6W7DX.js} +1513 -79
- 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-PXLVXTLW.js → chunk-RS5AP3J4.js} +72 -15
- 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 +166 -12
- package/dist/doc/index.js +36 -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 +13 -12
- package/dist/index.js +118 -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-wSLA2A1g.d.ts +223 -0
- 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 +31 -6
- package/dist/schemas/index.js +43 -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-RjVgLpUi.d.ts → themeLibrary-DU9mUmVl.d.ts} +1 -1
- package/dist/timing/index.js +3 -4
- package/dist/transform/index.d.ts +9 -10
- 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-2PWOO4ZE.js.map +0 -1
- 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-CY2R2VPR.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-FVJUUTEM.js +0 -74
- package/dist/chunk-FVJUUTEM.js.map +0 -1
- package/dist/chunk-FVTQSNR7.js.map +0 -1
- package/dist/chunk-GZY66SDN.js.map +0 -1
- package/dist/chunk-JOQYPRDZ.js.map +0 -1
- package/dist/chunk-MMPBOUK7.js.map +0 -1
- package/dist/chunk-PGGGKYWG.js +0 -1
- package/dist/chunk-PGGGKYWG.js.map +0 -1
- package/dist/chunk-PXLVXTLW.js.map +0 -1
- package/dist/chunk-Q7LROV2H.js.map +0 -1
- package/dist/chunk-QE7TWGVT.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-TFJVXUHH.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-W4O2TX5I.js.map +0 -1
- package/dist/chunk-X6DUONGT.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 -135
- 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__/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 -160
- 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 -127
- package/src/doc/markdownToDoc.ts +0 -1054
- package/src/doc/materializeBlockLayers.ts +0 -304
- package/src/doc/mediaAnnotations.ts +0 -120
- 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 -423
- 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 -1052
- 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/Theme.ts +0 -406
- 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 -29
- package/src/schemas/themeCompile.ts +0 -237
- package/src/schemas/themeConstants.ts +0 -2
- package/src/schemas/themeLibrary.ts +0 -60
- package/src/schemas/themeValidator.ts +0 -426
- package/src/schemas/themes/bold.json +0 -48
- package/src/schemas/themes/cinematic.json +0 -111
- package/src/schemas/themes/documentary.json +0 -96
- package/src/schemas/themes/gezellig.json +0 -93
- package/src/schemas/themes/index.ts +0 -53
- package/src/schemas/themes/magazine.json +0 -89
- package/src/schemas/themes/minimalist.json +0 -45
- package/src/schemas/themes/morning-light.json +0 -85
- package/src/schemas/themes/standard-dark.json +0 -85
- package/src/schemas/themes/standard.json +0 -74
- package/src/schemas/themes/tech-dark.json +0 -101
- package/src/schemas/themes/warm-earth.json +0 -50
- 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 -198
- package/src/transform/styles/dataDriven.ts +0 -17
- package/src/transform/styles/documentary.ts +0 -17
- package/src/transform/styles/index.ts +0 -5
- package/src/transform/styles/magazine.ts +0 -18
- package/src/transform/styles/minimal.ts +0 -17
- package/src/transform/styles/narrative.ts +0 -18
- package/src/transform/templateSelector.ts +0 -389
- package/src/transform/timingAllocator.ts +0 -257
- package/src/transform/types.ts +0 -151
- 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,304 +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 } 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 { createTemplateContext, isTemplateBlock } from '../schemas/BlockTemplates.js';
|
|
20
|
-
import { DEFAULT_THEME } from '../schemas/themeLibrary.js';
|
|
21
|
-
import { VIEWPORT_PRESETS } from '../schemas/Viewport.js';
|
|
22
|
-
import { cloneData } from '../internal/immutable.js';
|
|
23
|
-
import { applyRenderStyleToLayers } from './utils/applyRenderStyle.js';
|
|
24
|
-
import { coerceTemplateParams } from './templates/inputDescriptors.js';
|
|
25
|
-
import { fallbackBlockLayers } from './templates/fallbackBlock.js';
|
|
26
|
-
import { expandPersistentLayers, wrapWithPersistentLayers } from './templates/persistentLayers.js';
|
|
27
|
-
import { resolveTemplateName } from './templates/templateNames.js';
|
|
28
|
-
import {
|
|
29
|
-
buildRegistry,
|
|
30
|
-
templateRegistry,
|
|
31
|
-
type RuntimeTemplateRegistry,
|
|
32
|
-
} from './templates/registry.js';
|
|
33
|
-
|
|
34
|
-
/** Internal result from executing one template function. */
|
|
35
|
-
type TemplateLayerMaterialization =
|
|
36
|
-
| { status: 'ok'; layers: Layer[] }
|
|
37
|
-
| { status: 'unknown-template'; layers: [] }
|
|
38
|
-
| { status: 'invalid-result'; layers: []; receivedType: string }
|
|
39
|
-
| { status: 'error'; layers: []; error: unknown };
|
|
40
|
-
|
|
41
|
-
/** How a failed template render is represented in the returned layer graph. */
|
|
42
|
-
export type LayerMaterializationFailureMode = 'fallback' | 'empty';
|
|
43
|
-
|
|
44
|
-
/** A structured, inspectable explanation for a template render failure. */
|
|
45
|
-
export type LayerMaterializationDiagnostic =
|
|
46
|
-
| {
|
|
47
|
-
code: 'unknown-template';
|
|
48
|
-
template: string;
|
|
49
|
-
message: string;
|
|
50
|
-
}
|
|
51
|
-
| {
|
|
52
|
-
code: 'invalid-template-result';
|
|
53
|
-
template: string;
|
|
54
|
-
message: string;
|
|
55
|
-
receivedType: string;
|
|
56
|
-
}
|
|
57
|
-
| {
|
|
58
|
-
code: 'template-error';
|
|
59
|
-
template: string;
|
|
60
|
-
message: string;
|
|
61
|
-
cause: unknown;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/** Identifies which path produced a materialized layer graph. */
|
|
65
|
-
export type LayerMaterializationSource = 'authored' | 'template' | 'fallback' | 'empty';
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Complete result from {@link materializeBlockLayers}. Failures are data, not
|
|
69
|
-
* console side effects: callers can display, report, or ignore the diagnostic.
|
|
70
|
-
*/
|
|
71
|
-
export interface BlockLayerMaterialization {
|
|
72
|
-
layers: Layer[];
|
|
73
|
-
source: LayerMaterializationSource;
|
|
74
|
-
diagnostic?: LayerMaterializationDiagnostic;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* The single public context for turning a block into renderable layers.
|
|
79
|
-
*
|
|
80
|
-
* Theme persistent layers are inherited by default. Pass
|
|
81
|
-
* `persistentLayers: false` to opt out, or a config to replace the theme's
|
|
82
|
-
* persistent layers wholesale.
|
|
83
|
-
*/
|
|
84
|
-
export interface MaterializeBlockLayersOptions {
|
|
85
|
-
/** Theme used by templates and render-style post-processing. */
|
|
86
|
-
theme?: Theme;
|
|
87
|
-
/** Target viewport. Defaults to the landscape preset. */
|
|
88
|
-
viewport?: ViewportConfig;
|
|
89
|
-
/** Theme inheritance override for persistent layers. */
|
|
90
|
-
persistentLayers?: PersistentLayerConfig | false;
|
|
91
|
-
/** Zero-based position in the flattened render sequence. */
|
|
92
|
-
blockIndex?: number;
|
|
93
|
-
/** Number of blocks in the flattened render sequence. */
|
|
94
|
-
totalBlocks?: number;
|
|
95
|
-
/** Document-scoped custom templates; built-ins win name collisions. */
|
|
96
|
-
customTemplates?: readonly CustomTemplateDefinition[];
|
|
97
|
-
/** Failed templates render a visible fallback by default. */
|
|
98
|
-
failureMode?: LayerMaterializationFailureMode;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** Pre-expanded scheduling cache; not part of the public materialization API. */
|
|
102
|
-
export interface ExpandedPersistentLayerSet {
|
|
103
|
-
bottomLayers: Layer[];
|
|
104
|
-
topLayers: Layer[];
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** Internal dependencies and compatibility switches supplied by orchestrators. */
|
|
108
|
-
export interface MaterializationRuntime {
|
|
109
|
-
registry: RuntimeTemplateRegistry;
|
|
110
|
-
templateContext?: TemplateContext;
|
|
111
|
-
applyRenderStyle?: boolean;
|
|
112
|
-
expandedPersistentLayers?: ExpandedPersistentLayerSet;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Turn any doc block into an owned, render-ready layer graph.
|
|
117
|
-
*
|
|
118
|
-
* This is the only recommended public materialization entry point.
|
|
119
|
-
*/
|
|
120
|
-
export function materializeBlockLayers(
|
|
121
|
-
block: DocBlock,
|
|
122
|
-
options: MaterializeBlockLayersOptions = {},
|
|
123
|
-
): BlockLayerMaterialization {
|
|
124
|
-
const registry =
|
|
125
|
-
options.customTemplates && options.customTemplates.length > 0
|
|
126
|
-
? buildRegistry(options.customTemplates)
|
|
127
|
-
: (templateRegistry as unknown as RuntimeTemplateRegistry);
|
|
128
|
-
return materializeBlockLayersWithRuntime(block, options, { registry });
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/** Internal entry point for schedulers that cache registry and persistent expansion. */
|
|
132
|
-
export function materializeBlockLayersWithRuntime(
|
|
133
|
-
block: DocBlock,
|
|
134
|
-
options: MaterializeBlockLayersOptions,
|
|
135
|
-
runtime: MaterializationRuntime,
|
|
136
|
-
): BlockLayerMaterialization {
|
|
137
|
-
const theme = options.theme ?? DEFAULT_THEME;
|
|
138
|
-
const viewport = options.viewport ?? VIEWPORT_PRESETS.landscape;
|
|
139
|
-
const blockIndex = options.blockIndex ?? 0;
|
|
140
|
-
const totalBlocks = options.totalBlocks ?? 1;
|
|
141
|
-
const effectivePersistentLayers =
|
|
142
|
-
options.persistentLayers === false
|
|
143
|
-
? undefined
|
|
144
|
-
: (options.persistentLayers ?? theme.persistentLayers);
|
|
145
|
-
|
|
146
|
-
const existingLayers = (block as Block).layers;
|
|
147
|
-
if (existingLayers && existingLayers.length > 0 && !isTemplateBlock(block)) {
|
|
148
|
-
return {
|
|
149
|
-
layers: injectPersistentLayers(
|
|
150
|
-
cloneData(existingLayers),
|
|
151
|
-
block,
|
|
152
|
-
theme,
|
|
153
|
-
effectivePersistentLayers,
|
|
154
|
-
runtime.expandedPersistentLayers,
|
|
155
|
-
),
|
|
156
|
-
source: 'authored',
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (!isTemplateBlock(block)) {
|
|
161
|
-
return {
|
|
162
|
-
layers: injectPersistentLayers(
|
|
163
|
-
[],
|
|
164
|
-
block,
|
|
165
|
-
theme,
|
|
166
|
-
effectivePersistentLayers,
|
|
167
|
-
runtime.expandedPersistentLayers,
|
|
168
|
-
),
|
|
169
|
-
source: 'empty',
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const context = runtime.templateContext
|
|
174
|
-
? cloneData(runtime.templateContext)
|
|
175
|
-
: createTemplateContext(theme, blockIndex, totalBlocks, viewport);
|
|
176
|
-
context.block = cloneData(block as Block);
|
|
177
|
-
|
|
178
|
-
const execution = executeTemplateMaterialization(block, context, runtime.registry);
|
|
179
|
-
if (execution.status === 'ok') {
|
|
180
|
-
const styledLayers =
|
|
181
|
-
runtime.applyRenderStyle !== false
|
|
182
|
-
? applyRenderStyleToLayers(execution.layers, block as Block, theme)
|
|
183
|
-
: execution.layers;
|
|
184
|
-
return {
|
|
185
|
-
layers: injectPersistentLayers(
|
|
186
|
-
styledLayers,
|
|
187
|
-
block,
|
|
188
|
-
theme,
|
|
189
|
-
effectivePersistentLayers,
|
|
190
|
-
runtime.expandedPersistentLayers,
|
|
191
|
-
),
|
|
192
|
-
source: 'template',
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const diagnostic = toLayerMaterializationDiagnostic(block.template, execution);
|
|
197
|
-
if ((options.failureMode ?? 'fallback') === 'empty') {
|
|
198
|
-
return {
|
|
199
|
-
layers: injectPersistentLayers(
|
|
200
|
-
[],
|
|
201
|
-
block,
|
|
202
|
-
theme,
|
|
203
|
-
effectivePersistentLayers,
|
|
204
|
-
runtime.expandedPersistentLayers,
|
|
205
|
-
),
|
|
206
|
-
source: 'empty',
|
|
207
|
-
diagnostic,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return {
|
|
212
|
-
layers: injectPersistentLayers(
|
|
213
|
-
fallbackBlockLayers(block, context, diagnostic.message),
|
|
214
|
-
block,
|
|
215
|
-
theme,
|
|
216
|
-
effectivePersistentLayers,
|
|
217
|
-
runtime.expandedPersistentLayers,
|
|
218
|
-
),
|
|
219
|
-
source: 'fallback',
|
|
220
|
-
diagnostic,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function executeTemplateMaterialization(
|
|
225
|
-
templateBlock: TemplateBlock,
|
|
226
|
-
context: TemplateContext,
|
|
227
|
-
registry: RuntimeTemplateRegistry,
|
|
228
|
-
): TemplateLayerMaterialization {
|
|
229
|
-
const safeTemplateBlock = cloneData(templateBlock);
|
|
230
|
-
const safeContext = cloneData(context);
|
|
231
|
-
const maybeChildren = (safeTemplateBlock as Block).children;
|
|
232
|
-
if ((!safeContext.children || safeContext.children.length === 0) && maybeChildren?.length) {
|
|
233
|
-
safeContext.children = maybeChildren;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
const templateFn = registry[resolveTemplateName(safeTemplateBlock.template)];
|
|
237
|
-
if (!templateFn) return { status: 'unknown-template', layers: [] };
|
|
238
|
-
|
|
239
|
-
const { templateData, templateOverrides } = safeTemplateBlock as Block;
|
|
240
|
-
const input =
|
|
241
|
-
templateData || templateOverrides
|
|
242
|
-
? ({
|
|
243
|
-
...safeTemplateBlock,
|
|
244
|
-
...templateData,
|
|
245
|
-
...coerceTemplateParams(safeTemplateBlock.template, templateOverrides ?? {}).input,
|
|
246
|
-
} as TemplateBlock)
|
|
247
|
-
: safeTemplateBlock;
|
|
248
|
-
|
|
249
|
-
try {
|
|
250
|
-
const renderedLayers = templateFn(input, safeContext);
|
|
251
|
-
if (!Array.isArray(renderedLayers)) {
|
|
252
|
-
return {
|
|
253
|
-
status: 'invalid-result',
|
|
254
|
-
layers: [],
|
|
255
|
-
receivedType: typeof renderedLayers,
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
return { status: 'ok', layers: cloneData(renderedLayers) };
|
|
259
|
-
} catch (error: unknown) {
|
|
260
|
-
return { status: 'error', layers: [], error };
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
function toLayerMaterializationDiagnostic(
|
|
265
|
-
template: string,
|
|
266
|
-
execution: Exclude<TemplateLayerMaterialization, { status: 'ok' }>,
|
|
267
|
-
): LayerMaterializationDiagnostic {
|
|
268
|
-
if (execution.status === 'unknown-template') {
|
|
269
|
-
return {
|
|
270
|
-
code: 'unknown-template',
|
|
271
|
-
template,
|
|
272
|
-
message: `Unknown template "${template}"`,
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
if (execution.status === 'invalid-result') {
|
|
276
|
-
return {
|
|
277
|
-
code: 'invalid-template-result',
|
|
278
|
-
template,
|
|
279
|
-
receivedType: execution.receivedType,
|
|
280
|
-
message: `Template "${template}" returned ${execution.receivedType}, not a layer array`,
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
return {
|
|
284
|
-
code: 'template-error',
|
|
285
|
-
template,
|
|
286
|
-
cause: execution.error,
|
|
287
|
-
message: `Template "${template}" failed`,
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
function injectPersistentLayers(
|
|
292
|
-
layers: Layer[],
|
|
293
|
-
block: DocBlock,
|
|
294
|
-
theme: Theme,
|
|
295
|
-
persistentLayers?: PersistentLayerConfig,
|
|
296
|
-
expanded?: ExpandedPersistentLayerSet,
|
|
297
|
-
): Layer[] {
|
|
298
|
-
if (!persistentLayers) return layers;
|
|
299
|
-
const bottomLayers =
|
|
300
|
-
expanded?.bottomLayers ?? expandPersistentLayers(persistentLayers.bottomLayers, theme);
|
|
301
|
-
const topLayers =
|
|
302
|
-
expanded?.topLayers ?? expandPersistentLayers(persistentLayers.topLayers, theme);
|
|
303
|
-
return wrapWithPersistentLayers(layers, block as TemplateBlock, bottomLayers, topLayers);
|
|
304
|
-
}
|
|
@@ -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
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Doc-scoped theme resolution.
|
|
3
|
-
*
|
|
4
|
-
* The theme analog of how `buildRegistry` resolves custom templates: pure and
|
|
5
|
-
* doc-scoped, with no global state. `resolveThemeForDoc` looks up the active
|
|
6
|
-
* theme id in the doc's own custom themes first, then falls back to an
|
|
7
|
-
* optional caller-owned registry, then built-ins via `resolveTheme`.
|
|
8
|
-
*
|
|
9
|
-
* It accepts either a squisq `Doc` (which carries a typed `customThemes`
|
|
10
|
-
* array) or anything with raw `frontmatter` — notably a `MarkdownDocument`,
|
|
11
|
-
* which is the shape every export pipeline pivots through. In the latter case
|
|
12
|
-
* the inline themes are decoded from the `squisq-custom-themes` frontmatter
|
|
13
|
-
* payload. Inline custom themes ship with the doc, exactly like custom
|
|
14
|
-
* templates; host-level themes can be supplied through an explicit registry.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { Theme, ThemeRegistry } from '../schemas/Theme.js';
|
|
18
|
-
import { resolveTheme } from '../schemas/themeLibrary.js';
|
|
19
|
-
import { readFrontmatterThemeId } from '../markdown/utils.js';
|
|
20
|
-
import { readCustomThemesFromFrontmatter } from './customThemesFrontmatter.js';
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* The minimal shape `resolveThemeForDoc` needs. Satisfied by both the squisq
|
|
24
|
-
* `Doc` (typed `customThemes` + `themeId`) and a `MarkdownDocument` (raw
|
|
25
|
-
* `frontmatter` carrying the encoded payload).
|
|
26
|
-
*/
|
|
27
|
-
export interface ThemeResolvable {
|
|
28
|
-
themeId?: string;
|
|
29
|
-
customThemes?: Theme[];
|
|
30
|
-
frontmatter?: Record<string, unknown>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Resolve the Theme a document should render with.
|
|
35
|
-
*
|
|
36
|
-
* @param doc - the document (may carry inline custom themes plus a `themeId`
|
|
37
|
-
* / `squisq-theme` frontmatter selector).
|
|
38
|
-
* @param explicitId - an id that overrides the doc's own selection (e.g. the
|
|
39
|
-
* editor's theme dropdown, or an export `--theme` option). When omitted, the
|
|
40
|
-
* doc's `themeId` / frontmatter theme id is used.
|
|
41
|
-
* @returns the matching inline custom theme (doc-scoped) when present, else
|
|
42
|
-
* the caller-registry or built-in theme for that id, else the default theme.
|
|
43
|
-
*/
|
|
44
|
-
export function resolveThemeForDoc(
|
|
45
|
-
doc: ThemeResolvable | null | undefined,
|
|
46
|
-
explicitId?: string,
|
|
47
|
-
registry?: ThemeRegistry,
|
|
48
|
-
): Theme {
|
|
49
|
-
const id = explicitId ?? doc?.themeId ?? readFrontmatterThemeId(doc?.frontmatter);
|
|
50
|
-
// Prefer the already-parsed list on a squisq Doc; otherwise decode the
|
|
51
|
-
// frontmatter payload (the shape exports see on a MarkdownDocument).
|
|
52
|
-
const inline = doc?.customThemes ?? readCustomThemesFromFrontmatter(doc?.frontmatter);
|
|
53
|
-
const custom = id ? inline?.find((t) => t.id === id) : undefined;
|
|
54
|
-
if (custom) return custom;
|
|
55
|
-
return resolveTheme(id, registry);
|
|
56
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Standalone-paragraph annotation parser.
|
|
3
|
-
*
|
|
4
|
-
* A paragraph whose entire trimmed text is exactly a `{[…]}` annotation
|
|
5
|
-
* (nothing before or after) is a *standalone annotation*. Two features share
|
|
6
|
-
* this shape:
|
|
7
|
-
*
|
|
8
|
-
* - **Media annotations** (`{[audio …]}` / `{[video …]}`) — lifted into typed
|
|
9
|
-
* {@link import('../schemas/Media.js').MediaClip}s by `mediaAnnotations.ts`.
|
|
10
|
-
* - **Standalone template blocks** (`{[quote]}`, `{[statHighlight …]}`, …) —
|
|
11
|
-
* turned into heading-less {@link import('../schemas/Doc.js').Block}s by
|
|
12
|
-
* `annotationBlocks.ts`.
|
|
13
|
-
*
|
|
14
|
-
* Both call the single parser here so the annotation grammar (quoting,
|
|
15
|
-
* escaping, first-token-is-template) stays identical to the heading form.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import {
|
|
19
|
-
matchTrailingTemplateAnnotation,
|
|
20
|
-
tokenizeAttrTokens,
|
|
21
|
-
splitKeyValueToken,
|
|
22
|
-
} from '../markdown/attrTokens.js';
|
|
23
|
-
import type { MarkdownBlockNode } from '../markdown/types.js';
|
|
24
|
-
|
|
25
|
-
/** The template name + params parsed out of a standalone `{[…]}` paragraph. */
|
|
26
|
-
export interface ParsedAnnotation {
|
|
27
|
-
/** First bare token, when the annotation leads with one (e.g. `quote`). */
|
|
28
|
-
template?: string;
|
|
29
|
-
/** Remaining `key=value` tokens, unquoted/unescaped. */
|
|
30
|
-
params: Record<string, string>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Parse a paragraph node that is *exactly* a `{[…]}` annotation (nothing
|
|
35
|
-
* before or after). Returns the template + params, or null when the node
|
|
36
|
-
* isn't a standalone annotation (not a paragraph, more than one child, a
|
|
37
|
-
* non-text child such as a resolved inline icon, or trailing text).
|
|
38
|
-
*/
|
|
39
|
-
export function parseStandaloneAnnotation(node: MarkdownBlockNode): ParsedAnnotation | null {
|
|
40
|
-
if (node.type !== 'paragraph') return null;
|
|
41
|
-
const children = node.children ?? [];
|
|
42
|
-
if (children.length !== 1 || children[0].type !== 'text') return null;
|
|
43
|
-
const text = children[0].value.trim();
|
|
44
|
-
const match = matchTrailingTemplateAnnotation(text);
|
|
45
|
-
// index 0 means the whole (trimmed) paragraph is the annotation.
|
|
46
|
-
if (!match || match.index !== 0) return null;
|
|
47
|
-
|
|
48
|
-
const tokens = tokenizeAttrTokens(match.inner.trim());
|
|
49
|
-
const firstIsParam = tokens.length > 0 && tokens[0].indexOf('=') > 0;
|
|
50
|
-
const template = firstIsParam || tokens.length === 0 ? undefined : tokens[0];
|
|
51
|
-
const startIdx = firstIsParam ? 0 : 1;
|
|
52
|
-
const params: Record<string, string> = {};
|
|
53
|
-
for (let i = startIdx; i < tokens.length; i++) {
|
|
54
|
-
const kv = splitKeyValueToken(tokens[i]);
|
|
55
|
-
if (kv) params[kv.key] = kv.value;
|
|
56
|
-
}
|
|
57
|
-
return { template, params };
|
|
58
|
-
}
|