import type { NodeRenderer } from '../types'; /** * Separate numbers and letters so that numbers can be 2 * @param formula a string H2O * @returns ['H', '2', '0'] */ function parseFormula(formula?: string) { return [...(formula ?? '')].reduce((acc, letter) => { const last = acc.pop(); const isNumber = letter.match(/[0-9]/); const lastIsNumber = last?.match(/[0-9]/); if (isNumber) { if (lastIsNumber) { return [...acc, `${last ?? ''}${letter}`]; } return [...acc, last, letter].filter((v) => !!v) as string[]; } if (lastIsNumber) { return [...acc, last, letter].filter((v) => !!v) as string[]; } return [...acc, `${last ?? ''}${letter}`]; }, [] as string[]); } export const ChemicalFormula: NodeRenderer = (node) => { const parts = parseFormula(node.value); return ( {parts.map((letter, index) => { if (letter.match(/[0-9]/)) return {letter}; return {letter}; })} ); }; const CHEM_RENDERERS = { chemicalFormula: ChemicalFormula, }; export default CHEM_RENDERERS;