react-cheminfo 0.28.0 → 0.30.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 +79 -26
- package/lib/chart/core/axisLabels.d.ts +82 -0
- package/lib/chart/core/axisLabels.d.ts.map +1 -0
- package/lib/chart/core/axisLabels.js +111 -0
- package/lib/chart/core/axisLabels.js.map +1 -0
- package/lib/chart/core/boxLayout.d.ts +53 -0
- package/lib/chart/core/boxLayout.d.ts.map +1 -0
- package/lib/chart/core/boxLayout.js +112 -0
- package/lib/chart/core/boxLayout.js.map +1 -0
- package/lib/chart/core/chartAxisScale.d.ts +23 -2
- package/lib/chart/core/chartAxisScale.d.ts.map +1 -1
- package/lib/chart/core/chartAxisScale.js +64 -13
- package/lib/chart/core/chartAxisScale.js.map +1 -1
- package/lib/chart/core/chartDomain.d.ts +160 -0
- package/lib/chart/core/chartDomain.d.ts.map +1 -0
- package/lib/chart/core/chartDomain.js +46 -0
- package/lib/chart/core/chartDomain.js.map +1 -0
- package/lib/chart/core/chartGeometry.d.ts +131 -0
- package/lib/chart/core/chartGeometry.d.ts.map +1 -0
- package/lib/chart/core/chartGeometry.js +101 -0
- package/lib/chart/core/chartGeometry.js.map +1 -0
- package/lib/chart/core/chartPane.d.ts +11 -0
- package/lib/chart/core/chartPane.d.ts.map +1 -0
- package/lib/chart/core/chartPane.js +11 -0
- package/lib/chart/core/chartPane.js.map +1 -0
- package/lib/chart/core/chartScale.d.ts +4 -1
- package/lib/chart/core/chartScale.d.ts.map +1 -1
- package/lib/chart/core/chartScale.js +8 -4
- package/lib/chart/core/chartScale.js.map +1 -1
- package/lib/chart/core/chartTheme.d.ts +156 -0
- package/lib/chart/core/chartTheme.d.ts.map +1 -0
- package/lib/chart/core/chartTheme.js +156 -0
- package/lib/chart/core/chartTheme.js.map +1 -0
- package/lib/chart/core/chartViewport.d.ts +32 -5
- package/lib/chart/core/chartViewport.d.ts.map +1 -1
- package/lib/chart/core/chartViewport.js +40 -11
- package/lib/chart/core/chartViewport.js.map +1 -1
- package/lib/chart/core/guidePlacement.d.ts +52 -0
- package/lib/chart/core/guidePlacement.d.ts.map +1 -0
- package/lib/chart/core/guidePlacement.js +52 -0
- package/lib/chart/core/guidePlacement.js.map +1 -0
- package/lib/chart/core/index.d.ts +29 -2
- package/lib/chart/core/index.d.ts.map +1 -1
- package/lib/chart/core/index.js +19 -2
- package/lib/chart/core/index.js.map +1 -1
- package/lib/chart/core/labelStack.d.ts +27 -0
- package/lib/chart/core/labelStack.d.ts.map +1 -0
- package/lib/chart/core/labelStack.js +62 -0
- package/lib/chart/core/labelStack.js.map +1 -0
- package/lib/chart/core/legendBox.d.ts +152 -0
- package/lib/chart/core/legendBox.d.ts.map +1 -0
- package/lib/chart/core/legendBox.js +169 -0
- package/lib/chart/core/legendBox.js.map +1 -0
- package/lib/chart/core/selectionGeometry.d.ts +45 -0
- package/lib/chart/core/selectionGeometry.d.ts.map +1 -0
- package/lib/chart/core/selectionGeometry.js +49 -0
- package/lib/chart/core/selectionGeometry.js.map +1 -0
- package/lib/chart/core/spectrumColor.d.ts +80 -0
- package/lib/chart/core/spectrumColor.d.ts.map +1 -0
- package/lib/chart/core/spectrumColor.js +120 -0
- package/lib/chart/core/spectrumColor.js.map +1 -0
- package/lib/chart/core/stackCapacity.d.ts +136 -0
- package/lib/chart/core/stackCapacity.d.ts.map +1 -0
- package/lib/chart/core/stackCapacity.js +153 -0
- package/lib/chart/core/stackCapacity.js.map +1 -0
- package/lib/chart/core/svgPoint.d.ts +62 -0
- package/lib/chart/core/svgPoint.d.ts.map +1 -0
- package/lib/chart/core/svgPoint.js +43 -0
- package/lib/chart/core/svgPoint.js.map +1 -0
- package/lib/chart/core/tracePath.d.ts +94 -0
- package/lib/chart/core/tracePath.d.ts.map +1 -0
- package/lib/chart/core/tracePath.js +191 -0
- package/lib/chart/core/tracePath.js.map +1 -0
- package/lib/chart/core/trackerReadout.d.ts +55 -0
- package/lib/chart/core/trackerReadout.d.ts.map +1 -0
- package/lib/chart/core/trackerReadout.js +53 -0
- package/lib/chart/core/trackerReadout.js.map +1 -0
- package/lib/chart/core/viewTransform.d.ts +167 -0
- package/lib/chart/core/viewTransform.d.ts.map +1 -0
- package/lib/chart/core/viewTransform.js +188 -0
- package/lib/chart/core/viewTransform.js.map +1 -0
- package/lib/chart/core/zoomDomain.d.ts +127 -0
- package/lib/chart/core/zoomDomain.d.ts.map +1 -0
- package/lib/chart/core/zoomDomain.js +175 -0
- package/lib/chart/core/zoomDomain.js.map +1 -0
- package/lib/chart/ui/Axes.d.ts +104 -0
- package/lib/chart/ui/Axes.d.ts.map +1 -0
- package/lib/chart/ui/Axes.js +155 -0
- package/lib/chart/ui/Axes.js.map +1 -0
- package/lib/chart/ui/AxisGuide.d.ts +60 -0
- package/lib/chart/ui/AxisGuide.d.ts.map +1 -0
- package/lib/chart/ui/AxisGuide.js +111 -0
- package/lib/chart/ui/AxisGuide.js.map +1 -0
- package/lib/chart/ui/ChartStack.d.ts +81 -0
- package/lib/chart/ui/ChartStack.d.ts.map +1 -0
- package/lib/chart/ui/ChartStack.js +42 -0
- package/lib/chart/ui/ChartStack.js.map +1 -0
- package/lib/chart/ui/ChartTracker.d.ts +36 -0
- package/lib/chart/ui/ChartTracker.d.ts.map +1 -0
- package/lib/chart/ui/ChartTracker.js +27 -0
- package/lib/chart/ui/ChartTracker.js.map +1 -0
- package/lib/chart/ui/PlotCaption.d.ts +44 -0
- package/lib/chart/ui/PlotCaption.d.ts.map +1 -0
- package/lib/chart/ui/PlotCaption.js +68 -0
- package/lib/chart/ui/PlotCaption.js.map +1 -0
- package/lib/chart/ui/SelectionRect.d.ts +27 -0
- package/lib/chart/ui/SelectionRect.d.ts.map +1 -0
- package/lib/chart/ui/SelectionRect.js +31 -0
- package/lib/chart/ui/SelectionRect.js.map +1 -0
- package/lib/chart/ui/TraceLegend.d.ts +99 -0
- package/lib/chart/ui/TraceLegend.d.ts.map +1 -0
- package/lib/chart/ui/TraceLegend.js +45 -0
- package/lib/chart/ui/TraceLegend.js.map +1 -0
- package/lib/chart/ui/chartGestures.d.ts +158 -0
- package/lib/chart/ui/chartGestures.d.ts.map +1 -0
- package/lib/chart/ui/chartGestures.js +145 -0
- package/lib/chart/ui/chartGestures.js.map +1 -0
- package/lib/chart/ui/chartStackLevel.d.ts +115 -0
- package/lib/chart/ui/chartStackLevel.d.ts.map +1 -0
- package/lib/chart/ui/chartStackLevel.js +96 -0
- package/lib/chart/ui/chartStackLevel.js.map +1 -0
- package/lib/chart/ui/chartSurface.d.ts +35 -0
- package/lib/chart/ui/chartSurface.d.ts.map +1 -0
- package/lib/chart/ui/chartSurface.js +58 -0
- package/lib/chart/ui/chartSurface.js.map +1 -0
- package/lib/chart/ui/index.d.ts +24 -0
- package/lib/chart/ui/index.d.ts.map +1 -1
- package/lib/chart/ui/index.js +13 -0
- package/lib/chart/ui/index.js.map +1 -1
- package/lib/chart/ui/useChartPointer.d.ts +124 -0
- package/lib/chart/ui/useChartPointer.d.ts.map +1 -0
- package/lib/chart/ui/useChartPointer.js +152 -0
- package/lib/chart/ui/useChartPointer.js.map +1 -0
- package/lib/chart/ui/useChartSize.d.ts +49 -0
- package/lib/chart/ui/useChartSize.d.ts.map +1 -0
- package/lib/chart/ui/useChartSize.js +91 -0
- package/lib/chart/ui/useChartSize.js.map +1 -0
- package/lib/chart/ui/useChartWindow.d.ts +147 -0
- package/lib/chart/ui/useChartWindow.d.ts.map +1 -0
- package/lib/chart/ui/useChartWindow.js +135 -0
- package/lib/chart/ui/useChartWindow.js.map +1 -0
- package/lib/chart/ui/useChartZoom.d.ts +88 -0
- package/lib/chart/ui/useChartZoom.d.ts.map +1 -0
- package/lib/chart/ui/useChartZoom.js +142 -0
- package/lib/chart/ui/useChartZoom.js.map +1 -0
- package/lib/chart/ui/useWheelListener.d.ts +30 -0
- package/lib/chart/ui/useWheelListener.d.ts.map +1 -0
- package/lib/chart/ui/useWheelListener.js +57 -0
- package/lib/chart/ui/useWheelListener.js.map +1 -0
- package/lib/chrome/ui/AccountButton.d.ts +76 -0
- package/lib/chrome/ui/AccountButton.d.ts.map +1 -0
- package/lib/chrome/ui/AccountButton.js +66 -0
- package/lib/chrome/ui/AccountButton.js.map +1 -0
- package/lib/chrome/ui/index.d.ts +2 -0
- package/lib/chrome/ui/index.d.ts.map +1 -1
- package/lib/chrome/ui/index.js +1 -0
- package/lib/chrome/ui/index.js.map +1 -1
- package/lib/clipboard/core/copyPng.d.ts +13 -0
- package/lib/clipboard/core/copyPng.d.ts.map +1 -0
- package/lib/clipboard/core/copyPng.js +19 -0
- package/lib/clipboard/core/copyPng.js.map +1 -0
- package/lib/clipboard/core/index.d.ts +1 -0
- package/lib/clipboard/core/index.d.ts.map +1 -1
- package/lib/clipboard/core/index.js +1 -0
- package/lib/clipboard/core/index.js.map +1 -1
- package/lib/clipboard/ui/ClickToCopy.d.ts +6 -0
- package/lib/clipboard/ui/ClickToCopy.d.ts.map +1 -1
- package/lib/clipboard/ui/ClickToCopy.js +3 -3
- package/lib/clipboard/ui/ClickToCopy.js.map +1 -1
- package/lib/core.d.ts +1 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +1 -0
- package/lib/core.js.map +1 -1
- package/lib/download/core/exportStyles.d.ts +22 -0
- package/lib/download/core/exportStyles.d.ts.map +1 -0
- package/lib/download/core/exportStyles.js +19 -0
- package/lib/download/core/exportStyles.js.map +1 -0
- package/lib/download/core/imageResolution.d.ts +88 -0
- package/lib/download/core/imageResolution.d.ts.map +1 -0
- package/lib/download/core/imageResolution.js +77 -0
- package/lib/download/core/imageResolution.js.map +1 -0
- package/lib/download/core/index.d.ts +13 -0
- package/lib/download/core/index.d.ts.map +1 -1
- package/lib/download/core/index.js +8 -0
- package/lib/download/core/index.js.map +1 -1
- package/lib/download/core/pictureExport.d.ts +93 -0
- package/lib/download/core/pictureExport.d.ts.map +1 -0
- package/lib/download/core/pictureExport.js +116 -0
- package/lib/download/core/pictureExport.js.map +1 -0
- package/lib/download/core/stackedDrawing.d.ts +36 -0
- package/lib/download/core/stackedDrawing.d.ts.map +1 -0
- package/lib/download/core/stackedDrawing.js +98 -0
- package/lib/download/core/stackedDrawing.js.map +1 -0
- package/lib/download/core/svgBounds.d.ts +44 -0
- package/lib/download/core/svgBounds.d.ts.map +1 -0
- package/lib/download/core/svgBounds.js +69 -0
- package/lib/download/core/svgBounds.js.map +1 -0
- package/lib/download/core/svgNamespace.d.ts +9 -0
- package/lib/download/core/svgNamespace.d.ts.map +1 -0
- package/lib/download/core/svgNamespace.js +10 -0
- package/lib/download/core/svgNamespace.js.map +1 -0
- package/lib/download/core/svgToPng.d.ts +43 -0
- package/lib/download/core/svgToPng.d.ts.map +1 -0
- package/lib/download/core/svgToPng.js +79 -0
- package/lib/download/core/svgToPng.js.map +1 -0
- package/lib/download/core/svgToString.d.ts +45 -0
- package/lib/download/core/svgToString.d.ts.map +1 -0
- package/lib/download/core/svgToString.js +58 -0
- package/lib/download/core/svgToString.js.map +1 -0
- package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
- package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
- package/lib/download/ui/ExportDialogFrame.js +24 -0
- package/lib/download/ui/ExportDialogFrame.js.map +1 -0
- package/lib/download/ui/ExportImageDialog.d.ts +47 -0
- package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
- package/lib/download/ui/ExportImageDialog.js +25 -0
- package/lib/download/ui/ExportImageDialog.js.map +1 -0
- package/lib/download/ui/ExportNameField.d.ts +29 -0
- package/lib/download/ui/ExportNameField.d.ts.map +1 -0
- package/lib/download/ui/ExportNameField.js +99 -0
- package/lib/download/ui/ExportNameField.js.map +1 -0
- package/lib/download/ui/ExportPictureSection.d.ts +38 -0
- package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
- package/lib/download/ui/ExportPictureSection.js +48 -0
- package/lib/download/ui/ExportPictureSection.js.map +1 -0
- package/lib/download/ui/index.d.ts +10 -0
- package/lib/download/ui/index.d.ts.map +1 -1
- package/lib/download/ui/index.js +5 -0
- package/lib/download/ui/index.js.map +1 -1
- package/lib/download/ui/useDrawingBox.d.ts +23 -0
- package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
- package/lib/download/ui/useDrawingBox.js +21 -0
- package/lib/download/ui/useDrawingBox.js.map +1 -0
- package/lib/error/core/describeSource.d.ts +17 -0
- package/lib/error/core/describeSource.d.ts.map +1 -0
- package/lib/error/core/describeSource.js +19 -0
- package/lib/error/core/describeSource.js.map +1 -0
- package/lib/error/core/index.d.ts +1 -0
- package/lib/error/core/index.d.ts.map +1 -1
- package/lib/error/core/index.js +1 -0
- package/lib/error/core/index.js.map +1 -1
- package/lib/help/ui/HelpBody.d.ts +10 -1
- package/lib/help/ui/HelpBody.d.ts.map +1 -1
- package/lib/help/ui/HelpBody.js +24 -1
- package/lib/help/ui/HelpBody.js.map +1 -1
- package/lib/help/ui/index.d.ts +1 -1
- package/lib/help/ui/index.d.ts.map +1 -1
- package/lib/help/ui/index.js.map +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/ir/core/analysisSpectra.d.ts +46 -0
- package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
- package/lib/ir/core/analysisSpectra.js +187 -0
- package/lib/ir/core/analysisSpectra.js.map +1 -0
- package/lib/ir/core/assignBands.d.ts +83 -0
- package/lib/ir/core/assignBands.d.ts.map +1 -0
- package/lib/ir/core/assignBands.js +83 -0
- package/lib/ir/core/assignBands.js.map +1 -0
- package/lib/ir/core/bandAssignments.d.ts +47 -0
- package/lib/ir/core/bandAssignments.d.ts.map +1 -0
- package/lib/ir/core/bandAssignments.js +305 -0
- package/lib/ir/core/bandAssignments.js.map +1 -0
- package/lib/ir/core/bandLabelPlan.d.ts +93 -0
- package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
- package/lib/ir/core/bandLabelPlan.js +104 -0
- package/lib/ir/core/bandLabelPlan.js.map +1 -0
- package/lib/ir/core/detectIrFormat.d.ts +23 -0
- package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
- package/lib/ir/core/detectIrFormat.js +133 -0
- package/lib/ir/core/detectIrFormat.js.map +1 -0
- package/lib/ir/core/downloadSpectra.d.ts +26 -0
- package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
- package/lib/ir/core/downloadSpectra.js +37 -0
- package/lib/ir/core/downloadSpectra.js.map +1 -0
- package/lib/ir/core/fromJcamp.d.ts +35 -0
- package/lib/ir/core/fromJcamp.d.ts.map +1 -0
- package/lib/ir/core/fromJcamp.js +48 -0
- package/lib/ir/core/fromJcamp.js.map +1 -0
- package/lib/ir/core/fromSpc.d.ts +30 -0
- package/lib/ir/core/fromSpc.d.ts.map +1 -0
- package/lib/ir/core/fromSpc.js +40 -0
- package/lib/ir/core/fromSpc.js.map +1 -0
- package/lib/ir/core/index.d.ts +51 -0
- package/lib/ir/core/index.d.ts.map +1 -0
- package/lib/ir/core/index.js +35 -0
- package/lib/ir/core/index.js.map +1 -0
- package/lib/ir/core/irBand.d.ts +45 -0
- package/lib/ir/core/irBand.d.ts.map +1 -0
- package/lib/ir/core/irBand.js +30 -0
- package/lib/ir/core/irBand.js.map +1 -0
- package/lib/ir/core/irCommands.d.ts +168 -0
- package/lib/ir/core/irCommands.d.ts.map +1 -0
- package/lib/ir/core/irCommands.js +94 -0
- package/lib/ir/core/irCommands.js.map +1 -0
- package/lib/ir/core/irDomain.d.ts +63 -0
- package/lib/ir/core/irDomain.d.ts.map +1 -0
- package/lib/ir/core/irDomain.js +136 -0
- package/lib/ir/core/irDomain.js.map +1 -0
- package/lib/ir/core/irEditorApi.d.ts +42 -0
- package/lib/ir/core/irEditorApi.d.ts.map +1 -0
- package/lib/ir/core/irEditorApi.js +10 -0
- package/lib/ir/core/irEditorApi.js.map +1 -0
- package/lib/ir/core/irFormat.d.ts +42 -0
- package/lib/ir/core/irFormat.d.ts.map +1 -0
- package/lib/ir/core/irFormat.js +51 -0
- package/lib/ir/core/irFormat.js.map +1 -0
- package/lib/ir/core/irMode.d.ts +160 -0
- package/lib/ir/core/irMode.d.ts.map +1 -0
- package/lib/ir/core/irMode.js +175 -0
- package/lib/ir/core/irMode.js.map +1 -0
- package/lib/ir/core/irReducer.d.ts +101 -0
- package/lib/ir/core/irReducer.d.ts.map +1 -0
- package/lib/ir/core/irReducer.js +207 -0
- package/lib/ir/core/irReducer.js.map +1 -0
- package/lib/ir/core/irSidePanels.d.ts +22 -0
- package/lib/ir/core/irSidePanels.d.ts.map +1 -0
- package/lib/ir/core/irSidePanels.js +12 -0
- package/lib/ir/core/irSidePanels.js.map +1 -0
- package/lib/ir/core/irSpectrum.d.ts +140 -0
- package/lib/ir/core/irSpectrum.d.ts.map +1 -0
- package/lib/ir/core/irSpectrum.js +34 -0
- package/lib/ir/core/irSpectrum.js.map +1 -0
- package/lib/ir/core/irState.d.ts +119 -0
- package/lib/ir/core/irState.d.ts.map +1 -0
- package/lib/ir/core/irState.js +92 -0
- package/lib/ir/core/irState.js.map +1 -0
- package/lib/ir/core/loadIrSpectra.d.ts +36 -0
- package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
- package/lib/ir/core/loadIrSpectra.js +44 -0
- package/lib/ir/core/loadIrSpectra.js.map +1 -0
- package/lib/ir/core/nearestBand.d.ts +35 -0
- package/lib/ir/core/nearestBand.d.ts.map +1 -0
- package/lib/ir/core/nearestBand.js +47 -0
- package/lib/ir/core/nearestBand.js.map +1 -0
- package/lib/ir/core/pickBands.d.ts +70 -0
- package/lib/ir/core/pickBands.d.ts.map +1 -0
- package/lib/ir/core/pickBands.js +125 -0
- package/lib/ir/core/pickBands.js.map +1 -0
- package/lib/ir/core/spectrumJcamp.d.ts +58 -0
- package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
- package/lib/ir/core/spectrumJcamp.js +156 -0
- package/lib/ir/core/spectrumJcamp.js.map +1 -0
- package/lib/ir/core/toIrSpectrum.d.ts +59 -0
- package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
- package/lib/ir/core/toIrSpectrum.js +56 -0
- package/lib/ir/core/toIrSpectrum.js.map +1 -0
- package/lib/ir/ui/BandMarks.d.ts +52 -0
- package/lib/ir/ui/BandMarks.d.ts.map +1 -0
- package/lib/ir/ui/BandMarks.js +71 -0
- package/lib/ir/ui/BandMarks.js.map +1 -0
- package/lib/ir/ui/BandsPanel.d.ts +31 -0
- package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
- package/lib/ir/ui/BandsPanel.js +94 -0
- package/lib/ir/ui/BandsPanel.js.map +1 -0
- package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
- package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
- package/lib/ir/ui/IrAboutDialog.js +32 -0
- package/lib/ir/ui/IrAboutDialog.js.map +1 -0
- package/lib/ir/ui/IrCanvas.d.ts +38 -0
- package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
- package/lib/ir/ui/IrCanvas.js +41 -0
- package/lib/ir/ui/IrCanvas.js.map +1 -0
- package/lib/ir/ui/IrChart.d.ts +28 -0
- package/lib/ir/ui/IrChart.d.ts.map +1 -0
- package/lib/ir/ui/IrChart.js +114 -0
- package/lib/ir/ui/IrChart.js.map +1 -0
- package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
- package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
- package/lib/ir/ui/IrCommandProvider.js +14 -0
- package/lib/ir/ui/IrCommandProvider.js.map +1 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
- package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
- package/lib/ir/ui/IrCommandTooltip.js +22 -0
- package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
- package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
- package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
- package/lib/ir/ui/IrDocumentationDialog.js +68 -0
- package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
- package/lib/ir/ui/IrEditor.d.ts +60 -0
- package/lib/ir/ui/IrEditor.d.ts.map +1 -0
- package/lib/ir/ui/IrEditor.js +42 -0
- package/lib/ir/ui/IrEditor.js.map +1 -0
- package/lib/ir/ui/IrHeader.d.ts +13 -0
- package/lib/ir/ui/IrHeader.d.ts.map +1 -0
- package/lib/ir/ui/IrHeader.js +21 -0
- package/lib/ir/ui/IrHeader.js.map +1 -0
- package/lib/ir/ui/IrLogo.d.ts +20 -0
- package/lib/ir/ui/IrLogo.d.ts.map +1 -0
- package/lib/ir/ui/IrLogo.js +17 -0
- package/lib/ir/ui/IrLogo.js.map +1 -0
- package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
- package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
- package/lib/ir/ui/IrPointerTracker.js +47 -0
- package/lib/ir/ui/IrPointerTracker.js.map +1 -0
- package/lib/ir/ui/IrShell.d.ts +25 -0
- package/lib/ir/ui/IrShell.d.ts.map +1 -0
- package/lib/ir/ui/IrShell.js +178 -0
- package/lib/ir/ui/IrShell.js.map +1 -0
- package/lib/ir/ui/IrSidePanel.d.ts +26 -0
- package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
- package/lib/ir/ui/IrSidePanel.js +39 -0
- package/lib/ir/ui/IrSidePanel.js.map +1 -0
- package/lib/ir/ui/IrStateProvider.d.ts +19 -0
- package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
- package/lib/ir/ui/IrStateProvider.js +16 -0
- package/lib/ir/ui/IrStateProvider.js.map +1 -0
- package/lib/ir/ui/IrStatusBar.d.ts +14 -0
- package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
- package/lib/ir/ui/IrStatusBar.js +48 -0
- package/lib/ir/ui/IrStatusBar.js.map +1 -0
- package/lib/ir/ui/IrToolbar.d.ts +18 -0
- package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
- package/lib/ir/ui/IrToolbar.js +32 -0
- package/lib/ir/ui/IrToolbar.js.map +1 -0
- package/lib/ir/ui/IrTraces.d.ts +63 -0
- package/lib/ir/ui/IrTraces.d.ts.map +1 -0
- package/lib/ir/ui/IrTraces.js +72 -0
- package/lib/ir/ui/IrTraces.js.map +1 -0
- package/lib/ir/ui/MetadataPanel.d.ts +15 -0
- package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
- package/lib/ir/ui/MetadataPanel.js +49 -0
- package/lib/ir/ui/MetadataPanel.js.map +1 -0
- package/lib/ir/ui/SpectraPanel.d.ts +20 -0
- package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
- package/lib/ir/ui/SpectraPanel.js +42 -0
- package/lib/ir/ui/SpectraPanel.js.map +1 -0
- package/lib/ir/ui/SpectrumRow.d.ts +26 -0
- package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
- package/lib/ir/ui/SpectrumRow.js +41 -0
- package/lib/ir/ui/SpectrumRow.js.map +1 -0
- package/lib/ir/ui/index.d.ts +56 -0
- package/lib/ir/ui/index.d.ts.map +1 -0
- package/lib/ir/ui/index.js +36 -0
- package/lib/ir/ui/index.js.map +1 -0
- package/lib/ir/ui/irActions.d.ts +52 -0
- package/lib/ir/ui/irActions.d.ts.map +1 -0
- package/lib/ir/ui/irActions.js +62 -0
- package/lib/ir/ui/irActions.js.map +1 -0
- package/lib/ir/ui/irChartProps.d.ts +116 -0
- package/lib/ir/ui/irChartProps.d.ts.map +1 -0
- package/lib/ir/ui/irChartProps.js +14 -0
- package/lib/ir/ui/irChartProps.js.map +1 -0
- package/lib/ir/ui/irCommandContext.d.ts +35 -0
- package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
- package/lib/ir/ui/irCommandContext.js +44 -0
- package/lib/ir/ui/irCommandContext.js.map +1 -0
- package/lib/ir/ui/irStateContext.d.ts +26 -0
- package/lib/ir/ui/irStateContext.d.ts.map +1 -0
- package/lib/ir/ui/irStateContext.js +37 -0
- package/lib/ir/ui/irStateContext.js.map +1 -0
- package/lib/ir/ui/useIrEditor.d.ts +51 -0
- package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
- package/lib/ir/ui/useIrEditor.js +88 -0
- package/lib/ir/ui/useIrEditor.js.map +1 -0
- package/lib/ir/ui/useIrPointer.d.ts +66 -0
- package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
- package/lib/ir/ui/useIrPointer.js +53 -0
- package/lib/ir/ui/useIrPointer.js.map +1 -0
- package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
- package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
- package/lib/ir/ui/useIrShortcuts.js +73 -0
- package/lib/ir/ui/useIrShortcuts.js.map +1 -0
- package/lib/ir/ui/useIrZoom.d.ts +51 -0
- package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
- package/lib/ir/ui/useIrZoom.js +46 -0
- package/lib/ir/ui/useIrZoom.js.map +1 -0
- package/lib/ir.d.ts +13 -0
- package/lib/ir.d.ts.map +1 -0
- package/lib/ir.js +13 -0
- package/lib/ir.js.map +1 -0
- package/lib/locales/de.json +3 -0
- package/lib/locales/en.json +3 -0
- package/lib/locales/es.json +3 -0
- package/lib/locales/fr.json +3 -0
- package/lib/panel/core/dialogStyles.d.ts +13 -0
- package/lib/panel/core/dialogStyles.d.ts.map +1 -0
- package/lib/panel/core/dialogStyles.js +11 -0
- package/lib/panel/core/dialogStyles.js.map +1 -0
- package/lib/panel/core/index.d.ts +19 -0
- package/lib/panel/core/index.d.ts.map +1 -0
- package/lib/panel/core/index.js +18 -0
- package/lib/panel/core/index.js.map +1 -0
- package/lib/panel/core/isEditingField.d.ts +17 -0
- package/lib/panel/core/isEditingField.d.ts.map +1 -0
- package/lib/panel/core/isEditingField.js +25 -0
- package/lib/panel/core/isEditingField.js.map +1 -0
- package/lib/panel/core/panelStyles.d.ts +242 -0
- package/lib/panel/core/panelStyles.d.ts.map +1 -0
- package/lib/panel/core/panelStyles.js +228 -0
- package/lib/panel/core/panelStyles.js.map +1 -0
- package/lib/panel/core/rowSpacers.d.ts +38 -0
- package/lib/panel/core/rowSpacers.d.ts.map +1 -0
- package/lib/panel/core/rowSpacers.js +31 -0
- package/lib/panel/core/rowSpacers.js.map +1 -0
- package/lib/panel/core/statusBar.d.ts +44 -0
- package/lib/panel/core/statusBar.d.ts.map +1 -0
- package/lib/panel/core/statusBar.js +40 -0
- package/lib/panel/core/statusBar.js.map +1 -0
- package/lib/panel/core/textFilter.d.ts +22 -0
- package/lib/panel/core/textFilter.d.ts.map +1 -0
- package/lib/panel/core/textFilter.js +32 -0
- package/lib/panel/core/textFilter.js.map +1 -0
- package/lib/panel/core/yieldToPainting.d.ts +17 -0
- package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
- package/lib/panel/core/yieldToPainting.js +21 -0
- package/lib/panel/core/yieldToPainting.js.map +1 -0
- package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
- package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
- package/lib/panel/ui/AboutDialogFrame.js +43 -0
- package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
- package/lib/panel/ui/ClearButton.d.ts +28 -0
- package/lib/panel/ui/ClearButton.d.ts.map +1 -0
- package/lib/panel/ui/ClearButton.js +23 -0
- package/lib/panel/ui/ClearButton.js.map +1 -0
- package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
- package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
- package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
- package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
- package/lib/panel/ui/FilterInput.d.ts +31 -0
- package/lib/panel/ui/FilterInput.d.ts.map +1 -0
- package/lib/panel/ui/FilterInput.js +23 -0
- package/lib/panel/ui/FilterInput.js.map +1 -0
- package/lib/panel/ui/HelpLabel.d.ts +24 -0
- package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
- package/lib/panel/ui/HelpLabel.js +23 -0
- package/lib/panel/ui/HelpLabel.js.map +1 -0
- package/lib/panel/ui/PanelMessage.d.ts +41 -0
- package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
- package/lib/panel/ui/PanelMessage.js +30 -0
- package/lib/panel/ui/PanelMessage.js.map +1 -0
- package/lib/panel/ui/PanelRail.d.ts +41 -0
- package/lib/panel/ui/PanelRail.d.ts.map +1 -0
- package/lib/panel/ui/PanelRail.js +12 -0
- package/lib/panel/ui/PanelRail.js.map +1 -0
- package/lib/panel/ui/Section.d.ts +25 -0
- package/lib/panel/ui/Section.d.ts.map +1 -0
- package/lib/panel/ui/Section.js +41 -0
- package/lib/panel/ui/Section.js.map +1 -0
- package/lib/panel/ui/SidePanelStack.d.ts +62 -0
- package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
- package/lib/panel/ui/SidePanelStack.js +40 -0
- package/lib/panel/ui/SidePanelStack.js.map +1 -0
- package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
- package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
- package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
- package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
- package/lib/panel/ui/index.d.ts +37 -0
- package/lib/panel/ui/index.d.ts.map +1 -0
- package/lib/panel/ui/index.js +24 -0
- package/lib/panel/ui/index.js.map +1 -0
- package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
- package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
- package/lib/panel/ui/useConfirmOnEnter.js +64 -0
- package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
- package/lib/panel/ui/useFilterBox.d.ts +23 -0
- package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
- package/lib/panel/ui/useFilterBox.js +22 -0
- package/lib/panel/ui/useFilterBox.js.map +1 -0
- package/lib/panel/ui/useVirtualRows.d.ts +46 -0
- package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
- package/lib/panel/ui/useVirtualRows.js +56 -0
- package/lib/panel/ui/useVirtualRows.js.map +1 -0
- package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
- package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
- package/lib/panel/ui/useVirtualWindowRows.js +65 -0
- package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
- package/lib/structure/core/conformerBoltzmann.d.ts +56 -0
- package/lib/structure/core/conformerBoltzmann.d.ts.map +1 -0
- package/lib/structure/core/conformerBoltzmann.js +96 -0
- package/lib/structure/core/conformerBoltzmann.js.map +1 -0
- package/lib/structure/core/conformerEnergy.d.ts +69 -0
- package/lib/structure/core/conformerEnergy.d.ts.map +1 -0
- package/lib/structure/core/conformerEnergy.js +47 -0
- package/lib/structure/core/conformerEnergy.js.map +1 -0
- package/lib/structure/core/index.d.ts +3 -0
- package/lib/structure/core/index.d.ts.map +1 -1
- package/lib/structure/core/index.js +2 -0
- package/lib/structure/core/index.js.map +1 -1
- package/lib/structure/ui/ConformerTable.d.ts +73 -0
- package/lib/structure/ui/ConformerTable.d.ts.map +1 -0
- package/lib/structure/ui/ConformerTable.js +259 -0
- package/lib/structure/ui/ConformerTable.js.map +1 -0
- package/lib/structure/ui/conformerColumns.d.ts +30 -0
- package/lib/structure/ui/conformerColumns.d.ts.map +1 -0
- package/lib/structure/ui/conformerColumns.js +37 -0
- package/lib/structure/ui/conformerColumns.js.map +1 -0
- package/lib/ui.d.ts +5 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +3 -0
- package/lib/ui.js.map +1 -1
- package/package.json +8 -1
- package/src/chart/core/axisLabels.ts +117 -0
- package/src/chart/core/boxLayout.ts +126 -0
- package/src/chart/core/chartAxisScale.ts +92 -10
- package/src/chart/core/chartDomain.ts +185 -0
- package/src/chart/core/chartGeometry.ts +159 -0
- package/src/chart/core/chartPane.ts +10 -0
- package/src/chart/core/chartScale.ts +7 -4
- package/src/chart/core/chartTheme.ts +161 -0
- package/src/chart/core/chartViewport.ts +40 -13
- package/src/chart/core/guidePlacement.ts +66 -0
- package/src/chart/core/index.ts +121 -2
- package/src/chart/core/labelStack.ts +72 -0
- package/src/chart/core/legendBox.ts +263 -0
- package/src/chart/core/selectionGeometry.ts +68 -0
- package/src/chart/core/spectrumColor.ts +129 -0
- package/src/chart/core/stackCapacity.ts +162 -0
- package/src/chart/core/svgPoint.ts +77 -0
- package/src/chart/core/tracePath.ts +228 -0
- package/src/chart/core/trackerReadout.ts +78 -0
- package/src/chart/core/viewTransform.ts +287 -0
- package/src/chart/core/zoomDomain.ts +235 -0
- package/src/chart/ui/Axes.tsx +361 -0
- package/src/chart/ui/AxisGuide.tsx +187 -0
- package/src/chart/ui/ChartStack.tsx +130 -0
- package/src/chart/ui/ChartTracker.tsx +101 -0
- package/src/chart/ui/PlotCaption.tsx +108 -0
- package/src/chart/ui/SelectionRect.tsx +52 -0
- package/src/chart/ui/TraceLegend.tsx +193 -0
- package/src/chart/ui/chartGestures.ts +270 -0
- package/src/chart/ui/chartStackLevel.tsx +210 -0
- package/src/chart/ui/chartSurface.ts +66 -0
- package/src/chart/ui/index.ts +35 -0
- package/src/chart/ui/useChartPointer.ts +223 -0
- package/src/chart/ui/useChartSize.ts +115 -0
- package/src/chart/ui/useChartWindow.ts +240 -0
- package/src/chart/ui/useChartZoom.ts +255 -0
- package/src/chart/ui/useWheelListener.ts +62 -0
- package/src/chrome/ui/AccountButton.tsx +185 -0
- package/src/chrome/ui/index.ts +2 -0
- package/src/clipboard/core/copyPng.ts +20 -0
- package/src/clipboard/core/index.ts +1 -0
- package/src/clipboard/ui/ClickToCopy.tsx +9 -1
- package/src/core.ts +1 -0
- package/src/download/core/exportStyles.ts +20 -0
- package/src/download/core/imageResolution.ts +118 -0
- package/src/download/core/index.ts +34 -0
- package/src/download/core/pictureExport.ts +207 -0
- package/src/download/core/stackedDrawing.ts +108 -0
- package/src/download/core/svgBounds.ts +80 -0
- package/src/download/core/svgNamespace.ts +9 -0
- package/src/download/core/svgToPng.ts +121 -0
- package/src/download/core/svgToString.ts +95 -0
- package/src/download/ui/ExportDialogFrame.tsx +86 -0
- package/src/download/ui/ExportImageDialog.tsx +91 -0
- package/src/download/ui/ExportNameField.tsx +148 -0
- package/src/download/ui/ExportPictureSection.tsx +142 -0
- package/src/download/ui/index.ts +11 -0
- package/src/download/ui/useDrawingBox.ts +37 -0
- package/src/error/core/describeSource.ts +18 -0
- package/src/error/core/index.ts +1 -0
- package/src/help/ui/HelpBody.tsx +41 -2
- package/src/help/ui/index.ts +6 -1
- package/src/ir/core/analysisSpectra.ts +231 -0
- package/src/ir/core/assignBands.ts +144 -0
- package/src/ir/core/bandAssignments.ts +329 -0
- package/src/ir/core/bandLabelPlan.ts +194 -0
- package/src/ir/core/detectIrFormat.ts +139 -0
- package/src/ir/core/downloadSpectra.ts +57 -0
- package/src/ir/core/fromJcamp.ts +70 -0
- package/src/ir/core/fromSpc.ts +61 -0
- package/src/ir/core/index.ts +113 -0
- package/src/ir/core/irBand.ts +57 -0
- package/src/ir/core/irCommands.ts +154 -0
- package/src/ir/core/irDomain.ts +163 -0
- package/src/ir/core/irEditorApi.ts +44 -0
- package/src/ir/core/irFormat.ts +57 -0
- package/src/ir/core/irMode.ts +203 -0
- package/src/ir/core/irReducer.ts +273 -0
- package/src/ir/core/irSidePanels.ts +20 -0
- package/src/ir/core/irSpectrum.ts +155 -0
- package/src/ir/core/irState.ts +173 -0
- package/src/ir/core/loadIrSpectra.ts +79 -0
- package/src/ir/core/nearestBand.ts +57 -0
- package/src/ir/core/pickBands.ts +181 -0
- package/src/ir/core/spectrumJcamp.ts +178 -0
- package/src/ir/core/toIrSpectrum.ts +102 -0
- package/src/ir/ui/BandMarks.tsx +166 -0
- package/src/ir/ui/BandsPanel.tsx +271 -0
- package/src/ir/ui/IrAboutDialog.tsx +121 -0
- package/src/ir/ui/IrCanvas.tsx +91 -0
- package/src/ir/ui/IrChart.tsx +215 -0
- package/src/ir/ui/IrCommandProvider.tsx +32 -0
- package/src/ir/ui/IrCommandTooltip.tsx +36 -0
- package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
- package/src/ir/ui/IrEditor.tsx +99 -0
- package/src/ir/ui/IrHeader.tsx +39 -0
- package/src/ir/ui/IrLogo.tsx +49 -0
- package/src/ir/ui/IrPointerTracker.tsx +102 -0
- package/src/ir/ui/IrShell.tsx +285 -0
- package/src/ir/ui/IrSidePanel.tsx +78 -0
- package/src/ir/ui/IrStateProvider.tsx +32 -0
- package/src/ir/ui/IrStatusBar.tsx +97 -0
- package/src/ir/ui/IrToolbar.tsx +102 -0
- package/src/ir/ui/IrTraces.tsx +134 -0
- package/src/ir/ui/MetadataPanel.tsx +88 -0
- package/src/ir/ui/SpectraPanel.tsx +114 -0
- package/src/ir/ui/SpectrumRow.tsx +127 -0
- package/src/ir/ui/index.ts +56 -0
- package/src/ir/ui/irActions.ts +103 -0
- package/src/ir/ui/irChartProps.ts +118 -0
- package/src/ir/ui/irCommandContext.tsx +62 -0
- package/src/ir/ui/irStateContext.ts +48 -0
- package/src/ir/ui/useIrEditor.ts +139 -0
- package/src/ir/ui/useIrPointer.ts +109 -0
- package/src/ir/ui/useIrShortcuts.ts +95 -0
- package/src/ir/ui/useIrZoom.ts +86 -0
- package/src/ir.ts +13 -0
- package/src/locales/de.json +3 -0
- package/src/locales/en.json +3 -0
- package/src/locales/es.json +3 -0
- package/src/locales/fr.json +3 -0
- package/src/panel/core/dialogStyles.ts +11 -0
- package/src/panel/core/index.ts +47 -0
- package/src/panel/core/isEditingField.ts +23 -0
- package/src/panel/core/panelStyles.ts +248 -0
- package/src/panel/core/rowSpacers.ts +50 -0
- package/src/panel/core/statusBar.ts +48 -0
- package/src/panel/core/textFilter.ts +33 -0
- package/src/panel/core/yieldToPainting.ts +20 -0
- package/src/panel/ui/AboutDialogFrame.tsx +100 -0
- package/src/panel/ui/ClearButton.tsx +42 -0
- package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
- package/src/panel/ui/FilterInput.tsx +60 -0
- package/src/panel/ui/HelpLabel.tsx +43 -0
- package/src/panel/ui/PanelMessage.tsx +64 -0
- package/src/panel/ui/PanelRail.tsx +64 -0
- package/src/panel/ui/Section.tsx +66 -0
- package/src/panel/ui/SidePanelStack.tsx +109 -0
- package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
- package/src/panel/ui/index.ts +47 -0
- package/src/panel/ui/useConfirmOnEnter.ts +68 -0
- package/src/panel/ui/useFilterBox.ts +35 -0
- package/src/panel/ui/useVirtualRows.ts +82 -0
- package/src/panel/ui/useVirtualWindowRows.ts +86 -0
- package/src/structure/core/conformerBoltzmann.ts +102 -0
- package/src/structure/core/conformerEnergy.ts +97 -0
- package/src/structure/core/index.ts +15 -0
- package/src/structure/ui/ConformerTable.tsx +429 -0
- package/src/structure/ui/conformerColumns.ts +55 -0
- package/src/ui.ts +13 -0
- package/styles/chrome.css +55 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The correlation table: which vibration a band at a given wavenumber may be.
|
|
3
|
+
*
|
|
4
|
+
* This is the infrared analogue of a fragment set — what a producer *claims*
|
|
5
|
+
* about a spectrum — with one difference that shapes the whole design: a mass
|
|
6
|
+
* fragment claims one m/z, while a vibration claims a **range**, and the ranges
|
|
7
|
+
* overlap heavily on purpose. A band at 1715 cm⁻¹ is an ester, an aldehyde, a
|
|
8
|
+
* ketone and a carboxylic acid until something else decides between them, and a
|
|
9
|
+
* table that returned one answer there would be inventing chemistry.
|
|
10
|
+
*
|
|
11
|
+
* The ranges are the conventional teaching values, rounded to the tens that a
|
|
12
|
+
* printed table uses. They are deliberately not narrowed to look precise: a
|
|
13
|
+
* conjugated ketone really does absorb below an unconjugated one, and a table
|
|
14
|
+
* that excluded it would read as ruling the ketone out.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { IrBandStrength } from './irBand.ts';
|
|
18
|
+
|
|
19
|
+
/** One vibration a band may be, as a correlation table states it. */
|
|
20
|
+
export interface BandAssignment {
|
|
21
|
+
/** Identity, stable so a selection survives a re-pick. */
|
|
22
|
+
id: string;
|
|
23
|
+
/** The functional group it belongs to, as a chemist names it. */
|
|
24
|
+
group: string;
|
|
25
|
+
/** The motion itself: which bond, and how it moves. */
|
|
26
|
+
vibration: string;
|
|
27
|
+
/** Lowest wavenumber of the range, in cm⁻¹. */
|
|
28
|
+
from: number;
|
|
29
|
+
/** Highest wavenumber of the range, in cm⁻¹. */
|
|
30
|
+
to: number;
|
|
31
|
+
/** How strong the band usually is, in the table's own letters. */
|
|
32
|
+
strength: IrBandStrength;
|
|
33
|
+
/**
|
|
34
|
+
* What tells this assignment apart from the others it overlaps — the shape of
|
|
35
|
+
* the band, a partner band elsewhere, a region it must be absent from.
|
|
36
|
+
* @default undefined
|
|
37
|
+
*/
|
|
38
|
+
note?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The table, in ascending order of the low end of each range.
|
|
43
|
+
*
|
|
44
|
+
* Ordered so that a reader scanning it moves along the axis, and so that the
|
|
45
|
+
* fingerprint region below 1500 cm⁻¹ — where assignments are least decisive —
|
|
46
|
+
* sits together at the top rather than being interleaved with the diagnostic
|
|
47
|
+
* stretches above it.
|
|
48
|
+
*/
|
|
49
|
+
export const BAND_ASSIGNMENTS: readonly BandAssignment[] = [
|
|
50
|
+
{
|
|
51
|
+
id: 'c-br-stretch',
|
|
52
|
+
group: 'alkyl bromide',
|
|
53
|
+
vibration: 'C–Br stretch',
|
|
54
|
+
from: 500,
|
|
55
|
+
to: 600,
|
|
56
|
+
strength: 'S',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'c-cl-stretch',
|
|
60
|
+
group: 'alkyl chloride',
|
|
61
|
+
vibration: 'C–Cl stretch',
|
|
62
|
+
from: 600,
|
|
63
|
+
to: 800,
|
|
64
|
+
strength: 'S',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'aromatic-ch-oop',
|
|
68
|
+
group: 'arene',
|
|
69
|
+
vibration: 'C–H out-of-plane bend',
|
|
70
|
+
from: 690,
|
|
71
|
+
to: 900,
|
|
72
|
+
strength: 'S',
|
|
73
|
+
note: 'How many bands, and where, is what tells a substitution pattern apart',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: 'alkene-ch-oop',
|
|
77
|
+
group: 'alkene',
|
|
78
|
+
vibration: '=C–H out-of-plane bend',
|
|
79
|
+
from: 890,
|
|
80
|
+
to: 990,
|
|
81
|
+
strength: 'S',
|
|
82
|
+
note: 'A terminal vinyl gives two, near 910 and 990',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'c-o-stretch',
|
|
86
|
+
group: 'alcohol, ether, ester',
|
|
87
|
+
vibration: 'C–O stretch',
|
|
88
|
+
from: 1000,
|
|
89
|
+
to: 1300,
|
|
90
|
+
strength: 'S',
|
|
91
|
+
note: 'Strong and broad; an ester shows two, the higher one near 1200',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: 'c-f-stretch',
|
|
95
|
+
group: 'alkyl fluoride',
|
|
96
|
+
vibration: 'C–F stretch',
|
|
97
|
+
from: 1000,
|
|
98
|
+
to: 1400,
|
|
99
|
+
strength: 'S',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 'c-n-stretch',
|
|
103
|
+
group: 'amine, amide',
|
|
104
|
+
vibration: 'C–N stretch',
|
|
105
|
+
from: 1080,
|
|
106
|
+
to: 1360,
|
|
107
|
+
strength: 'm',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: 'nitro-symmetric',
|
|
111
|
+
group: 'nitro',
|
|
112
|
+
vibration: 'N–O symmetric stretch',
|
|
113
|
+
from: 1300,
|
|
114
|
+
to: 1390,
|
|
115
|
+
strength: 'S',
|
|
116
|
+
note: 'Never alone: the asymmetric partner sits near 1500–1560',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'oh-bend',
|
|
120
|
+
group: 'alcohol',
|
|
121
|
+
vibration: 'O–H bend',
|
|
122
|
+
from: 1330,
|
|
123
|
+
to: 1430,
|
|
124
|
+
strength: 'm',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: 'alkane-ch-bend',
|
|
128
|
+
group: 'alkane',
|
|
129
|
+
vibration: 'C–H bend',
|
|
130
|
+
from: 1370,
|
|
131
|
+
to: 1470,
|
|
132
|
+
strength: 'm',
|
|
133
|
+
note: 'A gem-dimethyl splits the 1380 band in two',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: 'aromatic-cc-stretch',
|
|
137
|
+
group: 'arene',
|
|
138
|
+
vibration: 'C=C aromatic stretch',
|
|
139
|
+
from: 1450,
|
|
140
|
+
to: 1600,
|
|
141
|
+
strength: 'm',
|
|
142
|
+
note: 'Usually a pair, near 1500 and 1600',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
id: 'nitro-asymmetric',
|
|
146
|
+
group: 'nitro',
|
|
147
|
+
vibration: 'N–O asymmetric stretch',
|
|
148
|
+
from: 1500,
|
|
149
|
+
to: 1560,
|
|
150
|
+
strength: 'S',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: 'nh-bend',
|
|
154
|
+
group: 'amine, amide',
|
|
155
|
+
vibration: 'N–H bend',
|
|
156
|
+
from: 1550,
|
|
157
|
+
to: 1640,
|
|
158
|
+
strength: 'm',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: 'alkene-cc-stretch',
|
|
162
|
+
group: 'alkene',
|
|
163
|
+
vibration: 'C=C stretch',
|
|
164
|
+
from: 1620,
|
|
165
|
+
to: 1680,
|
|
166
|
+
strength: 'w',
|
|
167
|
+
note: 'Weak, and absent altogether on a symmetric alkene',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: 'amide-co-stretch',
|
|
171
|
+
group: 'amide',
|
|
172
|
+
vibration: 'C=O stretch',
|
|
173
|
+
from: 1630,
|
|
174
|
+
to: 1690,
|
|
175
|
+
strength: 'S',
|
|
176
|
+
note: 'The lowest carbonyl there is; look for N–H above 3300 to confirm',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
id: 'acid-co-stretch',
|
|
180
|
+
group: 'carboxylic acid',
|
|
181
|
+
vibration: 'C=O stretch',
|
|
182
|
+
from: 1700,
|
|
183
|
+
to: 1725,
|
|
184
|
+
strength: 'S',
|
|
185
|
+
note: 'Confirmed by the very broad O–H between 2500 and 3300',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'ketone-co-stretch',
|
|
189
|
+
group: 'ketone',
|
|
190
|
+
vibration: 'C=O stretch',
|
|
191
|
+
from: 1705,
|
|
192
|
+
to: 1725,
|
|
193
|
+
strength: 'S',
|
|
194
|
+
note: 'Conjugation drops it by about 30; a strained ring raises it',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: 'aldehyde-co-stretch',
|
|
198
|
+
group: 'aldehyde',
|
|
199
|
+
vibration: 'C=O stretch',
|
|
200
|
+
from: 1720,
|
|
201
|
+
to: 1740,
|
|
202
|
+
strength: 'S',
|
|
203
|
+
note: 'Confirmed by the C–H pair near 2720 and 2820',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'ester-co-stretch',
|
|
207
|
+
group: 'ester',
|
|
208
|
+
vibration: 'C=O stretch',
|
|
209
|
+
from: 1735,
|
|
210
|
+
to: 1750,
|
|
211
|
+
strength: 'S',
|
|
212
|
+
note: 'Confirmed by the strong C–O between 1000 and 1300',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: 'acid-chloride-co-stretch',
|
|
216
|
+
group: 'acid chloride',
|
|
217
|
+
vibration: 'C=O stretch',
|
|
218
|
+
from: 1770,
|
|
219
|
+
to: 1815,
|
|
220
|
+
strength: 'S',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'anhydride-co-stretch',
|
|
224
|
+
group: 'anhydride',
|
|
225
|
+
vibration: 'C=O stretch',
|
|
226
|
+
from: 1740,
|
|
227
|
+
to: 1830,
|
|
228
|
+
strength: 'S',
|
|
229
|
+
note: 'Two bands, about 60 apart, which is what names it',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: 'nitrile-stretch',
|
|
233
|
+
group: 'nitrile',
|
|
234
|
+
vibration: 'C≡N stretch',
|
|
235
|
+
from: 2210,
|
|
236
|
+
to: 2260,
|
|
237
|
+
strength: 'm',
|
|
238
|
+
note: 'Sharp, and in a region almost nothing else occupies',
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: 'alkyne-cc-stretch',
|
|
242
|
+
group: 'alkyne',
|
|
243
|
+
vibration: 'C≡C stretch',
|
|
244
|
+
from: 2100,
|
|
245
|
+
to: 2260,
|
|
246
|
+
strength: 'w',
|
|
247
|
+
note: 'Weak, and absent on a symmetric internal alkyne',
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
id: 'aldehyde-ch-stretch',
|
|
251
|
+
group: 'aldehyde',
|
|
252
|
+
vibration: 'C–H stretch',
|
|
253
|
+
from: 2695,
|
|
254
|
+
to: 2830,
|
|
255
|
+
strength: 'm',
|
|
256
|
+
note: 'The diagnostic pair near 2720 and 2820',
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 'acid-oh-stretch',
|
|
260
|
+
group: 'carboxylic acid',
|
|
261
|
+
vibration: 'O–H stretch',
|
|
262
|
+
from: 2500,
|
|
263
|
+
to: 3300,
|
|
264
|
+
strength: 'S',
|
|
265
|
+
note: 'Very broad — it runs under the C–H bands rather than beside them',
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
id: 'alkane-ch-stretch',
|
|
269
|
+
group: 'alkane',
|
|
270
|
+
vibration: 'C–H stretch',
|
|
271
|
+
from: 2850,
|
|
272
|
+
to: 3000,
|
|
273
|
+
strength: 'S',
|
|
274
|
+
note: 'Below 3000, which is what separates it from an alkene C–H',
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: 'alkene-ch-stretch',
|
|
278
|
+
group: 'alkene',
|
|
279
|
+
vibration: '=C–H stretch',
|
|
280
|
+
from: 3000,
|
|
281
|
+
to: 3100,
|
|
282
|
+
strength: 'm',
|
|
283
|
+
note: 'Above 3000, and never alone: the C=C sits near 1650',
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
id: 'aromatic-ch-stretch',
|
|
287
|
+
group: 'arene',
|
|
288
|
+
vibration: 'C–H stretch',
|
|
289
|
+
from: 3000,
|
|
290
|
+
to: 3100,
|
|
291
|
+
strength: 'm',
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
id: 'alkyne-ch-stretch',
|
|
295
|
+
group: 'alkyne',
|
|
296
|
+
vibration: '≡C–H stretch',
|
|
297
|
+
from: 3260,
|
|
298
|
+
to: 3330,
|
|
299
|
+
strength: 'S',
|
|
300
|
+
note: 'Sharp, where an O–H in the same place is broad',
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: 'alcohol-oh-stretch',
|
|
304
|
+
group: 'alcohol',
|
|
305
|
+
vibration: 'O–H stretch',
|
|
306
|
+
from: 3200,
|
|
307
|
+
to: 3600,
|
|
308
|
+
strength: 'S',
|
|
309
|
+
note: 'Broad when hydrogen bonded, which is nearly always',
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
id: 'nh-stretch',
|
|
313
|
+
group: 'amine, amide',
|
|
314
|
+
vibration: 'N–H stretch',
|
|
315
|
+
from: 3300,
|
|
316
|
+
to: 3500,
|
|
317
|
+
strength: 'm',
|
|
318
|
+
note: 'A primary amine gives two bands, a secondary one',
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
id: 'free-oh-stretch',
|
|
322
|
+
group: 'alcohol',
|
|
323
|
+
vibration: 'O–H stretch, not hydrogen bonded',
|
|
324
|
+
from: 3580,
|
|
325
|
+
to: 3650,
|
|
326
|
+
strength: 'm',
|
|
327
|
+
note: 'Sharp, and only in a dilute or gas-phase spectrum',
|
|
328
|
+
},
|
|
329
|
+
];
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where every band's mark and label go, worked out before anything is drawn.
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from the component because it is the part worth testing: which
|
|
5
|
+
* bands get a label, which way their lines stack, how far a crowded label may
|
|
6
|
+
* slide from the band it names, and which are dropped rather than drawn
|
|
7
|
+
* somewhere misleading. All of that is arithmetic over numbers, and none of it
|
|
8
|
+
* needs a DOM.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { layoutAnnotationBoxes } from '../../chart/core/boxLayout.ts';
|
|
12
|
+
import type { PlotRect } from '../../chart/core/chartGeometry.ts';
|
|
13
|
+
import type { ChartScale } from '../../chart/core/chartScale.ts';
|
|
14
|
+
import { chartPixel } from '../../chart/core/chartScale.ts';
|
|
15
|
+
import { PEAK_LABEL } from '../../chart/core/chartTheme.ts';
|
|
16
|
+
import { labelStackBaselines } from '../../chart/core/labelStack.ts';
|
|
17
|
+
|
|
18
|
+
import type { AssignedBand } from './assignBands.ts';
|
|
19
|
+
import { bandLabel } from './assignBands.ts';
|
|
20
|
+
import type { IrBand } from './irBand.ts';
|
|
21
|
+
import { formatWavenumber } from './irFormat.ts';
|
|
22
|
+
import { bandsPointDown } from './irMode.ts';
|
|
23
|
+
import type { IrMode } from './irSpectrum.ts';
|
|
24
|
+
|
|
25
|
+
/** One band, and where everything about it is drawn. */
|
|
26
|
+
export interface BandLabelPlan {
|
|
27
|
+
/** The band itself. */
|
|
28
|
+
band: IrBand;
|
|
29
|
+
/** Where its tip sits horizontally, in user units of the SVG. */
|
|
30
|
+
tipX: number;
|
|
31
|
+
/** Where its tip sits vertically. */
|
|
32
|
+
tipY: number;
|
|
33
|
+
/**
|
|
34
|
+
* Where its label is centred, `NaN` when the label was dropped for having
|
|
35
|
+
* been slid too far from the band to belong to it.
|
|
36
|
+
*/
|
|
37
|
+
labelX: number;
|
|
38
|
+
/** The baseline of each line of the label, in the order the lines are given. */
|
|
39
|
+
baselines: Float64Array;
|
|
40
|
+
/** What the label says, farthest line from the band first. */
|
|
41
|
+
lines: string[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** What the plan is worked out from. */
|
|
45
|
+
export interface BandLabelPlanOptions {
|
|
46
|
+
/** The bands to name, with whatever the table said about them. */
|
|
47
|
+
assigned: readonly AssignedBand[];
|
|
48
|
+
/** Where the plot sits inside the SVG. */
|
|
49
|
+
plot: PlotRect;
|
|
50
|
+
/** The wavenumber axis as it is currently zoomed. */
|
|
51
|
+
xScale: ChartScale;
|
|
52
|
+
/** The value axis as it is currently zoomed. */
|
|
53
|
+
yScale: ChartScale;
|
|
54
|
+
/** Which value axis is being drawn, which decides which way labels stack. */
|
|
55
|
+
mode: IrMode;
|
|
56
|
+
/**
|
|
57
|
+
* Whether each label names the assignment as well as the wavenumber.
|
|
58
|
+
*
|
|
59
|
+
* The assignment is the longer line by far — `carboxylic acid C=O stretch`
|
|
60
|
+
* against `1710` — so a chart showing a dozen bands is legible with the
|
|
61
|
+
* wavenumbers alone and unreadable with both.
|
|
62
|
+
* @default false
|
|
63
|
+
*/
|
|
64
|
+
showAssignments?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* At most how many bands to name.
|
|
67
|
+
*
|
|
68
|
+
* Marks are drawn on every band regardless; this only bounds the labels, since
|
|
69
|
+
* a mark costs three pixels and a two-line label costs sixty.
|
|
70
|
+
* @default 12
|
|
71
|
+
*/
|
|
72
|
+
limit?: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Work out where every band's label goes.
|
|
77
|
+
*
|
|
78
|
+
* Only the bands inside the window are considered, so a zoom into one region
|
|
79
|
+
* gives its bands the whole width to be named in rather than sharing it with the
|
|
80
|
+
* hundred outside the plot.
|
|
81
|
+
*
|
|
82
|
+
* The strongest bands win the labels when there are more than `limit`, because a
|
|
83
|
+
* strong band is the one a reader is looking for; but they come back in ascending
|
|
84
|
+
* wavenumber — the order `pickBands` returns and the order a band table lists —
|
|
85
|
+
* rather than in the order they were chosen. Which is right to left on screen,
|
|
86
|
+
* since the axis is drawn backwards; nothing depends on it, because the declutter
|
|
87
|
+
* sweep sorts by pixel itself.
|
|
88
|
+
* @param options - The bands, the axes and how much to say.
|
|
89
|
+
* @returns One plan per band that is inside the window, in axis order.
|
|
90
|
+
*/
|
|
91
|
+
export function planBandLabels(options: BandLabelPlanOptions): BandLabelPlan[] {
|
|
92
|
+
const {
|
|
93
|
+
assigned,
|
|
94
|
+
plot,
|
|
95
|
+
xScale,
|
|
96
|
+
yScale,
|
|
97
|
+
mode,
|
|
98
|
+
showAssignments = false,
|
|
99
|
+
limit = 12,
|
|
100
|
+
} = options;
|
|
101
|
+
|
|
102
|
+
const inside: AssignedBand[] = [];
|
|
103
|
+
for (const entry of assigned) {
|
|
104
|
+
const pixelX = chartPixel(xScale, entry.band.wavenumber);
|
|
105
|
+
if (!Number.isFinite(pixelX)) continue;
|
|
106
|
+
if (pixelX < plot.left || pixelX > plot.right) continue;
|
|
107
|
+
inside.push(entry);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const named =
|
|
111
|
+
inside.length <= limit
|
|
112
|
+
? inside
|
|
113
|
+
: inside
|
|
114
|
+
.toSorted(
|
|
115
|
+
(first, second) => second.band.absorbance - first.band.absorbance,
|
|
116
|
+
)
|
|
117
|
+
.slice(0, limit)
|
|
118
|
+
.toSorted(
|
|
119
|
+
(first, second) => first.band.wavenumber - second.band.wavenumber,
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const centres = new Float64Array(named.length);
|
|
123
|
+
for (let index = 0; index < named.length; index++) {
|
|
124
|
+
centres[index] = chartPixel(
|
|
125
|
+
xScale,
|
|
126
|
+
(named[index] as AssignedBand).band.wavenumber,
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
const placed = layoutAnnotationBoxes(
|
|
130
|
+
centres,
|
|
131
|
+
[plot.left, plot.right],
|
|
132
|
+
LABEL_WIDTH,
|
|
133
|
+
LABEL_GAP,
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const down = bandsPointDown(mode);
|
|
137
|
+
const plans: BandLabelPlan[] = new Array<BandLabelPlan>(named.length);
|
|
138
|
+
for (let index = 0; index < named.length; index++) {
|
|
139
|
+
const entry = named[index] as AssignedBand;
|
|
140
|
+
const lines = labelLines(entry, showAssignments);
|
|
141
|
+
const tipY = chartPixel(
|
|
142
|
+
yScale,
|
|
143
|
+
mode === 'absorbance' ? entry.band.absorbance : entry.band.transmittance,
|
|
144
|
+
);
|
|
145
|
+
plans[index] = {
|
|
146
|
+
band: entry.band,
|
|
147
|
+
tipX: centres[index] as number,
|
|
148
|
+
tipY,
|
|
149
|
+
labelX: placed[index] as number,
|
|
150
|
+
// The stack hangs away from the baseline: below the tip of a transmittance
|
|
151
|
+
// band, which dips downwards, and above the tip of an absorbance one.
|
|
152
|
+
baselines: labelStackBaselines(
|
|
153
|
+
tipY,
|
|
154
|
+
lines.length,
|
|
155
|
+
[plot.top, plot.bottom],
|
|
156
|
+
down,
|
|
157
|
+
),
|
|
158
|
+
lines,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return plans;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* How wide a label is taken to be while it is being spaced out.
|
|
166
|
+
*
|
|
167
|
+
* A wavenumber is four digits and an assignment is far wider, but the width used
|
|
168
|
+
* for spacing is the wavenumber's: spacing on the longer line would push every
|
|
169
|
+
* label so far apart that only three fit, and an assignment is only ever shown
|
|
170
|
+
* when a handful of bands are named.
|
|
171
|
+
*/
|
|
172
|
+
export const LABEL_WIDTH = 34;
|
|
173
|
+
|
|
174
|
+
/** The clear space kept between two neighbouring labels. */
|
|
175
|
+
export const LABEL_GAP = 6;
|
|
176
|
+
|
|
177
|
+
/** How far the mark reaches from the tip of a band, in pixels. */
|
|
178
|
+
export const BAND_MARK = PEAK_LABEL.topMark;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* What one band's label says.
|
|
182
|
+
* @param entry - The band and whatever the table said about it.
|
|
183
|
+
* @param showAssignments - Whether to name the assignment as well.
|
|
184
|
+
* @returns The lines, farthest from the band first, never empty.
|
|
185
|
+
*/
|
|
186
|
+
function labelLines(entry: AssignedBand, showAssignments: boolean): string[] {
|
|
187
|
+
const lines = [formatWavenumber(entry.band.wavenumber)];
|
|
188
|
+
if (!showAssignments) return lines;
|
|
189
|
+
const label = bandLabel(entry);
|
|
190
|
+
// The assignment goes nearest the band, under the wavenumber, so the eye
|
|
191
|
+
// travels from the mark to what it is claimed to be.
|
|
192
|
+
if (label !== null) lines.push(label);
|
|
193
|
+
return lines;
|
|
194
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which reader a dropped infrared file belongs to, decided from the file itself.
|
|
3
|
+
*
|
|
4
|
+
* The extension is the least reliable thing about a spectrum file: instruments
|
|
5
|
+
* export JCAMP as `.txt`, LIMS systems rename everything to `.dat`, and a user
|
|
6
|
+
* pasting into a text box has no extension at all. So the content decides and
|
|
7
|
+
* the name is consulted only when the content stayed silent.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { IrFormat } from './irSpectrum.ts';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* How much of the file the decision is taken on.
|
|
14
|
+
*
|
|
15
|
+
* Every marker looked for here sits in the header — the SPC flag pair in the
|
|
16
|
+
* first two bytes, `##TITLE=` at the very top of a JCAMP. Reading further would
|
|
17
|
+
* only cost a decode of the whole file.
|
|
18
|
+
*/
|
|
19
|
+
const HEADER_BYTES = 4096;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Extensions that name a format outright, once the content has said nothing.
|
|
23
|
+
*
|
|
24
|
+
* A `Map` rather than an object, because the key comes off a file name the user
|
|
25
|
+
* chose: `spectrum.constructor` read out of an object literal answers with a
|
|
26
|
+
* function inherited from `Object.prototype`, which is neither a format nor
|
|
27
|
+
* `undefined` and so passes every check made of it.
|
|
28
|
+
*/
|
|
29
|
+
const EXTENSIONS = new Map<string, IrFormat>([
|
|
30
|
+
['jdx', 'jcamp'],
|
|
31
|
+
['dx', 'jcamp'],
|
|
32
|
+
['jcamp', 'jcamp'],
|
|
33
|
+
['spc', 'spc'],
|
|
34
|
+
['txt', 'text'],
|
|
35
|
+
['csv', 'text'],
|
|
36
|
+
['tsv', 'text'],
|
|
37
|
+
['xy', 'text'],
|
|
38
|
+
['dpt', 'text'],
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The one decoder the header is read through, kept because a drop of fifty
|
|
43
|
+
* files would otherwise build a hundred of them for four kilobytes each.
|
|
44
|
+
*/
|
|
45
|
+
const DECODER = new TextDecoder();
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Decide what a dropped file is, from its first bytes and only then its name.
|
|
49
|
+
*
|
|
50
|
+
* Returns `'unknown'` rather than guessing `'text'` for the two cases the
|
|
51
|
+
* readers cannot survive: nothing at all, and bytes that are plainly not text.
|
|
52
|
+
* Handing either to the text reader produces an empty spectrum and a message
|
|
53
|
+
* about missing columns, which sends whoever dropped the file looking in the
|
|
54
|
+
* wrong place.
|
|
55
|
+
* @param data - The file, or the pasted text.
|
|
56
|
+
* @param fileName - Its name, when it has one.
|
|
57
|
+
* @returns The format, or `'unknown'` when nothing in the file names one.
|
|
58
|
+
*/
|
|
59
|
+
export function detectIrFormat(
|
|
60
|
+
data: Uint8Array | string,
|
|
61
|
+
fileName?: string,
|
|
62
|
+
): IrFormat | 'unknown' {
|
|
63
|
+
if (isSpc(data)) return 'spc';
|
|
64
|
+
|
|
65
|
+
const header = stripByteOrderMark(readHeader(data)).trimStart();
|
|
66
|
+
if (header.startsWith('##')) return 'jcamp';
|
|
67
|
+
|
|
68
|
+
const named = formatFromExtension(fileName);
|
|
69
|
+
if (named !== undefined) return named;
|
|
70
|
+
if (header.length === 0) return 'unknown';
|
|
71
|
+
// A binary file the SPC check did not claim decodes to replacement characters;
|
|
72
|
+
// a `.dpt` export of two columns decodes to digits. Telling them apart on the
|
|
73
|
+
// decode is what stops a stray binary from reaching the text reader.
|
|
74
|
+
if (header.includes('\uFFFD') || header.includes('\0')) return 'unknown';
|
|
75
|
+
return 'text';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Whether the first bytes are an SPC file header.
|
|
80
|
+
*
|
|
81
|
+
* The second byte is the format version, and Thermo Galactic only ever wrote
|
|
82
|
+
* three: `0x4B` for the new LSB-first format, `0x4C` for MSB-first, and `0x4D`
|
|
83
|
+
* for the old format. Checked before anything is decoded, because putting a
|
|
84
|
+
* binary file through a UTF-8 decode turns its header into replacement
|
|
85
|
+
* characters that happen to match nothing — a right answer reached by luck.
|
|
86
|
+
* @param data - The file, or the pasted text.
|
|
87
|
+
* @returns Whether it looks like SPC.
|
|
88
|
+
*/
|
|
89
|
+
function isSpc(data: Uint8Array | string): boolean {
|
|
90
|
+
// A pasted string is never SPC: the bytes would not have survived the decode.
|
|
91
|
+
if (typeof data === 'string' || data.length < 2) return false;
|
|
92
|
+
return SPC_VERSIONS.has(data[1] as number);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The format versions Thermo Galactic ever wrote, as the second byte states it.
|
|
97
|
+
*
|
|
98
|
+
* `0x4B` is the current LSB-first format, `0x4C` the MSB-first one, and `0x4D`
|
|
99
|
+
* the old format still exported by instruments of a certain age.
|
|
100
|
+
*/
|
|
101
|
+
const SPC_VERSIONS = new Set([0x4b, 0x4c, 0x4d]);
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The first bytes of the file, as text.
|
|
105
|
+
* @param data - The file, or the pasted text.
|
|
106
|
+
* @param length - How many bytes to read, defaulting to the whole header.
|
|
107
|
+
* @returns The decoded prefix; a byte sequence cut in half at the end decodes
|
|
108
|
+
* to a replacement character, which no marker looked for here contains.
|
|
109
|
+
*/
|
|
110
|
+
function readHeader(data: Uint8Array | string, length = HEADER_BYTES): string {
|
|
111
|
+
if (typeof data === 'string') return data.slice(0, length);
|
|
112
|
+
return DECODER.decode(data.subarray(0, length));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Drop a leading UTF-8 byte order mark.
|
|
117
|
+
*
|
|
118
|
+
* This is the whole reason the header is normalised before it is tested: a
|
|
119
|
+
* `U+FEFF` in front of `##TITLE=` makes a plain `startsWith('##')` fail, and a
|
|
120
|
+
* BOM-prefixed JCAMP then goes silently to the text reader, which reads its
|
|
121
|
+
* records as unparsable lines and reports two columns of nothing.
|
|
122
|
+
* @param header - The decoded prefix.
|
|
123
|
+
* @returns The prefix without its mark.
|
|
124
|
+
*/
|
|
125
|
+
function stripByteOrderMark(header: string): string {
|
|
126
|
+
return header.startsWith('\uFEFF') ? header.slice(1) : header;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The format a file name claims, used only once the content has said nothing.
|
|
131
|
+
* @param fileName - The name, when the file has one.
|
|
132
|
+
* @returns The format, or `undefined` when the extension names none.
|
|
133
|
+
*/
|
|
134
|
+
function formatFromExtension(fileName?: string): IrFormat | undefined {
|
|
135
|
+
if (fileName === undefined) return undefined;
|
|
136
|
+
const extension = fileName.split('.').pop();
|
|
137
|
+
if (extension === undefined || extension === fileName) return undefined;
|
|
138
|
+
return EXTENSIONS.get(extension.toLowerCase());
|
|
139
|
+
}
|