@bendyline/squisq 1.4.0 → 1.5.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/dist/{Doc-BeSeH2iX.d.ts → Doc-BsMkmzH8.d.ts} +838 -268
- package/dist/{ImageEditDoc-BTIvw0oq.d.ts → ImageEditDoc-DvoeHMP9.d.ts} +11 -4
- package/dist/{chunk-ZTX4PFFT.js → chunk-2OIBZYKP.js} +75 -2
- package/dist/chunk-2OIBZYKP.js.map +1 -0
- package/dist/chunk-2UQOHYE2.js +45 -0
- package/dist/chunk-2UQOHYE2.js.map +1 -0
- package/dist/{chunk-B4EEON3N.js → chunk-4AKUQPEE.js} +536 -103
- package/dist/chunk-4AKUQPEE.js.map +1 -0
- package/dist/chunk-4ZFRZBU2.js +6582 -0
- package/dist/chunk-4ZFRZBU2.js.map +1 -0
- package/dist/{chunk-57CVQCFX.js → chunk-7MQGNR76.js} +79 -3
- package/dist/chunk-7MQGNR76.js.map +1 -0
- package/dist/{chunk-5WFRKURX.js → chunk-DLXZMS5K.js} +4 -2
- package/dist/chunk-DLXZMS5K.js.map +1 -0
- package/dist/{chunk-MYIH7FWD.js → chunk-FBKP5CAO.js} +1 -1
- package/dist/chunk-FBKP5CAO.js.map +1 -0
- package/dist/chunk-KZNXZ5SM.js +333 -0
- package/dist/chunk-KZNXZ5SM.js.map +1 -0
- package/dist/{chunk-WMOI7FN3.js → chunk-LRCV7N7F.js} +12 -2
- package/dist/{chunk-WMOI7FN3.js.map → chunk-LRCV7N7F.js.map} +1 -1
- package/dist/{chunk-3K5OG6KI.js → chunk-OH43RPTP.js} +403 -187
- package/dist/chunk-OH43RPTP.js.map +1 -0
- package/dist/{chunk-H3AXU4MJ.js → chunk-OKJOQXK4.js} +149 -2
- package/dist/chunk-OKJOQXK4.js.map +1 -0
- package/dist/chunk-PGGGKYWG.js +1 -0
- package/dist/chunk-PGGGKYWG.js.map +1 -0
- package/dist/{chunk-7UDSRZKG.js → chunk-Q3ROPT5H.js} +35 -14
- package/dist/chunk-Q3ROPT5H.js.map +1 -0
- package/dist/chunk-QE7TWGVT.js +178 -0
- package/dist/chunk-QE7TWGVT.js.map +1 -0
- package/dist/chunk-RUDYOTA6.js +345 -0
- package/dist/chunk-RUDYOTA6.js.map +1 -0
- package/dist/chunk-TVSGLUID.js +596 -0
- package/dist/chunk-TVSGLUID.js.map +1 -0
- package/dist/chunk-ZLQKNOZQ.js +1 -0
- package/dist/chunk-ZLQKNOZQ.js.map +1 -0
- package/dist/doc/index.d.ts +5 -10
- package/dist/doc/index.js +263 -7
- package/dist/doc/index.js.map +1 -1
- package/dist/generate/index.d.ts +106 -7
- package/dist/generate/index.js +16 -3
- package/dist/generate/index.js.map +1 -1
- package/dist/icons/index.d.ts +62 -10
- package/dist/icons/index.js +29 -9
- package/dist/icons/index.js.map +1 -1
- package/dist/icons/inlineIconMarker.d.ts +1 -0
- package/dist/icons/inlineIconMarker.js +15 -0
- package/dist/icons/inlineIconMarker.js.map +1 -0
- package/dist/imageEdit/index.d.ts +219 -11
- package/dist/imageEdit/index.js +56 -21
- package/dist/imageEdit/index.js.map +1 -1
- package/dist/index.d.ts +24 -13
- package/dist/index.js +680 -12
- package/dist/index.js.map +1 -1
- package/dist/inlineIconMarker-CiE8Hlvz.d.ts +59 -0
- package/dist/jsonForm/index.d.ts +189 -12
- package/dist/jsonForm/index.js +26 -11
- package/dist/jsonForm/index.js.map +1 -1
- package/dist/markdown/index.d.ts +474 -19
- package/dist/markdown/index.js +72 -33
- package/dist/markdown/index.js.map +1 -1
- package/dist/random/index.d.ts +51 -2
- package/dist/random/index.js +9 -1
- package/dist/random/index.js.map +1 -1
- package/dist/recommend/index.d.ts +39 -13
- package/dist/recommend/index.js +10 -14
- package/dist/recommend/index.js.map +1 -1
- package/dist/schemas/index.d.ts +208 -15
- package/dist/schemas/index.js +150 -11
- package/dist/schemas/index.js.map +1 -1
- package/dist/spatial/index.d.ts +116 -3
- package/dist/spatial/index.js +24 -2
- package/dist/spatial/index.js.map +1 -1
- package/dist/storage/index.d.ts +159 -10
- package/dist/storage/index.js +20 -6
- package/dist/storage/index.js.map +1 -1
- package/dist/story/index.d.ts +906 -40
- package/dist/story/index.js +124 -6
- package/dist/{themeLibrary-BHjJ0Qx6.d.ts → themeLibrary-DQQKuRMx.d.ts} +1 -1
- package/dist/timing/index.d.ts +109 -4
- package/dist/timing/index.js +23 -2
- package/dist/timing/index.js.map +1 -1
- package/dist/transform/index.d.ts +213 -6
- package/dist/transform/index.js +26 -3
- package/dist/transform/index.js.map +1 -1
- package/dist/{types-BdZkdJ3z.d.ts → types-DlAZ7MW4.d.ts} +115 -1
- package/dist/versions/index.d.ts +123 -24
- package/dist/versions/index.js +34 -27
- package/dist/versions/index.js.map +1 -1
- package/package.json +6 -1
- package/src/__tests__/animationUtils.test.ts +40 -0
- package/src/__tests__/annotationCoercion.test.ts +243 -0
- package/src/__tests__/applyRenderStyle.test.ts +146 -0
- package/src/__tests__/atmosphereLayers.test.ts +108 -0
- package/src/__tests__/attrTokens.test.ts +162 -0
- package/src/__tests__/customTemplateSample.test.ts +83 -0
- package/src/__tests__/customTemplatesFrontmatter.test.ts +205 -0
- package/src/__tests__/customThemesFrontmatter.test.ts +118 -0
- package/src/__tests__/diagramBlock.test.ts +122 -0
- package/src/__tests__/diagramLayout.test.ts +134 -0
- package/src/__tests__/drawing.test.ts +109 -0
- package/src/__tests__/drawingBlock.test.ts +124 -0
- package/src/__tests__/drawingLayout.test.ts +171 -0
- package/src/__tests__/geohash.test.ts +6 -5
- package/src/__tests__/getLayers.test.ts +6 -2
- package/src/__tests__/getLayersFallback.test.ts +103 -0
- package/src/__tests__/imageEditExportSvg.test.ts +70 -0
- package/src/__tests__/imageEditVersions.test.ts +72 -0
- package/src/__tests__/inlineIconMarker.test.ts +36 -0
- package/src/__tests__/layoutBlock.test.ts +83 -0
- package/src/__tests__/layoutLayout.test.ts +169 -0
- package/src/__tests__/markdown.test.ts +23 -0
- package/src/__tests__/markdownSanitize.test.ts +64 -0
- package/src/__tests__/markdownToDoc.test.ts +223 -2
- package/src/__tests__/mediaAnnotations.test.ts +64 -0
- package/src/__tests__/mediaSchedule.test.ts +118 -0
- package/src/__tests__/pandocAttrParse.test.ts +187 -0
- package/src/__tests__/resolveDocTheme.test.ts +55 -0
- package/src/__tests__/rootExports.test.ts +43 -0
- package/src/__tests__/shapeGeometry.test.ts +89 -0
- package/src/__tests__/shapeVocabulary.test.ts +133 -0
- package/src/__tests__/structuredData.test.ts +179 -0
- package/src/__tests__/templateAnnotationParse.test.ts +108 -0
- package/src/__tests__/templateMetadata.test.ts +21 -0
- package/src/__tests__/templates.test.ts +145 -4
- package/src/__tests__/themeCompile.test.ts +42 -0
- package/src/__tests__/themeValidator.test.ts +6 -0
- package/src/__tests__/transformV2.test.ts +137 -0
- package/src/__tests__/transitionNormalize.test.ts +61 -0
- package/src/__tests__/validateDoc.test.ts +100 -0
- package/src/doc/customTemplatesFrontmatter.ts +308 -0
- package/src/doc/customThemesFrontmatter.ts +90 -0
- package/src/doc/docToMarkdown.ts +73 -4
- package/src/doc/getLayers.ts +40 -17
- package/src/doc/index.ts +35 -1
- package/src/doc/markdownToDoc.ts +333 -12
- package/src/doc/mediaAnnotations.ts +118 -0
- package/src/doc/resolveDocTheme.ts +55 -0
- package/src/doc/structuredData.ts +230 -0
- package/src/doc/templateInputs.ts +240 -0
- package/src/doc/templates/__tests__/customTemplate.test.ts +151 -0
- package/src/doc/templates/__tests__/customTemplateRegistry.test.ts +110 -0
- package/src/doc/templates/accentImage.ts +30 -6
- package/src/doc/templates/captionUtils.ts +23 -0
- package/src/doc/templates/comparisonBar.ts +26 -18
- package/src/doc/templates/coverBlock.ts +7 -4
- package/src/doc/templates/customTemplate.ts +45 -0
- package/src/doc/templates/dataTable.ts +37 -19
- package/src/doc/templates/dateEvent.ts +41 -20
- package/src/doc/templates/definitionCard.ts +26 -18
- package/src/doc/templates/diagramBlock.ts +204 -0
- package/src/doc/templates/diagramLayout.ts +159 -0
- package/src/doc/templates/drawingBlock.ts +325 -0
- package/src/doc/templates/drawingLayout.ts +539 -0
- package/src/doc/templates/factCard.ts +51 -25
- package/src/doc/templates/fallbackBlock.ts +123 -0
- package/src/doc/templates/featureBlock.ts +20 -13
- package/src/doc/templates/fullBleedQuote.ts +18 -8
- package/src/doc/templates/imageWithCaption.ts +22 -9
- package/src/doc/templates/index.ts +215 -46
- package/src/doc/templates/layoutBlock.ts +43 -0
- package/src/doc/templates/layoutLayout.ts +243 -0
- package/src/doc/templates/listBlock.ts +56 -30
- package/src/doc/templates/mapBlock.ts +15 -12
- package/src/doc/templates/metadata.ts +120 -0
- package/src/doc/templates/persistentLayers.ts +129 -11
- package/src/doc/templates/photoGrid.ts +23 -12
- package/src/doc/templates/pullQuote.ts +30 -12
- package/src/doc/templates/quoteBlock.ts +54 -29
- package/src/doc/templates/sectionHeader.ts +25 -11
- package/src/doc/templates/statHighlight.ts +39 -22
- package/src/doc/templates/titleBlock.ts +59 -21
- package/src/doc/templates/tokens/__tests__/resolveTokens.test.ts +221 -0
- package/src/doc/templates/tokens/resolveTokens.ts +0 -0
- package/src/doc/templates/twoColumn.ts +48 -30
- package/src/doc/templates/videoPullQuote.ts +22 -12
- package/src/doc/templates/videoWithCaption.ts +13 -8
- package/src/doc/utils/animationUtils.ts +267 -3
- package/src/doc/utils/applyRenderStyle.ts +113 -0
- package/src/doc/utils/imageTreatment.ts +70 -0
- package/src/doc/utils/shapeGeometry.ts +464 -0
- package/src/doc/utils/themeUtils.ts +75 -1
- package/src/doc/validate.ts +476 -0
- package/src/generate/slideshowGenerator.ts +7 -0
- package/src/icons/index.ts +8 -0
- package/src/icons/inlineIconMarker.ts +73 -0
- package/src/imageEdit/export.ts +85 -2
- package/src/imageEdit/index.ts +1 -0
- package/src/imageEdit/persistence.ts +51 -0
- package/src/index.ts +2 -0
- package/src/markdown/annotationCoercion.ts +295 -0
- package/src/markdown/attrTokens.ts +222 -0
- package/src/markdown/convert.ts +229 -26
- package/src/markdown/index.ts +36 -0
- package/src/markdown/sanitize.ts +298 -0
- package/src/markdown/stringify.ts +84 -3
- package/src/markdown/types.ts +66 -0
- package/src/markdown/utils.ts +49 -1
- package/src/recommend/templates.ts +24 -0
- package/src/schemas/BlockTemplates.ts +133 -4
- package/src/schemas/CustomTemplates.ts +74 -0
- package/src/schemas/Doc.ts +353 -29
- package/src/schemas/ImageEditDoc.ts +11 -4
- package/src/schemas/Media.ts +169 -0
- package/src/schemas/Theme.ts +23 -1
- package/src/schemas/Transitions.ts +224 -0
- package/src/schemas/colorUtils.ts +33 -0
- package/src/schemas/fontStacks.ts +5 -2
- package/src/schemas/index.ts +3 -0
- package/src/schemas/themeCompile.ts +23 -4
- package/src/schemas/themeValidator.ts +49 -11
- package/src/schemas/themes/cinematic.json +69 -12
- package/src/schemas/themes/documentary.json +58 -11
- package/src/schemas/themes/gezellig.json +60 -11
- package/src/schemas/themes/magazine.json +54 -9
- package/src/schemas/themes/morning-light.json +52 -9
- package/src/schemas/themes/standard-dark.json +48 -13
- package/src/schemas/themes/standard.json +44 -12
- package/src/schemas/themes/tech-dark.json +65 -12
- package/src/spatial/Geohash.ts +52 -21
- package/src/transform/applyTransform.ts +43 -4
- package/src/transform/index.ts +1 -0
- package/src/transform/registry.ts +44 -13
- package/src/transform/styles/dataDriven.ts +2 -1
- package/src/transform/styles/documentary.ts +2 -1
- package/src/transform/styles/magazine.ts +3 -1
- package/src/transform/styles/minimal.ts +2 -1
- package/src/transform/styles/narrative.ts +3 -1
- package/src/transform/templateSelector.ts +87 -11
- package/src/transform/types.ts +35 -2
- package/dist/__tests__/animationUtils.test.d.ts +0 -2
- package/dist/__tests__/animationUtils.test.d.ts.map +0 -1
- package/dist/__tests__/animationUtils.test.js +0 -60
- package/dist/__tests__/animationUtils.test.js.map +0 -1
- package/dist/__tests__/colorUtils.test.d.ts +0 -2
- package/dist/__tests__/colorUtils.test.d.ts.map +0 -1
- package/dist/__tests__/colorUtils.test.js +0 -94
- package/dist/__tests__/colorUtils.test.js.map +0 -1
- package/dist/__tests__/contentContainer.test.d.ts +0 -2
- package/dist/__tests__/contentContainer.test.d.ts.map +0 -1
- package/dist/__tests__/contentContainer.test.js +0 -234
- package/dist/__tests__/contentContainer.test.js.map +0 -1
- package/dist/__tests__/contentExtractor.test.d.ts +0 -2
- package/dist/__tests__/contentExtractor.test.d.ts.map +0 -1
- package/dist/__tests__/contentExtractor.test.js +0 -151
- package/dist/__tests__/contentExtractor.test.js.map +0 -1
- package/dist/__tests__/coverBlock.test.d.ts +0 -2
- package/dist/__tests__/coverBlock.test.d.ts.map +0 -1
- package/dist/__tests__/coverBlock.test.js +0 -197
- package/dist/__tests__/coverBlock.test.js.map +0 -1
- package/dist/__tests__/dataTable.test.d.ts +0 -2
- package/dist/__tests__/dataTable.test.d.ts.map +0 -1
- package/dist/__tests__/dataTable.test.js +0 -110
- package/dist/__tests__/dataTable.test.js.map +0 -1
- package/dist/__tests__/geohash.test.d.ts +0 -2
- package/dist/__tests__/geohash.test.d.ts.map +0 -1
- package/dist/__tests__/geohash.test.js +0 -87
- package/dist/__tests__/geohash.test.js.map +0 -1
- package/dist/__tests__/getLayers.test.d.ts +0 -2
- package/dist/__tests__/getLayers.test.d.ts.map +0 -1
- package/dist/__tests__/getLayers.test.js +0 -191
- package/dist/__tests__/getLayers.test.js.map +0 -1
- package/dist/__tests__/haversine.test.d.ts +0 -2
- package/dist/__tests__/haversine.test.d.ts.map +0 -1
- package/dist/__tests__/haversine.test.js +0 -56
- package/dist/__tests__/haversine.test.js.map +0 -1
- package/dist/__tests__/iconResolve.test.d.ts +0 -2
- package/dist/__tests__/iconResolve.test.d.ts.map +0 -1
- package/dist/__tests__/iconResolve.test.js +0 -99
- package/dist/__tests__/iconResolve.test.js.map +0 -1
- package/dist/__tests__/imageEditState.test.d.ts +0 -2
- package/dist/__tests__/imageEditState.test.d.ts.map +0 -1
- package/dist/__tests__/imageEditState.test.js +0 -61
- package/dist/__tests__/imageEditState.test.js.map +0 -1
- package/dist/__tests__/imageEditVersions.test.d.ts +0 -2
- package/dist/__tests__/imageEditVersions.test.d.ts.map +0 -1
- package/dist/__tests__/imageEditVersions.test.js +0 -141
- package/dist/__tests__/imageEditVersions.test.js.map +0 -1
- package/dist/__tests__/inferDocumentTitle.test.d.ts +0 -2
- package/dist/__tests__/inferDocumentTitle.test.d.ts.map +0 -1
- package/dist/__tests__/inferDocumentTitle.test.js +0 -42
- package/dist/__tests__/inferDocumentTitle.test.js.map +0 -1
- package/dist/__tests__/jsonForm.chooseControl.test.d.ts +0 -2
- package/dist/__tests__/jsonForm.chooseControl.test.d.ts.map +0 -1
- package/dist/__tests__/jsonForm.chooseControl.test.js +0 -74
- package/dist/__tests__/jsonForm.chooseControl.test.js.map +0 -1
- package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts +0 -2
- package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts.map +0 -1
- package/dist/__tests__/jsonForm.evaluateWhen.test.js +0 -51
- package/dist/__tests__/jsonForm.evaluateWhen.test.js.map +0 -1
- package/dist/__tests__/jsonForm.inferSchema.test.d.ts +0 -2
- package/dist/__tests__/jsonForm.inferSchema.test.d.ts.map +0 -1
- package/dist/__tests__/jsonForm.inferSchema.test.js +0 -23
- package/dist/__tests__/jsonForm.inferSchema.test.js.map +0 -1
- package/dist/__tests__/jsonForm.pointer.test.d.ts +0 -2
- package/dist/__tests__/jsonForm.pointer.test.d.ts.map +0 -1
- package/dist/__tests__/jsonForm.pointer.test.js +0 -94
- package/dist/__tests__/jsonForm.pointer.test.js.map +0 -1
- package/dist/__tests__/localForageAdapter.test.d.ts +0 -8
- package/dist/__tests__/localForageAdapter.test.d.ts.map +0 -1
- package/dist/__tests__/localForageAdapter.test.js +0 -130
- package/dist/__tests__/localForageAdapter.test.js.map +0 -1
- package/dist/__tests__/markdown.test.d.ts +0 -2
- package/dist/__tests__/markdown.test.d.ts.map +0 -1
- package/dist/__tests__/markdown.test.js +0 -715
- package/dist/__tests__/markdown.test.js.map +0 -1
- package/dist/__tests__/markdownIcons.test.d.ts +0 -2
- package/dist/__tests__/markdownIcons.test.d.ts.map +0 -1
- package/dist/__tests__/markdownIcons.test.js +0 -93
- package/dist/__tests__/markdownIcons.test.js.map +0 -1
- package/dist/__tests__/markdownToDoc.test.d.ts +0 -2
- package/dist/__tests__/markdownToDoc.test.d.ts.map +0 -1
- package/dist/__tests__/markdownToDoc.test.js +0 -458
- package/dist/__tests__/markdownToDoc.test.js.map +0 -1
- package/dist/__tests__/recommendTemplates.test.d.ts +0 -2
- package/dist/__tests__/recommendTemplates.test.d.ts.map +0 -1
- package/dist/__tests__/recommendTemplates.test.js +0 -158
- package/dist/__tests__/recommendTemplates.test.js.map +0 -1
- package/dist/__tests__/scopedContentContainer.test.d.ts +0 -2
- package/dist/__tests__/scopedContentContainer.test.d.ts.map +0 -1
- package/dist/__tests__/scopedContentContainer.test.js +0 -74
- package/dist/__tests__/scopedContentContainer.test.js.map +0 -1
- package/dist/__tests__/seededRandom.test.d.ts +0 -2
- package/dist/__tests__/seededRandom.test.d.ts.map +0 -1
- package/dist/__tests__/seededRandom.test.js +0 -125
- package/dist/__tests__/seededRandom.test.js.map +0 -1
- package/dist/__tests__/slideshowGenerator.test.d.ts +0 -2
- package/dist/__tests__/slideshowGenerator.test.d.ts.map +0 -1
- package/dist/__tests__/slideshowGenerator.test.js +0 -114
- package/dist/__tests__/slideshowGenerator.test.js.map +0 -1
- package/dist/__tests__/storage.test.d.ts +0 -2
- package/dist/__tests__/storage.test.d.ts.map +0 -1
- package/dist/__tests__/storage.test.js +0 -51
- package/dist/__tests__/storage.test.js.map +0 -1
- package/dist/__tests__/surface.test.d.ts +0 -2
- package/dist/__tests__/surface.test.d.ts.map +0 -1
- package/dist/__tests__/surface.test.js +0 -57
- package/dist/__tests__/surface.test.js.map +0 -1
- package/dist/__tests__/templateAnnotationParse.test.d.ts +0 -2
- package/dist/__tests__/templateAnnotationParse.test.d.ts.map +0 -1
- package/dist/__tests__/templateAnnotationParse.test.js +0 -42
- package/dist/__tests__/templateAnnotationParse.test.js.map +0 -1
- package/dist/__tests__/templates.test.d.ts +0 -2
- package/dist/__tests__/templates.test.d.ts.map +0 -1
- package/dist/__tests__/templates.test.js +0 -298
- package/dist/__tests__/templates.test.js.map +0 -1
- package/dist/__tests__/themeCompile.test.d.ts +0 -2
- package/dist/__tests__/themeCompile.test.d.ts.map +0 -1
- package/dist/__tests__/themeCompile.test.js +0 -134
- package/dist/__tests__/themeCompile.test.js.map +0 -1
- package/dist/__tests__/themeValidator.test.d.ts +0 -2
- package/dist/__tests__/themeValidator.test.d.ts.map +0 -1
- package/dist/__tests__/themeValidator.test.js +0 -107
- package/dist/__tests__/themeValidator.test.js.map +0 -1
- package/dist/__tests__/timing.test.d.ts +0 -2
- package/dist/__tests__/timing.test.d.ts.map +0 -1
- package/dist/__tests__/timing.test.js +0 -131
- package/dist/__tests__/timing.test.js.map +0 -1
- package/dist/__tests__/versions.test.d.ts +0 -2
- package/dist/__tests__/versions.test.d.ts.map +0 -1
- package/dist/__tests__/versions.test.js +0 -339
- package/dist/__tests__/versions.test.js.map +0 -1
- package/dist/chunk-3K5OG6KI.js.map +0 -1
- package/dist/chunk-57CVQCFX.js.map +0 -1
- package/dist/chunk-5WFRKURX.js.map +0 -1
- package/dist/chunk-7UDSRZKG.js.map +0 -1
- package/dist/chunk-B4EEON3N.js.map +0 -1
- package/dist/chunk-H3AXU4MJ.js.map +0 -1
- package/dist/chunk-KSWJR66U.js +0 -3706
- package/dist/chunk-KSWJR66U.js.map +0 -1
- package/dist/chunk-MYIH7FWD.js.map +0 -1
- package/dist/chunk-ZTX4PFFT.js.map +0 -1
- package/dist/doc/audioMapping.d.ts +0 -36
- package/dist/doc/audioMapping.d.ts.map +0 -1
- package/dist/doc/audioMapping.js +0 -350
- package/dist/doc/audioMapping.js.map +0 -1
- package/dist/doc/docToMarkdown.d.ts +0 -41
- package/dist/doc/docToMarkdown.d.ts.map +0 -1
- package/dist/doc/docToMarkdown.js +0 -88
- package/dist/doc/docToMarkdown.js.map +0 -1
- package/dist/doc/getLayers.d.ts +0 -65
- package/dist/doc/getLayers.d.ts.map +0 -1
- package/dist/doc/getLayers.js +0 -114
- package/dist/doc/getLayers.js.map +0 -1
- package/dist/doc/index.d.ts.map +0 -1
- package/dist/doc/markdownToDoc.d.ts +0 -75
- package/dist/doc/markdownToDoc.d.ts.map +0 -1
- package/dist/doc/markdownToDoc.js +0 -432
- package/dist/doc/markdownToDoc.js.map +0 -1
- package/dist/doc/templates/accentImage.d.ts +0 -59
- package/dist/doc/templates/accentImage.d.ts.map +0 -1
- package/dist/doc/templates/accentImage.js +0 -275
- package/dist/doc/templates/accentImage.js.map +0 -1
- package/dist/doc/templates/captionUtils.d.ts +0 -20
- package/dist/doc/templates/captionUtils.d.ts.map +0 -1
- package/dist/doc/templates/captionUtils.js +0 -29
- package/dist/doc/templates/captionUtils.js.map +0 -1
- package/dist/doc/templates/comparisonBar.d.ts +0 -13
- package/dist/doc/templates/comparisonBar.d.ts.map +0 -1
- package/dist/doc/templates/comparisonBar.js +0 -145
- package/dist/doc/templates/comparisonBar.js.map +0 -1
- package/dist/doc/templates/coverBlock.d.ts +0 -51
- package/dist/doc/templates/coverBlock.d.ts.map +0 -1
- package/dist/doc/templates/coverBlock.js +0 -153
- package/dist/doc/templates/coverBlock.js.map +0 -1
- package/dist/doc/templates/dataTable.d.ts +0 -14
- package/dist/doc/templates/dataTable.d.ts.map +0 -1
- package/dist/doc/templates/dataTable.js +0 -73
- package/dist/doc/templates/dataTable.js.map +0 -1
- package/dist/doc/templates/dateEvent.d.ts +0 -15
- package/dist/doc/templates/dateEvent.d.ts.map +0 -1
- package/dist/doc/templates/dateEvent.js +0 -114
- package/dist/doc/templates/dateEvent.js.map +0 -1
- package/dist/doc/templates/definitionCard.d.ts +0 -13
- package/dist/doc/templates/definitionCard.d.ts.map +0 -1
- package/dist/doc/templates/definitionCard.js +0 -117
- package/dist/doc/templates/definitionCard.js.map +0 -1
- package/dist/doc/templates/factCard.d.ts +0 -15
- package/dist/doc/templates/factCard.d.ts.map +0 -1
- package/dist/doc/templates/factCard.js +0 -104
- package/dist/doc/templates/factCard.js.map +0 -1
- package/dist/doc/templates/featureBlock.d.ts +0 -18
- package/dist/doc/templates/featureBlock.d.ts.map +0 -1
- package/dist/doc/templates/featureBlock.js +0 -180
- package/dist/doc/templates/featureBlock.js.map +0 -1
- package/dist/doc/templates/fullBleedQuote.d.ts +0 -25
- package/dist/doc/templates/fullBleedQuote.d.ts.map +0 -1
- package/dist/doc/templates/fullBleedQuote.js +0 -67
- package/dist/doc/templates/fullBleedQuote.js.map +0 -1
- package/dist/doc/templates/imageWithCaption.d.ts +0 -13
- package/dist/doc/templates/imageWithCaption.d.ts.map +0 -1
- package/dist/doc/templates/imageWithCaption.js +0 -146
- package/dist/doc/templates/imageWithCaption.js.map +0 -1
- package/dist/doc/templates/index.d.ts +0 -129
- package/dist/doc/templates/index.d.ts.map +0 -1
- package/dist/doc/templates/index.js +0 -478
- package/dist/doc/templates/index.js.map +0 -1
- package/dist/doc/templates/listBlock.d.ts +0 -13
- package/dist/doc/templates/listBlock.d.ts.map +0 -1
- package/dist/doc/templates/listBlock.js +0 -109
- package/dist/doc/templates/listBlock.js.map +0 -1
- package/dist/doc/templates/mapBlock.d.ts +0 -17
- package/dist/doc/templates/mapBlock.d.ts.map +0 -1
- package/dist/doc/templates/mapBlock.js +0 -115
- package/dist/doc/templates/mapBlock.js.map +0 -1
- package/dist/doc/templates/persistentLayers.d.ts +0 -39
- package/dist/doc/templates/persistentLayers.d.ts.map +0 -1
- package/dist/doc/templates/persistentLayers.js +0 -447
- package/dist/doc/templates/persistentLayers.js.map +0 -1
- package/dist/doc/templates/photoGrid.d.ts +0 -20
- package/dist/doc/templates/photoGrid.d.ts.map +0 -1
- package/dist/doc/templates/photoGrid.js +0 -175
- package/dist/doc/templates/photoGrid.js.map +0 -1
- package/dist/doc/templates/pullQuote.d.ts +0 -13
- package/dist/doc/templates/pullQuote.d.ts.map +0 -1
- package/dist/doc/templates/pullQuote.js +0 -113
- package/dist/doc/templates/pullQuote.js.map +0 -1
- package/dist/doc/templates/quoteBlock.d.ts +0 -15
- package/dist/doc/templates/quoteBlock.d.ts.map +0 -1
- package/dist/doc/templates/quoteBlock.js +0 -101
- package/dist/doc/templates/quoteBlock.js.map +0 -1
- package/dist/doc/templates/sectionHeader.d.ts +0 -14
- package/dist/doc/templates/sectionHeader.d.ts.map +0 -1
- package/dist/doc/templates/sectionHeader.js +0 -97
- package/dist/doc/templates/sectionHeader.js.map +0 -1
- package/dist/doc/templates/statHighlight.d.ts +0 -27
- package/dist/doc/templates/statHighlight.d.ts.map +0 -1
- package/dist/doc/templates/statHighlight.js +0 -114
- package/dist/doc/templates/statHighlight.js.map +0 -1
- package/dist/doc/templates/titleBlock.d.ts +0 -24
- package/dist/doc/templates/titleBlock.d.ts.map +0 -1
- package/dist/doc/templates/titleBlock.js +0 -103
- package/dist/doc/templates/titleBlock.js.map +0 -1
- package/dist/doc/templates/twoColumn.d.ts +0 -15
- package/dist/doc/templates/twoColumn.d.ts.map +0 -1
- package/dist/doc/templates/twoColumn.js +0 -225
- package/dist/doc/templates/twoColumn.js.map +0 -1
- package/dist/doc/templates/videoPullQuote.d.ts +0 -20
- package/dist/doc/templates/videoPullQuote.d.ts.map +0 -1
- package/dist/doc/templates/videoPullQuote.js +0 -122
- package/dist/doc/templates/videoPullQuote.js.map +0 -1
- package/dist/doc/templates/videoWithCaption.d.ts +0 -20
- package/dist/doc/templates/videoWithCaption.d.ts.map +0 -1
- package/dist/doc/templates/videoWithCaption.js +0 -107
- package/dist/doc/templates/videoWithCaption.js.map +0 -1
- package/dist/doc/utils/animationUtils.d.ts +0 -34
- package/dist/doc/utils/animationUtils.d.ts.map +0 -1
- package/dist/doc/utils/animationUtils.js +0 -110
- package/dist/doc/utils/animationUtils.js.map +0 -1
- package/dist/doc/utils/themeUtils.d.ts +0 -64
- package/dist/doc/utils/themeUtils.d.ts.map +0 -1
- package/dist/doc/utils/themeUtils.js +0 -136
- package/dist/doc/utils/themeUtils.js.map +0 -1
- package/dist/generate/contentExtractor.d.ts +0 -112
- package/dist/generate/contentExtractor.d.ts.map +0 -1
- package/dist/generate/contentExtractor.js +0 -638
- package/dist/generate/contentExtractor.js.map +0 -1
- package/dist/generate/index.d.ts.map +0 -1
- package/dist/generate/slideshowGenerator.d.ts +0 -72
- package/dist/generate/slideshowGenerator.d.ts.map +0 -1
- package/dist/generate/slideshowGenerator.js +0 -159
- package/dist/generate/slideshowGenerator.js.map +0 -1
- package/dist/generate/templateMapper.d.ts +0 -23
- package/dist/generate/templateMapper.d.ts.map +0 -1
- package/dist/generate/templateMapper.js +0 -114
- package/dist/generate/templateMapper.js.map +0 -1
- package/dist/icons/iconData.d.ts +0 -26
- package/dist/icons/iconData.d.ts.map +0 -1
- package/dist/icons/iconData.js +0 -12
- package/dist/icons/iconData.js.map +0 -1
- package/dist/icons/index.d.ts.map +0 -1
- package/dist/icons/resolve.d.ts +0 -61
- package/dist/icons/resolve.d.ts.map +0 -1
- package/dist/icons/resolve.js +0 -130
- package/dist/icons/resolve.js.map +0 -1
- package/dist/imageEdit/ImageEditVersionManager.d.ts +0 -31
- package/dist/imageEdit/ImageEditVersionManager.d.ts.map +0 -1
- package/dist/imageEdit/ImageEditVersionManager.js +0 -39
- package/dist/imageEdit/ImageEditVersionManager.js.map +0 -1
- package/dist/imageEdit/export.d.ts +0 -33
- package/dist/imageEdit/export.d.ts.map +0 -1
- package/dist/imageEdit/export.js +0 -253
- package/dist/imageEdit/export.js.map +0 -1
- package/dist/imageEdit/index.d.ts.map +0 -1
- package/dist/imageEdit/persistence.d.ts +0 -15
- package/dist/imageEdit/persistence.d.ts.map +0 -1
- package/dist/imageEdit/persistence.js +0 -49
- package/dist/imageEdit/persistence.js.map +0 -1
- package/dist/imageEdit/state.d.ts +0 -42
- package/dist/imageEdit/state.d.ts.map +0 -1
- package/dist/imageEdit/state.js +0 -98
- package/dist/imageEdit/state.js.map +0 -1
- package/dist/imageEdit/versionPaths.d.ts +0 -27
- package/dist/imageEdit/versionPaths.d.ts.map +0 -1
- package/dist/imageEdit/versionPaths.js +0 -57
- package/dist/imageEdit/versionPaths.js.map +0 -1
- package/dist/imageEdit/versions.d.ts +0 -67
- package/dist/imageEdit/versions.d.ts.map +0 -1
- package/dist/imageEdit/versions.js +0 -161
- package/dist/imageEdit/versions.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/jsonForm/chooseControl.d.ts +0 -20
- package/dist/jsonForm/chooseControl.d.ts.map +0 -1
- package/dist/jsonForm/chooseControl.js +0 -82
- package/dist/jsonForm/chooseControl.js.map +0 -1
- package/dist/jsonForm/evaluateWhen.d.ts +0 -12
- package/dist/jsonForm/evaluateWhen.d.ts.map +0 -1
- package/dist/jsonForm/evaluateWhen.js +0 -65
- package/dist/jsonForm/evaluateWhen.js.map +0 -1
- package/dist/jsonForm/index.d.ts.map +0 -1
- package/dist/jsonForm/inferSchema.d.ts +0 -12
- package/dist/jsonForm/inferSchema.d.ts.map +0 -1
- package/dist/jsonForm/inferSchema.js +0 -15
- package/dist/jsonForm/inferSchema.js.map +0 -1
- package/dist/jsonForm/pointer.d.ts +0 -26
- package/dist/jsonForm/pointer.d.ts.map +0 -1
- package/dist/jsonForm/pointer.js +0 -102
- package/dist/jsonForm/pointer.js.map +0 -1
- package/dist/jsonForm/types.d.ts +0 -120
- package/dist/jsonForm/types.d.ts.map +0 -1
- package/dist/jsonForm/types.js +0 -10
- package/dist/jsonForm/types.js.map +0 -1
- package/dist/markdown/convert.d.ts +0 -81
- package/dist/markdown/convert.d.ts.map +0 -1
- package/dist/markdown/convert.js +0 -975
- package/dist/markdown/convert.js.map +0 -1
- package/dist/markdown/htmlParse.d.ts +0 -26
- package/dist/markdown/htmlParse.d.ts.map +0 -1
- package/dist/markdown/htmlParse.js +0 -195
- package/dist/markdown/htmlParse.js.map +0 -1
- package/dist/markdown/index.d.ts.map +0 -1
- package/dist/markdown/parse.d.ts +0 -27
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js +0 -90
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/stringify.d.ts +0 -32
- package/dist/markdown/stringify.d.ts.map +0 -1
- package/dist/markdown/stringify.js +0 -108
- package/dist/markdown/stringify.js.map +0 -1
- package/dist/markdown/types.d.ts +0 -531
- package/dist/markdown/types.d.ts.map +0 -1
- package/dist/markdown/types.js +0 -17
- package/dist/markdown/types.js.map +0 -1
- package/dist/markdown/utils.d.ts +0 -118
- package/dist/markdown/utils.d.ts.map +0 -1
- package/dist/markdown/utils.js +0 -308
- package/dist/markdown/utils.js.map +0 -1
- package/dist/random/SeededRandom.d.ts +0 -50
- package/dist/random/SeededRandom.d.ts.map +0 -1
- package/dist/random/SeededRandom.js +0 -115
- package/dist/random/SeededRandom.js.map +0 -1
- package/dist/random/index.d.ts.map +0 -1
- package/dist/recommend/index.d.ts.map +0 -1
- package/dist/recommend/templates.d.ts +0 -39
- package/dist/recommend/templates.d.ts.map +0 -1
- package/dist/recommend/templates.js +0 -235
- package/dist/recommend/templates.js.map +0 -1
- package/dist/schemas/BlockTemplates.d.ts +0 -638
- package/dist/schemas/BlockTemplates.d.ts.map +0 -1
- package/dist/schemas/BlockTemplates.js +0 -72
- package/dist/schemas/BlockTemplates.js.map +0 -1
- package/dist/schemas/Doc.d.ts +0 -503
- package/dist/schemas/Doc.d.ts.map +0 -1
- package/dist/schemas/Doc.js +0 -90
- package/dist/schemas/Doc.js.map +0 -1
- package/dist/schemas/ImageEditDoc.d.ts +0 -81
- package/dist/schemas/ImageEditDoc.d.ts.map +0 -1
- package/dist/schemas/ImageEditDoc.js +0 -20
- package/dist/schemas/ImageEditDoc.js.map +0 -1
- package/dist/schemas/LayoutStrategy.d.ts +0 -84
- package/dist/schemas/LayoutStrategy.d.ts.map +0 -1
- package/dist/schemas/LayoutStrategy.js +0 -123
- package/dist/schemas/LayoutStrategy.js.map +0 -1
- package/dist/schemas/MediaProvider.d.ts +0 -65
- package/dist/schemas/MediaProvider.d.ts.map +0 -1
- package/dist/schemas/MediaProvider.js +0 -13
- package/dist/schemas/MediaProvider.js.map +0 -1
- package/dist/schemas/Theme.d.ts +0 -233
- package/dist/schemas/Theme.d.ts.map +0 -1
- package/dist/schemas/Theme.js +0 -129
- package/dist/schemas/Theme.js.map +0 -1
- package/dist/schemas/Types.d.ts +0 -14
- package/dist/schemas/Types.d.ts.map +0 -1
- package/dist/schemas/Types.js +0 -5
- package/dist/schemas/Types.js.map +0 -1
- package/dist/schemas/Viewport.d.ts +0 -74
- package/dist/schemas/Viewport.d.ts.map +0 -1
- package/dist/schemas/Viewport.js +0 -63
- package/dist/schemas/Viewport.js.map +0 -1
- package/dist/schemas/colorUtils.d.ts +0 -51
- package/dist/schemas/colorUtils.d.ts.map +0 -1
- package/dist/schemas/colorUtils.js +0 -154
- package/dist/schemas/colorUtils.js.map +0 -1
- package/dist/schemas/fontStacks.d.ts +0 -57
- package/dist/schemas/fontStacks.d.ts.map +0 -1
- package/dist/schemas/fontStacks.js +0 -227
- package/dist/schemas/fontStacks.js.map +0 -1
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/themeCompile.d.ts +0 -45
- package/dist/schemas/themeCompile.d.ts.map +0 -1
- package/dist/schemas/themeCompile.js +0 -160
- package/dist/schemas/themeCompile.js.map +0 -1
- package/dist/schemas/themeLibrary.d.ts +0 -37
- package/dist/schemas/themeLibrary.d.ts.map +0 -1
- package/dist/schemas/themeLibrary.js +0 -49
- package/dist/schemas/themeLibrary.js.map +0 -1
- package/dist/schemas/themeValidator.d.ts +0 -26
- package/dist/schemas/themeValidator.d.ts.map +0 -1
- package/dist/schemas/themeValidator.js +0 -352
- package/dist/schemas/themeValidator.js.map +0 -1
- package/dist/schemas/themes/bold.json +0 -48
- package/dist/schemas/themes/cinematic.json +0 -54
- package/dist/schemas/themes/documentary.json +0 -49
- package/dist/schemas/themes/gezellig.json +0 -44
- package/dist/schemas/themes/index.d.ts +0 -26
- package/dist/schemas/themes/index.d.ts.map +0 -1
- package/dist/schemas/themes/index.js +0 -49
- package/dist/schemas/themes/index.js.map +0 -1
- package/dist/schemas/themes/magazine.json +0 -44
- package/dist/schemas/themes/minimalist.json +0 -45
- package/dist/schemas/themes/morning-light.json +0 -42
- package/dist/schemas/themes/standard-dark.json +0 -50
- package/dist/schemas/themes/standard.json +0 -42
- package/dist/schemas/themes/tech-dark.json +0 -48
- package/dist/schemas/themes/warm-earth.json +0 -50
- package/dist/spatial/Geohash.d.ts +0 -85
- package/dist/spatial/Geohash.d.ts.map +0 -1
- package/dist/spatial/Geohash.js +0 -142
- package/dist/spatial/Geohash.js.map +0 -1
- package/dist/spatial/Haversine.d.ts +0 -24
- package/dist/spatial/Haversine.d.ts.map +0 -1
- package/dist/spatial/Haversine.js +0 -48
- package/dist/spatial/Haversine.js.map +0 -1
- package/dist/spatial/index.d.ts.map +0 -1
- package/dist/storage/ContentContainer.d.ts +0 -87
- package/dist/storage/ContentContainer.d.ts.map +0 -1
- package/dist/storage/ContentContainer.js +0 -131
- package/dist/storage/ContentContainer.js.map +0 -1
- package/dist/storage/LocalForageAdapter.d.ts +0 -36
- package/dist/storage/LocalForageAdapter.d.ts.map +0 -1
- package/dist/storage/LocalForageAdapter.js +0 -82
- package/dist/storage/LocalForageAdapter.js.map +0 -1
- package/dist/storage/LocalStorageAdapter.d.ts +0 -16
- package/dist/storage/LocalStorageAdapter.d.ts.map +0 -1
- package/dist/storage/LocalStorageAdapter.js +0 -50
- package/dist/storage/LocalStorageAdapter.js.map +0 -1
- package/dist/storage/MediaProviderFromContainer.d.ts +0 -21
- package/dist/storage/MediaProviderFromContainer.d.ts.map +0 -1
- package/dist/storage/MediaProviderFromContainer.js +0 -79
- package/dist/storage/MediaProviderFromContainer.js.map +0 -1
- package/dist/storage/MemoryStorageAdapter.d.ts +0 -15
- package/dist/storage/MemoryStorageAdapter.d.ts.map +0 -1
- package/dist/storage/MemoryStorageAdapter.js +0 -34
- package/dist/storage/MemoryStorageAdapter.js.map +0 -1
- package/dist/storage/ScopedContentContainer.d.ts +0 -44
- package/dist/storage/ScopedContentContainer.d.ts.map +0 -1
- package/dist/storage/ScopedContentContainer.js +0 -94
- package/dist/storage/ScopedContentContainer.js.map +0 -1
- package/dist/storage/Storage.d.ts +0 -23
- package/dist/storage/Storage.d.ts.map +0 -1
- package/dist/storage/Storage.js +0 -9
- package/dist/storage/Storage.js.map +0 -1
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/timing/index.d.ts.map +0 -1
- package/dist/timing/narrationTiming.d.ts +0 -54
- package/dist/timing/narrationTiming.d.ts.map +0 -1
- package/dist/timing/narrationTiming.js +0 -190
- package/dist/timing/narrationTiming.js.map +0 -1
- package/dist/timing/readingTime.d.ts +0 -54
- package/dist/timing/readingTime.d.ts.map +0 -1
- package/dist/timing/readingTime.js +0 -49
- package/dist/timing/readingTime.js.map +0 -1
- package/dist/transform/applyTransform.d.ts +0 -22
- package/dist/transform/applyTransform.d.ts.map +0 -1
- package/dist/transform/applyTransform.js +0 -68
- package/dist/transform/applyTransform.js.map +0 -1
- package/dist/transform/blockAnalyzer.d.ts +0 -48
- package/dist/transform/blockAnalyzer.d.ts.map +0 -1
- package/dist/transform/blockAnalyzer.js +0 -135
- package/dist/transform/blockAnalyzer.js.map +0 -1
- package/dist/transform/index.d.ts.map +0 -1
- package/dist/transform/registry.d.ts +0 -19
- package/dist/transform/registry.d.ts.map +0 -1
- package/dist/transform/registry.js +0 -41
- package/dist/transform/registry.js.map +0 -1
- package/dist/transform/styles/dataDriven.d.ts +0 -4
- package/dist/transform/styles/dataDriven.d.ts.map +0 -1
- package/dist/transform/styles/dataDriven.js +0 -15
- package/dist/transform/styles/dataDriven.js.map +0 -1
- package/dist/transform/styles/documentary.d.ts +0 -4
- package/dist/transform/styles/documentary.d.ts.map +0 -1
- package/dist/transform/styles/documentary.js +0 -15
- package/dist/transform/styles/documentary.js.map +0 -1
- package/dist/transform/styles/index.d.ts +0 -6
- package/dist/transform/styles/index.d.ts.map +0 -1
- package/dist/transform/styles/index.js +0 -6
- package/dist/transform/styles/index.js.map +0 -1
- package/dist/transform/styles/magazine.d.ts +0 -4
- package/dist/transform/styles/magazine.d.ts.map +0 -1
- package/dist/transform/styles/magazine.js +0 -15
- package/dist/transform/styles/magazine.js.map +0 -1
- package/dist/transform/styles/minimal.d.ts +0 -4
- package/dist/transform/styles/minimal.d.ts.map +0 -1
- package/dist/transform/styles/minimal.js +0 -15
- package/dist/transform/styles/minimal.js.map +0 -1
- package/dist/transform/styles/narrative.d.ts +0 -4
- package/dist/transform/styles/narrative.d.ts.map +0 -1
- package/dist/transform/styles/narrative.js +0 -15
- package/dist/transform/styles/narrative.js.map +0 -1
- package/dist/transform/templateSelector.d.ts +0 -30
- package/dist/transform/templateSelector.d.ts.map +0 -1
- package/dist/transform/templateSelector.js +0 -218
- package/dist/transform/templateSelector.js.map +0 -1
- package/dist/transform/timingAllocator.d.ts +0 -21
- package/dist/transform/timingAllocator.d.ts.map +0 -1
- package/dist/transform/timingAllocator.js +0 -111
- package/dist/transform/timingAllocator.js.map +0 -1
- package/dist/transform/types.d.ts +0 -86
- package/dist/transform/types.d.ts.map +0 -1
- package/dist/transform/types.js +0 -9
- package/dist/transform/types.js.map +0 -1
- package/dist/versions/DocumentVersionManager.d.ts +0 -31
- package/dist/versions/DocumentVersionManager.d.ts.map +0 -1
- package/dist/versions/DocumentVersionManager.js +0 -33
- package/dist/versions/DocumentVersionManager.js.map +0 -1
- package/dist/versions/index.d.ts.map +0 -1
- package/dist/versions/operations.d.ts +0 -44
- package/dist/versions/operations.d.ts.map +0 -1
- package/dist/versions/operations.js +0 -190
- package/dist/versions/operations.js.map +0 -1
- package/dist/versions/paths.d.ts +0 -29
- package/dist/versions/paths.d.ts.map +0 -1
- package/dist/versions/paths.js +0 -66
- package/dist/versions/paths.js.map +0 -1
- package/dist/versions/timestamp.d.ts +0 -22
- package/dist/versions/timestamp.d.ts.map +0 -1
- package/dist/versions/timestamp.js +0 -44
- package/dist/versions/timestamp.js.map +0 -1
- package/dist/versions/types.d.ts +0 -92
- package/dist/versions/types.d.ts.map +0 -1
- package/dist/versions/types.js +0 -11
- package/dist/versions/types.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generate/slideshowGenerator.ts"],"sourcesContent":["/**\n * Slideshow Generator\n *\n * Turns plain text + optional images into a complete squisq `Doc`.\n *\n * Pipeline:\n * 1. Strip markdown (if needed)\n * 2. Extract compelling content (stats, dates, quotes, …)\n * 3. Estimate narration timing\n * 4. Map extractions → template blocks\n * 5. Interleave image slides\n * 6. Return a ready-to-render `Doc`\n */\n\nimport type { Doc } from '../schemas/Doc.js';\nimport type {\n TemplateBlock,\n ImageWithCaptionInput,\n TitleBlockInput,\n ColorScheme,\n AccentImage,\n AccentPosition,\n} from '../schemas/BlockTemplates.js';\nimport { extractContent, stripMarkdown } from './contentExtractor.js';\nimport { mapElementToBlock } from './templateMapper.js';\nimport { estimateNarrationDuration } from '../timing/narrationTiming.js';\nimport { SeededRandom, hashString } from '../random/SeededRandom.js';\n\n// ── Public types ───────────────────────────────────────────────────\n\n/** A Doc variant whose blocks are TemplateBlocks (no startTime required). */\nexport type SlideshowDoc = Omit<Doc, 'blocks'> & {\n blocks: TemplateBlock[];\n};\n\n/** Image metadata passed to the generator. */\nexport interface SlideshowImage {\n /** Image source path or URL. */\n src: string;\n /** Alt text for accessibility. */\n alt?: string;\n /** Photo credit. */\n credit?: string;\n /** License identifier. */\n license?: string;\n}\n\n/** Options for `generateSlideshow`. */\nexport interface SlideshowOptions {\n /** Deterministic seed (default: hash of the text). */\n seed?: number;\n /** Title slide text. Omit to skip the title slide. */\n title?: string;\n /** Subtitle for the title slide. */\n subtitle?: string;\n /** Explicit total duration in seconds. When omitted, estimated from text. */\n duration?: number;\n /** Target number of content slides (default: 5–8, auto-scaled). */\n targetSlides?: number;\n /** Color schemes to rotate (default: ['blue','green','purple','orange','red']). */\n colorSchemes?: ColorScheme[];\n /** Ambient motions to rotate on images. */\n ambientMotions?: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'>;\n /** Accent positions to rotate on text slides. */\n accentPositions?: AccentPosition[];\n /** Minimum slide duration in seconds (default: 4). */\n minSlideDuration?: number;\n /** Maximum slide duration in seconds (default: 15). */\n maxSlideDuration?: number;\n /** Theme identifier to embed in the Doc. */\n themeId?: string;\n /** Whether the input text is markdown (default: false). */\n isMarkdown?: boolean;\n /** Minimum extraction confidence (default: 0.3). */\n minConfidence?: number;\n}\n\nconst DEFAULT_COLOR_SCHEMES: ColorScheme[] = ['blue', 'green', 'purple', 'orange', 'red'];\nconst DEFAULT_AMBIENT_MOTIONS: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'> = [\n 'zoomIn',\n 'zoomOut',\n 'panLeft',\n 'panRight',\n];\nconst DEFAULT_ACCENT_POSITIONS: AccentPosition[] = ['left-strip', 'right-strip', 'bottom-strip'];\n\n// ── Main ───────────────────────────────────────────────────────────\n\n/**\n * Generate a slideshow `Doc` from text and optional images.\n *\n * ```ts\n * const doc = generateSlideshow(articleText, myImages, {\n * title: 'Mount Rainier',\n * themeId: 'documentary',\n * });\n * // doc is a complete Doc ready for DocPlayer / LinearDocView\n * ```\n */\nexport function generateSlideshow(\n text: string,\n images: SlideshowImage[] = [],\n options: SlideshowOptions = {},\n): SlideshowDoc {\n const {\n seed,\n title,\n subtitle,\n duration: explicitDuration,\n targetSlides,\n colorSchemes = DEFAULT_COLOR_SCHEMES,\n ambientMotions = DEFAULT_AMBIENT_MOTIONS,\n accentPositions = DEFAULT_ACCENT_POSITIONS,\n minSlideDuration = 4,\n maxSlideDuration = 15,\n themeId,\n isMarkdown = false,\n minConfidence = 0.3,\n } = options;\n\n const plainText = isMarkdown ? stripMarkdown(text) : text;\n const rng = new SeededRandom(seed ?? hashString(plainText));\n\n // 1. Estimate total duration\n const totalDuration = explicitDuration ?? estimateNarrationDuration(plainText);\n\n // 2. Extract compelling content\n const extraction = extractContent(plainText, { minConfidence });\n const allElements = extraction.elements;\n\n // 3. Decide slide budget\n const slideBudget = targetSlides ?? computeSlideBudget(totalDuration, allElements.length);\n\n // Allocate slots between content and images\n const imageSlotCount = images.length > 0 ? Math.max(1, Math.round(slideBudget * 0.4)) : 0;\n const contentSlotCount = Math.max(0, slideBudget - imageSlotCount - (title ? 1 : 0));\n\n // Select top elements by confidence, then restore source order\n const sorted = [...allElements].sort((a, b) => b.confidence - a.confidence);\n const selected = sorted.slice(0, contentSlotCount);\n selected.sort((a, b) => a.sourcePosition - b.sourcePosition);\n\n // 4. Build slides\n const blocks: TemplateBlock[] = [];\n let slideIndex = 0;\n let colorIdx = 0;\n let accentIdx = 0;\n\n // Determine per-slide duration\n const totalSlideCount =\n (title ? 1 : 0) + selected.length + Math.min(imageSlotCount, images.length);\n const perSlide =\n totalSlideCount > 0\n ? Math.min(maxSlideDuration, Math.max(minSlideDuration, totalDuration / totalSlideCount))\n : minSlideDuration;\n\n // Title slide\n if (title) {\n const titleBlock: TitleBlockInput = {\n id: `slide-${slideIndex++}`,\n template: 'title',\n title,\n subtitle,\n duration: Math.min(perSlide, 6),\n audioSegment: 0,\n };\n blocks.push(titleBlock);\n }\n\n // Prepare image pool for standalone + accent images\n const standaloneImages = images.slice(0, Math.min(imageSlotCount, images.length));\n const accentPool =\n images.length > standaloneImages.length ? images.slice(standaloneImages.length) : [...images]; // reuse if not enough\n\n // Interleave pattern: insert an image slide every N content slides\n const imageInterval =\n standaloneImages.length > 0\n ? Math.max(1, Math.floor(selected.length / (standaloneImages.length + 1)))\n : Infinity;\n let imgIdx = 0;\n let sinceImage = 0;\n\n for (let i = 0; i < selected.length; i++) {\n // Maybe insert a standalone image slide before this content slide\n if (sinceImage >= imageInterval && imgIdx < standaloneImages.length) {\n blocks.push(\n createImageSlide(standaloneImages[imgIdx], slideIndex++, perSlide, rng, ambientMotions),\n );\n imgIdx++;\n sinceImage = 0;\n }\n\n const element = selected[i];\n\n // Optional accent image\n let accentImage: AccentImage | undefined;\n if (accentPool.length > 0) {\n const img = accentPool[i % accentPool.length];\n accentImage = {\n src: img.src,\n alt: img.alt ?? '',\n position: accentPositions[accentIdx % accentPositions.length],\n ambientMotion: rng.pickRequired(ambientMotions),\n credit: img.credit,\n license: img.license,\n };\n accentIdx++;\n }\n\n const block = mapElementToBlock(element, {\n id: `slide-${slideIndex++}`,\n duration: perSlide,\n audioSegment: 0,\n colorScheme: colorSchemes[colorIdx % colorSchemes.length],\n accentImage,\n });\n blocks.push(block);\n colorIdx++;\n sinceImage++;\n }\n\n // Append any remaining standalone images\n while (imgIdx < standaloneImages.length) {\n blocks.push(\n createImageSlide(standaloneImages[imgIdx], slideIndex++, perSlide, rng, ambientMotions),\n );\n imgIdx++;\n }\n\n // 5. Assemble Doc\n const doc: SlideshowDoc = {\n articleId: title ?? 'slideshow',\n duration: totalDuration,\n blocks,\n audio: {\n segments: [{ src: '', name: 'main', duration: totalDuration, startTime: 0 }],\n },\n themeId,\n };\n\n return doc;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nfunction computeSlideBudget(duration: number, elementCount: number): number {\n // Aim for ~5 slides per minute of content, clamped 3–12\n const byDuration = Math.round((duration / 60) * 5);\n // But don't exceed available elements + a few image slots\n const budget = Math.min(byDuration, elementCount + 4);\n return Math.max(3, Math.min(12, budget));\n}\n\nfunction createImageSlide(\n img: SlideshowImage,\n index: number,\n duration: number,\n rng: SeededRandom,\n motions: Array<'zoomIn' | 'zoomOut' | 'panLeft' | 'panRight'>,\n): ImageWithCaptionInput {\n return {\n id: `slide-${index}`,\n template: 'imageWithCaption',\n imageSrc: img.src,\n imageAlt: img.alt ?? '',\n caption: img.alt,\n duration,\n audioSegment: 0,\n ambientMotion: rng.pickRequired(motions),\n imageCredit: img.credit,\n imageLicense: img.license,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/imageEdit/state.ts","../src/imageEdit/persistence.ts","../src/imageEdit/versionPaths.ts","../src/imageEdit/versions.ts","../src/imageEdit/ImageEditVersionManager.ts","../src/imageEdit/export.ts"],"sourcesContent":["/**\n * Pure helpers for constructing and mutating {@link ImageEditDoc} values.\n *\n * All functions are side-effect free and return new doc objects rather\n * than mutating their inputs, so they're safe to use from a reducer.\n */\n\nimport type { ImageEditDoc, ImageEditLayer } from '../schemas/ImageEditDoc.js';\n\n/** Filename used for the persisted editor state inside the sidecar. */\nexport const IMAGE_EDIT_STATE_FILENAME = 'state.json';\n\n/** Subfolder (inside the sidecar) for embedded asset bytes. */\nexport const IMAGE_EDIT_ASSETS_PREFIX = 'assets/';\n\n/** Generate a short random layer id. */\nfunction nextLayerId(): string {\n return `layer-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Create an empty doc with the given canvas size and no layers.\n *\n * `meta.createdAt` and `meta.updatedAt` are set to the current time so\n * the doc has a complete metadata footprint from the start.\n */\nexport function createEmptyImageEditDoc(\n width: number,\n height: number,\n options: { background?: string; sourcePath?: string; now?: Date } = {},\n): ImageEditDoc {\n const now = (options.now ?? new Date()).toISOString();\n return {\n version: 1,\n canvas: {\n width,\n height,\n background: options.background ?? 'transparent',\n },\n layers: [],\n meta: {\n sourcePath: options.sourcePath,\n createdAt: now,\n updatedAt: now,\n },\n };\n}\n\n/** Append a layer (top of stack). Assigns an id when missing. */\nexport function addLayer(doc: ImageEditDoc, layer: ImageEditLayer): ImageEditDoc {\n const withId: ImageEditLayer = layer.id ? layer : { ...layer, id: nextLayerId() };\n return touch({ ...doc, layers: [...doc.layers, withId] });\n}\n\n/** Remove the layer with the given id. No-op if not found. */\nexport function removeLayer(doc: ImageEditDoc, layerId: string): ImageEditDoc {\n const next = doc.layers.filter((l) => l.id !== layerId);\n if (next.length === doc.layers.length) return doc;\n return touch({ ...doc, layers: next });\n}\n\n/**\n * Reorder a layer to a new index in the stack. The index is clamped to\n * the valid range; out-of-range / missing layers are no-ops.\n */\nexport function reorderLayer(doc: ImageEditDoc, layerId: string, toIndex: number): ImageEditDoc {\n const fromIndex = doc.layers.findIndex((l) => l.id === layerId);\n if (fromIndex < 0) return doc;\n const clamped = Math.max(0, Math.min(doc.layers.length - 1, Math.floor(toIndex)));\n if (clamped === fromIndex) return doc;\n const next = doc.layers.slice();\n const [layer] = next.splice(fromIndex, 1);\n next.splice(clamped, 0, layer!);\n return touch({ ...doc, layers: next });\n}\n\n/**\n * Replace the layer with the given id by applying a partial update.\n * The patch is shallow-merged at the top level; callers updating\n * `content`, `position`, etc. must spread those sub-objects themselves.\n */\nexport function updateLayer(\n doc: ImageEditDoc,\n layerId: string,\n patch: Partial<ImageEditLayer>,\n): ImageEditDoc {\n let changed = false;\n const next = doc.layers.map((l) => {\n if (l.id !== layerId) return l;\n changed = true;\n return { ...l, ...patch } as ImageEditLayer;\n });\n if (!changed) return doc;\n return touch({ ...doc, layers: next });\n}\n\n/** Replace the canvas configuration. */\nexport function setCanvas(doc: ImageEditDoc, canvas: ImageEditDoc['canvas']): ImageEditDoc {\n return touch({ ...doc, canvas });\n}\n\n/** Bump `meta.updatedAt`. Pure: returns a new doc. */\nexport function touch(doc: ImageEditDoc, now: Date = new Date()): ImageEditDoc {\n return {\n ...doc,\n meta: {\n ...doc.meta,\n createdAt: doc.meta?.createdAt ?? now.toISOString(),\n updatedAt: now.toISOString(),\n },\n };\n}\n","/**\n * Load and save {@link ImageEditDoc} JSON to a sidecar\n * {@link ContentContainer} (typically a {@link ScopedContentContainer}\n * rooted at `<basename>_files/`).\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { ImageEditDoc } from '../schemas/ImageEditDoc.js';\nimport { IMAGE_EDIT_STATE_FILENAME } from './state.js';\n\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\n/**\n * Read `state.json` from the sidecar and parse it. Returns `null` when\n * the file does not exist; throws on parse / shape errors.\n */\nexport async function readImageEditDoc(\n container: ContentContainer,\n filename: string = IMAGE_EDIT_STATE_FILENAME,\n): Promise<ImageEditDoc | null> {\n const data = await container.readFile(filename);\n if (!data) return null;\n const text = decoder.decode(data);\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`readImageEditDoc: ${filename} is not valid JSON: ${msg}`);\n }\n assertImageEditDoc(parsed, filename);\n return parsed;\n}\n\n/** Serialize `doc` to JSON and write it to the sidecar. */\nexport async function writeImageEditDoc(\n container: ContentContainer,\n doc: ImageEditDoc,\n filename: string = IMAGE_EDIT_STATE_FILENAME,\n): Promise<void> {\n const text = JSON.stringify(doc, null, 2);\n await container.writeFile(filename, encoder.encode(text), 'application/json');\n}\n\nfunction assertImageEditDoc(value: unknown, filename: string): asserts value is ImageEditDoc {\n if (!value || typeof value !== 'object') {\n throw new Error(`readImageEditDoc: ${filename} root must be an object`);\n }\n const v = value as Partial<ImageEditDoc>;\n if (v.version !== 1) {\n throw new Error(\n `readImageEditDoc: ${filename} has unsupported schema version ${String(v.version)} (expected 1)`,\n );\n }\n if (!v.canvas || typeof v.canvas.width !== 'number' || typeof v.canvas.height !== 'number') {\n throw new Error(`readImageEditDoc: ${filename} canvas.width/height must be numbers`);\n }\n if (!Array.isArray(v.layers)) {\n throw new Error(`readImageEditDoc: ${filename} layers must be an array`);\n }\n}\n","/**\n * Path conventions for image-editor version snapshots.\n *\n * Snapshots live inside the sidecar at\n * `.versions/<basename>.<timestamp>[<-suffix>].json`. The collision\n * suffix (`-2`, `-3`, ...) is appended only when two snapshots land on\n * the same UTC second.\n *\n * Mirrors `core/src/versions/paths.ts` but keyed on `.json` instead of\n * `.md` so the two histories live side-by-side without colliding.\n */\n\nimport { formatVersionTimestamp, parseVersionTimestamp } from '../versions/timestamp.js';\n\n/** Subfolder (inside the sidecar) that holds image-editor snapshots. */\nexport const IMAGE_EDIT_VERSIONS_PREFIX = '.versions/';\n\n/** Default basename when none is supplied. Matches `IMAGE_EDIT_STATE_FILENAME` stem. */\nexport const IMAGE_EDIT_DEFAULT_BASENAME = 'state';\n\n/** Build a snapshot path. Optionally append a collision suffix. */\nexport function buildImageEditVersionPath(basename: string, date: Date, collision = 0): string {\n const stamp = formatVersionTimestamp(date);\n const suffix = collision > 0 ? `-${collision + 1}` : '';\n return `${IMAGE_EDIT_VERSIONS_PREFIX}${basename}.${stamp}${suffix}.json`;\n}\n\n/**\n * Parse a snapshot path. Returns `null` when the path doesn't match the\n * convention (so unrelated `.versions/*.json` files are ignored).\n */\nexport function parseImageEditVersionPath(\n path: string,\n): { basename: string; timestamp: Date; collision: number } | null {\n if (!path.startsWith(IMAGE_EDIT_VERSIONS_PREFIX)) return null;\n const rest = path.slice(IMAGE_EDIT_VERSIONS_PREFIX.length);\n if (!rest.endsWith('.json')) return null;\n const stem = rest.slice(0, -'.json'.length);\n const lastDot = stem.lastIndexOf('.');\n if (lastDot <= 0) return null;\n const basename = stem.slice(0, lastDot);\n const tail = stem.slice(lastDot + 1);\n const dash = tail.indexOf('-');\n let stamp: string;\n let collision = 0;\n if (dash >= 0) {\n stamp = tail.slice(0, dash);\n const n = Number(tail.slice(dash + 1));\n if (!Number.isInteger(n) || n < 2) return null;\n collision = n - 1;\n } else {\n stamp = tail;\n }\n const timestamp = parseVersionTimestamp(stamp);\n if (!timestamp) return null;\n return { basename, timestamp, collision };\n}\n","/**\n * Image-editor version operations against a sidecar\n * {@link ContentContainer}.\n *\n * Mirrors `core/src/versions/operations.ts` but operates on\n * {@link ImageEditDoc} JSON state at `.versions/<basename>.<timestamp>.json`\n * instead of the markdown document. Reuses {@link PrunePolicy} so hosts\n * can share their pruning configuration between the two histories.\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { ImageEditDoc } from '../schemas/ImageEditDoc.js';\nimport type { CoalesceOptions, PrunePolicy, Version } from '../versions/types.js';\nimport { readImageEditDoc, writeImageEditDoc } from './persistence.js';\nimport { IMAGE_EDIT_STATE_FILENAME } from './state.js';\nimport {\n IMAGE_EDIT_VERSIONS_PREFIX,\n IMAGE_EDIT_DEFAULT_BASENAME,\n buildImageEditVersionPath,\n parseImageEditVersionPath,\n} from './versionPaths.js';\n\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\n/** Options for {@link saveImageEditVersion}. */\nexport interface SaveImageEditVersionOptions {\n /** Override the doc to snapshot; otherwise `state.json` is read from the sidecar. */\n doc?: ImageEditDoc;\n /** Override the snapshot timestamp. Defaults to `new Date()`. */\n now?: Date;\n /** Skip the diff-vs-latest check and force a write. */\n force?: boolean;\n /** Override the basename used in version filenames. Defaults to `'state'`. */\n basename?: string;\n /** Override the source filename inside the sidecar. Defaults to `state.json`. */\n stateFilename?: string;\n}\n\n/** Result of a {@link saveImageEditVersion} call. */\nexport interface SaveImageEditVersionResult {\n saved: boolean;\n version: Version | null;\n /** `'saved' | 'unchanged' | 'no-state'` — `'no-state'` means there was nothing to snapshot. */\n reason: 'saved' | 'unchanged' | 'no-state';\n}\n\n/** Options for {@link revertToImageEditVersion}. */\nexport interface RevertImageEditOptions {\n /**\n * Whether to snapshot the *current* state before replacing it. Defaults to `true`.\n */\n snapshotCurrent?: boolean;\n /** Override the source filename. Defaults to `state.json`. */\n stateFilename?: string;\n}\n\n/** List image-edit snapshots in the sidecar, newest-first. */\nexport async function listImageEditVersions(\n container: ContentContainer,\n basename?: string,\n): Promise<Version[]> {\n const entries = await container.listFiles(IMAGE_EDIT_VERSIONS_PREFIX);\n const versions: Version[] = [];\n for (const entry of entries) {\n const parsed = parseImageEditVersionPath(entry.path);\n if (!parsed) continue;\n if (basename !== undefined && parsed.basename !== basename) continue;\n versions.push({\n path: entry.path,\n basename: parsed.basename,\n timestamp: parsed.timestamp,\n size: entry.size,\n collision: parsed.collision,\n });\n }\n versions.sort((a, b) => {\n const dt = b.timestamp.getTime() - a.timestamp.getTime();\n if (dt !== 0) return dt;\n return b.collision - a.collision;\n });\n return versions;\n}\n\n/** Read a snapshot's JSON text. Returns `null` if the snapshot is missing. */\nexport async function readImageEditVersionText(\n container: ContentContainer,\n version: Version | string,\n): Promise<string | null> {\n const path = typeof version === 'string' ? version : version.path;\n const data = await container.readFile(path);\n if (!data) return null;\n return decoder.decode(data);\n}\n\n/** Read and parse a snapshot. Returns `null` if missing. */\nexport async function readImageEditVersion(\n container: ContentContainer,\n version: Version | string,\n): Promise<ImageEditDoc | null> {\n const text = await readImageEditVersionText(container, version);\n if (text === null) return null;\n return JSON.parse(text) as ImageEditDoc;\n}\n\n/**\n * Snapshot the current image-editor state if it differs from the latest\n * existing snapshot.\n *\n * Diff is computed on the *serialized* JSON (with stable 2-space\n * indentation) so semantically-equal states with different key order\n * still snapshot — accept the over-snapshot rather than running a deep\n * structural compare.\n */\nexport async function saveImageEditVersion(\n container: ContentContainer,\n options: SaveImageEditVersionOptions = {},\n): Promise<SaveImageEditVersionResult> {\n const stateFilename = options.stateFilename ?? IMAGE_EDIT_STATE_FILENAME;\n const doc = options.doc ?? (await readImageEditDoc(container, stateFilename));\n if (!doc) {\n return { saved: false, version: null, reason: 'no-state' };\n }\n const basename = options.basename ?? IMAGE_EDIT_DEFAULT_BASENAME;\n const serialized = JSON.stringify(doc, null, 2);\n\n const versions = await listImageEditVersions(container, basename);\n if (!options.force && versions.length > 0) {\n const latest = versions[0]!;\n const existing = await readImageEditVersionText(container, latest);\n if (existing === serialized) {\n return { saved: false, version: null, reason: 'unchanged' };\n }\n }\n\n const now = options.now ?? new Date();\n let collision = 0;\n let path = buildImageEditVersionPath(basename, now, collision);\n while (await container.exists(path)) {\n collision += 1;\n path = buildImageEditVersionPath(basename, now, collision);\n }\n\n const data = encoder.encode(serialized);\n await container.writeFile(path, data, 'application/json');\n\n const version: Version = {\n path,\n basename,\n timestamp: now,\n size: data.byteLength,\n collision,\n };\n return { saved: true, version, reason: 'saved' };\n}\n\n/** Revert `state.json` to a prior snapshot. Snapshots the current state first by default. */\nexport async function revertToImageEditVersion(\n container: ContentContainer,\n version: Version | string,\n options: RevertImageEditOptions = {},\n): Promise<{ reverted: boolean; snapshotted: Version | null }> {\n const doc = await readImageEditVersion(container, version);\n if (!doc) {\n return { reverted: false, snapshotted: null };\n }\n\n let snapshotted: Version | null = null;\n if (options.snapshotCurrent !== false) {\n const result = await saveImageEditVersion(container, { stateFilename: options.stateFilename });\n snapshotted = result.version;\n }\n\n await writeImageEditDoc(container, doc, options.stateFilename);\n return { reverted: true, snapshotted };\n}\n\n/** Delete snapshots that don't satisfy the policy. */\nexport async function pruneImageEditVersions(\n container: ContentContainer,\n policy: PrunePolicy,\n basename?: string,\n): Promise<Version[]> {\n const versions = await listImageEditVersions(container, basename);\n const toDelete: Version[] = [];\n\n if (policy.type === 'keep-last-n') {\n const n = Math.max(0, Math.floor(policy.n));\n toDelete.push(...versions.slice(n));\n } else if (policy.type === 'older-than') {\n const cutoff = policy.date.getTime();\n for (const v of versions) {\n if (v.timestamp.getTime() < cutoff) toDelete.push(v);\n }\n } else {\n for (const v of versions) {\n if (!policy.keep(v, versions)) toDelete.push(v);\n }\n }\n\n for (const v of toDelete) {\n await container.removeFile(v.path);\n }\n return toDelete;\n}\n\n/** Collapse adjacent snapshots within `windowMs`, keeping the newer of each pair. */\nexport async function coalesceImageEditVersions(\n container: ContentContainer,\n options: CoalesceOptions = {},\n basename?: string,\n): Promise<Version[]> {\n const windowMs = options.windowMs ?? 60_000;\n const versions = await listImageEditVersions(container, basename);\n const toDelete: Version[] = [];\n if (versions.length > 0) {\n let anchor = versions[0]!;\n for (let i = 1; i < versions.length; i++) {\n const candidate = versions[i]!;\n if (anchor.timestamp.getTime() - candidate.timestamp.getTime() <= windowMs) {\n toDelete.push(candidate);\n } else {\n anchor = candidate;\n }\n }\n }\n for (const v of toDelete) {\n await container.removeFile(v.path);\n }\n return toDelete;\n}\n","/**\n * Convenience wrapper around the image-edit version operations that\n * captures a {@link ContentContainer} reference and an optional basename\n * override. Mirrors `DocumentVersionManager` in shape.\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { CoalesceOptions, PrunePolicy, Version } from '../versions/types.js';\nimport {\n coalesceImageEditVersions,\n listImageEditVersions,\n pruneImageEditVersions,\n readImageEditVersion,\n revertToImageEditVersion,\n saveImageEditVersion,\n type RevertImageEditOptions,\n type SaveImageEditVersionOptions,\n type SaveImageEditVersionResult,\n} from './versions.js';\nimport type { ImageEditDoc } from '../schemas/ImageEditDoc.js';\n\nexport interface ImageEditVersionManagerOptions {\n /** Override the basename used in version filenames. Defaults to `'state'`. */\n basename?: string;\n /** Override the source filename inside the sidecar. Defaults to `state.json`. */\n stateFilename?: string;\n}\n\nexport class ImageEditVersionManager {\n private readonly container: ContentContainer;\n private readonly basename: string | undefined;\n private readonly stateFilename: string | undefined;\n\n constructor(container: ContentContainer, options: ImageEditVersionManagerOptions = {}) {\n this.container = container;\n this.basename = options.basename;\n this.stateFilename = options.stateFilename;\n }\n\n saveVersion(options: SaveImageEditVersionOptions = {}): Promise<SaveImageEditVersionResult> {\n return saveImageEditVersion(this.container, {\n basename: this.basename,\n stateFilename: this.stateFilename,\n ...options,\n });\n }\n\n listVersions(): Promise<Version[]> {\n return listImageEditVersions(this.container, this.basename);\n }\n\n readVersion(version: Version | string): Promise<ImageEditDoc | null> {\n return readImageEditVersion(this.container, version);\n }\n\n revertToVersion(\n version: Version | string,\n options: RevertImageEditOptions = {},\n ): Promise<{ reverted: boolean; snapshotted: Version | null }> {\n return revertToImageEditVersion(this.container, version, {\n stateFilename: this.stateFilename,\n ...options,\n });\n }\n\n pruneVersions(policy: PrunePolicy): Promise<Version[]> {\n return pruneImageEditVersions(this.container, policy, this.basename);\n }\n\n coalesceVersions(options: CoalesceOptions = {}): Promise<Version[]> {\n return coalesceImageEditVersions(this.container, options, this.basename);\n }\n}\n","/**\n * Rasterize an {@link ImageEditDoc} to a PNG / JPEG / WebP {@link Blob}.\n *\n * The pipeline:\n * 1. Build an SVG string mirroring the canvas + layers, with image\n * hrefs inlined as `data:` URLs (so the canvas isn't tainted).\n * 2. Wrap the SVG in a `Blob` and load it through an `Image`.\n * 3. Draw it onto a canvas (`OffscreenCanvas` when available,\n * otherwise a detached `HTMLCanvasElement`).\n * 4. Convert the canvas to the requested format.\n *\n * Browser-only — calls `Image`, `URL.createObjectURL`, and canvas APIs.\n * Returns a Promise that rejects on SVG parse / load failures.\n */\n\nimport type { ContentContainer } from '../storage/ContentContainer.js';\nimport type { ImageEditCanvas, ImageEditDoc, ImageEditLayer } from '../schemas/ImageEditDoc.js';\nimport type { Position } from '../schemas/Doc.js';\n\n/** Supported export formats. */\nexport type ImageEditExportFormat = 'png' | 'jpeg' | 'webp';\n\n/** Options for {@link exportImageEditDoc}. */\nexport interface ImageEditExportOptions {\n /** Output format. Defaults to `'png'`. */\n format?: ImageEditExportFormat;\n /** JPEG/WebP quality 0..1. Defaults to `0.92`. Ignored for PNG. */\n quality?: number;\n /** Resolution scale factor. Defaults to `1` (canvas pixels = output pixels). */\n scale?: number;\n}\n\nconst FORMAT_MIME: Record<ImageEditExportFormat, string> = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n};\n\n/**\n * Export the doc to a raster {@link Blob}. Asset bytes referenced by image\n * layers are read from `container` and inlined as data URLs.\n */\nexport async function exportImageEditDoc(\n doc: ImageEditDoc,\n container: ContentContainer,\n options: ImageEditExportOptions = {},\n): Promise<Blob> {\n const format: ImageEditExportFormat = options.format ?? 'png';\n const quality = options.quality ?? 0.92;\n const scale = options.scale ?? 1;\n const mime = FORMAT_MIME[format];\n\n const svg = await buildSvgString(doc, container);\n const outW = Math.max(1, Math.round(doc.canvas.width * scale));\n const outH = Math.max(1, Math.round(doc.canvas.height * scale));\n\n const img = await loadSvgImage(svg);\n const canvas = createRasterCanvas(outW, outH);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('exportImageEditDoc: 2D canvas context unavailable');\n\n // For JPEG (no alpha), pre-fill with the canvas background or white so\n // transparent regions aren't rendered as black.\n if (format === 'jpeg') {\n const bg =\n doc.canvas.background && doc.canvas.background !== 'transparent'\n ? doc.canvas.background\n : '#ffffff';\n ctx.fillStyle = bg;\n ctx.fillRect(0, 0, outW, outH);\n }\n\n ctx.drawImage(img as CanvasImageSource, 0, 0, outW, outH);\n return canvasToBlob(canvas, mime, quality);\n}\n\n// ============================================\n// SVG construction\n// ============================================\n\nasync function buildSvgString(doc: ImageEditDoc, container: ContentContainer): Promise<string> {\n const { width, height, background } = doc.canvas;\n const bgRect =\n background && background !== 'transparent'\n ? `<rect width=\"${width}\" height=\"${height}\" fill=\"${escapeAttr(background)}\"/>`\n : '';\n\n const layerXml: string[] = [];\n for (const layer of doc.layers) {\n if (layer.visible === false) continue;\n layerXml.push(await renderLayerToSvg(layer, doc.canvas, container));\n }\n\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"` +\n ` width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">` +\n bgRect +\n layerXml.join('') +\n `</svg>`\n );\n}\n\nasync function renderLayerToSvg(\n layer: ImageEditLayer,\n canvas: ImageEditCanvas,\n container: ContentContainer,\n): Promise<string> {\n const opacity = layer.opacity ?? 1;\n const opacityAttr = opacity < 1 ? ` opacity=\"${opacity}\"` : '';\n const inner = await renderLayerInner(layer, canvas, container);\n return `<g data-layer-id=\"${escapeAttr(layer.id)}\"${opacityAttr}>${inner}</g>`;\n}\n\nasync function renderLayerInner(\n layer: ImageEditLayer,\n canvas: ImageEditCanvas,\n container: ContentContainer,\n): Promise<string> {\n const { x, y, w, h } = resolveBox(layer.position, canvas);\n\n if (layer.type === 'image') {\n const dataUrl = await loadAssetAsDataUrl(container, layer.content.src);\n return (\n `<image x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"` +\n ` preserveAspectRatio=\"${preserveAspectRatioFor(layer.content.fit)}\"` +\n ` xlink:href=\"${escapeAttr(dataUrl)}\"/>`\n );\n }\n\n if (layer.type === 'shape') {\n const c = layer.content;\n const fill = c.fill ?? 'none';\n const stroke = c.stroke ? ` stroke=\"${escapeAttr(c.stroke)}\"` : '';\n const strokeWidth = c.strokeWidth ? ` stroke-width=\"${c.strokeWidth}\"` : '';\n if (c.shape === 'rect') {\n const rx = c.borderRadius ? ` rx=\"${c.borderRadius}\" ry=\"${c.borderRadius}\"` : '';\n return `<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" fill=\"${escapeAttr(fill)}\"${stroke}${strokeWidth}${rx}/>`;\n }\n if (c.shape === 'circle') {\n const r = Math.min(w, h) / 2;\n return `<circle cx=\"${x + w / 2}\" cy=\"${y + h / 2}\" r=\"${r}\" fill=\"${escapeAttr(fill)}\"${stroke}${strokeWidth}/>`;\n }\n // line\n return `<line x1=\"${x}\" y1=\"${y}\" x2=\"${x + w}\" y2=\"${y + h}\"${stroke}${strokeWidth}/>`;\n }\n\n // text\n const c = layer.content;\n const style = c.style;\n const lineHeight = style.lineHeight ?? 1.4;\n const lineHeightPx = style.fontSize * lineHeight;\n const lines = (c.text ?? '').split('\\n');\n const tspans = lines\n .map(\n (line, i) => `<tspan x=\"${x}\" dy=\"${i === 0 ? 0 : lineHeightPx}\">${escapeText(line)}</tspan>`,\n )\n .join('');\n const fontFamily = style.fontFamily ?? 'sans-serif';\n const fontWeight = style.fontWeight ?? 'normal';\n const textAnchor =\n style.textAlign === 'center' ? 'middle' : style.textAlign === 'right' ? 'end' : 'start';\n return (\n `<text x=\"${x}\" y=\"${y + style.fontSize}\" font-family=\"${escapeAttr(fontFamily)}\"` +\n ` font-size=\"${style.fontSize}\" font-weight=\"${fontWeight}\"` +\n ` fill=\"${escapeAttr(style.color)}\" text-anchor=\"${textAnchor}\">` +\n tspans +\n `</text>`\n );\n}\n\nfunction preserveAspectRatioFor(fit?: 'cover' | 'contain' | 'fill'): string {\n if (fit === 'cover') return 'xMidYMid slice';\n if (fit === 'fill') return 'none';\n return 'xMidYMid meet'; // contain (default)\n}\n\nfunction resolveBox(\n position: Position,\n canvas: ImageEditCanvas,\n): { x: number; y: number; w: number; h: number } {\n const x = resolveValue(position.x, canvas.width);\n const y = resolveValue(position.y, canvas.height);\n const w =\n position.width !== undefined ? resolveValue(position.width, canvas.width) : canvas.width;\n const h =\n position.height !== undefined ? resolveValue(position.height, canvas.height) : canvas.height;\n const offset = anchorOffset(position.anchor, w, h);\n return { x: x + offset.x, y: y + offset.y, w, h };\n}\n\nfunction resolveValue(v: number | string, base: number): number {\n if (typeof v === 'number') return v;\n if (v.endsWith('%')) return (parseFloat(v) / 100) * base;\n return parseFloat(v) || 0;\n}\n\nfunction anchorOffset(\n anchor: Position['anchor'] | undefined,\n w: number,\n h: number,\n): { x: number; y: number } {\n switch (anchor) {\n case 'center':\n return { x: -w / 2, y: -h / 2 };\n case 'top-right':\n return { x: -w, y: 0 };\n case 'bottom-left':\n return { x: 0, y: -h };\n case 'bottom-right':\n return { x: -w, y: -h };\n case 'top-left':\n default:\n return { x: 0, y: 0 };\n }\n}\n\n// ============================================\n// Asset inlining\n// ============================================\n\nasync function loadAssetAsDataUrl(container: ContentContainer, src: string): Promise<string> {\n // Already a data: or absolute URL — pass through.\n if (/^(data:|https?:|blob:)/.test(src)) return src;\n const data = await container.readFile(src);\n if (!data) throw new Error(`exportImageEditDoc: missing asset \"${src}\"`);\n const list = await container.listFiles(src);\n const mime = list.find((e) => e.path === src)?.mimeType ?? guessMime(src);\n return arrayBufferToDataUrl(data, mime);\n}\n\nfunction arrayBufferToDataUrl(data: ArrayBuffer, mime: string): string {\n const bytes = new Uint8Array(data);\n let binary = '';\n // chunk to avoid call-stack limits with large images\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + CHUNK)));\n }\n // btoa exists in browsers and modern Node (>= 16); fall back to Buffer for older runtimes.\n const b64 = typeof btoa === 'function' ? btoa(binary) : Buffer.from(bytes).toString('base64');\n return `data:${mime};base64,${b64}`;\n}\n\nfunction guessMime(path: string): string {\n const dot = path.lastIndexOf('.');\n const ext = dot >= 0 ? path.slice(dot).toLowerCase() : '';\n switch (ext) {\n case '.png':\n return 'image/png';\n case '.jpg':\n case '.jpeg':\n return 'image/jpeg';\n case '.webp':\n return 'image/webp';\n case '.gif':\n return 'image/gif';\n case '.svg':\n return 'image/svg+xml';\n default:\n return 'application/octet-stream';\n }\n}\n\n// ============================================\n// SVG → Image → Canvas → Blob\n// ============================================\n\nasync function loadSvgImage(svg: string): Promise<HTMLImageElement> {\n const blob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n return await new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('exportImageEditDoc: SVG image failed to load'));\n img.src = url;\n });\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\ntype RasterCanvas = HTMLCanvasElement | OffscreenCanvas;\n\nfunction createRasterCanvas(width: number, height: number): RasterCanvas {\n if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(width, height);\n }\n const c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n return c;\n}\n\nasync function canvasToBlob(canvas: RasterCanvas, mime: string, quality: number): Promise<Blob> {\n if ('convertToBlob' in canvas) {\n return canvas.convertToBlob({ type: mime, quality });\n }\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error('exportImageEditDoc: canvas.toBlob returned null'));\n },\n mime,\n quality,\n );\n });\n}\n\n// ============================================\n// XML escaping\n// ============================================\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n"],"mappings":"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","names":["decoder","encoder","c"]}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Audio Mapping
|
|
3
|
-
*
|
|
4
|
-
* Associates audio segments (MP3 files) with document blocks.
|
|
5
|
-
* Supports two modes:
|
|
6
|
-
*
|
|
7
|
-
* 1. **Explicit annotation**: Blocks with `{[audio=filename.mp3]}` in their
|
|
8
|
-
* heading annotation are directly mapped to that audio file.
|
|
9
|
-
*
|
|
10
|
-
* 2. **Auto-matching**: When no annotations exist but the container has MP3s
|
|
11
|
-
* with `.timing.json` files, matches MP3s to blocks by comparing the
|
|
12
|
-
* timing.json `sourceText` against block text content (word overlap).
|
|
13
|
-
* Falls back to filename-based matching (slugified title comparison).
|
|
14
|
-
*/
|
|
15
|
-
import type { Doc } from '../schemas/Doc.js';
|
|
16
|
-
import type { ContentContainer } from '../storage/ContentContainer.js';
|
|
17
|
-
/**
|
|
18
|
-
* Calculate Jaccard similarity between two texts (word overlap).
|
|
19
|
-
* Returns 0–1 where 1 = identical word sets.
|
|
20
|
-
*/
|
|
21
|
-
export declare function scoreTextSimilarity(a: string, b: string): number;
|
|
22
|
-
/**
|
|
23
|
-
* Resolve audio mapping for a Doc using a ContentContainer.
|
|
24
|
-
*
|
|
25
|
-
* Tries explicit `{[audio=filename.mp3]}` annotations first,
|
|
26
|
-
* then falls back to auto-matching by content similarity.
|
|
27
|
-
*
|
|
28
|
-
* Returns a new Doc with `audio.segments` populated and blocks
|
|
29
|
-
* assigned to the correct `audioSegment` indices.
|
|
30
|
-
*
|
|
31
|
-
* @param doc - The source Doc (not mutated).
|
|
32
|
-
* @param container - ContentContainer with MP3 and timing files.
|
|
33
|
-
* @returns New Doc with audio segments resolved, or original doc if no matches.
|
|
34
|
-
*/
|
|
35
|
-
export declare function resolveAudioMapping(doc: Doc, container: ContentContainer): Promise<Doc>;
|
|
36
|
-
//# sourceMappingURL=audioMapping.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audioMapping.d.ts","sourceRoot":"","sources":["../../src/doc/audioMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAwC,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAqCvE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAYhE;AA2QD;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAqD7F"}
|
package/dist/doc/audioMapping.js
DELETED
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Audio Mapping
|
|
3
|
-
*
|
|
4
|
-
* Associates audio segments (MP3 files) with document blocks.
|
|
5
|
-
* Supports two modes:
|
|
6
|
-
*
|
|
7
|
-
* 1. **Explicit annotation**: Blocks with `{[audio=filename.mp3]}` in their
|
|
8
|
-
* heading annotation are directly mapped to that audio file.
|
|
9
|
-
*
|
|
10
|
-
* 2. **Auto-matching**: When no annotations exist but the container has MP3s
|
|
11
|
-
* with `.timing.json` files, matches MP3s to blocks by comparing the
|
|
12
|
-
* timing.json `sourceText` against block text content (word overlap).
|
|
13
|
-
* Falls back to filename-based matching (slugified title comparison).
|
|
14
|
-
*/
|
|
15
|
-
import { extractPlainText } from '../markdown/utils.js';
|
|
16
|
-
// ── Helpers ──────────────────────────────────────────────────────────
|
|
17
|
-
/**
|
|
18
|
-
* Parse a timing.json file from raw data.
|
|
19
|
-
*/
|
|
20
|
-
function parseTimingJson(data) {
|
|
21
|
-
try {
|
|
22
|
-
const text = new TextDecoder().decode(data);
|
|
23
|
-
const parsed = JSON.parse(text);
|
|
24
|
-
if (parsed && typeof parsed.sourceText === 'string' && typeof parsed.duration === 'number') {
|
|
25
|
-
return {
|
|
26
|
-
sourceText: parsed.sourceText,
|
|
27
|
-
bookmarks: Array.isArray(parsed.bookmarks) ? parsed.bookmarks : [],
|
|
28
|
-
duration: parsed.duration,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Normalize text for comparison: lowercase, strip punctuation, split into word set.
|
|
39
|
-
*/
|
|
40
|
-
function normalizeToWords(text) {
|
|
41
|
-
const words = text
|
|
42
|
-
.toLowerCase()
|
|
43
|
-
.replace(/[^\w\s]/g, ' ')
|
|
44
|
-
.split(/\s+/)
|
|
45
|
-
.filter((w) => w.length > 2);
|
|
46
|
-
return new Set(words);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Calculate Jaccard similarity between two texts (word overlap).
|
|
50
|
-
* Returns 0–1 where 1 = identical word sets.
|
|
51
|
-
*/
|
|
52
|
-
export function scoreTextSimilarity(a, b) {
|
|
53
|
-
const wordsA = normalizeToWords(a);
|
|
54
|
-
const wordsB = normalizeToWords(b);
|
|
55
|
-
if (wordsA.size === 0 || wordsB.size === 0)
|
|
56
|
-
return 0;
|
|
57
|
-
let intersection = 0;
|
|
58
|
-
for (const w of wordsA) {
|
|
59
|
-
if (wordsB.has(w))
|
|
60
|
-
intersection++;
|
|
61
|
-
}
|
|
62
|
-
const union = new Set([...wordsA, ...wordsB]).size;
|
|
63
|
-
return union > 0 ? intersection / union : 0;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Slugify a title for filename comparison.
|
|
67
|
-
* "The Behring Gambit" → "the-behring-gambit"
|
|
68
|
-
*/
|
|
69
|
-
function slugify(text) {
|
|
70
|
-
return text
|
|
71
|
-
.toLowerCase()
|
|
72
|
-
.replace(/[^\w\s-]/g, '')
|
|
73
|
-
.replace(/\s+/g, '-')
|
|
74
|
-
.replace(/-+/g, '-')
|
|
75
|
-
.replace(/^-|-$/g, '');
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Extract plain text from a block's contents and title.
|
|
79
|
-
*/
|
|
80
|
-
function blockToPlainText(block) {
|
|
81
|
-
const parts = [];
|
|
82
|
-
if (block.title)
|
|
83
|
-
parts.push(block.title);
|
|
84
|
-
if (block.contents) {
|
|
85
|
-
for (const node of block.contents) {
|
|
86
|
-
parts.push(extractPlainText(node));
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return parts.join('\n');
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Flatten a block tree into a linear array of leaf blocks
|
|
93
|
-
* (blocks that represent actual content sections).
|
|
94
|
-
*/
|
|
95
|
-
function flattenForAudio(blocks) {
|
|
96
|
-
const result = [];
|
|
97
|
-
for (const block of blocks) {
|
|
98
|
-
if (block.children && block.children.length > 0) {
|
|
99
|
-
result.push(...flattenForAudio(block.children));
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
result.push(block);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return result;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* File extensions that unambiguously denote audio anywhere in the
|
|
109
|
-
* container. These predate the recorder feature.
|
|
110
|
-
*/
|
|
111
|
-
const AUDIO_ONLY_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.m4a'];
|
|
112
|
-
/**
|
|
113
|
-
* Extensions that could be audio or video — `.webm` and `.mp4` are the
|
|
114
|
-
* containers `MediaRecorder` produces for browser-side narration, but
|
|
115
|
-
* they're also used for video clips. Only treat them as narration when
|
|
116
|
-
* they live under the `audio/` directory the recorder writes to.
|
|
117
|
-
*/
|
|
118
|
-
const AMBIGUOUS_EXTENSIONS = ['.webm', '.mp4'];
|
|
119
|
-
function isNarrationAudioPath(path) {
|
|
120
|
-
const lower = path.toLowerCase();
|
|
121
|
-
if (AUDIO_ONLY_EXTENSIONS.some((ext) => lower.endsWith(ext)))
|
|
122
|
-
return true;
|
|
123
|
-
if (AMBIGUOUS_EXTENSIONS.some((ext) => lower.endsWith(ext))) {
|
|
124
|
-
return lower.startsWith('audio/');
|
|
125
|
-
}
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
/** Strip a known narration audio extension from a filename. */
|
|
129
|
-
function stripAudioExtension(filename) {
|
|
130
|
-
const lower = filename.toLowerCase();
|
|
131
|
-
for (const ext of [...AUDIO_ONLY_EXTENSIONS, ...AMBIGUOUS_EXTENSIONS]) {
|
|
132
|
-
if (lower.endsWith(ext))
|
|
133
|
-
return filename.slice(0, -ext.length);
|
|
134
|
-
}
|
|
135
|
-
return filename;
|
|
136
|
-
}
|
|
137
|
-
// ── Core Functions ───────────────────────────────────────────────────
|
|
138
|
-
/**
|
|
139
|
-
* Parse a consolidated timing.json (version 2) which contains all section
|
|
140
|
-
* timing data in a single file.
|
|
141
|
-
*/
|
|
142
|
-
function parseConsolidatedTiming(data) {
|
|
143
|
-
try {
|
|
144
|
-
const text = new TextDecoder().decode(data);
|
|
145
|
-
const parsed = JSON.parse(text);
|
|
146
|
-
if (parsed && parsed.version === 2 && parsed.sections) {
|
|
147
|
-
return parsed.sections;
|
|
148
|
-
}
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Discover all narration audio files in a container and load their
|
|
157
|
-
* timing data. Covers historical `.mp3`/`.wav`/`.ogg`/`.m4a` files
|
|
158
|
-
* anywhere in the container plus `.webm`/`.mp4` files under `audio/`
|
|
159
|
-
* (the destination the browser recorder writes to).
|
|
160
|
-
*
|
|
161
|
-
* Checks for a consolidated timing.json first, then falls back to
|
|
162
|
-
* per-file `.timing.json` sidecars.
|
|
163
|
-
*/
|
|
164
|
-
async function discoverMp3s(container) {
|
|
165
|
-
const files = await container.listFiles();
|
|
166
|
-
const audioFiles = files.filter((f) => isNarrationAudioPath(f.path));
|
|
167
|
-
const results = [];
|
|
168
|
-
// Try to load consolidated timing.json
|
|
169
|
-
let consolidatedSections = null;
|
|
170
|
-
const consolidatedData = await container.readFile('timing.json');
|
|
171
|
-
if (consolidatedData) {
|
|
172
|
-
consolidatedSections = parseConsolidatedTiming(consolidatedData);
|
|
173
|
-
}
|
|
174
|
-
for (const file of audioFiles) {
|
|
175
|
-
const filename = file.path.split('/').pop() ?? file.path;
|
|
176
|
-
let timing = null;
|
|
177
|
-
// Try consolidated timing first: match section name from filename
|
|
178
|
-
if (consolidatedSections) {
|
|
179
|
-
const audioBase = stripAudioExtension(filename);
|
|
180
|
-
for (const [sectionName, sectionTiming] of Object.entries(consolidatedSections)) {
|
|
181
|
-
if (audioBase.endsWith(`-${sectionName}`)) {
|
|
182
|
-
timing = sectionTiming;
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
// Fall back to per-file .timing.json
|
|
188
|
-
if (!timing) {
|
|
189
|
-
const timingPath = `${file.path}.timing.json`;
|
|
190
|
-
const timingData = await container.readFile(timingPath);
|
|
191
|
-
if (timingData) {
|
|
192
|
-
timing = parseTimingJson(timingData);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
results.push({ path: file.path, filename, timing });
|
|
196
|
-
}
|
|
197
|
-
return results;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Resolve audio from explicit `{[audio=filename.mp3]}` annotations on blocks.
|
|
201
|
-
* Returns the matched pairs or an empty array if no annotations found.
|
|
202
|
-
*/
|
|
203
|
-
function resolveFromAnnotations(blocks, mp3s) {
|
|
204
|
-
const matches = [];
|
|
205
|
-
const flat = flattenForAudio(blocks);
|
|
206
|
-
for (const block of flat) {
|
|
207
|
-
const audioRef = block.templateOverrides?.audio;
|
|
208
|
-
if (!audioRef)
|
|
209
|
-
continue;
|
|
210
|
-
// Find the MP3 by filename (exact or suffix match)
|
|
211
|
-
const mp3 = mp3s.find((m) => m.filename === audioRef || m.path === audioRef || m.path.endsWith(`/${audioRef}`));
|
|
212
|
-
if (mp3) {
|
|
213
|
-
matches.push({ block, mp3 });
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return matches;
|
|
217
|
-
}
|
|
218
|
-
/** Minimum similarity score to consider a content match. */
|
|
219
|
-
const MIN_CONTENT_SIMILARITY = 0.35;
|
|
220
|
-
/** Minimum similarity score for filename-based matching. */
|
|
221
|
-
const MIN_FILENAME_SIMILARITY = 0.5;
|
|
222
|
-
/**
|
|
223
|
-
* Auto-match MP3 files to blocks by content similarity.
|
|
224
|
-
* Uses timing.json sourceText when available, falls back to filename matching.
|
|
225
|
-
*/
|
|
226
|
-
function autoMatchBlocks(blocks, mp3s) {
|
|
227
|
-
const flat = flattenForAudio(blocks);
|
|
228
|
-
if (flat.length === 0 || mp3s.length === 0)
|
|
229
|
-
return [];
|
|
230
|
-
// Score all (mp3, block) pairs
|
|
231
|
-
const scoredPairs = [];
|
|
232
|
-
for (let mi = 0; mi < mp3s.length; mi++) {
|
|
233
|
-
const mp3 = mp3s[mi];
|
|
234
|
-
for (let bi = 0; bi < flat.length; bi++) {
|
|
235
|
-
const block = flat[bi];
|
|
236
|
-
const blockText = blockToPlainText(block);
|
|
237
|
-
if (!blockText.trim())
|
|
238
|
-
continue;
|
|
239
|
-
let score = 0;
|
|
240
|
-
// Primary: content similarity via timing.json sourceText
|
|
241
|
-
if (mp3.timing?.sourceText) {
|
|
242
|
-
score = scoreTextSimilarity(mp3.timing.sourceText, blockText);
|
|
243
|
-
}
|
|
244
|
-
// Fallback: filename-based matching
|
|
245
|
-
if (score < MIN_CONTENT_SIMILARITY && block.title) {
|
|
246
|
-
const titleSlug = slugify(block.title);
|
|
247
|
-
const fileSlug = slugify(stripAudioExtension(mp3.filename));
|
|
248
|
-
// Check if the title slug appears in the filename slug
|
|
249
|
-
if (fileSlug.includes(titleSlug) && titleSlug.length >= 3) {
|
|
250
|
-
score = Math.max(score, MIN_FILENAME_SIMILARITY + 0.1);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
if (score >= MIN_CONTENT_SIMILARITY) {
|
|
254
|
-
scoredPairs.push({ block, blockIndex: bi, mp3, mp3Index: mi, score });
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
// Greedy assignment: highest score first, each mp3 and block used at most once
|
|
259
|
-
scoredPairs.sort((a, b) => b.score - a.score);
|
|
260
|
-
const usedBlocks = new Set();
|
|
261
|
-
const usedMp3s = new Set();
|
|
262
|
-
const matches = [];
|
|
263
|
-
for (const pair of scoredPairs) {
|
|
264
|
-
if (usedBlocks.has(pair.blockIndex) || usedMp3s.has(pair.mp3Index))
|
|
265
|
-
continue;
|
|
266
|
-
usedBlocks.add(pair.blockIndex);
|
|
267
|
-
usedMp3s.add(pair.mp3Index);
|
|
268
|
-
matches.push({ block: pair.block, mp3: pair.mp3, score: pair.score });
|
|
269
|
-
}
|
|
270
|
-
return matches;
|
|
271
|
-
}
|
|
272
|
-
// ── Public API ───────────────────────────────────────────────────────
|
|
273
|
-
/**
|
|
274
|
-
* Resolve audio mapping for a Doc using a ContentContainer.
|
|
275
|
-
*
|
|
276
|
-
* Tries explicit `{[audio=filename.mp3]}` annotations first,
|
|
277
|
-
* then falls back to auto-matching by content similarity.
|
|
278
|
-
*
|
|
279
|
-
* Returns a new Doc with `audio.segments` populated and blocks
|
|
280
|
-
* assigned to the correct `audioSegment` indices.
|
|
281
|
-
*
|
|
282
|
-
* @param doc - The source Doc (not mutated).
|
|
283
|
-
* @param container - ContentContainer with MP3 and timing files.
|
|
284
|
-
* @returns New Doc with audio segments resolved, or original doc if no matches.
|
|
285
|
-
*/
|
|
286
|
-
export async function resolveAudioMapping(doc, container) {
|
|
287
|
-
// Discover MP3 files and their timing data
|
|
288
|
-
const mp3s = await discoverMp3s(container);
|
|
289
|
-
if (mp3s.length === 0)
|
|
290
|
-
return doc;
|
|
291
|
-
// Try annotations first
|
|
292
|
-
let matches = resolveFromAnnotations(doc.blocks, mp3s);
|
|
293
|
-
// Fall back to auto-matching if no annotations found
|
|
294
|
-
if (matches.length === 0) {
|
|
295
|
-
matches = autoMatchBlocks(doc.blocks, mp3s).map((m) => ({
|
|
296
|
-
block: m.block,
|
|
297
|
-
mp3: m.mp3,
|
|
298
|
-
}));
|
|
299
|
-
}
|
|
300
|
-
if (matches.length === 0)
|
|
301
|
-
return doc;
|
|
302
|
-
// Build audio segments in document order
|
|
303
|
-
// Sort matches by the block's position in the flattened tree
|
|
304
|
-
const flat = flattenForAudio(doc.blocks);
|
|
305
|
-
const blockOrder = new Map(flat.map((b, i) => [b.id, i]));
|
|
306
|
-
matches.sort((a, b) => (blockOrder.get(a.block.id) ?? 0) - (blockOrder.get(b.block.id) ?? 0));
|
|
307
|
-
// Build segment list and assign indices
|
|
308
|
-
const segments = [];
|
|
309
|
-
const blockToSegment = new Map();
|
|
310
|
-
let startTime = 0;
|
|
311
|
-
for (let i = 0; i < matches.length; i++) {
|
|
312
|
-
const { block, mp3 } = matches[i];
|
|
313
|
-
const duration = mp3.timing?.duration ?? 30; // Fallback duration if no timing
|
|
314
|
-
segments.push({
|
|
315
|
-
src: mp3.path,
|
|
316
|
-
name: block.title ?? block.id,
|
|
317
|
-
duration,
|
|
318
|
-
startTime,
|
|
319
|
-
});
|
|
320
|
-
blockToSegment.set(block.id, i);
|
|
321
|
-
startTime += duration;
|
|
322
|
-
}
|
|
323
|
-
// Deep clone blocks and assign audioSegment indices
|
|
324
|
-
const newBlocks = assignSegmentIndices(doc.blocks, blockToSegment);
|
|
325
|
-
return {
|
|
326
|
-
...doc,
|
|
327
|
-
blocks: newBlocks,
|
|
328
|
-
duration: startTime,
|
|
329
|
-
audio: { segments },
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Recursively clone blocks and assign audioSegment indices.
|
|
334
|
-
* Blocks not in the map keep their original audioSegment.
|
|
335
|
-
* Children of a matched block inherit the parent's segment.
|
|
336
|
-
*/
|
|
337
|
-
function assignSegmentIndices(blocks, blockToSegment, inheritedSegment) {
|
|
338
|
-
return blocks.map((block) => {
|
|
339
|
-
const segment = blockToSegment.get(block.id) ?? inheritedSegment ?? block.audioSegment;
|
|
340
|
-
const newBlock = {
|
|
341
|
-
...block,
|
|
342
|
-
audioSegment: segment,
|
|
343
|
-
};
|
|
344
|
-
if (block.children) {
|
|
345
|
-
newBlock.children = assignSegmentIndices(block.children, blockToSegment, segment);
|
|
346
|
-
}
|
|
347
|
-
return newBlock;
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
//# sourceMappingURL=audioMapping.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audioMapping.js","sourceRoot":"","sources":["../../src/doc/audioMapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Doc → Markdown Conversion
|
|
3
|
-
*
|
|
4
|
-
* Converts a Doc with a heading-driven Block hierarchy back into a
|
|
5
|
-
* MarkdownDocument. This is the reverse of markdownToDoc() and enables
|
|
6
|
-
* round-tripping: edit a Doc's block tree, then serialize back to markdown.
|
|
7
|
-
*
|
|
8
|
-
* **Algorithm:**
|
|
9
|
-
* Walk the block tree depth-first. For each block:
|
|
10
|
-
* 1. If it has a `sourceHeading`, emit that heading node
|
|
11
|
-
* 2. Emit all nodes in `contents`
|
|
12
|
-
* 3. Recurse into `children`
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```ts
|
|
16
|
-
* import { markdownToDoc, docToMarkdown } from '@bendyline/squisq/doc';
|
|
17
|
-
* import { parseMarkdown, stringifyMarkdown } from '@bendyline/squisq/markdown';
|
|
18
|
-
*
|
|
19
|
-
* const md = '# Hello\n\nWorld\n';
|
|
20
|
-
* const doc = markdownToDoc(parseMarkdown(md));
|
|
21
|
-
* const roundTripped = stringifyMarkdown(docToMarkdown(doc));
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
import type { Doc } from '../schemas/Doc.js';
|
|
25
|
-
import type { MarkdownDocument } from '../markdown/types.js';
|
|
26
|
-
/**
|
|
27
|
-
* Convert a Doc with heading-driven blocks back to a MarkdownDocument.
|
|
28
|
-
*
|
|
29
|
-
* Walks the block tree depth-first, emitting heading nodes and contents
|
|
30
|
-
* in document order. Blocks without a `sourceHeading` (preamble blocks)
|
|
31
|
-
* emit only their contents.
|
|
32
|
-
*
|
|
33
|
-
* If a block has a `template` or `templateOverrides` that aren't already
|
|
34
|
-
* reflected in the heading's `templateAnnotation`, the annotation is
|
|
35
|
-
* injected so the round-trip preserves template assignments.
|
|
36
|
-
*
|
|
37
|
-
* @param doc - A Doc whose blocks may have `sourceHeading`, `contents`, and `children`
|
|
38
|
-
* @returns A MarkdownDocument that can be stringified back to markdown
|
|
39
|
-
*/
|
|
40
|
-
export declare function docToMarkdown(doc: Doc): MarkdownDocument;
|
|
41
|
-
//# sourceMappingURL=docToMarkdown.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docToMarkdown.d.ts","sourceRoot":"","sources":["../../src/doc/docToMarkdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAS,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,sBAAsB,CAAC;AAEjG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB,CA+BxD"}
|