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;