初次提交

This commit is contained in:
2021-11-15 16:25:49 +08:00
parent 43ef43b849
commit f5eb42da7e
8 changed files with 272 additions and 1 deletions

36
src/index.ts Normal file
View File

@ -0,0 +1,36 @@
import { escapeTable, unescapeTable } from "./table"
/**
* escape string to HTML special entities
* @param str string
* @returns
*/
export function escape(str: string) {
const buffer: Array<string> = []
let prev = 0
for (let i = 0; i < str.length; ++i) {
const cc = str.charCodeAt(i)
const name = escapeTable[cc]
if (name) {
buffer.push(str.substring(prev, i))
buffer.push(`&${name};`)
prev = i + 1
}
}
return buffer.join('')
}
/**
* unescape HTML special entities to normal string
* @param str string
* @returns
*/
export function unescape(str: string) {
return str.replace(/&(\w+);/g, (match, name, index) => {
const code = unescapeTable[name]
if (!code) return match
return String.fromCharCode(code)
})
}
export default { escape, unescape }

80
src/table.ts Normal file
View File

@ -0,0 +1,80 @@
/** ISO 8859-1 (Latin-1)字符集 */
const latin1 = {
nbsp: 160, iexcl: 161, cent: 162, pound: 163, curren: 164,
yen: 165, brvbar: 166, sect: 167, uml: 168, copy: 169,
ordf: 170, laquo: 171, not: 172, shy: 173, reg: 174,
macr: 175, deg: 176, plusmn: 177, sup2: 178, sup3: 179,
acute: 180, micro: 181, para: 182, middot: 183, cedil: 184,
sup1: 185, ordm: 186, raquo: 187, frac14: 188, frac12: 189,
frac34: 190, iquest: 191, Agrave: 192, Aacute: 193, Acirc: 194,
Atilde: 195, Auml: 196, Aring: 197, AElig: 198, Ccedil: 199,
Egrave: 200, Eacute: 201, Ecirc: 202, Euml: 203, Igrave: 204,
Iacute: 205, Icirc: 206, Iuml: 207, ETH: 208, Ntilde: 209,
Ograve: 210, Oacute: 211, Ocirc: 212, Otilde: 213, Ouml: 214,
times: 215, Oslash: 216, Ugrave: 217, Uacute: 218, Ucirc: 219,
Uuml: 220, Yacute: 221, THORN: 222, szlig: 223, agrave: 224,
aacute: 225, acirc: 226, atilde: 227, auml: 228, aring: 229,
aelig: 230, ccedil: 231, egrave: 232, eacute: 233, ecirc: 234,
euml: 235, igrave: 236, iacute: 237, icirc: 238, iuml: 239,
eth: 240, ntilde: 241, ograve: 242, oacute: 243, ocirc: 244,
otilde: 245, ouml: 246, divide: 247, oslash: 248, ugrave: 249,
uacute: 250, ucirc: 251, uuml: 252, yacute: 253, thorn: 254,
yuml: 255,
}
/**
* 数学和希腊字母标志
*
* symbols, mathematical symbols, and Greek letters
*/
const symbols = {
fnof: 402, Alpha: 913, Beta: 914, Gamma: 915, Delta: 916,
Epsilon: 917, Zeta: 918, Eta: 919, Theta: 920, Iota: 921,
Kappa: 922, Lambda: 923, Mu: 924, Nu: 925, Xi: 926,
Omicron: 927, Pi: 928, Rho: 929, Sigma: 931, Tau: 932,
Upsilon: 933, Phi: 934, Chi: 935, Psi: 936, Omega: 937,
alpha: 945, beta: 946, gamma: 947, delta: 948, epsilon: 949,
zeta: 950, eta: 951, theta: 952, iota: 953, kappa: 954,
lambda: 955, mu: 956, nu: 957, xi: 958, omicron: 959,
pi: 960, rho: 961, sigmaf: 962, sigma: 963, tau: 964,
upsilon: 965, phi: 966, chi: 967, psi: 968, omega: 969,
thetasym: 977, upsih: 978, piv: 982, bull: 8226, hellip: 8230,
prime: 8242, Prime: 8243, oline: 8254, frasl: 8260, weierp: 8472,
image: 8465, real: 8476, trade: 8482, alefsym: 8501, larr: 8592,
uarr: 8593, rarr: 8594, darr: 8595, harr: 8596, crarr: 8629,
lArr: 8656, uArr: 8657, rArr: 8658, dArr: 8659, hArr: 8660,
forall: 8704, part: 8706, exist: 8707, empty: 8709, nabla: 8711,
isin: 8712, notin: 8713, ni: 8715, prod: 8719, sum: 8721,
minus: 8722, lowast: 8727, radic: 8730, prop: 8733, infin: 8734,
ang: 8736, and: 8743, or: 8744, cap: 8745, cup: 8746,
int: 8747, there4: 8756, sim: 8764, cong: 8773, asymp: 8776,
ne: 8800, equiv: 8801, le: 8804, ge: 8805, sub: 8834,
sup: 8835, nsub: 8836, sube: 8838, supe: 8839, oplus: 8853,
otimes: 8855, perp: 8869, sdot: 8901, lceil: 8968, rceil: 8969,
lfloor: 8970, rfloor: 8971, lang: 9001, rang: 9002, loz: 9674,
spades: 9824, clubs: 9827, hearts: 9829, diams: 9830,
}
/**
* 重要的国际标记
*
* markup-significant and internationalization characters
*/
const markup = {
quot: 34, amp: 38, lt: 60, gt: 62, OElig: 338,
oelig: 339, Scaron: 352, scaron: 353, Yuml: 376, circ: 710,
tilde: 732, ensp: 8194, emsp: 8195, thinsp: 8201, zwnj: 8204,
zwj: 8205, lrm: 8206, rlm: 8207, ndash: 8211, mdash: 8212,
lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221,
bdquo: 8222, dagger: 8224, Dagger: 8225, permil: 8240, lsaquo: 8249,
rsaquo: 8250, euro: 8364,
}
const unescapeTable: { [K: string]: number } = { ...latin1, ...symbols, ...markup }
const escapeTable: { [K: number]: string } = {}
Object.keys(unescapeTable).forEach(key => { escapeTable[unescapeTable[key]] = key })
export { escapeTable, unescapeTable }