@thi.ng/strings
Version:
Various string formatting & utility functions
140 lines (139 loc) • 3.15 kB
JavaScript
const ENTITIES = {
"&": "&",
"<": "<",
">": ">",
"\u2264": "≤",
"\u2265": "≥",
'"': """,
"'": "'",
"\u2014": "—",
"\u2013": "–",
"\u2026": "…",
"\u22EE": "⋮",
"\u22EF": "⋯",
"\xA2": "¢",
"\u20AC": "€",
"\xA3": "£",
"\xA5": "¥",
"\u20B9": "₹",
\u5143: "元",
"\xA7": "§",
"\xB6": "¶",
"\xA9": "©",
"\xAE": "®",
"\u2122": "™",
"\u2103": "℃",
"\u2109": "℉",
"\u212A": "K",
// Kelvin
"\u25C2": "◂",
"\u25B8": "▸",
"\u25B4": "▴",
"\u25BE": "▾",
"\u2190": "←",
"\u2192": "→",
"\u2191": "↑",
"\u2193": "↓",
"\u21B5": "↵",
"\u21A9": "↩",
"\u21D0": "⇐",
"\u21D2": "⇒",
"\u21BA": "↺",
"\u21BB": "↻",
"\xB9": "¹",
"\xB2": "²",
"\xB3": "³",
"\xBD": "½",
"\u2153": "⅓",
"\u2154": "⅔",
"\xBC": "¼",
"\xBE": "¾",
"\u2155": "⅕",
"\u2159": "⅙",
"\u215B": "⅛",
\u00C4: "Ä",
\u00CB: "Ë",
\u00CF: "Ï",
\u00D6: "Ö",
\u00DC: "Ü",
\u00E4: "ä",
\u00EB: "ë",
\u00EF: "ï",
\u00F6: "ö",
\u00FC: "ü",
\u00DF: "ß",
\u03B1: "α",
\u03B2: "β",
\u03B3: "γ",
\u03B4: "δ",
\u03B5: "ε",
\u03B8: "θ",
\u03BB: "λ",
\u03BC: "μ",
\u03C0: "π",
\u03C3: "σ",
\u03C4: "τ",
\u03C6: "φ",
\u03C9: "ω",
\u0394: "Δ",
\u03A9: "Ω",
"\u221E": "∞",
"\xB1": "±",
"\u2A2F": "⨯",
"\xB0": "°",
"\u2211": "∑",
"\u220F": "∏",
"\u222B": "∫",
"\u221A": "√",
"\u2220": "∠",
"\u2227": "∧",
"\u2228": "∨",
"\u2229": "∩",
"\u222A": "∪",
"\u2282": "⊂",
"\u2283": "⊃",
"\u2208": "∈",
"\u2209": "∉",
"\u2205": "∅",
"\u2295": "⊕",
"\u2296": "⊖",
"\u2297": "⊗",
"\u2316": "⌖",
"\u2606": "☆",
"\u2605": "★",
"\u2713": "✓",
"\u2717": "✗",
"\xA0": " "
};
const RE_ENTITIES = new RegExp(
`[${Object.keys(ENTITIES).join("")}]`,
"gu"
);
const ENTITIES_REV = Object.entries(ENTITIES).reduce(
(acc, [k, v]) => (acc[v] = k, acc),
{}
);
const RE_ENTITIES_REV = new RegExp(
`(${Object.keys(ENTITIES_REV).join("|")})`,
"g"
);
const RE_ENTITIES_NUM = /&#(x?)([0-9a-f]+);/gi;
const escapeEntities = (src) => src.replace(RE_ENTITIES, (x) => ENTITIES[x]);
const escapeEntitiesNum = (src) => src.replace(RE_ENTITIES, (x) => {
const code = x.charCodeAt(0);
return code < 128 ? ENTITIES[x] : `&#x${code.toString(16)};`;
});
const unescapeEntities = (src) => src.replace(RE_ENTITIES_REV, (x) => ENTITIES_REV[x]).replace(
RE_ENTITIES_NUM,
(_, hex, x) => String.fromCharCode(parseInt(x, hex ? 16 : 10))
);
export {
ENTITIES,
ENTITIES_REV,
RE_ENTITIES,
RE_ENTITIES_NUM,
RE_ENTITIES_REV,
escapeEntities,
escapeEntitiesNum,
unescapeEntities
};