初次提交
This commit is contained in:
36
src/index.ts
Normal file
36
src/index.ts
Normal 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
80
src/table.ts
Normal 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 }
|
Reference in New Issue
Block a user