react-cheminfo 0.3.0 → 0.4.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 +111 -23
- package/lib/capsule/ui/CapsuleFilter.d.ts +61 -0
- package/lib/capsule/ui/CapsuleFilter.d.ts.map +1 -0
- package/lib/capsule/ui/CapsuleFilter.js +33 -0
- package/lib/capsule/ui/CapsuleFilter.js.map +1 -0
- package/lib/capsule/ui/index.d.ts +3 -0
- package/lib/capsule/ui/index.d.ts.map +1 -0
- package/lib/capsule/ui/index.js +2 -0
- package/lib/capsule/ui/index.js.map +1 -0
- package/lib/chrome/ui/NavLink.d.ts +27 -0
- package/lib/chrome/ui/NavLink.d.ts.map +1 -0
- package/lib/chrome/ui/NavLink.js +36 -0
- package/lib/chrome/ui/NavLink.js.map +1 -0
- package/lib/chrome/ui/NavMenuButton.d.ts +40 -0
- package/lib/chrome/ui/NavMenuButton.d.ts.map +1 -0
- package/lib/chrome/ui/NavMenuButton.js +26 -0
- package/lib/chrome/ui/NavMenuButton.js.map +1 -0
- package/lib/chrome/ui/SiteFooter.d.ts +39 -0
- package/lib/chrome/ui/SiteFooter.d.ts.map +1 -0
- package/lib/chrome/ui/SiteFooter.js +17 -0
- package/lib/chrome/ui/SiteFooter.js.map +1 -0
- package/lib/chrome/ui/SiteHeader.d.ts +59 -0
- package/lib/chrome/ui/SiteHeader.d.ts.map +1 -0
- package/lib/chrome/ui/SiteHeader.js +28 -0
- package/lib/chrome/ui/SiteHeader.js.map +1 -0
- package/lib/chrome/ui/index.d.ts +12 -0
- package/lib/chrome/ui/index.d.ts.map +1 -0
- package/lib/chrome/ui/index.js +6 -0
- package/lib/chrome/ui/index.js.map +1 -0
- package/lib/chrome/ui/navItem.d.ts +57 -0
- package/lib/chrome/ui/navItem.d.ts.map +1 -0
- package/lib/chrome/ui/navItem.js +10 -0
- package/lib/chrome/ui/navItem.js.map +1 -0
- package/lib/chrome/ui/useCompactHeader.d.ts +31 -0
- package/lib/chrome/ui/useCompactHeader.d.ts.map +1 -0
- package/lib/chrome/ui/useCompactHeader.js +50 -0
- package/lib/chrome/ui/useCompactHeader.js.map +1 -0
- package/lib/citation/core/clipboard.d.ts +12 -3
- package/lib/citation/core/clipboard.d.ts.map +1 -1
- package/lib/citation/core/clipboard.js +21 -10
- package/lib/citation/core/clipboard.js.map +1 -1
- package/lib/citation/core/download.d.ts +11 -3
- package/lib/citation/core/download.d.ts.map +1 -1
- package/lib/citation/core/download.js +17 -13
- package/lib/citation/core/download.js.map +1 -1
- package/lib/citation/core/index.d.ts +4 -3
- package/lib/citation/core/index.d.ts.map +1 -1
- package/lib/citation/core/index.js +3 -3
- package/lib/citation/core/index.js.map +1 -1
- package/lib/citation/core/works.d.ts +44 -0
- package/lib/citation/core/works.d.ts.map +1 -0
- package/lib/citation/core/works.js +51 -0
- package/lib/citation/core/works.js.map +1 -0
- package/lib/citation/ui/CitationMenu.d.ts +20 -3
- package/lib/citation/ui/CitationMenu.d.ts.map +1 -1
- package/lib/citation/ui/CitationMenu.js +60 -49
- package/lib/citation/ui/CitationMenu.js.map +1 -1
- package/lib/citation/ui/CitationPreview.d.ts +5 -2
- package/lib/citation/ui/CitationPreview.d.ts.map +1 -1
- package/lib/citation/ui/CitationPreview.js +9 -4
- package/lib/citation/ui/CitationPreview.js.map +1 -1
- package/lib/citation/ui/CiteButton.d.ts +13 -6
- package/lib/citation/ui/CiteButton.d.ts.map +1 -1
- package/lib/citation/ui/CiteButton.js +5 -4
- package/lib/citation/ui/CiteButton.js.map +1 -1
- package/lib/citation/ui/CopyFormatEntries.d.ts +31 -0
- package/lib/citation/ui/CopyFormatEntries.d.ts.map +1 -0
- package/lib/citation/ui/CopyFormatEntries.js +29 -0
- package/lib/citation/ui/CopyFormatEntries.js.map +1 -0
- package/lib/citation/ui/WorkEntry.d.ts +18 -0
- package/lib/citation/ui/WorkEntry.d.ts.map +1 -0
- package/lib/citation/ui/WorkEntry.js +32 -0
- package/lib/citation/ui/WorkEntry.js.map +1 -0
- package/lib/citation/ui/entries.d.ts +7 -7
- package/lib/citation/ui/entries.d.ts.map +1 -1
- package/lib/citation/ui/entries.js +11 -13
- package/lib/citation/ui/entries.js.map +1 -1
- package/lib/citation/ui/index.d.ts +2 -2
- package/lib/citation/ui/index.d.ts.map +1 -1
- package/lib/citation/ui/index.js.map +1 -1
- package/lib/citation/ui/useCopyFeedback.d.ts +20 -0
- package/lib/citation/ui/useCopyFeedback.d.ts.map +1 -0
- package/lib/citation/ui/useCopyFeedback.js +49 -0
- package/lib/citation/ui/useCopyFeedback.js.map +1 -0
- package/lib/clipboard/core/index.d.ts +2 -0
- package/lib/clipboard/core/index.d.ts.map +1 -0
- package/lib/clipboard/core/index.js +2 -0
- package/lib/clipboard/core/index.js.map +1 -0
- package/lib/clipboard/core/writeToClipboard.d.ts +12 -0
- package/lib/clipboard/core/writeToClipboard.d.ts.map +1 -0
- package/lib/clipboard/core/writeToClipboard.js +49 -0
- package/lib/clipboard/core/writeToClipboard.js.map +1 -0
- package/lib/clipboard/ui/CodeBlock.d.ts +43 -0
- package/lib/clipboard/ui/CodeBlock.d.ts.map +1 -0
- package/lib/clipboard/ui/CodeBlock.js +49 -0
- package/lib/clipboard/ui/CodeBlock.js.map +1 -0
- package/lib/clipboard/ui/CopyButton.d.ts +64 -0
- package/lib/clipboard/ui/CopyButton.d.ts.map +1 -0
- package/lib/clipboard/ui/CopyButton.js +21 -0
- package/lib/clipboard/ui/CopyButton.js.map +1 -0
- package/lib/clipboard/ui/index.d.ts +7 -0
- package/lib/clipboard/ui/index.d.ts.map +1 -0
- package/lib/clipboard/ui/index.js +4 -0
- package/lib/clipboard/ui/index.js.map +1 -0
- package/lib/clipboard/ui/useCopyToClipboard.d.ts +24 -0
- package/lib/clipboard/ui/useCopyToClipboard.d.ts.map +1 -0
- package/lib/clipboard/ui/useCopyToClipboard.js +36 -0
- package/lib/clipboard/ui/useCopyToClipboard.js.map +1 -0
- package/lib/color/core/contrast.d.ts +43 -0
- package/lib/color/core/contrast.d.ts.map +1 -0
- package/lib/color/core/contrast.js +61 -0
- package/lib/color/core/contrast.js.map +1 -0
- package/lib/color/core/hex.d.ts +26 -0
- package/lib/color/core/hex.d.ts.map +1 -0
- package/lib/color/core/hex.js +44 -0
- package/lib/color/core/hex.js.map +1 -0
- package/lib/color/core/index.d.ts +5 -0
- package/lib/color/core/index.d.ts.map +1 -0
- package/lib/color/core/index.js +3 -0
- package/lib/color/core/index.js.map +1 -0
- package/lib/color/core/scale.d.ts +52 -0
- package/lib/color/core/scale.d.ts.map +1 -0
- package/lib/color/core/scale.js +96 -0
- package/lib/color/core/scale.js.map +1 -0
- package/lib/color/ui/ColorScaleLegend.d.ts +38 -0
- package/lib/color/ui/ColorScaleLegend.d.ts.map +1 -0
- package/lib/color/ui/ColorScaleLegend.js +68 -0
- package/lib/color/ui/ColorScaleLegend.js.map +1 -0
- package/lib/color/ui/index.d.ts +3 -0
- package/lib/color/ui/index.d.ts.map +1 -0
- package/lib/color/ui/index.js +2 -0
- package/lib/color/ui/index.js.map +1 -0
- package/lib/core.d.ts +11 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +11 -0
- package/lib/core.js.map +1 -1
- package/lib/credits/core/credits.d.ts +144 -0
- package/lib/credits/core/credits.d.ts.map +1 -0
- package/lib/credits/core/credits.js +156 -0
- package/lib/credits/core/credits.js.map +1 -0
- package/lib/credits/core/index.d.ts +3 -0
- package/lib/credits/core/index.d.ts.map +1 -0
- package/lib/credits/core/index.js +2 -0
- package/lib/credits/core/index.js.map +1 -0
- package/lib/credits/ui/CreditsList.d.ts +29 -0
- package/lib/credits/ui/CreditsList.d.ts.map +1 -0
- package/lib/credits/ui/CreditsList.js +33 -0
- package/lib/credits/ui/CreditsList.js.map +1 -0
- package/lib/credits/ui/index.d.ts +3 -0
- package/lib/credits/ui/index.d.ts.map +1 -0
- package/lib/credits/ui/index.js +2 -0
- package/lib/credits/ui/index.js.map +1 -0
- package/lib/delimited/core/delimiters.d.ts +31 -0
- package/lib/delimited/core/delimiters.d.ts.map +1 -0
- package/lib/delimited/core/delimiters.js +46 -0
- package/lib/delimited/core/delimiters.js.map +1 -0
- package/lib/delimited/core/index.d.ts +9 -0
- package/lib/delimited/core/index.d.ts.map +1 -0
- package/lib/delimited/core/index.js +5 -0
- package/lib/delimited/core/index.js.map +1 -0
- package/lib/delimited/core/readDelimited.d.ts +32 -0
- package/lib/delimited/core/readDelimited.d.ts.map +1 -0
- package/lib/delimited/core/readDelimited.js +122 -0
- package/lib/delimited/core/readDelimited.js.map +1 -0
- package/lib/delimited/core/rowsToDelimited.d.ts +59 -0
- package/lib/delimited/core/rowsToDelimited.d.ts.map +1 -0
- package/lib/delimited/core/rowsToDelimited.js +87 -0
- package/lib/delimited/core/rowsToDelimited.js.map +1 -0
- package/lib/delimited/core/toDelimited.d.ts +38 -0
- package/lib/delimited/core/toDelimited.d.ts.map +1 -0
- package/lib/delimited/core/toDelimited.js +45 -0
- package/lib/delimited/core/toDelimited.js.map +1 -0
- package/lib/delimited/ui/DelimitedTextDialog.d.ts +22 -0
- package/lib/delimited/ui/DelimitedTextDialog.d.ts.map +1 -0
- package/lib/delimited/ui/DelimitedTextDialog.js +17 -0
- package/lib/delimited/ui/DelimitedTextDialog.js.map +1 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts +56 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts.map +1 -0
- package/lib/delimited/ui/DelimitedTextPanel.js +55 -0
- package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -0
- package/lib/delimited/ui/index.d.ts +5 -0
- package/lib/delimited/ui/index.d.ts.map +1 -0
- package/lib/delimited/ui/index.js +3 -0
- package/lib/delimited/ui/index.js.map +1 -0
- package/lib/disclosure/ui/CollapsibleSection.d.ts +57 -0
- package/lib/disclosure/ui/CollapsibleSection.d.ts.map +1 -0
- package/lib/disclosure/ui/CollapsibleSection.js +60 -0
- package/lib/disclosure/ui/CollapsibleSection.js.map +1 -0
- package/lib/disclosure/ui/index.d.ts +5 -0
- package/lib/disclosure/ui/index.d.ts.map +1 -0
- package/lib/disclosure/ui/index.js +3 -0
- package/lib/disclosure/ui/index.js.map +1 -0
- package/lib/disclosure/ui/useDisclosure.d.ts +22 -0
- package/lib/disclosure/ui/useDisclosure.d.ts.map +1 -0
- package/lib/disclosure/ui/useDisclosure.js +18 -0
- package/lib/disclosure/ui/useDisclosure.js.map +1 -0
- package/lib/download/core/downloadBlob.d.ts +10 -0
- package/lib/download/core/downloadBlob.d.ts.map +1 -0
- package/lib/download/core/downloadBlob.js +20 -0
- package/lib/download/core/downloadBlob.js.map +1 -0
- package/lib/download/core/downloadText.d.ts +9 -0
- package/lib/download/core/downloadText.d.ts.map +1 -0
- package/lib/download/core/downloadText.js +14 -0
- package/lib/download/core/downloadText.js.map +1 -0
- package/lib/download/core/index.d.ts +4 -0
- package/lib/download/core/index.d.ts.map +1 -0
- package/lib/download/core/index.js +4 -0
- package/lib/download/core/index.js.map +1 -0
- package/lib/download/core/sanitizeFileName.d.ts +15 -0
- package/lib/download/core/sanitizeFileName.d.ts.map +1 -0
- package/lib/download/core/sanitizeFileName.js +33 -0
- package/lib/download/core/sanitizeFileName.js.map +1 -0
- package/lib/ecosystem/core/index.d.ts +3 -0
- package/lib/ecosystem/core/index.d.ts.map +1 -1
- package/lib/ecosystem/core/index.js +3 -0
- package/lib/ecosystem/core/index.js.map +1 -1
- package/lib/ecosystem/core/links.d.ts +11 -0
- package/lib/ecosystem/core/links.d.ts.map +1 -0
- package/lib/ecosystem/core/links.js +28 -0
- package/lib/ecosystem/core/links.js.map +1 -0
- package/lib/ecosystem/core/lookup.d.ts +21 -0
- package/lib/ecosystem/core/lookup.d.ts.map +1 -0
- package/lib/ecosystem/core/lookup.js +40 -0
- package/lib/ecosystem/core/lookup.js.map +1 -0
- package/lib/ecosystem/core/sites.d.ts +2 -0
- package/lib/ecosystem/core/sites.d.ts.map +1 -1
- package/lib/ecosystem/core/sites.js +15 -0
- package/lib/ecosystem/core/sites.js.map +1 -1
- package/lib/ecosystem/core/tokens.d.ts +21 -0
- package/lib/ecosystem/core/tokens.d.ts.map +1 -0
- package/lib/ecosystem/core/tokens.js +42 -0
- package/lib/ecosystem/core/tokens.js.map +1 -0
- package/lib/ecosystem/ui/SiteTheme.d.ts +18 -0
- package/lib/ecosystem/ui/SiteTheme.d.ts.map +1 -0
- package/lib/ecosystem/ui/SiteTheme.js +16 -0
- package/lib/ecosystem/ui/SiteTheme.js.map +1 -0
- package/lib/ecosystem/ui/Wordmark.d.ts +30 -0
- package/lib/ecosystem/ui/Wordmark.d.ts.map +1 -0
- package/lib/ecosystem/ui/Wordmark.js +26 -0
- package/lib/ecosystem/ui/Wordmark.js.map +1 -0
- package/lib/ecosystem/ui/index.d.ts +4 -0
- package/lib/ecosystem/ui/index.d.ts.map +1 -1
- package/lib/ecosystem/ui/index.js +2 -0
- package/lib/ecosystem/ui/index.js.map +1 -1
- package/lib/ecosystem/ui/marks.d.ts +30 -4
- package/lib/ecosystem/ui/marks.d.ts.map +1 -1
- package/lib/ecosystem/ui/marks.js +13 -3
- package/lib/ecosystem/ui/marks.js.map +1 -1
- package/lib/error/ui/ErrorBoundary.d.ts +60 -0
- package/lib/error/ui/ErrorBoundary.d.ts.map +1 -0
- package/lib/error/ui/ErrorBoundary.js +59 -0
- package/lib/error/ui/ErrorBoundary.js.map +1 -0
- package/lib/error/ui/ErrorFallback.d.ts +38 -0
- package/lib/error/ui/ErrorFallback.d.ts.map +1 -0
- package/lib/error/ui/ErrorFallback.js +16 -0
- package/lib/error/ui/ErrorFallback.js.map +1 -0
- package/lib/error/ui/index.d.ts +5 -0
- package/lib/error/ui/index.d.ts.map +1 -0
- package/lib/error/ui/index.js +3 -0
- package/lib/error/ui/index.js.map +1 -0
- package/lib/error/ui/toError.d.ts +11 -0
- package/lib/error/ui/toError.d.ts.map +1 -0
- package/lib/error/ui/toError.js +35 -0
- package/lib/error/ui/toError.js.map +1 -0
- package/lib/format/core/index.d.ts +5 -0
- package/lib/format/core/index.d.ts.map +1 -0
- package/lib/format/core/index.js +5 -0
- package/lib/format/core/index.js.map +1 -0
- package/lib/format/core/missing.d.ts +7 -0
- package/lib/format/core/missing.d.ts.map +1 -0
- package/lib/format/core/missing.js +7 -0
- package/lib/format/core/missing.js.map +1 -0
- package/lib/format/core/numbers.d.ts +40 -0
- package/lib/format/core/numbers.d.ts.map +1 -0
- package/lib/format/core/numbers.js +81 -0
- package/lib/format/core/numbers.js.map +1 -0
- package/lib/format/core/units.d.ts +17 -0
- package/lib/format/core/units.d.ts.map +1 -0
- package/lib/format/core/units.js +54 -0
- package/lib/format/core/units.js.map +1 -0
- package/lib/format/core/words.d.ts +12 -0
- package/lib/format/core/words.d.ts.map +1 -0
- package/lib/format/core/words.js +14 -0
- package/lib/format/core/words.js.map +1 -0
- package/lib/help/ui/HelpBody.d.ts +57 -0
- package/lib/help/ui/HelpBody.d.ts.map +1 -0
- package/lib/help/ui/HelpBody.js +44 -0
- package/lib/help/ui/HelpBody.js.map +1 -0
- package/lib/help/ui/HelpIcon.d.ts +33 -0
- package/lib/help/ui/HelpIcon.d.ts.map +1 -0
- package/lib/help/ui/HelpIcon.js +16 -0
- package/lib/help/ui/HelpIcon.js.map +1 -0
- package/lib/help/ui/HelpToolbarButton.d.ts +45 -0
- package/lib/help/ui/HelpToolbarButton.d.ts.map +1 -0
- package/lib/help/ui/HelpToolbarButton.js +17 -0
- package/lib/help/ui/HelpToolbarButton.js.map +1 -0
- package/lib/help/ui/HelpTooltip.d.ts +36 -0
- package/lib/help/ui/HelpTooltip.d.ts.map +1 -0
- package/lib/help/ui/HelpTooltip.js +24 -0
- package/lib/help/ui/HelpTooltip.js.map +1 -0
- package/lib/help/ui/index.d.ts +9 -0
- package/lib/help/ui/index.d.ts.map +1 -0
- package/lib/help/ui/index.js +5 -0
- package/lib/help/ui/index.js.map +1 -0
- package/lib/hooks/ui/index.d.ts +7 -0
- package/lib/hooks/ui/index.d.ts.map +1 -0
- package/lib/hooks/ui/index.js +5 -0
- package/lib/hooks/ui/index.js.map +1 -0
- package/lib/hooks/ui/listNavigation.d.ts +54 -0
- package/lib/hooks/ui/listNavigation.d.ts.map +1 -0
- package/lib/hooks/ui/listNavigation.js +77 -0
- package/lib/hooks/ui/listNavigation.js.map +1 -0
- package/lib/hooks/ui/useContainerSize.d.ts +15 -0
- package/lib/hooks/ui/useContainerSize.d.ts.map +1 -0
- package/lib/hooks/ui/useContainerSize.js +24 -0
- package/lib/hooks/ui/useContainerSize.js.map +1 -0
- package/lib/hooks/ui/useDebouncedValue.d.ts +12 -0
- package/lib/hooks/ui/useDebouncedValue.d.ts.map +1 -0
- package/lib/hooks/ui/useDebouncedValue.js +24 -0
- package/lib/hooks/ui/useDebouncedValue.js.map +1 -0
- package/lib/hooks/ui/useListKeyboardNavigation.d.ts +17 -0
- package/lib/hooks/ui/useListKeyboardNavigation.d.ts.map +1 -0
- package/lib/hooks/ui/useListKeyboardNavigation.js +25 -0
- package/lib/hooks/ui/useListKeyboardNavigation.js.map +1 -0
- package/lib/hooks/ui/useResizeObserver.d.ts +20 -0
- package/lib/hooks/ui/useResizeObserver.d.ts.map +1 -0
- package/lib/hooks/ui/useResizeObserver.js +37 -0
- package/lib/hooks/ui/useResizeObserver.js.map +1 -0
- package/lib/orbital/core/atomicGrid.d.ts +27 -0
- package/lib/orbital/core/atomicGrid.d.ts.map +1 -1
- package/lib/orbital/core/atomicGrid.js +37 -1
- package/lib/orbital/core/atomicGrid.js.map +1 -1
- package/lib/orbital/core/index.d.ts +9 -7
- package/lib/orbital/core/index.d.ts.map +1 -1
- package/lib/orbital/core/index.js +7 -6
- package/lib/orbital/core/index.js.map +1 -1
- package/lib/orbital/core/isovalue.d.ts +60 -0
- package/lib/orbital/core/isovalue.d.ts.map +1 -0
- package/lib/orbital/core/isovalue.js +128 -0
- package/lib/orbital/core/isovalue.js.map +1 -0
- package/lib/orbital/core/sample.d.ts +15 -1
- package/lib/orbital/core/sample.d.ts.map +1 -1
- package/lib/orbital/core/sample.js +10 -3
- package/lib/orbital/core/sample.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +6 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.js +12 -2
- package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +5 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
- package/lib/orbital/ui/renderVolume.d.ts +6 -3
- package/lib/orbital/ui/renderVolume.d.ts.map +1 -1
- package/lib/orbital/ui/renderVolume.js +14 -15
- package/lib/orbital/ui/renderVolume.js.map +1 -1
- package/lib/orbital/ui/viewer.d.ts +3 -1
- package/lib/orbital/ui/viewer.d.ts.map +1 -1
- package/lib/orbital/ui/viewer.js +3 -2
- package/lib/orbital/ui/viewer.js.map +1 -1
- package/lib/orbital/ui/volumeField.d.ts +5 -21
- package/lib/orbital/ui/volumeField.d.ts.map +1 -1
- package/lib/orbital/ui/volumeField.js +5 -45
- package/lib/orbital/ui/volumeField.js.map +1 -1
- package/lib/pedagogy/core/glossary.d.ts +79 -0
- package/lib/pedagogy/core/glossary.d.ts.map +1 -0
- package/lib/pedagogy/core/glossary.js +71 -0
- package/lib/pedagogy/core/glossary.js.map +1 -0
- package/lib/pedagogy/core/index.d.ts +8 -0
- package/lib/pedagogy/core/index.d.ts.map +1 -0
- package/lib/pedagogy/core/index.js +4 -0
- package/lib/pedagogy/core/index.js.map +1 -0
- package/lib/pedagogy/core/jsonStorage.d.ts +21 -0
- package/lib/pedagogy/core/jsonStorage.d.ts.map +1 -0
- package/lib/pedagogy/core/jsonStorage.js +55 -0
- package/lib/pedagogy/core/jsonStorage.js.map +1 -0
- package/lib/pedagogy/core/progress.d.ts +116 -0
- package/lib/pedagogy/core/progress.d.ts.map +1 -0
- package/lib/pedagogy/core/progress.js +122 -0
- package/lib/pedagogy/core/progress.js.map +1 -0
- package/lib/pedagogy/core/types.d.ts +74 -0
- package/lib/pedagogy/core/types.d.ts.map +1 -0
- package/lib/pedagogy/core/types.js +8 -0
- package/lib/pedagogy/core/types.js.map +1 -0
- package/lib/pedagogy/core/validation.d.ts +79 -0
- package/lib/pedagogy/core/validation.d.ts.map +1 -0
- package/lib/pedagogy/core/validation.js +47 -0
- package/lib/pedagogy/core/validation.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseActions.d.ts +74 -0
- package/lib/pedagogy/ui/ExerciseActions.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseActions.js +22 -0
- package/lib/pedagogy/ui/ExerciseActions.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts +43 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.js +43 -0
- package/lib/pedagogy/ui/ExerciseProgressHeader.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseTags.d.ts +49 -0
- package/lib/pedagogy/ui/ExerciseTags.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseTags.js +22 -0
- package/lib/pedagogy/ui/ExerciseTags.js.map +1 -0
- package/lib/pedagogy/ui/GlossaryProvider.d.ts +19 -0
- package/lib/pedagogy/ui/GlossaryProvider.d.ts.map +1 -0
- package/lib/pedagogy/ui/GlossaryProvider.js +16 -0
- package/lib/pedagogy/ui/GlossaryProvider.js.map +1 -0
- package/lib/pedagogy/ui/GlossaryText.d.ts +50 -0
- package/lib/pedagogy/ui/GlossaryText.d.ts.map +1 -0
- package/lib/pedagogy/ui/GlossaryText.js +79 -0
- package/lib/pedagogy/ui/GlossaryText.js.map +1 -0
- package/lib/pedagogy/ui/HintLadder.d.ts +38 -0
- package/lib/pedagogy/ui/HintLadder.d.ts.map +1 -0
- package/lib/pedagogy/ui/HintLadder.js +33 -0
- package/lib/pedagogy/ui/HintLadder.js.map +1 -0
- package/lib/pedagogy/ui/ReferenceGrid.d.ts +31 -0
- package/lib/pedagogy/ui/ReferenceGrid.d.ts.map +1 -0
- package/lib/pedagogy/ui/ReferenceGrid.js +25 -0
- package/lib/pedagogy/ui/ReferenceGrid.js.map +1 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts +64 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.d.ts.map +1 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.js +78 -0
- package/lib/pedagogy/ui/ReferenceSectionBlock.js.map +1 -0
- package/lib/pedagogy/ui/SyntaxTooltip.d.ts +94 -0
- package/lib/pedagogy/ui/SyntaxTooltip.d.ts.map +1 -0
- package/lib/pedagogy/ui/SyntaxTooltip.js +79 -0
- package/lib/pedagogy/ui/SyntaxTooltip.js.map +1 -0
- package/lib/pedagogy/ui/TestCaseList.d.ts +35 -0
- package/lib/pedagogy/ui/TestCaseList.d.ts.map +1 -0
- package/lib/pedagogy/ui/TestCaseList.js +63 -0
- package/lib/pedagogy/ui/TestCaseList.js.map +1 -0
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts +42 -0
- package/lib/pedagogy/ui/TutorialStepStrip.d.ts.map +1 -0
- package/lib/pedagogy/ui/TutorialStepStrip.js +98 -0
- package/lib/pedagogy/ui/TutorialStepStrip.js.map +1 -0
- package/lib/pedagogy/ui/exerciseMeta.d.ts +24 -0
- package/lib/pedagogy/ui/exerciseMeta.d.ts.map +1 -0
- package/lib/pedagogy/ui/exerciseMeta.js +38 -0
- package/lib/pedagogy/ui/exerciseMeta.js.map +1 -0
- package/lib/pedagogy/ui/glossaryContext.d.ts +17 -0
- package/lib/pedagogy/ui/glossaryContext.d.ts.map +1 -0
- package/lib/pedagogy/ui/glossaryContext.js +19 -0
- package/lib/pedagogy/ui/glossaryContext.js.map +1 -0
- package/lib/pedagogy/ui/index.d.ts +27 -0
- package/lib/pedagogy/ui/index.d.ts.map +1 -0
- package/lib/pedagogy/ui/index.js +15 -0
- package/lib/pedagogy/ui/index.js.map +1 -0
- package/lib/pedagogy/ui/tutorialLevels.d.ts +18 -0
- package/lib/pedagogy/ui/tutorialLevels.d.ts.map +1 -0
- package/lib/pedagogy/ui/tutorialLevels.js +14 -0
- package/lib/pedagogy/ui/tutorialLevels.js.map +1 -0
- package/lib/router/core/address.d.ts +42 -0
- package/lib/router/core/address.d.ts.map +1 -0
- package/lib/router/core/address.js +64 -0
- package/lib/router/core/address.js.map +1 -0
- package/lib/router/core/basePath.d.ts +49 -0
- package/lib/router/core/basePath.d.ts.map +1 -0
- package/lib/router/core/basePath.js +78 -0
- package/lib/router/core/basePath.js.map +1 -0
- package/lib/router/core/index.d.ts +8 -0
- package/lib/router/core/index.d.ts.map +1 -0
- package/lib/router/core/index.js +5 -0
- package/lib/router/core/index.js.map +1 -0
- package/lib/router/core/legacyHash.d.ts +45 -0
- package/lib/router/core/legacyHash.d.ts.map +1 -0
- package/lib/router/core/legacyHash.js +50 -0
- package/lib/router/core/legacyHash.js.map +1 -0
- package/lib/router/core/pageAddresses.d.ts +50 -0
- package/lib/router/core/pageAddresses.d.ts.map +1 -0
- package/lib/router/core/pageAddresses.js +56 -0
- package/lib/router/core/pageAddresses.js.map +1 -0
- package/lib/router/core/query.d.ts +41 -0
- package/lib/router/core/query.d.ts.map +1 -0
- package/lib/router/core/query.js +64 -0
- package/lib/router/core/query.js.map +1 -0
- package/lib/router/core/tabRouter.d.ts +111 -0
- package/lib/router/core/tabRouter.d.ts.map +1 -0
- package/lib/router/core/tabRouter.js +87 -0
- package/lib/router/core/tabRouter.js.map +1 -0
- package/lib/seo/core/documentMeta.d.ts +45 -0
- package/lib/seo/core/documentMeta.d.ts.map +1 -0
- package/lib/seo/core/documentMeta.js +69 -0
- package/lib/seo/core/documentMeta.js.map +1 -0
- package/lib/seo/core/index.d.ts +3 -0
- package/lib/seo/core/index.d.ts.map +1 -0
- package/lib/seo/core/index.js +2 -0
- package/lib/seo/core/index.js.map +1 -0
- package/lib/share/core/config.d.ts +63 -0
- package/lib/share/core/config.d.ts.map +1 -0
- package/lib/share/core/config.js +125 -0
- package/lib/share/core/config.js.map +1 -0
- package/lib/share/core/escape.d.ts +15 -0
- package/lib/share/core/escape.d.ts.map +1 -0
- package/lib/share/core/escape.js +22 -0
- package/lib/share/core/escape.js.map +1 -0
- package/lib/share/core/index.d.ts +9 -0
- package/lib/share/core/index.d.ts.map +1 -0
- package/lib/share/core/index.js +5 -0
- package/lib/share/core/index.js.map +1 -0
- package/lib/share/core/params.d.ts +93 -0
- package/lib/share/core/params.d.ts.map +1 -0
- package/lib/share/core/params.js +111 -0
- package/lib/share/core/params.js.map +1 -0
- package/lib/share/core/query.d.ts +30 -0
- package/lib/share/core/query.d.ts.map +1 -0
- package/lib/share/core/query.js +68 -0
- package/lib/share/core/query.js.map +1 -0
- package/lib/share/core/url.d.ts +57 -0
- package/lib/share/core/url.d.ts.map +1 -0
- package/lib/share/core/url.js +49 -0
- package/lib/share/core/url.js.map +1 -0
- package/lib/share/core/vocabulary.d.ts +51 -0
- package/lib/share/core/vocabulary.d.ts.map +1 -0
- package/lib/share/core/vocabulary.js +2 -0
- package/lib/share/core/vocabulary.js.map +1 -0
- package/lib/share/ui/HiddenPartsProvider.d.ts +19 -0
- package/lib/share/ui/HiddenPartsProvider.d.ts.map +1 -0
- package/lib/share/ui/HiddenPartsProvider.js +15 -0
- package/lib/share/ui/HiddenPartsProvider.js.map +1 -0
- package/lib/share/ui/PagePart.d.ts +18 -0
- package/lib/share/ui/PagePart.d.ts.map +1 -0
- package/lib/share/ui/PagePart.js +16 -0
- package/lib/share/ui/PagePart.js.map +1 -0
- package/lib/share/ui/ShareButton.d.ts +42 -0
- package/lib/share/ui/ShareButton.d.ts.map +1 -0
- package/lib/share/ui/ShareButton.js +18 -0
- package/lib/share/ui/ShareButton.js.map +1 -0
- package/lib/share/ui/ShareDialog.d.ts +73 -0
- package/lib/share/ui/ShareDialog.d.ts.map +1 -0
- package/lib/share/ui/ShareDialog.js +19 -0
- package/lib/share/ui/ShareDialog.js.map +1 -0
- package/lib/share/ui/ShareDialogContent.d.ts +13 -0
- package/lib/share/ui/ShareDialogContent.d.ts.map +1 -0
- package/lib/share/ui/ShareDialogContent.js +71 -0
- package/lib/share/ui/ShareDialogContent.js.map +1 -0
- package/lib/share/ui/SharePartOptions.d.ts +18 -0
- package/lib/share/ui/SharePartOptions.d.ts.map +1 -0
- package/lib/share/ui/SharePartOptions.js +22 -0
- package/lib/share/ui/SharePartOptions.js.map +1 -0
- package/lib/share/ui/draft.d.ts +13 -0
- package/lib/share/ui/draft.d.ts.map +1 -0
- package/lib/share/ui/draft.js +16 -0
- package/lib/share/ui/draft.js.map +1 -0
- package/lib/share/ui/hiddenParts.d.ts +17 -0
- package/lib/share/ui/hiddenParts.d.ts.map +1 -0
- package/lib/share/ui/hiddenParts.js +21 -0
- package/lib/share/ui/hiddenParts.js.map +1 -0
- package/lib/share/ui/index.d.ts +10 -0
- package/lib/share/ui/index.d.ts.map +1 -0
- package/lib/share/ui/index.js +6 -0
- package/lib/share/ui/index.js.map +1 -0
- package/lib/shared/ui/index.d.ts +2 -1
- package/lib/shared/ui/index.d.ts.map +1 -1
- package/lib/shared/ui/index.js +1 -1
- package/lib/shared/ui/index.js.map +1 -1
- package/lib/state/ui/index.d.ts +3 -0
- package/lib/state/ui/index.d.ts.map +1 -0
- package/lib/state/ui/index.js +2 -0
- package/lib/state/ui/index.js.map +1 -0
- package/lib/state/ui/mergeStored.d.ts +27 -0
- package/lib/state/ui/mergeStored.d.ts.map +1 -0
- package/lib/state/ui/mergeStored.js +82 -0
- package/lib/state/ui/mergeStored.js.map +1 -0
- package/lib/state/ui/persistBucket.d.ts +65 -0
- package/lib/state/ui/persistBucket.d.ts.map +1 -0
- package/lib/state/ui/persistBucket.js +90 -0
- package/lib/state/ui/persistBucket.js.map +1 -0
- package/lib/structure/core/editorValue.d.ts +69 -0
- package/lib/structure/core/editorValue.d.ts.map +1 -0
- package/lib/structure/core/editorValue.js +72 -0
- package/lib/structure/core/editorValue.js.map +1 -0
- package/lib/structure/core/fragmentQuery.d.ts +33 -0
- package/lib/structure/core/fragmentQuery.d.ts.map +1 -0
- package/lib/structure/core/fragmentQuery.js +37 -0
- package/lib/structure/core/fragmentQuery.js.map +1 -0
- package/lib/structure/core/index.d.ts +11 -0
- package/lib/structure/core/index.d.ts.map +1 -0
- package/lib/structure/core/index.js +6 -0
- package/lib/structure/core/index.js.map +1 -0
- package/lib/structure/core/molfile.d.ts +42 -0
- package/lib/structure/core/molfile.d.ts.map +1 -0
- package/lib/structure/core/molfile.js +74 -0
- package/lib/structure/core/molfile.js.map +1 -0
- package/lib/structure/core/readStructure.d.ts +37 -0
- package/lib/structure/core/readStructure.d.ts.map +1 -0
- package/lib/structure/core/readStructure.js +59 -0
- package/lib/structure/core/readStructure.js.map +1 -0
- package/lib/structure/core/structureSource.d.ts +34 -0
- package/lib/structure/core/structureSource.d.ts.map +1 -0
- package/lib/structure/core/structureSource.js +32 -0
- package/lib/structure/core/structureSource.js.map +1 -0
- package/lib/structure/core/toolbarFloor.d.ts +16 -0
- package/lib/structure/core/toolbarFloor.d.ts.map +1 -0
- package/lib/structure/core/toolbarFloor.js +27 -0
- package/lib/structure/core/toolbarFloor.js.map +1 -0
- package/lib/structure/ui/EditorCanvas.d.ts +55 -0
- package/lib/structure/ui/EditorCanvas.d.ts.map +1 -0
- package/lib/structure/ui/EditorCanvas.js +41 -0
- package/lib/structure/ui/EditorCanvas.js.map +1 -0
- package/lib/structure/ui/Structure.d.ts +122 -0
- package/lib/structure/ui/Structure.d.ts.map +1 -0
- package/lib/structure/ui/Structure.js +28 -0
- package/lib/structure/ui/Structure.js.map +1 -0
- package/lib/structure/ui/StructureEditor.d.ts +75 -0
- package/lib/structure/ui/StructureEditor.d.ts.map +1 -0
- package/lib/structure/ui/StructureEditor.js +83 -0
- package/lib/structure/ui/StructureEditor.js.map +1 -0
- package/lib/structure/ui/StructurePlaceholder.d.ts +29 -0
- package/lib/structure/ui/StructurePlaceholder.d.ts.map +1 -0
- package/lib/structure/ui/StructurePlaceholder.js +19 -0
- package/lib/structure/ui/StructurePlaceholder.js.map +1 -0
- package/lib/structure/ui/StructureSvg.d.ts +58 -0
- package/lib/structure/ui/StructureSvg.d.ts.map +1 -0
- package/lib/structure/ui/StructureSvg.js +33 -0
- package/lib/structure/ui/StructureSvg.js.map +1 -0
- package/lib/structure/ui/index.d.ts +19 -0
- package/lib/structure/ui/index.d.ts.map +1 -0
- package/lib/structure/ui/index.js +15 -0
- package/lib/structure/ui/index.js.map +1 -0
- package/lib/structure/ui/useToolbarFloor.d.ts +26 -0
- package/lib/structure/ui/useToolbarFloor.d.ts.map +1 -0
- package/lib/structure/ui/useToolbarFloor.js +70 -0
- package/lib/structure/ui/useToolbarFloor.js.map +1 -0
- package/lib/structure.d.ts +3 -0
- package/lib/structure.d.ts.map +1 -0
- package/lib/structure.js +3 -0
- package/lib/structure.js.map +1 -0
- package/lib/ui.d.ts +13 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +13 -0
- package/lib/ui.js.map +1 -1
- package/lib/worker/core/errors.d.ts +15 -0
- package/lib/worker/core/errors.d.ts.map +1 -0
- package/lib/worker/core/errors.js +15 -0
- package/lib/worker/core/errors.js.map +1 -0
- package/lib/worker/core/index.d.ts +5 -0
- package/lib/worker/core/index.d.ts.map +1 -0
- package/lib/worker/core/index.js +3 -0
- package/lib/worker/core/index.js.map +1 -0
- package/lib/worker/core/messages.d.ts +48 -0
- package/lib/worker/core/messages.d.ts.map +1 -0
- package/lib/worker/core/messages.js +2 -0
- package/lib/worker/core/messages.js.map +1 -0
- package/lib/worker/core/workerChannel.d.ts +69 -0
- package/lib/worker/core/workerChannel.d.ts.map +1 -0
- package/lib/worker/core/workerChannel.js +121 -0
- package/lib/worker/core/workerChannel.js.map +1 -0
- package/package.json +18 -5
- package/src/capsule/ui/CapsuleFilter.tsx +119 -0
- package/src/capsule/ui/index.ts +2 -0
- package/src/chrome/ui/NavLink.tsx +88 -0
- package/src/chrome/ui/NavMenuButton.tsx +95 -0
- package/src/chrome/ui/SiteFooter.tsx +65 -0
- package/src/chrome/ui/SiteHeader.tsx +119 -0
- package/src/chrome/ui/index.ts +11 -0
- package/src/chrome/ui/navItem.ts +60 -0
- package/src/chrome/ui/useCompactHeader.ts +81 -0
- package/src/citation/core/clipboard.ts +27 -11
- package/src/citation/core/download.ts +25 -15
- package/src/citation/core/index.ts +8 -3
- package/src/citation/core/works.ts +81 -0
- package/src/citation/ui/CitationMenu.tsx +104 -89
- package/src/citation/ui/CitationPreview.tsx +18 -8
- package/src/citation/ui/CiteButton.tsx +24 -9
- package/src/citation/ui/CopyFormatEntries.tsx +84 -0
- package/src/citation/ui/WorkEntry.tsx +80 -0
- package/src/citation/ui/entries.tsx +18 -20
- package/src/citation/ui/index.ts +10 -2
- package/src/citation/ui/useCopyFeedback.ts +76 -0
- package/src/clipboard/core/index.ts +1 -0
- package/src/clipboard/core/writeToClipboard.ts +47 -0
- package/src/clipboard/ui/CodeBlock.tsx +110 -0
- package/src/clipboard/ui/CopyButton.tsx +111 -0
- package/src/clipboard/ui/index.ts +9 -0
- package/src/clipboard/ui/useCopyToClipboard.ts +57 -0
- package/src/color/core/contrast.ts +85 -0
- package/src/color/core/hex.ts +57 -0
- package/src/color/core/index.ts +4 -0
- package/src/color/core/scale.ts +132 -0
- package/src/color/ui/ColorScaleLegend.tsx +144 -0
- package/src/color/ui/index.ts +2 -0
- package/src/core.ts +11 -0
- package/src/credits/core/credits.ts +183 -0
- package/src/credits/core/index.ts +2 -0
- package/src/credits/ui/CreditsList.tsx +82 -0
- package/src/credits/ui/index.ts +2 -0
- package/src/delimited/core/delimiters.ts +64 -0
- package/src/delimited/core/index.ts +11 -0
- package/src/delimited/core/readDelimited.ts +132 -0
- package/src/delimited/core/rowsToDelimited.ts +135 -0
- package/src/delimited/core/toDelimited.ts +69 -0
- package/src/delimited/ui/DelimitedTextDialog.tsx +49 -0
- package/src/delimited/ui/DelimitedTextPanel.tsx +161 -0
- package/src/delimited/ui/index.ts +4 -0
- package/src/disclosure/ui/CollapsibleSection.tsx +150 -0
- package/src/disclosure/ui/index.ts +4 -0
- package/src/disclosure/ui/useDisclosure.ts +35 -0
- package/src/download/core/downloadBlob.ts +19 -0
- package/src/download/core/downloadText.ts +19 -0
- package/src/download/core/index.ts +3 -0
- package/src/download/core/sanitizeFileName.ts +33 -0
- package/src/ecosystem/core/index.ts +3 -0
- package/src/ecosystem/core/links.ts +29 -0
- package/src/ecosystem/core/lookup.ts +41 -0
- package/src/ecosystem/core/sites.ts +17 -0
- package/src/ecosystem/core/tokens.ts +47 -0
- package/src/ecosystem/ui/SiteTheme.tsx +23 -0
- package/src/ecosystem/ui/Wordmark.tsx +65 -0
- package/src/ecosystem/ui/index.ts +4 -0
- package/src/ecosystem/ui/marks.tsx +54 -15
- package/src/error/ui/ErrorBoundary.tsx +94 -0
- package/src/error/ui/ErrorFallback.tsx +64 -0
- package/src/error/ui/index.ts +4 -0
- package/src/error/ui/toError.ts +33 -0
- package/src/format/core/index.ts +9 -0
- package/src/format/core/missing.ts +6 -0
- package/src/format/core/numbers.ts +84 -0
- package/src/format/core/units.ts +60 -0
- package/src/format/core/words.ts +17 -0
- package/src/help/ui/HelpBody.tsx +130 -0
- package/src/help/ui/HelpIcon.tsx +53 -0
- package/src/help/ui/HelpToolbarButton.tsx +72 -0
- package/src/help/ui/HelpTooltip.tsx +72 -0
- package/src/help/ui/index.ts +8 -0
- package/src/hooks/ui/index.ts +6 -0
- package/src/hooks/ui/listNavigation.ts +116 -0
- package/src/hooks/ui/useContainerSize.ts +32 -0
- package/src/hooks/ui/useDebouncedValue.ts +29 -0
- package/src/hooks/ui/useListKeyboardNavigation.ts +37 -0
- package/src/hooks/ui/useResizeObserver.ts +50 -0
- package/src/orbital/core/atomicGrid.ts +53 -1
- package/src/orbital/core/index.ts +7 -16
- package/src/orbital/core/isovalue.ts +146 -0
- package/src/orbital/core/sample.ts +25 -5
- package/src/orbital/ui/AtomicOrbitalCanvas.tsx +19 -3
- package/src/orbital/ui/AtomicOrbitalViewer.tsx +5 -1
- package/src/orbital/ui/renderVolume.ts +29 -16
- package/src/orbital/ui/viewer.ts +6 -1
- package/src/orbital/ui/volumeField.ts +5 -49
- package/src/pedagogy/core/glossary.ts +122 -0
- package/src/pedagogy/core/index.ts +28 -0
- package/src/pedagogy/core/jsonStorage.ts +51 -0
- package/src/pedagogy/core/progress.ts +205 -0
- package/src/pedagogy/core/types.ts +78 -0
- package/src/pedagogy/core/validation.ts +109 -0
- package/src/pedagogy/ui/ExerciseActions.tsx +129 -0
- package/src/pedagogy/ui/ExerciseProgressHeader.tsx +135 -0
- package/src/pedagogy/ui/ExerciseTags.tsx +85 -0
- package/src/pedagogy/ui/GlossaryProvider.tsx +31 -0
- package/src/pedagogy/ui/GlossaryText.tsx +164 -0
- package/src/pedagogy/ui/HintLadder.tsx +95 -0
- package/src/pedagogy/ui/ReferenceGrid.tsx +69 -0
- package/src/pedagogy/ui/ReferenceSectionBlock.tsx +175 -0
- package/src/pedagogy/ui/SyntaxTooltip.tsx +222 -0
- package/src/pedagogy/ui/TestCaseList.tsx +122 -0
- package/src/pedagogy/ui/TutorialStepStrip.tsx +230 -0
- package/src/pedagogy/ui/exerciseMeta.ts +45 -0
- package/src/pedagogy/ui/glossaryContext.ts +23 -0
- package/src/pedagogy/ui/index.ts +37 -0
- package/src/pedagogy/ui/tutorialLevels.ts +27 -0
- package/src/router/core/address.ts +74 -0
- package/src/router/core/basePath.ts +76 -0
- package/src/router/core/index.ts +26 -0
- package/src/router/core/legacyHash.ts +77 -0
- package/src/router/core/pageAddresses.ts +106 -0
- package/src/router/core/query.ts +87 -0
- package/src/router/core/tabRouter.ts +214 -0
- package/src/seo/core/documentMeta.ts +92 -0
- package/src/seo/core/index.ts +6 -0
- package/src/share/core/config.ts +165 -0
- package/src/share/core/escape.ts +22 -0
- package/src/share/core/index.ts +31 -0
- package/src/share/core/params.ts +176 -0
- package/src/share/core/query.ts +72 -0
- package/src/share/core/url.ts +105 -0
- package/src/share/core/vocabulary.ts +60 -0
- package/src/share/ui/HiddenPartsProvider.tsx +34 -0
- package/src/share/ui/PagePart.tsx +26 -0
- package/src/share/ui/ShareButton.tsx +84 -0
- package/src/share/ui/ShareDialog.tsx +114 -0
- package/src/share/ui/ShareDialogContent.tsx +189 -0
- package/src/share/ui/SharePartOptions.tsx +51 -0
- package/src/share/ui/draft.ts +19 -0
- package/src/share/ui/hiddenParts.ts +22 -0
- package/src/share/ui/index.ts +9 -0
- package/src/shared/ui/index.ts +2 -1
- package/src/state/ui/index.ts +6 -0
- package/src/state/ui/mergeStored.ts +87 -0
- package/src/state/ui/persistBucket.ts +147 -0
- package/src/structure/core/editorValue.ts +116 -0
- package/src/structure/core/fragmentQuery.ts +50 -0
- package/src/structure/core/index.ts +13 -0
- package/src/structure/core/molfile.ts +90 -0
- package/src/structure/core/readStructure.ts +73 -0
- package/src/structure/core/structureSource.ts +57 -0
- package/src/structure/core/toolbarFloor.ts +31 -0
- package/src/structure/ui/EditorCanvas.tsx +130 -0
- package/src/structure/ui/Structure.tsx +183 -0
- package/src/structure/ui/StructureEditor.tsx +196 -0
- package/src/structure/ui/StructurePlaceholder.tsx +48 -0
- package/src/structure/ui/StructureSvg.tsx +110 -0
- package/src/structure/ui/index.ts +22 -0
- package/src/structure/ui/useToolbarFloor.ts +93 -0
- package/src/structure.ts +2 -0
- package/src/ui.ts +13 -0
- package/src/worker/core/errors.ts +15 -0
- package/src/worker/core/index.ts +8 -0
- package/src/worker/core/messages.ts +47 -0
- package/src/worker/core/workerChannel.ts +218 -0
- package/styles/chrome.css +223 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bucket of preferences kept in `localStorage` under one versioned key.
|
|
3
|
+
*
|
|
4
|
+
* Everything here is best effort. In a page framed by a course, third-party
|
|
5
|
+
* storage is partitioned in Chrome and blocked in Safari, so a read may find
|
|
6
|
+
* nothing, a write may be refused, and touching the store may throw before it
|
|
7
|
+
* is even reached — none of which may ever reach the interface. A visitor whose
|
|
8
|
+
* quota is full still gets a working site, with their preferences lasting only
|
|
9
|
+
* as long as the tab.
|
|
10
|
+
* @param options - See {@link PersistBucketOptions}.
|
|
11
|
+
* @returns The three ways to use the bucket: read it, write it, forget it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function persistBucket<T extends object>(options: PersistBucketOptions<T>): PersistedBucket<T>;
|
|
14
|
+
/** How a bucket is named, versioned and filled in. */
|
|
15
|
+
export interface PersistBucketOptions<T extends object> {
|
|
16
|
+
/**
|
|
17
|
+
* Name of the bucket, namespaced by the site, e.g. `smiles:exercises`. The
|
|
18
|
+
* version is appended to it, so this never carries one itself.
|
|
19
|
+
*/
|
|
20
|
+
key: string;
|
|
21
|
+
/**
|
|
22
|
+
* Schema version, appended to the key as `:v<version>`. Raise it when a new
|
|
23
|
+
* shape cannot be reconciled with the old one field by field, and every entry
|
|
24
|
+
* written by the previous shape is then ignored rather than migrated.
|
|
25
|
+
* @default 1
|
|
26
|
+
*/
|
|
27
|
+
version?: number;
|
|
28
|
+
/**
|
|
29
|
+
* What a visitor who has stored nothing gets, and what every missing or
|
|
30
|
+
* unusable field of a stored payload falls back to. Must be JSON
|
|
31
|
+
* serialisable, since that is how it is stored.
|
|
32
|
+
*/
|
|
33
|
+
defaults: T;
|
|
34
|
+
/**
|
|
35
|
+
* Called when a write was refused because the store is full, with the error
|
|
36
|
+
* the store threw. The write is swallowed either way; this only exists so a
|
|
37
|
+
* page can tell its visitor that what they are doing is no longer being kept.
|
|
38
|
+
* @default undefined
|
|
39
|
+
*/
|
|
40
|
+
onQuotaExceeded?: (error: unknown) => void;
|
|
41
|
+
}
|
|
42
|
+
/** The three ways a page uses its bucket. */
|
|
43
|
+
export interface PersistedBucket<T extends object> {
|
|
44
|
+
/** The versioned key the bucket occupies, e.g. `smiles:exercises:v1`. */
|
|
45
|
+
readonly storageKey: string;
|
|
46
|
+
/** What was stored, merged over the defaults. */
|
|
47
|
+
read: () => BucketRead<T>;
|
|
48
|
+
/** Store the bucket as it now stands, replacing what was there. */
|
|
49
|
+
write: (value: T) => void;
|
|
50
|
+
/** Forget the bucket, leaving whatever the page holds in memory untouched. */
|
|
51
|
+
clear: () => void;
|
|
52
|
+
}
|
|
53
|
+
/** What one read of a bucket found. */
|
|
54
|
+
export interface BucketRead<T> {
|
|
55
|
+
/** The stored payload merged over the defaults, ready to be used as is. */
|
|
56
|
+
value: T;
|
|
57
|
+
/**
|
|
58
|
+
* True when nothing usable was there: no entry, an unreadable store, or a
|
|
59
|
+
* payload that is not an object. It tells a first visit from a visitor who
|
|
60
|
+
* chose exactly the defaults, which is what decides whether a page opens on
|
|
61
|
+
* its welcome state or writes the bucket straight back.
|
|
62
|
+
*/
|
|
63
|
+
firstRun: boolean;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=persistBucket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistBucket.d.ts","sourceRoot":"","sources":["../../../src/state/ui/persistBucket.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,eAAe,CAAC,CAAC,CAAC,CAwBpB;AAED,sDAAsD;AACtD,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM;IACpD;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,CAAC;IACZ;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM;IAC/C,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,IAAI,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1B,mEAAmE;IACnE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC1B,8EAA8E;IAC9E,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,uCAAuC;AACvC,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,2EAA2E;IAC3E,KAAK,EAAE,CAAC,CAAC;IACT;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { isPlainRecord, mergeStored } from "./mergeStored.js";
|
|
2
|
+
/**
|
|
3
|
+
* A bucket of preferences kept in `localStorage` under one versioned key.
|
|
4
|
+
*
|
|
5
|
+
* Everything here is best effort. In a page framed by a course, third-party
|
|
6
|
+
* storage is partitioned in Chrome and blocked in Safari, so a read may find
|
|
7
|
+
* nothing, a write may be refused, and touching the store may throw before it
|
|
8
|
+
* is even reached — none of which may ever reach the interface. A visitor whose
|
|
9
|
+
* quota is full still gets a working site, with their preferences lasting only
|
|
10
|
+
* as long as the tab.
|
|
11
|
+
* @param options - See {@link PersistBucketOptions}.
|
|
12
|
+
* @returns The three ways to use the bucket: read it, write it, forget it.
|
|
13
|
+
*/
|
|
14
|
+
export function persistBucket(options) {
|
|
15
|
+
const { key, version = 1, defaults, onQuotaExceeded } = options;
|
|
16
|
+
const storageKey = `${key}:v${version}`;
|
|
17
|
+
return {
|
|
18
|
+
storageKey,
|
|
19
|
+
read: () => {
|
|
20
|
+
const stored = readEntry(storageKey);
|
|
21
|
+
return {
|
|
22
|
+
value: mergeStored(defaults, stored),
|
|
23
|
+
firstRun: stored === undefined,
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
write: (value) => {
|
|
27
|
+
writeEntry(storageKey, value, onQuotaExceeded);
|
|
28
|
+
},
|
|
29
|
+
clear: () => {
|
|
30
|
+
try {
|
|
31
|
+
globalThis.localStorage?.removeItem(storageKey);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// An unavailable store has nothing to forget.
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function readEntry(storageKey) {
|
|
40
|
+
let raw;
|
|
41
|
+
try {
|
|
42
|
+
raw = globalThis.localStorage?.getItem(storageKey) ?? null;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
if (raw === null)
|
|
48
|
+
return undefined;
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(raw);
|
|
51
|
+
return isPlainRecord(parsed) ? parsed : undefined;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function writeEntry(storageKey, value, onQuotaExceeded) {
|
|
58
|
+
let serialized;
|
|
59
|
+
try {
|
|
60
|
+
serialized = JSON.stringify(value);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// A value that cannot be serialised is a bug in the caller, never a reason
|
|
64
|
+
// to take the page down with it.
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
globalThis.localStorage?.setItem(storageKey, serialized);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (!isQuotaExceeded(error) || onQuotaExceeded === undefined)
|
|
72
|
+
return;
|
|
73
|
+
try {
|
|
74
|
+
onQuotaExceeded(error);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// A callback that throws must not turn a lost preference into a crash.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function isQuotaExceeded(error) {
|
|
82
|
+
if (typeof error !== 'object' || error === null)
|
|
83
|
+
return false;
|
|
84
|
+
const { name, code } = error;
|
|
85
|
+
return (name === 'QuotaExceededError' ||
|
|
86
|
+
name === 'NS_ERROR_DOM_QUOTA_REACHED' ||
|
|
87
|
+
code === 22 ||
|
|
88
|
+
code === 1014);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=persistBucket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistBucket.js","sourceRoot":"","sources":["../../../src/state/ui/persistBucket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAgC;IAEhC,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAChE,MAAM,UAAU,GAAG,GAAG,GAAG,KAAK,OAAO,EAAE,CAAC;IAExC,OAAO;QACL,UAAU;QACV,IAAI,EAAE,GAAG,EAAE;YACT,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,OAAO;gBACL,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACpC,QAAQ,EAAE,MAAM,KAAK,SAAS;aAC/B,CAAC;QACJ,CAAC;QACD,KAAK,EAAE,CAAC,KAAQ,EAAE,EAAE;YAClB,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,CAAC;gBACH,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAwDD,SAAS,SAAS,CAAC,UAAkB;IACnC,IAAI,GAAkB,CAAC;IACvB,IAAI,CAAC;QACH,GAAG,GAAG,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,UAAkB,EAClB,KAAc,EACd,eAAuD;IAEvD,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,iCAAiC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,eAAe,KAAK,SAAS;YAAE,OAAO;QACrE,IAAI,CAAC;YACH,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAA2C,CAAC;IACnE,OAAO,CACL,IAAI,KAAK,oBAAoB;QAC7B,IAAI,KAAK,4BAA4B;QACrC,IAAI,KAAK,EAAE;QACX,IAAI,KAAK,IAAI,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/** One structure of an editor's value, with whatever was written next to it. */
|
|
2
|
+
export interface EditorLine {
|
|
3
|
+
/**
|
|
4
|
+
* The structure. On a line-oriented value this is the first blank-separated
|
|
5
|
+
* token, because a line notation never holds a blank; on a molfile it is the
|
|
6
|
+
* whole file.
|
|
7
|
+
*/
|
|
8
|
+
structure: string;
|
|
9
|
+
/**
|
|
10
|
+
* What followed the structure on its line, which a Daylight `.smi` file uses
|
|
11
|
+
* as a name. Empty when nothing did.
|
|
12
|
+
*/
|
|
13
|
+
label: string;
|
|
14
|
+
/** 1-based line the structure starts on, so an error can point back at it. */
|
|
15
|
+
line: number;
|
|
16
|
+
}
|
|
17
|
+
/** An editor's value, classified and cut into the structures it holds. */
|
|
18
|
+
export interface EditorValue {
|
|
19
|
+
/** How the value is written; `empty` when it holds no structure at all. */
|
|
20
|
+
kind: 'molfile' | 'smiles' | 'empty';
|
|
21
|
+
/**
|
|
22
|
+
* The molfile, exactly as it arrived, when `kind` is `molfile`. Empty
|
|
23
|
+
* otherwise — a molfile's fixed-width header does not survive being trimmed.
|
|
24
|
+
*/
|
|
25
|
+
molfile: string;
|
|
26
|
+
/**
|
|
27
|
+
* Every structure the value holds, in order: one per meaningful line for a
|
|
28
|
+
* line-oriented value, a single entry for a molfile, none for an empty one.
|
|
29
|
+
*/
|
|
30
|
+
entries: EditorLine[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Take an editor's value apart.
|
|
34
|
+
*
|
|
35
|
+
* A structure box is handed whatever the chemist had: one molfile pasted out
|
|
36
|
+
* of another tool, or a run of line notations one per line, possibly with a
|
|
37
|
+
* name after each and with blank and `#` comment lines in between. Both are
|
|
38
|
+
* read here so a page can take either without asking which it was given.
|
|
39
|
+
* @param text - The editor's value, as typed, pasted or dropped.
|
|
40
|
+
* @returns The notation, the molfile when it is one, and the structures.
|
|
41
|
+
*/
|
|
42
|
+
export declare function splitEditorValue(text: string): EditorValue;
|
|
43
|
+
/** An idCode and, when the writer emitted one, the atom layout beside it. */
|
|
44
|
+
export interface IdCodeValue {
|
|
45
|
+
idCode: string;
|
|
46
|
+
/** Absent when the value carried no coordinates. */
|
|
47
|
+
coordinates?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Take an idCode apart.
|
|
51
|
+
*
|
|
52
|
+
* A drawing editor appends the atom coordinates after a space, which
|
|
53
|
+
* `Molecule.fromIDCode` takes as a second argument rather than as part of the
|
|
54
|
+
* first, and which two drawings of the same structure differ by.
|
|
55
|
+
* @param value - The editor value, coordinates included or not.
|
|
56
|
+
* @returns The idCode and the coordinates, the idCode empty for a blank value.
|
|
57
|
+
*/
|
|
58
|
+
export declare function splitIdCode(value: string): IdCodeValue;
|
|
59
|
+
/**
|
|
60
|
+
* Whether an idCode describes nothing.
|
|
61
|
+
*
|
|
62
|
+
* Erasing a canvas does not leave the editor with an empty string: it leaves
|
|
63
|
+
* the idCode of the empty molecule, or of the empty fragment in query mode.
|
|
64
|
+
* Treating either as a structure keeps a filter alive with nothing drawn.
|
|
65
|
+
* @param value - The editor value, coordinates included or not.
|
|
66
|
+
* @returns True when there is nothing on the canvas.
|
|
67
|
+
*/
|
|
68
|
+
export declare function isEmptyIdCode(value: string): boolean;
|
|
69
|
+
//# sourceMappingURL=editorValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorValue.d.ts","sourceRoot":"","sources":["../../../src/structure/core/editorValue.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAa1D;AAED,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAGtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { looksLikeMolfile } from "./molfile.js";
|
|
2
|
+
/**
|
|
3
|
+
* Take an editor's value apart.
|
|
4
|
+
*
|
|
5
|
+
* A structure box is handed whatever the chemist had: one molfile pasted out
|
|
6
|
+
* of another tool, or a run of line notations one per line, possibly with a
|
|
7
|
+
* name after each and with blank and `#` comment lines in between. Both are
|
|
8
|
+
* read here so a page can take either without asking which it was given.
|
|
9
|
+
* @param text - The editor's value, as typed, pasted or dropped.
|
|
10
|
+
* @returns The notation, the molfile when it is one, and the structures.
|
|
11
|
+
*/
|
|
12
|
+
export function splitEditorValue(text) {
|
|
13
|
+
if (text.trim() === '')
|
|
14
|
+
return { kind: 'empty', molfile: '', entries: [] };
|
|
15
|
+
if (looksLikeMolfile(text)) {
|
|
16
|
+
return {
|
|
17
|
+
kind: 'molfile',
|
|
18
|
+
molfile: text,
|
|
19
|
+
entries: [{ structure: text, label: '', line: 1 }],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const entries = splitLines(text);
|
|
23
|
+
return entries.length === 0
|
|
24
|
+
? { kind: 'empty', molfile: '', entries: [] }
|
|
25
|
+
: { kind: 'smiles', molfile: '', entries };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Take an idCode apart.
|
|
29
|
+
*
|
|
30
|
+
* A drawing editor appends the atom coordinates after a space, which
|
|
31
|
+
* `Molecule.fromIDCode` takes as a second argument rather than as part of the
|
|
32
|
+
* first, and which two drawings of the same structure differ by.
|
|
33
|
+
* @param value - The editor value, coordinates included or not.
|
|
34
|
+
* @returns The idCode and the coordinates, the idCode empty for a blank value.
|
|
35
|
+
*/
|
|
36
|
+
export function splitIdCode(value) {
|
|
37
|
+
const [idCode = '', coordinates] = value.trim().split(' ');
|
|
38
|
+
return coordinates === undefined ? { idCode } : { idCode, coordinates };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether an idCode describes nothing.
|
|
42
|
+
*
|
|
43
|
+
* Erasing a canvas does not leave the editor with an empty string: it leaves
|
|
44
|
+
* the idCode of the empty molecule, or of the empty fragment in query mode.
|
|
45
|
+
* Treating either as a structure keeps a filter alive with nothing drawn.
|
|
46
|
+
* @param value - The editor value, coordinates included or not.
|
|
47
|
+
* @returns True when there is nothing on the canvas.
|
|
48
|
+
*/
|
|
49
|
+
export function isEmptyIdCode(value) {
|
|
50
|
+
return EMPTY_ID_CODES.has(splitIdCode(value).idCode);
|
|
51
|
+
}
|
|
52
|
+
/** What openchemlib writes for a structure with no atoms: molecule, fragment. */
|
|
53
|
+
const EMPTY_ID_CODES = new Set(['', 'd@', 'dH']);
|
|
54
|
+
function splitLines(text) {
|
|
55
|
+
const entries = [];
|
|
56
|
+
const lines = text.split('\n');
|
|
57
|
+
for (let index = 0; index < lines.length; index++) {
|
|
58
|
+
const line = (lines[index] ?? '').trim();
|
|
59
|
+
if (line === '' || line.startsWith('#'))
|
|
60
|
+
continue;
|
|
61
|
+
const blank = line.search(/\s/);
|
|
62
|
+
entries.push(blank === -1
|
|
63
|
+
? { structure: line, label: '', line: index + 1 }
|
|
64
|
+
: {
|
|
65
|
+
structure: line.slice(0, blank),
|
|
66
|
+
label: line.slice(blank).trim(),
|
|
67
|
+
line: index + 1,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return entries;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=editorValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorValue.js","sourceRoot":"","sources":["../../../src/structure/core/editorValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAmChD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3E,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC;QACzB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7C,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AAC/C,CAAC;AASD;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAC1E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,iFAAiF;AACjF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjD,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CACV,KAAK,KAAK,CAAC,CAAC;YACV,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;YACjD,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;gBAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;gBAC/B,IAAI,EAAE,KAAK,GAAG,CAAC;aAChB,CACN,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { StructureKind } from './readStructure.ts';
|
|
2
|
+
/** What a substructure field is currently filtering on. */
|
|
3
|
+
export interface FragmentQuery {
|
|
4
|
+
/** The notation the query should be read as. */
|
|
5
|
+
kind: StructureKind;
|
|
6
|
+
/** The query, ready to hand a parser. Empty when nothing is filtered on. */
|
|
7
|
+
value: string;
|
|
8
|
+
/**
|
|
9
|
+
* True when the field filters on nothing — a blank box, or the idCode an
|
|
10
|
+
* erased canvas leaves behind.
|
|
11
|
+
*/
|
|
12
|
+
isEmpty: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read what a substructure field holds.
|
|
16
|
+
*
|
|
17
|
+
* A filter is fed from two places that disagree about what "nothing" is: a
|
|
18
|
+
* text box hands back the empty string, while a drawing canvas hands back the
|
|
19
|
+
* idCode of the empty molecule. Both mean the filter is off, and a filter that
|
|
20
|
+
* stays on with nothing drawn quietly hides every result.
|
|
21
|
+
* @param text - The field's value: an idCode, a molfile or a line notation.
|
|
22
|
+
* @returns The notation, the query, and whether anything is being filtered on.
|
|
23
|
+
*/
|
|
24
|
+
export declare function fragmentQuery(text: string): FragmentQuery;
|
|
25
|
+
/**
|
|
26
|
+
* Whether two field values describe the same query, so a search is not run
|
|
27
|
+
* again for a value that only changed by its surrounding blanks.
|
|
28
|
+
* @param left - One field value.
|
|
29
|
+
* @param right - The other field value.
|
|
30
|
+
* @returns True when both would be read as the same query.
|
|
31
|
+
*/
|
|
32
|
+
export declare function sameFragmentQuery(left: string, right: string): boolean;
|
|
33
|
+
//# sourceMappingURL=fragmentQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragmentQuery.d.ts","sourceRoot":"","sources":["../../../src/structure/core/fragmentQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,IAAI,EAAE,aAAa,CAAC;IACpB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAQzD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAKtE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { isEmptyIdCode } from "./editorValue.js";
|
|
2
|
+
import { readStructure } from "./readStructure.js";
|
|
3
|
+
/**
|
|
4
|
+
* Read what a substructure field holds.
|
|
5
|
+
*
|
|
6
|
+
* A filter is fed from two places that disagree about what "nothing" is: a
|
|
7
|
+
* text box hands back the empty string, while a drawing canvas hands back the
|
|
8
|
+
* idCode of the empty molecule. Both mean the filter is off, and a filter that
|
|
9
|
+
* stays on with nothing drawn quietly hides every result.
|
|
10
|
+
* @param text - The field's value: an idCode, a molfile or a line notation.
|
|
11
|
+
* @returns The notation, the query, and whether anything is being filtered on.
|
|
12
|
+
*/
|
|
13
|
+
export function fragmentQuery(text) {
|
|
14
|
+
if (isEmptyIdCode(text))
|
|
15
|
+
return { kind: 'empty', value: '', isEmpty: true };
|
|
16
|
+
const read = readStructure(text);
|
|
17
|
+
return {
|
|
18
|
+
kind: read.kind,
|
|
19
|
+
value: read.value,
|
|
20
|
+
isEmpty: read.kind === 'empty',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Whether two field values describe the same query, so a search is not run
|
|
25
|
+
* again for a value that only changed by its surrounding blanks.
|
|
26
|
+
* @param left - One field value.
|
|
27
|
+
* @param right - The other field value.
|
|
28
|
+
* @returns True when both would be read as the same query.
|
|
29
|
+
*/
|
|
30
|
+
export function sameFragmentQuery(left, right) {
|
|
31
|
+
const first = fragmentQuery(left);
|
|
32
|
+
const second = fragmentQuery(right);
|
|
33
|
+
if (first.isEmpty || second.isEmpty)
|
|
34
|
+
return first.isEmpty === second.isEmpty;
|
|
35
|
+
return first.kind === second.kind && first.value === second.value;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=fragmentQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragmentQuery.js","sourceRoot":"","sources":["../../../src/structure/core/fragmentQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAenD;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5E,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa;IAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;IAC7E,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { EditorLine, EditorValue } from './editorValue.ts';
|
|
2
|
+
export { splitEditorValue } from './editorValue.ts';
|
|
3
|
+
export type { FragmentQuery } from './fragmentQuery.ts';
|
|
4
|
+
export { fragmentQuery, sameFragmentQuery } from './fragmentQuery.ts';
|
|
5
|
+
export type { MolfileClassification, MolfileVersion } from './molfile.ts';
|
|
6
|
+
export { classifyMolfile, molfileAtomCount } from './molfile.ts';
|
|
7
|
+
export type { ReadStructureResult, StructureKind } from './readStructure.ts';
|
|
8
|
+
export { looksLikeSmarts, readStructure } from './readStructure.ts';
|
|
9
|
+
export type { StructureSource, StructureSourceInput, } from './structureSource.ts';
|
|
10
|
+
export { structureSource } from './structureSource.ts';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/structure/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EACV,eAAe,EACf,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { splitEditorValue } from "./editorValue.js";
|
|
2
|
+
export { fragmentQuery, sameFragmentQuery } from "./fragmentQuery.js";
|
|
3
|
+
export { classifyMolfile, molfileAtomCount } from "./molfile.js";
|
|
4
|
+
export { looksLikeSmarts, readStructure } from "./readStructure.js";
|
|
5
|
+
export { structureSource } from "./structureSource.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/structure/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Which connection-table dialect a molfile is written in. */
|
|
2
|
+
export type MolfileVersion = 'v2000' | 'v3000' | 'unknown';
|
|
3
|
+
/** What a molfile's counts line says about it. */
|
|
4
|
+
export interface MolfileClassification {
|
|
5
|
+
/** The dialect, `unknown` when the text carries no version stamp. */
|
|
6
|
+
version: MolfileVersion;
|
|
7
|
+
/**
|
|
8
|
+
* Atoms the counts line declares, `0` when there is no counts line to read.
|
|
9
|
+
*/
|
|
10
|
+
atomCount: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Read a molfile's version and its declared atom count.
|
|
14
|
+
*
|
|
15
|
+
* The two dialects write their counts in unrelated places: V2000 packs them
|
|
16
|
+
* into the fixed-width fields of the line ending in `V2000`, while a V3000
|
|
17
|
+
* file leaves those fields at zero and declares the real counts on an
|
|
18
|
+
* `M V30 COUNTS` line further down. Reading a V3000 file with the V2000 rule
|
|
19
|
+
* therefore answers zero atoms without failing, which is what makes a viewer
|
|
20
|
+
* render an empty scene and report nothing.
|
|
21
|
+
* @param text - A molfile, or any text that may not be one.
|
|
22
|
+
* @returns The dialect and the declared atom count.
|
|
23
|
+
*/
|
|
24
|
+
export declare function classifyMolfile(text: string): MolfileClassification;
|
|
25
|
+
/**
|
|
26
|
+
* How many atoms a molfile declares, whichever dialect it is written in.
|
|
27
|
+
* @param text - A molfile, or any text that may not be one.
|
|
28
|
+
* @returns The declared atom count, `0` when the text declares none.
|
|
29
|
+
*/
|
|
30
|
+
export declare function molfileAtomCount(text: string): number;
|
|
31
|
+
/**
|
|
32
|
+
* Whether a piece of text should be read as a molfile rather than as a line
|
|
33
|
+
* notation.
|
|
34
|
+
*
|
|
35
|
+
* A line notation is a single line and can never carry a version stamp, so a
|
|
36
|
+
* text holding a header, a counts line and at least one atom line is the one
|
|
37
|
+
* that is a molfile.
|
|
38
|
+
* @param text - The structure, as typed, pasted or dropped.
|
|
39
|
+
* @returns True when it should be read as a molfile.
|
|
40
|
+
*/
|
|
41
|
+
export declare function looksLikeMolfile(text: string): boolean;
|
|
42
|
+
//# sourceMappingURL=molfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"molfile.d.ts","sourceRoot":"","sources":["../../../src/structure/core/molfile.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3D,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,OAAO,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAQnE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a molfile's version and its declared atom count.
|
|
3
|
+
*
|
|
4
|
+
* The two dialects write their counts in unrelated places: V2000 packs them
|
|
5
|
+
* into the fixed-width fields of the line ending in `V2000`, while a V3000
|
|
6
|
+
* file leaves those fields at zero and declares the real counts on an
|
|
7
|
+
* `M V30 COUNTS` line further down. Reading a V3000 file with the V2000 rule
|
|
8
|
+
* therefore answers zero atoms without failing, which is what makes a viewer
|
|
9
|
+
* render an empty scene and report nothing.
|
|
10
|
+
* @param text - A molfile, or any text that may not be one.
|
|
11
|
+
* @returns The dialect and the declared atom count.
|
|
12
|
+
*/
|
|
13
|
+
export function classifyMolfile(text) {
|
|
14
|
+
if (V3000_STAMP.test(text)) {
|
|
15
|
+
return { version: 'v3000', atomCount: countIn(text, V3000_COUNTS) };
|
|
16
|
+
}
|
|
17
|
+
if (V2000_STAMP.test(text)) {
|
|
18
|
+
return { version: 'v2000', atomCount: countIn(text, V2000_COUNTS) };
|
|
19
|
+
}
|
|
20
|
+
return { version: 'unknown', atomCount: 0 };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* How many atoms a molfile declares, whichever dialect it is written in.
|
|
24
|
+
* @param text - A molfile, or any text that may not be one.
|
|
25
|
+
* @returns The declared atom count, `0` when the text declares none.
|
|
26
|
+
*/
|
|
27
|
+
export function molfileAtomCount(text) {
|
|
28
|
+
return classifyMolfile(text).atomCount;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Whether a piece of text should be read as a molfile rather than as a line
|
|
32
|
+
* notation.
|
|
33
|
+
*
|
|
34
|
+
* A line notation is a single line and can never carry a version stamp, so a
|
|
35
|
+
* text holding a header, a counts line and at least one atom line is the one
|
|
36
|
+
* that is a molfile.
|
|
37
|
+
* @param text - The structure, as typed, pasted or dropped.
|
|
38
|
+
* @returns True when it should be read as a molfile.
|
|
39
|
+
*/
|
|
40
|
+
export function looksLikeMolfile(text) {
|
|
41
|
+
if (countLines(text) < 4)
|
|
42
|
+
return false;
|
|
43
|
+
return classifyMolfile(text).version !== 'unknown';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The version stamp closes a line whose every other field is a number, so a
|
|
47
|
+
* data field or a sentence mentioning the dialect is not mistaken for one.
|
|
48
|
+
*/
|
|
49
|
+
const V2000_STAMP = /^[\d ]+V2000[^\S\n]*$/m;
|
|
50
|
+
const V3000_STAMP = /^[\d ]+V3000[^\S\n]*$/m;
|
|
51
|
+
/**
|
|
52
|
+
* The V2000 counts line is fixed-width: three characters for the atoms, three
|
|
53
|
+
* for the bonds. A writer that trims the padding still lands inside the same
|
|
54
|
+
* six characters for any count a V2000 file can hold.
|
|
55
|
+
*/
|
|
56
|
+
const V2000_COUNTS = /^(?<atoms>[\d ]{3})[\d ]*V2000[^\S\n]*$/m;
|
|
57
|
+
const V3000_COUNTS = /^M {2}V30 COUNTS +(?<atoms>\d+)/m;
|
|
58
|
+
function countIn(text, pattern) {
|
|
59
|
+
const atoms = pattern.exec(text)?.groups?.atoms;
|
|
60
|
+
if (atoms === undefined)
|
|
61
|
+
return 0;
|
|
62
|
+
const count = Number.parseInt(atoms.trim(), 10);
|
|
63
|
+
return Number.isFinite(count) && count > 0 ? count : 0;
|
|
64
|
+
}
|
|
65
|
+
function countLines(text) {
|
|
66
|
+
let lines = 1;
|
|
67
|
+
let index = text.indexOf('\n');
|
|
68
|
+
while (index !== -1) {
|
|
69
|
+
lines++;
|
|
70
|
+
index = text.indexOf('\n', index + 1);
|
|
71
|
+
}
|
|
72
|
+
return lines;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=molfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"molfile.js","sourceRoot":"","sources":["../../../src/structure/core/molfile.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAC7C,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C;;;;GAIG;AACH,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAChE,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAExD,SAAS,OAAO,CAAC,IAAY,EAAE,OAAe;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,KAAK,EAAE,CAAC;QACR,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** How a piece of structure text turned out to be written. */
|
|
2
|
+
export type StructureKind = 'molfile' | 'smiles' | 'smarts' | 'empty';
|
|
3
|
+
/** A piece of structure text, and the notation it should be read as. */
|
|
4
|
+
export interface ReadStructureResult {
|
|
5
|
+
kind: StructureKind;
|
|
6
|
+
/**
|
|
7
|
+
* The text to hand a parser. A line notation is trimmed; a molfile is left
|
|
8
|
+
* exactly as it arrived, because its first three lines are a fixed-width
|
|
9
|
+
* header whose title line is very often blank — trimming shifts every line
|
|
10
|
+
* up and the counts line is then read as an atom.
|
|
11
|
+
*/
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Decide what a piece of text is, without parsing it.
|
|
16
|
+
*
|
|
17
|
+
* Nothing is asked of the user, because the answer is in the text: a molfile
|
|
18
|
+
* carries a version stamp and several lines, a query carries syntax that only
|
|
19
|
+
* exists in SMARTS, and whatever is left is a SMILES. Text that holds nothing
|
|
20
|
+
* is the third answer, so a field can tell "not typed yet" from "typed
|
|
21
|
+
* something wrong" and only complain about the second.
|
|
22
|
+
* @param text - The structure, as typed, pasted or dropped.
|
|
23
|
+
* @returns The notation and the text to read it with.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readStructure(text: string): ReadStructureResult;
|
|
26
|
+
/**
|
|
27
|
+
* Whether a line notation uses syntax that exists in SMARTS and not in SMILES.
|
|
28
|
+
*
|
|
29
|
+
* Only the inside of a bracket atom is inspected for the primitives, because
|
|
30
|
+
* `#` is a triple bond outside one and `D`, `X`, `R`, `v` and `h` are the
|
|
31
|
+
* start of real element symbols. `~`, `&`, `,`, `;`, `!` and `$(` are SMARTS
|
|
32
|
+
* anywhere they appear.
|
|
33
|
+
* @param text - The line notation, already trimmed.
|
|
34
|
+
* @returns True when it can only be a query.
|
|
35
|
+
*/
|
|
36
|
+
export declare function looksLikeSmarts(text: string): boolean;
|
|
37
|
+
//# sourceMappingURL=readStructure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readStructure.d.ts","sourceRoot":"","sources":["../../../src/structure/core/readStructure.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAM/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD"}
|