[READ-ONLY] Mirror of https://github.com/CanadaHonk/porffor. An ahead-of-time JavaScript compiler porffor.dev
Something went wrong. Try again.
JavaScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273// node compiler/parser/gen-unicode.mjs -> regenerates unicode.js:// ID_Start/ID_Continue ranges for cp >= 0x80, delta-encoded base36 + binary search decoderconst ranges = re => { const out = []; let lo = -1, prev = -1; for (let cp = 0x80; cp <= 0x10ffff; cp++) { const m = re.test(String.fromCodePoint(cp)); if (m) { if (lo === -1) lo = cp; prev = cp; } else if (lo !== -1) { out.push([ lo, prev ]); lo = -1; } } if (lo !== -1) out.push([ lo, prev ]); return out;};
// encode as: delta from previous range end (gap), then length, both base36, space separatedconst encode = rs => { let prev = 0; const parts = []; for (const [ lo, hi ] of rs) { parts.push((lo - prev).toString(36), (hi - lo).toString(36)); prev = hi; } return parts.join(' ');};
const start = ranges(/^[\p{ID_Start}$_]$/u);const cont = ranges(/^[\p{ID_Continue}$_]$/u);
const startEnc = encode(start), contEnc = encode(cont);console.error(`start: ${start.length} ranges, ${startEnc.length} bytes; cont: ${cont.length} ranges, ${contEnc.length} bytes`);
const file = `// generated by gen-unicode.mjs from \\p{ID_Start}/\\p{ID_Continue} (do not edit)// ranges for codepoints >= 0x80, delta-encoded: gap-from-prev-end, length (base36)const decode = str => { const parts = str.split(' '); const out = new Uint32Array(parts.length); let prev = 0; for (let i = 0; i < parts.length; i += 2) { const lo = prev + parseInt(parts[i], 36); prev = lo + parseInt(parts[i + 1], 36); out[i] = lo; out[i + 1] = prev; } return out;};
const idStart = decode('${startEnc}');const idCont = decode('${contEnc}');
const search = (table, cp) => { let lo = 0, hi = (table.length >> 1) - 1; while (lo <= hi) { const mid = (lo + hi) >> 1; if (cp < table[mid * 2]) hi = mid - 1; else if (cp > table[mid * 2 + 1]) lo = mid + 1; else return true; } return false;};
export const isIdStartUni = cp => search(idStart, cp);export const isIdContinueUni = cp => search(idCont, cp);`;
import fs from 'node:fs';fs.writeFileSync(new URL('./unicode.js', import.meta.url), file);console.error('written');