const OMIT_PLUSSIGN = /^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/; const KEEP_PLUSSIGN = /^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/; const unsafeToRemovePlusSignAfter = new Set([ 'Dimension', 'Hash', 'Identifier', 'Number', 'Raw', 'UnicodeRange' ]); export function packNumber(value, item) { // omit plus sign only if no prev or prev is safe type const regexp = item && item.prev !== null && unsafeToRemovePlusSignAfter.has(item.prev.data.type) ? KEEP_PLUSSIGN : OMIT_PLUSSIGN; // 100 -> '100' // 00100 -> '100' // +100 -> '100' // -100 -> '-100' // 0.123 -> '.123' // 0.12300 -> '.123' // 0.0 -> '' // 0 -> '' // -0 -> '-' value = String(value).replace(regexp, '$1$2$3'); if (value === '' || value === '-') { value = '0'; } // FIXME: is it solution simplier? // value = String(Number(value)).replace(/^(-?)0+\./, '$1.'); return value; } export function Number(node) { node.value = packNumber(node.value); };