react-cheminfo 0.7.0 → 0.9.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/README.md +60 -2
- package/bin/check-tokens.mjs +105 -0
- package/lib/about/core/about.d.ts +95 -0
- package/lib/about/core/about.d.ts.map +1 -0
- package/lib/about/core/about.js +78 -0
- package/lib/about/core/about.js.map +1 -0
- package/lib/about/core/index.d.ts +3 -0
- package/lib/about/core/index.d.ts.map +1 -0
- package/lib/about/core/index.js +2 -0
- package/lib/about/core/index.js.map +1 -0
- package/lib/about/ui/AboutCitations.d.ts +14 -0
- package/lib/about/ui/AboutCitations.d.ts.map +1 -0
- package/lib/about/ui/AboutCitations.js +40 -0
- package/lib/about/ui/AboutCitations.js.map +1 -0
- package/lib/about/ui/AboutPage.d.ts +32 -0
- package/lib/about/ui/AboutPage.d.ts.map +1 -0
- package/lib/about/ui/AboutPage.js +70 -0
- package/lib/about/ui/AboutPage.js.map +1 -0
- package/lib/about/ui/AboutSection.d.ts +23 -0
- package/lib/about/ui/AboutSection.d.ts.map +1 -0
- package/lib/about/ui/AboutSection.js +28 -0
- package/lib/about/ui/AboutSection.js.map +1 -0
- package/lib/about/ui/index.d.ts +7 -0
- package/lib/about/ui/index.d.ts.map +1 -0
- package/lib/about/ui/index.js +4 -0
- package/lib/about/ui/index.js.map +1 -0
- package/lib/chrome/ui/index.d.ts +1 -0
- package/lib/chrome/ui/index.d.ts.map +1 -1
- package/lib/chrome/ui/index.js +3 -0
- package/lib/chrome/ui/index.js.map +1 -1
- package/lib/citation/core/index.d.ts +1 -0
- package/lib/citation/core/index.d.ts.map +1 -1
- package/lib/citation/core/index.js +1 -0
- package/lib/citation/core/index.js.map +1 -1
- package/lib/citation/core/teachingPaper.d.ts +15 -0
- package/lib/citation/core/teachingPaper.d.ts.map +1 -0
- package/lib/citation/core/teachingPaper.js +32 -0
- package/lib/citation/core/teachingPaper.js.map +1 -0
- package/lib/clipboard/ui/CodeBlock.d.ts.map +1 -1
- package/lib/clipboard/ui/CodeBlock.js +4 -1
- package/lib/clipboard/ui/CodeBlock.js.map +1 -1
- package/lib/color/ui/ColorScaleLegend.js +1 -1
- package/lib/color/ui/ColorScaleLegend.js.map +1 -1
- package/lib/core.d.ts +3 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +5 -0
- package/lib/core.js.map +1 -1
- package/lib/credits/core/credits.d.ts +36 -0
- package/lib/credits/core/credits.d.ts.map +1 -1
- package/lib/credits/core/credits.js +42 -0
- package/lib/credits/core/credits.js.map +1 -1
- package/lib/credits/ui/CreditsList.js +1 -1
- package/lib/credits/ui/CreditsList.js.map +1 -1
- package/lib/delimited/ui/DelimitedTextPanel.js +1 -1
- package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -1
- package/lib/ecosystem/core/sites.d.ts +1 -1
- package/lib/ecosystem/core/sites.d.ts.map +1 -1
- package/lib/ecosystem/core/sites.js +10 -0
- package/lib/ecosystem/core/sites.js.map +1 -1
- package/lib/ecosystem/core/tokens.d.ts.map +1 -1
- package/lib/ecosystem/core/tokens.js +1 -0
- package/lib/ecosystem/core/tokens.js.map +1 -1
- package/lib/ecosystem/ui/EcosystemLinks.js +2 -2
- package/lib/ecosystem/ui/EcosystemLinks.js.map +1 -1
- package/lib/ecosystem/ui/EcosystemMenu.js +1 -1
- package/lib/ecosystem/ui/EcosystemMenu.js.map +1 -1
- package/lib/ecosystem/ui/SiteTile.d.ts.map +1 -1
- package/lib/ecosystem/ui/SiteTile.js +5 -5
- package/lib/ecosystem/ui/SiteTile.js.map +1 -1
- package/lib/ecosystem/ui/glyphs.d.ts.map +1 -1
- package/lib/ecosystem/ui/glyphs.js +3 -0
- package/lib/ecosystem/ui/glyphs.js.map +1 -1
- package/lib/orbital/core/index.d.ts +1 -1
- package/lib/orbital/core/index.d.ts.map +1 -1
- package/lib/orbital/core/index.js +1 -1
- package/lib/orbital/core/index.js.map +1 -1
- package/lib/orbital/core/realHarmonics.d.ts +5 -2
- package/lib/orbital/core/realHarmonics.d.ts.map +1 -1
- package/lib/orbital/core/realHarmonics.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +18 -0
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.js +84 -7
- package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +13 -0
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.js +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
- package/lib/orbital/ui/camera.d.ts +15 -0
- package/lib/orbital/ui/camera.d.ts.map +1 -1
- package/lib/orbital/ui/camera.js +68 -0
- package/lib/orbital/ui/camera.js.map +1 -1
- package/lib/orbital/ui/renderVolume.d.ts.map +1 -1
- package/lib/orbital/ui/renderVolume.js +8 -1
- package/lib/orbital/ui/renderVolume.js.map +1 -1
- package/lib/orbital/ui/serial.d.ts +25 -0
- package/lib/orbital/ui/serial.d.ts.map +1 -0
- package/lib/orbital/ui/serial.js +25 -0
- package/lib/orbital/ui/serial.js.map +1 -0
- package/lib/orbital/ui/viewer.d.ts +23 -0
- package/lib/orbital/ui/viewer.d.ts.map +1 -1
- package/lib/orbital/ui/viewer.js +70 -17
- package/lib/orbital/ui/viewer.js.map +1 -1
- package/lib/pedagogy/ui/ExerciseProgressHeader.js +1 -1
- package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -1
- package/lib/pedagogy/ui/GlossaryText.js +2 -2
- package/lib/pedagogy/ui/GlossaryText.js.map +1 -1
- package/lib/pedagogy/ui/ReferenceSectionBlock.js +5 -2
- package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -1
- package/lib/pedagogy/ui/SyntaxTooltip.js +2 -2
- package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -1
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts +15 -2
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -1
- package/lib/pedagogy/ui/TutorialStepStrip.js +19 -5
- package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -1
- package/lib/pedagogy/ui/index.d.ts +1 -1
- package/lib/pedagogy/ui/index.d.ts.map +1 -1
- package/lib/pedagogy/ui/index.js.map +1 -1
- package/lib/periodic/ui/CategoryLegend.js +1 -1
- package/lib/periodic/ui/CategoryLegend.js.map +1 -1
- package/lib/periodic/ui/PeriodicTableChrome.js +2 -2
- package/lib/periodic/ui/PeriodicTableChrome.js.map +1 -1
- package/lib/seo/vite/ogCard.d.ts.map +1 -1
- package/lib/seo/vite/ogCard.js +1 -0
- package/lib/seo/vite/ogCard.js.map +1 -1
- package/lib/share/ui/ShareDialogContent.d.ts.map +1 -1
- package/lib/share/ui/ShareDialogContent.js +5 -2
- package/lib/share/ui/ShareDialogContent.js.map +1 -1
- package/lib/share/ui/SharePartOptions.js +1 -1
- package/lib/share/ui/SharePartOptions.js.map +1 -1
- package/lib/slides/core/demoLinks.d.ts +43 -0
- package/lib/slides/core/demoLinks.d.ts.map +1 -0
- package/lib/slides/core/demoLinks.js +104 -0
- package/lib/slides/core/demoLinks.js.map +1 -0
- package/lib/slides/core/index.d.ts +13 -0
- package/lib/slides/core/index.d.ts.map +1 -0
- package/lib/slides/core/index.js +7 -0
- package/lib/slides/core/index.js.map +1 -0
- package/lib/slides/core/sectionHeading.d.ts +19 -0
- package/lib/slides/core/sectionHeading.d.ts.map +1 -0
- package/lib/slides/core/sectionHeading.js +19 -0
- package/lib/slides/core/sectionHeading.js.map +1 -0
- package/lib/slides/core/slideNavigation.d.ts +38 -0
- package/lib/slides/core/slideNavigation.d.ts.map +1 -0
- package/lib/slides/core/slideNavigation.js +65 -0
- package/lib/slides/core/slideNavigation.js.map +1 -0
- package/lib/slides/core/talk.d.ts +82 -0
- package/lib/slides/core/talk.d.ts.map +1 -0
- package/lib/slides/core/talk.js +134 -0
- package/lib/slides/core/talk.js.map +1 -0
- package/lib/slides/core/talkManifest.d.ts +90 -0
- package/lib/slides/core/talkManifest.d.ts.map +1 -0
- package/lib/slides/core/talkManifest.js +109 -0
- package/lib/slides/core/talkManifest.js.map +1 -0
- package/lib/slides/core/talkOrigin.d.ts +50 -0
- package/lib/slides/core/talkOrigin.d.ts.map +1 -0
- package/lib/slides/core/talkOrigin.js +62 -0
- package/lib/slides/core/talkOrigin.js.map +1 -0
- package/lib/slides/ui/BackToSlides.d.ts +26 -0
- package/lib/slides/ui/BackToSlides.d.ts.map +1 -0
- package/lib/slides/ui/BackToSlides.js +24 -0
- package/lib/slides/ui/BackToSlides.js.map +1 -0
- package/lib/slides/ui/DemoLink.d.ts +42 -0
- package/lib/slides/ui/DemoLink.d.ts.map +1 -0
- package/lib/slides/ui/DemoLink.js +17 -0
- package/lib/slides/ui/DemoLink.js.map +1 -0
- package/lib/slides/ui/EmbedSlide.d.ts +19 -0
- package/lib/slides/ui/EmbedSlide.d.ts.map +1 -0
- package/lib/slides/ui/EmbedSlide.js +56 -0
- package/lib/slides/ui/EmbedSlide.js.map +1 -0
- package/lib/slides/ui/SectionSlide.d.ts +18 -0
- package/lib/slides/ui/SectionSlide.d.ts.map +1 -0
- package/lib/slides/ui/SectionSlide.js +18 -0
- package/lib/slides/ui/SectionSlide.js.map +1 -0
- package/lib/slides/ui/Slide.d.ts +52 -0
- package/lib/slides/ui/Slide.d.ts.map +1 -0
- package/lib/slides/ui/Slide.js +58 -0
- package/lib/slides/ui/Slide.js.map +1 -0
- package/lib/slides/ui/SlideBody.d.ts +32 -0
- package/lib/slides/ui/SlideBody.d.ts.map +1 -0
- package/lib/slides/ui/SlideBody.js +27 -0
- package/lib/slides/ui/SlideBody.js.map +1 -0
- package/lib/slides/ui/Slideshow.d.ts +93 -0
- package/lib/slides/ui/Slideshow.d.ts.map +1 -0
- package/lib/slides/ui/Slideshow.js +122 -0
- package/lib/slides/ui/Slideshow.js.map +1 -0
- package/lib/slides/ui/SlideshowBar.d.ts +33 -0
- package/lib/slides/ui/SlideshowBar.d.ts.map +1 -0
- package/lib/slides/ui/SlideshowBar.js +20 -0
- package/lib/slides/ui/SlideshowBar.js.map +1 -0
- package/lib/slides/ui/TalkList.d.ts +37 -0
- package/lib/slides/ui/TalkList.d.ts.map +1 -0
- package/lib/slides/ui/TalkList.js +68 -0
- package/lib/slides/ui/TalkList.js.map +1 -0
- package/lib/slides/ui/index.d.ts +19 -0
- package/lib/slides/ui/index.d.ts.map +1 -0
- package/lib/slides/ui/index.js +10 -0
- package/lib/slides/ui/index.js.map +1 -0
- package/lib/slides/vite/index.d.ts +3 -0
- package/lib/slides/vite/index.d.ts.map +1 -0
- package/lib/slides/vite/index.js +2 -0
- package/lib/slides/vite/index.js.map +1 -0
- package/lib/slides/vite/talks.d.ts +50 -0
- package/lib/slides/vite/talks.d.ts.map +1 -0
- package/lib/slides/vite/talks.js +87 -0
- package/lib/slides/vite/talks.js.map +1 -0
- package/lib/slides.d.ts +3 -0
- package/lib/slides.d.ts.map +1 -0
- package/lib/slides.js +3 -0
- package/lib/slides.js.map +1 -0
- package/lib/structure/ui/StructureEditor.js +2 -2
- package/lib/structure/ui/StructureEditor.js.map +1 -1
- package/lib/structure/ui/StructurePlaceholder.js +1 -1
- package/lib/structure/ui/StructurePlaceholder.js.map +1 -1
- package/lib/tokens/core/checkTokens.d.ts +51 -0
- package/lib/tokens/core/checkTokens.d.ts.map +1 -0
- package/lib/tokens/core/checkTokens.js +188 -0
- package/lib/tokens/core/checkTokens.js.map +1 -0
- package/lib/tokens/core/colors.d.ts +42 -0
- package/lib/tokens/core/colors.d.ts.map +1 -0
- package/lib/tokens/core/colors.js +119 -0
- package/lib/tokens/core/colors.js.map +1 -0
- package/lib/tokens/core/index.d.ts +3 -0
- package/lib/tokens/core/index.d.ts.map +1 -0
- package/lib/tokens/core/index.js +2 -0
- package/lib/tokens/core/index.js.map +1 -0
- package/lib/tokens/core/rules.d.ts +23 -0
- package/lib/tokens/core/rules.d.ts.map +1 -0
- package/lib/tokens/core/rules.js +90 -0
- package/lib/tokens/core/rules.js.map +1 -0
- package/lib/ui.d.ts +1 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +1 -0
- package/lib/ui.js.map +1 -1
- package/lib/vite.d.ts +1 -0
- package/lib/vite.d.ts.map +1 -1
- package/lib/vite.js +1 -0
- package/lib/vite.js.map +1 -1
- package/package.json +11 -3
- package/src/about/core/about.ts +176 -0
- package/src/about/core/index.ts +2 -0
- package/src/about/ui/AboutCitations.tsx +79 -0
- package/src/about/ui/AboutPage.tsx +177 -0
- package/src/about/ui/AboutSection.tsx +56 -0
- package/src/about/ui/index.ts +6 -0
- package/src/chrome/ui/index.ts +3 -0
- package/src/citation/core/index.ts +1 -0
- package/src/citation/core/teachingPaper.ts +36 -0
- package/src/clipboard/ui/CodeBlock.tsx +4 -1
- package/src/color/ui/ColorScaleLegend.tsx +1 -1
- package/src/core.ts +5 -0
- package/src/credits/core/credits.ts +42 -0
- package/src/credits/ui/CreditsList.tsx +1 -1
- package/src/delimited/ui/DelimitedTextPanel.tsx +1 -1
- package/src/ecosystem/core/sites.ts +12 -0
- package/src/ecosystem/core/tokens.ts +1 -0
- package/src/ecosystem/ui/EcosystemLinks.tsx +2 -2
- package/src/ecosystem/ui/EcosystemMenu.tsx +1 -1
- package/src/ecosystem/ui/SiteTile.tsx +7 -5
- package/src/ecosystem/ui/glyphs.tsx +40 -0
- package/src/orbital/core/index.ts +4 -1
- package/src/orbital/core/realHarmonics.ts +5 -2
- package/src/orbital/ui/AtomicOrbitalCanvas.tsx +126 -4
- package/src/orbital/ui/AtomicOrbitalViewer.tsx +14 -1
- package/src/orbital/ui/camera.ts +81 -0
- package/src/orbital/ui/renderVolume.ts +8 -1
- package/src/orbital/ui/serial.ts +35 -0
- package/src/orbital/ui/viewer.ts +72 -13
- package/src/pedagogy/ui/ExerciseProgressHeader.tsx +1 -1
- package/src/pedagogy/ui/GlossaryText.tsx +2 -2
- package/src/pedagogy/ui/ReferenceSectionBlock.tsx +5 -2
- package/src/pedagogy/ui/SyntaxTooltip.tsx +2 -2
- package/src/pedagogy/ui/TutorialStepStrip.tsx +39 -10
- package/src/pedagogy/ui/index.ts +4 -1
- package/src/periodic/ui/CategoryLegend.tsx +1 -1
- package/src/periodic/ui/PeriodicTableChrome.tsx +2 -2
- package/src/seo/vite/ogCard.ts +1 -0
- package/src/share/ui/ShareDialogContent.tsx +5 -2
- package/src/share/ui/SharePartOptions.tsx +1 -1
- package/src/slides/core/demoLinks.ts +113 -0
- package/src/slides/core/index.ts +22 -0
- package/src/slides/core/sectionHeading.ts +29 -0
- package/src/slides/core/slideNavigation.ts +77 -0
- package/src/slides/core/talk.ts +203 -0
- package/src/slides/core/talkManifest.ts +158 -0
- package/src/slides/core/talkOrigin.ts +83 -0
- package/src/slides/ui/BackToSlides.tsx +49 -0
- package/src/slides/ui/DemoLink.tsx +67 -0
- package/src/slides/ui/EmbedSlide.tsx +85 -0
- package/src/slides/ui/SectionSlide.tsx +44 -0
- package/src/slides/ui/Slide.tsx +143 -0
- package/src/slides/ui/SlideBody.tsx +64 -0
- package/src/slides/ui/Slideshow.tsx +282 -0
- package/src/slides/ui/SlideshowBar.tsx +83 -0
- package/src/slides/ui/TalkList.tsx +146 -0
- package/src/slides/ui/index.ts +18 -0
- package/src/slides/vite/index.ts +2 -0
- package/src/slides/vite/talks.ts +126 -0
- package/src/slides.ts +2 -0
- package/src/structure/ui/StructureEditor.tsx +2 -2
- package/src/structure/ui/StructurePlaceholder.tsx +1 -1
- package/src/tokens/core/checkTokens.ts +242 -0
- package/src/tokens/core/colors.ts +122 -0
- package/src/tokens/core/index.ts +6 -0
- package/src/tokens/core/rules.ts +103 -0
- package/src/ui.ts +1 -0
- package/src/vite.ts +1 -0
- package/styles/chrome.css +1 -0
- package/styles/slides.css +667 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShareDialogContent.js","sourceRoot":"","sources":["../../../src/share/ui/ShareDialogContent.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,EAAE,GACH,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAOpE,OAAO,EACL,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAwB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,GAAkB,
|
|
1
|
+
{"version":3,"file":"ShareDialogContent.js","sourceRoot":"","sources":["../../../src/share/ui/ShareDialogContent.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharePartOptions.js","sourceRoot":"","sources":["../../../src/share/ui/SharePartOptions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,MAAM,YAAY,GAAkB,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAExD,MAAM,iBAAiB,GAAkB;IACvC,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"SharePartOptions.js","sourceRoot":"","sources":["../../../src/share/ui/SharePartOptions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,MAAM,YAAY,GAAkB,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAExD,MAAM,iBAAiB,GAAkB;IACvC,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,4BAA4B;IACnC,QAAQ,EAAE,EAAE;CACb,CAAC;AAWF;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE1C,OAAO,CACL,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,eAAoB,KAAK,EAAE,YAAY,EAAE,SAAS,EAAC,YAAY,aAC7D,KAAC,QAAQ,IACP,OAAO,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EACnC,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClB,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;oBACnD,CAAC,GACD,EACF,eAAM,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAC,wBAAwB,YAC/D,IAAI,CAAC,WAAW,GACZ,KAVC,IAAI,CAAC,GAAG,CAWZ,CACP,CAAC,GACD,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The links a slide hands over to the live tool.
|
|
3
|
+
*
|
|
4
|
+
* A demo link is a paragraph that is exactly one Markdown link to an in-app
|
|
5
|
+
* route. It is parsed by hand rather than by a Markdown library because the
|
|
6
|
+
* labels are chemistry — `[M+H]⁺` opens a bracket the label closes itself, and
|
|
7
|
+
* a formula such as `H(OCH2CH2)10` puts parentheses inside the URL — and both
|
|
8
|
+
* defeat a naive `\[(.*)\]\((.*)\)` pattern.
|
|
9
|
+
*/
|
|
10
|
+
/** One link a slide offers as a live demo. */
|
|
11
|
+
export interface DemoLinkSpec {
|
|
12
|
+
/** The link text, which may itself contain balanced brackets. */
|
|
13
|
+
label: string;
|
|
14
|
+
/** Where it goes; a demo link always targets an in-app route. */
|
|
15
|
+
href: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Read a paragraph that is exactly one Markdown link `[label](url)` and nothing
|
|
19
|
+
* else, counting brackets so a label may hold its own pair, and accepting the
|
|
20
|
+
* angle-bracketed URL form `[label](<url>)` for a URL holding parentheses.
|
|
21
|
+
* @param text - The paragraph text.
|
|
22
|
+
* @returns The link, or `null` when the paragraph is anything else.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseSingleLink(text: string): DemoLinkSpec | null;
|
|
25
|
+
/**
|
|
26
|
+
* Split a slide body into its Markdown and the run of demo links that closes
|
|
27
|
+
* it. External links and ordinary paragraphs stay in the body, so a slide that
|
|
28
|
+
* merely cites a URL keeps it where the author wrote it.
|
|
29
|
+
* @param body - The slide Markdown body.
|
|
30
|
+
* @returns The body without its trailing demo links, and those links in order.
|
|
31
|
+
*/
|
|
32
|
+
export declare function splitDemoLinks(body: string): {
|
|
33
|
+
body: string;
|
|
34
|
+
demos: DemoLinkSpec[];
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* The displayed form of a demo link label: the `Demo:` prefix an author writes
|
|
38
|
+
* to mark the paragraph is dropped, and the first character is uppercased.
|
|
39
|
+
* @param label - The raw link label.
|
|
40
|
+
* @returns What the button shows.
|
|
41
|
+
*/
|
|
42
|
+
export declare function demoLabel(label: string): string;
|
|
43
|
+
//# sourceMappingURL=demoLinks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoLinks.d.ts","sourceRoot":"","sources":["../../../src/slides/core/demoLinks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAmDjE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,CAWA;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The links a slide hands over to the live tool.
|
|
3
|
+
*
|
|
4
|
+
* A demo link is a paragraph that is exactly one Markdown link to an in-app
|
|
5
|
+
* route. It is parsed by hand rather than by a Markdown library because the
|
|
6
|
+
* labels are chemistry — `[M+H]⁺` opens a bracket the label closes itself, and
|
|
7
|
+
* a formula such as `H(OCH2CH2)10` puts parentheses inside the URL — and both
|
|
8
|
+
* defeat a naive `\[(.*)\]\((.*)\)` pattern.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Read a paragraph that is exactly one Markdown link `[label](url)` and nothing
|
|
12
|
+
* else, counting brackets so a label may hold its own pair, and accepting the
|
|
13
|
+
* angle-bracketed URL form `[label](<url>)` for a URL holding parentheses.
|
|
14
|
+
* @param text - The paragraph text.
|
|
15
|
+
* @returns The link, or `null` when the paragraph is anything else.
|
|
16
|
+
*/
|
|
17
|
+
export function parseSingleLink(text) {
|
|
18
|
+
const source = text.trim();
|
|
19
|
+
if (!source.startsWith('['))
|
|
20
|
+
return null;
|
|
21
|
+
let depth = 0;
|
|
22
|
+
let labelEnd = -1;
|
|
23
|
+
for (let index = 0; index < source.length; index++) {
|
|
24
|
+
const char = source[index];
|
|
25
|
+
if (char === '[') {
|
|
26
|
+
depth++;
|
|
27
|
+
}
|
|
28
|
+
else if (char === ']') {
|
|
29
|
+
depth--;
|
|
30
|
+
if (depth === 0) {
|
|
31
|
+
labelEnd = index;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (labelEnd === -1 || source[labelEnd + 1] !== '(')
|
|
37
|
+
return null;
|
|
38
|
+
const label = source.slice(1, labelEnd);
|
|
39
|
+
let rest = source.slice(labelEnd + 2);
|
|
40
|
+
let href;
|
|
41
|
+
if (rest.startsWith('<')) {
|
|
42
|
+
const close = rest.indexOf('>');
|
|
43
|
+
if (close === -1 || rest[close + 1] !== ')')
|
|
44
|
+
return null;
|
|
45
|
+
href = rest.slice(1, close);
|
|
46
|
+
rest = rest.slice(close + 2);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
let parenDepth = 1;
|
|
50
|
+
let urlEnd = -1;
|
|
51
|
+
for (let index = 0; index < rest.length; index++) {
|
|
52
|
+
const char = rest[index];
|
|
53
|
+
if (char === '(') {
|
|
54
|
+
parenDepth++;
|
|
55
|
+
}
|
|
56
|
+
else if (char === ')') {
|
|
57
|
+
parenDepth--;
|
|
58
|
+
if (parenDepth === 0) {
|
|
59
|
+
urlEnd = index;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (urlEnd === -1)
|
|
65
|
+
return null;
|
|
66
|
+
href = rest.slice(0, urlEnd);
|
|
67
|
+
rest = rest.slice(urlEnd + 1);
|
|
68
|
+
}
|
|
69
|
+
if (rest.trim() !== '')
|
|
70
|
+
return null;
|
|
71
|
+
return { label, href };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Split a slide body into its Markdown and the run of demo links that closes
|
|
75
|
+
* it. External links and ordinary paragraphs stay in the body, so a slide that
|
|
76
|
+
* merely cites a URL keeps it where the author wrote it.
|
|
77
|
+
* @param body - The slide Markdown body.
|
|
78
|
+
* @returns The body without its trailing demo links, and those links in order.
|
|
79
|
+
*/
|
|
80
|
+
export function splitDemoLinks(body) {
|
|
81
|
+
const blocks = body.split(/\n{2,}/);
|
|
82
|
+
let firstDemo = blocks.length;
|
|
83
|
+
const demos = [];
|
|
84
|
+
for (let index = blocks.length - 1; index >= 0; index--) {
|
|
85
|
+
const link = parseSingleLink(blocks[index] ?? '');
|
|
86
|
+
if (!link?.href.startsWith('/'))
|
|
87
|
+
break;
|
|
88
|
+
demos.unshift(link);
|
|
89
|
+
firstDemo = index;
|
|
90
|
+
}
|
|
91
|
+
return { body: blocks.slice(0, firstDemo).join('\n\n').trim(), demos };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The displayed form of a demo link label: the `Demo:` prefix an author writes
|
|
95
|
+
* to mark the paragraph is dropped, and the first character is uppercased.
|
|
96
|
+
* @param label - The raw link label.
|
|
97
|
+
* @returns What the button shows.
|
|
98
|
+
*/
|
|
99
|
+
export function demoLabel(label) {
|
|
100
|
+
const text = label.replace(DEMO_PREFIX, '');
|
|
101
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
102
|
+
}
|
|
103
|
+
const DEMO_PREFIX = /^Demo:\s*/i;
|
|
104
|
+
//# sourceMappingURL=demoLinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoLinks.js","sourceRoot":"","sources":["../../../src/slides/core/demoLinks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type { DemoLinkSpec } from './demoLinks.ts';
|
|
2
|
+
export { demoLabel, parseSingleLink, splitDemoLinks } from './demoLinks.ts';
|
|
3
|
+
export type { SectionHeading } from './sectionHeading.ts';
|
|
4
|
+
export { parseSectionHeading } from './sectionHeading.ts';
|
|
5
|
+
export type { SlideAction } from './slideNavigation.ts';
|
|
6
|
+
export { clampSlideIndex, slideActionForKey } from './slideNavigation.ts';
|
|
7
|
+
export type { Slide, Talk, TalkMeta } from './talk.ts';
|
|
8
|
+
export { parseTalk } from './talk.ts';
|
|
9
|
+
export type { TalkManifest, TalkSummary } from './talkManifest.ts';
|
|
10
|
+
export { buildTalkManifest, parseTalkManifest, talkSourceUrl, talkSummary, } from './talkManifest.ts';
|
|
11
|
+
export type { TalkOrigin } from './talkOrigin.ts';
|
|
12
|
+
export { TALK_ORIGIN_PARAM, formatTalkOrigin, parseTalkOrigin, withTalkOrigin, } from './talkOrigin.ts';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/slides/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { demoLabel, parseSingleLink, splitDemoLinks } from "./demoLinks.js";
|
|
2
|
+
export { parseSectionHeading } from "./sectionHeading.js";
|
|
3
|
+
export { clampSlideIndex, slideActionForKey } from "./slideNavigation.js";
|
|
4
|
+
export { parseTalk } from "./talk.js";
|
|
5
|
+
export { buildTalkManifest, parseTalkManifest, talkSourceUrl, talkSummary, } from "./talkManifest.js";
|
|
6
|
+
export { TALK_ORIGIN_PARAM, formatTalkOrigin, parseTalkOrigin, withTalkOrigin, } from "./talkOrigin.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/slides/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** The parts of a section divider's heading. */
|
|
2
|
+
export interface SectionHeading {
|
|
3
|
+
/** The section number, as written; empty when the heading carries none. */
|
|
4
|
+
number: string;
|
|
5
|
+
/** The section title, without its number; empty when the heading carries none. */
|
|
6
|
+
title: string;
|
|
7
|
+
/** Whatever the body holds besides that heading. */
|
|
8
|
+
rest: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Split a section-divider body into its leading number, its title and the rest
|
|
12
|
+
* of the Markdown, so a template can set the number apart from the title.
|
|
13
|
+
* `·`, `.`, `:`, `—` and `-` all separate the two.
|
|
14
|
+
* @param body - Markdown body, normally starting with `# N · Title`.
|
|
15
|
+
* @returns The parsed heading; a body with no numbered heading keeps all of
|
|
16
|
+
* itself in `rest`, leaving `number` and `title` empty.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseSectionHeading(body: string): SectionHeading;
|
|
19
|
+
//# sourceMappingURL=sectionHeading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sectionHeading.d.ts","sourceRoot":"","sources":["../../../src/slides/core/sectionHeading.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAQhE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split a section-divider body into its leading number, its title and the rest
|
|
3
|
+
* of the Markdown, so a template can set the number apart from the title.
|
|
4
|
+
* `·`, `.`, `:`, `—` and `-` all separate the two.
|
|
5
|
+
* @param body - Markdown body, normally starting with `# N · Title`.
|
|
6
|
+
* @returns The parsed heading; a body with no numbered heading keeps all of
|
|
7
|
+
* itself in `rest`, leaving `number` and `title` empty.
|
|
8
|
+
*/
|
|
9
|
+
export function parseSectionHeading(body) {
|
|
10
|
+
const match = HEAD_RE.exec(body);
|
|
11
|
+
const number = match?.groups?.number;
|
|
12
|
+
const title = match?.groups?.title;
|
|
13
|
+
if (match === null || number === undefined || title === undefined) {
|
|
14
|
+
return { number: '', title: '', rest: body.trim() };
|
|
15
|
+
}
|
|
16
|
+
return { number, title, rest: body.replace(match[0], '').trim() };
|
|
17
|
+
}
|
|
18
|
+
const HEAD_RE = /^#\s+(?<number>\d+)\s*[.:·—-]\s*(?<title>.+?)\s*$/m;
|
|
19
|
+
//# sourceMappingURL=sectionHeading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sectionHeading.js","sourceRoot":"","sources":["../../../src/slides/core/sectionHeading.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IACnC,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAClE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,OAAO,GAAG,oDAAoD,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a key does during a presentation, decided without a DOM.
|
|
3
|
+
*
|
|
4
|
+
* The current slide lives in the address, so it arrives as whatever a link
|
|
5
|
+
* carried — a missing number, a negative one, one past the end of a talk that
|
|
6
|
+
* has since been shortened. Every move is therefore clamped here rather than
|
|
7
|
+
* trusted, and the player only ever renders a slide that exists.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The slide a requested index resolves to.
|
|
11
|
+
* @param index - The index asked for, from a link or a keystroke.
|
|
12
|
+
* @param total - How many slides the talk holds.
|
|
13
|
+
* @returns A zero-based index that exists, or `0` for a talk with no slides.
|
|
14
|
+
*/
|
|
15
|
+
export declare function clampSlideIndex(index: number, total: number): number;
|
|
16
|
+
/** What a key press asks the player to do. */
|
|
17
|
+
export type SlideAction = {
|
|
18
|
+
kind: 'go';
|
|
19
|
+
index: number;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'blank';
|
|
22
|
+
color: 'black' | 'white';
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'fullscreen';
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'notes';
|
|
27
|
+
} | null;
|
|
28
|
+
/**
|
|
29
|
+
* The action a key press means, with every move already clamped: stepping past
|
|
30
|
+
* the last slide, or back from the first, stays on the slide it is on rather
|
|
31
|
+
* than leaving the talk.
|
|
32
|
+
* @param key - The `key` of the keyboard event.
|
|
33
|
+
* @param index - Which slide is showing.
|
|
34
|
+
* @param total - How many slides the talk holds.
|
|
35
|
+
* @returns The action, or `null` when the key means nothing here.
|
|
36
|
+
*/
|
|
37
|
+
export declare function slideActionForKey(key: string, index: number, total: number): SlideAction;
|
|
38
|
+
//# sourceMappingURL=slideNavigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slideNavigation.d.ts","sourceRoot":"","sources":["../../../src/slides/core/slideNavigation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,8CAA8C;AAC9C,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB,IAAI,CAAC;AAET;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,WAAW,CAkBb"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a key does during a presentation, decided without a DOM.
|
|
3
|
+
*
|
|
4
|
+
* The current slide lives in the address, so it arrives as whatever a link
|
|
5
|
+
* carried — a missing number, a negative one, one past the end of a talk that
|
|
6
|
+
* has since been shortened. Every move is therefore clamped here rather than
|
|
7
|
+
* trusted, and the player only ever renders a slide that exists.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The slide a requested index resolves to.
|
|
11
|
+
* @param index - The index asked for, from a link or a keystroke.
|
|
12
|
+
* @param total - How many slides the talk holds.
|
|
13
|
+
* @returns A zero-based index that exists, or `0` for a talk with no slides.
|
|
14
|
+
*/
|
|
15
|
+
export function clampSlideIndex(index, total) {
|
|
16
|
+
if (!Number.isFinite(total) || total < 1)
|
|
17
|
+
return 0;
|
|
18
|
+
if (Number.isNaN(index) || index < 0)
|
|
19
|
+
return 0;
|
|
20
|
+
const last = total - 1;
|
|
21
|
+
return index > last ? last : Math.trunc(index);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The action a key press means, with every move already clamped: stepping past
|
|
25
|
+
* the last slide, or back from the first, stays on the slide it is on rather
|
|
26
|
+
* than leaving the talk.
|
|
27
|
+
* @param key - The `key` of the keyboard event.
|
|
28
|
+
* @param index - Which slide is showing.
|
|
29
|
+
* @param total - How many slides the talk holds.
|
|
30
|
+
* @returns The action, or `null` when the key means nothing here.
|
|
31
|
+
*/
|
|
32
|
+
export function slideActionForKey(key, index, total) {
|
|
33
|
+
switch (key) {
|
|
34
|
+
case 'ArrowRight':
|
|
35
|
+
case 'ArrowDown':
|
|
36
|
+
case 'PageDown':
|
|
37
|
+
case ' ':
|
|
38
|
+
return { kind: 'go', index: clampSlideIndex(index + 1, total) };
|
|
39
|
+
case 'ArrowLeft':
|
|
40
|
+
case 'ArrowUp':
|
|
41
|
+
case 'PageUp':
|
|
42
|
+
return { kind: 'go', index: clampSlideIndex(index - 1, total) };
|
|
43
|
+
case 'Home':
|
|
44
|
+
return { kind: 'go', index: 0 };
|
|
45
|
+
case 'End':
|
|
46
|
+
return { kind: 'go', index: clampSlideIndex(total - 1, total) };
|
|
47
|
+
default:
|
|
48
|
+
return letterAction(key);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function letterAction(key) {
|
|
52
|
+
switch (key.toLowerCase()) {
|
|
53
|
+
case 'f':
|
|
54
|
+
return { kind: 'fullscreen' };
|
|
55
|
+
case 'b':
|
|
56
|
+
return { kind: 'blank', color: 'black' };
|
|
57
|
+
case 'w':
|
|
58
|
+
return { kind: 'blank', color: 'white' };
|
|
59
|
+
case 'n':
|
|
60
|
+
return { kind: 'notes' };
|
|
61
|
+
default:
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=slideNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slideNavigation.js","sourceRoot":"","sources":["../../../src/slides/core/slideNavigation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAa;IAC1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IACvB,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAUD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,KAAa,EACb,KAAa;IAEb,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,YAAY,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAClE,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAClE,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAClC,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAClE;YACE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,QAAQ,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3C,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3C,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The talk format: one Markdown file is one talk, and this reads it.
|
|
3
|
+
*
|
|
4
|
+
* A talk is authored as prose rather than as data — an optional front-matter
|
|
5
|
+
* block, then slides separated by a `---` line. Which template draws a slide is
|
|
6
|
+
* a comment the author writes, and the name is deliberately not a closed list:
|
|
7
|
+
* every site registers the layouts it knows how to draw.
|
|
8
|
+
*/
|
|
9
|
+
/** Talk-level metadata, read from the front-matter block. */
|
|
10
|
+
export interface TalkMeta {
|
|
11
|
+
/** Talk title, shown on the title slide and in a talk index. */
|
|
12
|
+
title: string;
|
|
13
|
+
/**
|
|
14
|
+
* A second line under the title.
|
|
15
|
+
* @default undefined
|
|
16
|
+
*/
|
|
17
|
+
subtitle?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Conference or event the talk was given at.
|
|
20
|
+
* @default undefined
|
|
21
|
+
*/
|
|
22
|
+
event?: string;
|
|
23
|
+
/**
|
|
24
|
+
* When it was given, as an ISO date (`YYYY-MM-DD`).
|
|
25
|
+
* @default undefined
|
|
26
|
+
*/
|
|
27
|
+
date?: string;
|
|
28
|
+
/**
|
|
29
|
+
* City or venue.
|
|
30
|
+
* @default undefined
|
|
31
|
+
*/
|
|
32
|
+
location?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Who presented it.
|
|
35
|
+
* @default undefined
|
|
36
|
+
*/
|
|
37
|
+
author?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Logo image URLs shown on the title slide, written comma-separated in the
|
|
40
|
+
* front-matter.
|
|
41
|
+
* @default undefined
|
|
42
|
+
*/
|
|
43
|
+
logos?: string[];
|
|
44
|
+
/**
|
|
45
|
+
* One sentence about the talk, for a listing or a page description.
|
|
46
|
+
* @default undefined
|
|
47
|
+
*/
|
|
48
|
+
description?: string;
|
|
49
|
+
}
|
|
50
|
+
/** One slide of a talk. */
|
|
51
|
+
export interface Slide {
|
|
52
|
+
/**
|
|
53
|
+
* Which template draws the body. A site maps these names to its own
|
|
54
|
+
* components, so any lowercase identifier is accepted here.
|
|
55
|
+
*/
|
|
56
|
+
layout: string;
|
|
57
|
+
/** The Markdown body, with the layout marker and the notes comment removed. */
|
|
58
|
+
body: string;
|
|
59
|
+
/**
|
|
60
|
+
* What the presenter says over this slide, never drawn on it.
|
|
61
|
+
* @default undefined
|
|
62
|
+
*/
|
|
63
|
+
notes?: string;
|
|
64
|
+
}
|
|
65
|
+
/** A whole talk: its metadata and its slides, in order. */
|
|
66
|
+
export interface Talk {
|
|
67
|
+
/** What the front-matter said about the talk. */
|
|
68
|
+
meta: TalkMeta;
|
|
69
|
+
/** The slides, in the order they are presented. */
|
|
70
|
+
slides: Slide[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse a talk written in Markdown into its metadata and its slides.
|
|
74
|
+
*
|
|
75
|
+
* The source is read defensively: CRLF endings, a missing front-matter block,
|
|
76
|
+
* an empty file and a slide holding nothing but whitespace all resolve to
|
|
77
|
+
* something a player can render rather than to an error.
|
|
78
|
+
* @param source - The raw Markdown talk source.
|
|
79
|
+
* @returns The parsed talk; an empty source yields an untitled talk with no slides.
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseTalk(source: string): Talk;
|
|
82
|
+
//# sourceMappingURL=talk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"talk.d.ts","sourceRoot":"","sources":["../../../src/slides/core/talk.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,2BAA2B;AAC3B,MAAM,WAAW,KAAK;IACpB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2DAA2D;AAC3D,MAAM,WAAW,IAAI;IACnB,iDAAiD;IACjD,IAAI,EAAE,QAAQ,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ9C"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The talk format: one Markdown file is one talk, and this reads it.
|
|
3
|
+
*
|
|
4
|
+
* A talk is authored as prose rather than as data — an optional front-matter
|
|
5
|
+
* block, then slides separated by a `---` line. Which template draws a slide is
|
|
6
|
+
* a comment the author writes, and the name is deliberately not a closed list:
|
|
7
|
+
* every site registers the layouts it knows how to draw.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parse a talk written in Markdown into its metadata and its slides.
|
|
11
|
+
*
|
|
12
|
+
* The source is read defensively: CRLF endings, a missing front-matter block,
|
|
13
|
+
* an empty file and a slide holding nothing but whitespace all resolve to
|
|
14
|
+
* something a player can render rather than to an error.
|
|
15
|
+
* @param source - The raw Markdown talk source.
|
|
16
|
+
* @returns The parsed talk; an empty source yields an untitled talk with no slides.
|
|
17
|
+
*/
|
|
18
|
+
export function parseTalk(source) {
|
|
19
|
+
const normalized = source.replaceAll(/\r\n?/g, '\n');
|
|
20
|
+
const { meta, body } = extractFrontMatter(normalized);
|
|
21
|
+
const slides = [];
|
|
22
|
+
for (const chunk of splitSlides(body)) {
|
|
23
|
+
slides.push(toSlide(chunk));
|
|
24
|
+
}
|
|
25
|
+
return { meta, slides };
|
|
26
|
+
}
|
|
27
|
+
function extractFrontMatter(source) {
|
|
28
|
+
const lines = source.split('\n');
|
|
29
|
+
let index = 0;
|
|
30
|
+
while (index < lines.length && lines[index]?.trim() === '')
|
|
31
|
+
index++;
|
|
32
|
+
if (lines[index]?.trim() !== '---') {
|
|
33
|
+
return { meta: { title: '' }, body: source };
|
|
34
|
+
}
|
|
35
|
+
index++;
|
|
36
|
+
const metaLines = [];
|
|
37
|
+
while (index < lines.length && lines[index]?.trim() !== '---') {
|
|
38
|
+
metaLines.push(lines[index] ?? '');
|
|
39
|
+
index++;
|
|
40
|
+
}
|
|
41
|
+
index++;
|
|
42
|
+
return { meta: parseMeta(metaLines), body: lines.slice(index).join('\n') };
|
|
43
|
+
}
|
|
44
|
+
function parseMeta(metaLines) {
|
|
45
|
+
const meta = { title: '' };
|
|
46
|
+
for (const line of metaLines) {
|
|
47
|
+
const match = META_RE.exec(line);
|
|
48
|
+
const key = match?.groups?.key?.toLowerCase();
|
|
49
|
+
const value = match?.groups?.value?.trim();
|
|
50
|
+
if (key === undefined || value === undefined)
|
|
51
|
+
continue;
|
|
52
|
+
if (key === 'logos') {
|
|
53
|
+
meta.logos = splitLogos(value);
|
|
54
|
+
}
|
|
55
|
+
else if (TEXT_KEYS.has(key)) {
|
|
56
|
+
meta[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return meta;
|
|
60
|
+
}
|
|
61
|
+
function splitLogos(value) {
|
|
62
|
+
const logos = [];
|
|
63
|
+
for (const logo of value.split(',')) {
|
|
64
|
+
const trimmed = logo.trim();
|
|
65
|
+
if (trimmed !== '')
|
|
66
|
+
logos.push(trimmed);
|
|
67
|
+
}
|
|
68
|
+
return logos;
|
|
69
|
+
}
|
|
70
|
+
function splitSlides(body) {
|
|
71
|
+
const chunks = [[]];
|
|
72
|
+
for (const line of body.split('\n')) {
|
|
73
|
+
if (SEPARATOR_RE.test(line)) {
|
|
74
|
+
chunks.push([]);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
chunks.at(-1)?.push(line);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const slides = [];
|
|
81
|
+
for (const chunk of chunks) {
|
|
82
|
+
const text = chunk.join('\n').trim();
|
|
83
|
+
if (text !== '')
|
|
84
|
+
slides.push(text);
|
|
85
|
+
}
|
|
86
|
+
return slides;
|
|
87
|
+
}
|
|
88
|
+
function toSlide(chunk) {
|
|
89
|
+
const layoutMatch = LAYOUT_RE.exec(chunk);
|
|
90
|
+
const { body, notes } = extractNotes(chunk.replace(LAYOUT_RE, ''));
|
|
91
|
+
const layout = layoutMatch?.groups?.layout?.toLowerCase() ?? detectLayout(body);
|
|
92
|
+
const slide = { layout, body };
|
|
93
|
+
if (notes !== '')
|
|
94
|
+
slide.notes = notes;
|
|
95
|
+
return slide;
|
|
96
|
+
}
|
|
97
|
+
function extractNotes(chunk) {
|
|
98
|
+
const notes = [];
|
|
99
|
+
for (const match of chunk.matchAll(NOTES_RE)) {
|
|
100
|
+
const text = match.groups?.notes?.trim();
|
|
101
|
+
if (text !== undefined && text !== '')
|
|
102
|
+
notes.push(text);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
body: chunk.replaceAll(NOTES_RE, '').trim(),
|
|
106
|
+
notes: notes.join('\n\n'),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function detectLayout(body) {
|
|
110
|
+
let headings = 0;
|
|
111
|
+
for (const line of body.split('\n')) {
|
|
112
|
+
const trimmed = line.trim();
|
|
113
|
+
if (trimmed === '')
|
|
114
|
+
continue;
|
|
115
|
+
if (!trimmed.startsWith('#'))
|
|
116
|
+
return 'content';
|
|
117
|
+
headings++;
|
|
118
|
+
}
|
|
119
|
+
return headings > 0 ? 'title' : 'content';
|
|
120
|
+
}
|
|
121
|
+
const TEXT_KEYS = new Set([
|
|
122
|
+
'title',
|
|
123
|
+
'subtitle',
|
|
124
|
+
'event',
|
|
125
|
+
'date',
|
|
126
|
+
'location',
|
|
127
|
+
'author',
|
|
128
|
+
'description',
|
|
129
|
+
]);
|
|
130
|
+
const LAYOUT_RE = /<!--\s*layout:\s*(?<layout>[a-z][\da-z-]*)\s*-->/i;
|
|
131
|
+
const NOTES_RE = /<!--\s*notes:\s*(?<notes>.*?)-->/gis;
|
|
132
|
+
const SEPARATOR_RE = /^---[\t ]*$/;
|
|
133
|
+
const META_RE = /^(?<key>[a-z]+)\s*:\s*(?<value>.+)$/i;
|
|
134
|
+
//# sourceMappingURL=talk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"talk.js","sourceRoot":"","sources":["../../../src/slides/core/talk.ts"],"names":[],"mappings":"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"}
|