DocSpace-client/packages/shared/utils/encoder.ts

1150 lines
20 KiB
TypeScript

/* eslint-disable no-useless-escape */
/**
* Encoder
*/
export const Encoder = {
EncodeType: "entity",
isEmpty(val: null | string) {
if (val) {
return val === null || val.length === 0 || /^\s+$/.test(val);
}
return true;
},
HTML2Numerical(s: string) {
const arr1 = [
" ",
"¡",
"¢",
"£",
"¤",
"¥",
"¦",
"§",
"¨",
"©",
"ª",
"«",
"¬",
"­",
"®",
"¯",
"°",
"±",
"²",
"³",
"´",
"µ",
"¶",
"·",
"¸",
"¹",
"º",
"»",
"¼",
"½",
"¾",
"¿",
"à",
"á",
"â",
"ã",
"Ä",
"å",
"æ",
"ç",
"è",
"é",
"ê",
"ë",
"ì",
"í",
"î",
"ï",
"ð",
"ñ",
"ò",
"ó",
"ô",
"õ",
"Ö",
"×",
"ø",
"ù",
"ú",
"û",
"Ü",
"ý",
"þ",
"ß",
"à",
"á",
"â",
"ã",
"ä",
"å",
"æ",
"ç",
"è",
"é",
"ê",
"ë",
"ì",
"í",
"î",
"ï",
"ð",
"ñ",
"ò",
"ó",
"ô",
"õ",
"ö",
"÷",
"Ø",
"ù",
"ú",
"û",
"ü",
"ý",
"þ",
"ÿ",
""",
"&",
"<",
">",
"œ",
"œ",
"š",
"š",
"ÿ",
"ˆ",
"˜",
" ",
" ",
" ",
"‌",
"‍",
"‎",
"‏",
"–",
"—",
"‘",
"’",
"‚",
"“",
"”",
"„",
"†",
"†",
"‰",
"‹",
"›",
"€",
"ƒ",
"α",
"β",
"γ",
"δ",
"ε",
"ζ",
"η",
"θ",
"ι",
"κ",
"λ",
"μ",
"ν",
"ξ",
"ο",
"π",
"ρ",
"σ",
"τ",
"υ",
"φ",
"χ",
"ψ",
"ω",
"α",
"β",
"γ",
"δ",
"ε",
"ζ",
"η",
"θ",
"ι",
"κ",
"λ",
"μ",
"ν",
"ξ",
"ο",
"π",
"ρ",
"ς",
"σ",
"τ",
"υ",
"φ",
"χ",
"ψ",
"ω",
"ϑ",
"ϒ",
"ϖ",
"•",
"…",
"′",
"′",
"‾",
"⁄",
"℘",
"ℑ",
"ℜ",
"™",
"ℵ",
"←",
"↑",
"→",
"↓",
"↔",
"↵",
"←",
"↑",
"→",
"↓",
"↔",
"∀",
"∂",
"∃",
"∅",
"∇",
"∈",
"∉",
"∋",
"∏",
"∑",
"−",
"∗",
"√",
"∝",
"∞",
"∠",
"∧",
"∨",
"∩",
"∪",
"∫",
"∴",
"∼",
"≅",
"≈",
"≠",
"≡",
"≤",
"≥",
"⊂",
"⊃",
"⊄",
"⊆",
"⊇",
"⊕",
"⊗",
"⊥",
"⋅",
"⌈",
"⌉",
"⌊",
"⌋",
"⟨",
"⟩",
"◊",
"♠",
"♣",
"♥",
"♦",
];
const arr2 = [
" ",
"¡",
"¢",
"£",
"¤",
"¥",
"¦",
"§",
"¨",
"©",
"ª",
"«",
"¬",
"­",
"®",
"¯",
"°",
"±",
"²",
"³",
"´",
"µ",
"¶",
"·",
"¸",
"¹",
"º",
"»",
"¼",
"½",
"¾",
"¿",
"À",
"Á",
"Â",
"Ã",
"Ä",
"Å",
"Æ",
"Ç",
"È",
"É",
"Ê",
"Ë",
"Ì",
"Í",
"Î",
"Ï",
"Ð",
"Ñ",
"Ò",
"Ó",
"Ô",
"Õ",
"Ö",
"×",
"Ø",
"Ù",
"Ú",
"Û",
"Ü",
"Ý",
"Þ",
"ß",
"à",
"á",
"â",
"ã",
"ä",
"å",
"æ",
"ç",
"è",
"é",
"ê",
"ë",
"ì",
"í",
"î",
"ï",
"ð",
"ñ",
"ò",
"ó",
"ô",
"õ",
"ö",
"÷",
"ø",
"ù",
"ú",
"û",
"ü",
"ý",
"þ",
"ÿ",
""",
"&",
"<",
">",
"Œ",
"œ",
"Š",
"š",
"Ÿ",
"ˆ",
"˜",
" ",
" ",
" ",
"‌",
"‍",
"‎",
"‏",
"–",
"—",
"‘",
"’",
"‚",
"“",
"”",
"„",
"†",
"‡",
"‰",
"‹",
"›",
"€",
"ƒ",
"Α",
"Β",
"Γ",
"Δ",
"Ε",
"Ζ",
"Η",
"Θ",
"Ι",
"Κ",
"Λ",
"Μ",
"Ν",
"Ξ",
"Ο",
"Π",
"Ρ",
"Σ",
"Τ",
"Υ",
"Φ",
"Χ",
"Ψ",
"Ω",
"α",
"β",
"γ",
"δ",
"ε",
"ζ",
"η",
"θ",
"ι",
"κ",
"λ",
"μ",
"ν",
"ξ",
"ο",
"π",
"ρ",
"ς",
"σ",
"τ",
"υ",
"φ",
"χ",
"ψ",
"ω",
"ϑ",
"ϒ",
"ϖ",
"•",
"…",
"′",
"″",
"‾",
"⁄",
"℘",
"ℑ",
"ℜ",
"™",
"ℵ",
"←",
"↑",
"→",
"↓",
"↔",
"↵",
"⇐",
"⇑",
"⇒",
"⇓",
"⇔",
"∀",
"∂",
"∃",
"∅",
"∇",
"∈",
"∉",
"∋",
"∏",
"∑",
"−",
"∗",
"√",
"∝",
"∞",
"∠",
"∧",
"∨",
"∩",
"∪",
"∫",
"∴",
"∼",
"≅",
"≈",
"≠",
"≡",
"≤",
"≥",
"⊂",
"⊃",
"⊄",
"⊆",
"⊇",
"⊕",
"⊗",
"⊥",
"⋅",
"⌈",
"⌉",
"⌊",
"⌋",
"〈",
"〉",
"◊",
"♠",
"♣",
"♥",
"♦",
];
return this.swapArrayVals(s, arr1, arr2);
},
NumericalToHTML(s: string) {
const arr1 = [
" ",
"¡",
"¢",
"£",
"¤",
"¥",
"¦",
"§",
"¨",
"©",
"ª",
"«",
"¬",
"­",
"®",
"¯",
"°",
"±",
"²",
"³",
"´",
"µ",
"¶",
"·",
"¸",
"¹",
"º",
"»",
"¼",
"½",
"¾",
"¿",
"À",
"Á",
"Â",
"Ã",
"Ä",
"Å",
"Æ",
"Ç",
"È",
"É",
"Ê",
"Ë",
"Ì",
"Í",
"Î",
"Ï",
"Ð",
"Ñ",
"Ò",
"Ó",
"Ô",
"Õ",
"Ö",
"×",
"Ø",
"Ù",
"Ú",
"Û",
"Ü",
"Ý",
"Þ",
"ß",
"à",
"á",
"â",
"ã",
"ä",
"å",
"æ",
"ç",
"è",
"é",
"ê",
"ë",
"ì",
"í",
"î",
"ï",
"ð",
"ñ",
"ò",
"ó",
"ô",
"õ",
"ö",
"÷",
"ø",
"ù",
"ú",
"û",
"ü",
"ý",
"þ",
"ÿ",
""",
"&",
"<",
">",
"Œ",
"œ",
"Š",
"š",
"Ÿ",
"ˆ",
"˜",
" ",
" ",
" ",
"‌",
"‍",
"‎",
"‏",
"–",
"—",
"‘",
"’",
"‚",
"“",
"”",
"„",
"†",
"‡",
"‰",
"‹",
"›",
"€",
"ƒ",
"Α",
"Β",
"Γ",
"Δ",
"Ε",
"Ζ",
"Η",
"Θ",
"Ι",
"Κ",
"Λ",
"Μ",
"Ν",
"Ξ",
"Ο",
"Π",
"Ρ",
"Σ",
"Τ",
"Υ",
"Φ",
"Χ",
"Ψ",
"Ω",
"α",
"β",
"γ",
"δ",
"ε",
"ζ",
"η",
"θ",
"ι",
"κ",
"λ",
"μ",
"ν",
"ξ",
"ο",
"π",
"ρ",
"ς",
"σ",
"τ",
"υ",
"φ",
"χ",
"ψ",
"ω",
"ϑ",
"ϒ",
"ϖ",
"•",
"…",
"′",
"″",
"‾",
"⁄",
"℘",
"ℑ",
"ℜ",
"™",
"ℵ",
"←",
"↑",
"→",
"↓",
"↔",
"↵",
"⇐",
"⇑",
"⇒",
"⇓",
"⇔",
"∀",
"∂",
"∃",
"∅",
"∇",
"∈",
"∉",
"∋",
"∏",
"∑",
"−",
"∗",
"√",
"∝",
"∞",
"∠",
"∧",
"∨",
"∩",
"∪",
"∫",
"∴",
"∼",
"≅",
"≈",
"≠",
"≡",
"≤",
"≥",
"⊂",
"⊃",
"⊄",
"⊆",
"⊇",
"⊕",
"⊗",
"⊥",
"⋅",
"⌈",
"⌉",
"⌊",
"⌋",
"〈",
"〉",
"◊",
"♠",
"♣",
"♥",
"♦",
];
const arr2 = [
" ",
"¡",
"¢",
"£",
"¤",
"¥",
"¦",
"§",
"¨",
"©",
"ª",
"«",
"¬",
"­",
"®",
"¯",
"°",
"±",
"²",
"³",
"´",
"µ",
"¶",
"·",
"¸",
"¹",
"º",
"»",
"¼",
"½",
"¾",
"¿",
"à",
"á",
"â",
"ã",
"Ä",
"å",
"æ",
"ç",
"è",
"é",
"ê",
"ë",
"ì",
"í",
"î",
"ï",
"ð",
"ñ",
"ò",
"ó",
"ô",
"õ",
"Ö",
"×",
"ø",
"ù",
"ú",
"û",
"Ü",
"ý",
"þ",
"ß",
"à",
"á",
"â",
"ã",
"ä",
"å",
"æ",
"ç",
"è",
"é",
"ê",
"ë",
"ì",
"í",
"î",
"ï",
"ð",
"ñ",
"ò",
"ó",
"ô",
"õ",
"ö",
"÷",
"Ø",
"ù",
"ú",
"û",
"ü",
"ý",
"þ",
"ÿ",
""",
"&",
"<",
">",
"œ",
"œ",
"š",
"š",
"ÿ",
"ˆ",
"˜",
" ",
" ",
" ",
"‌",
"‍",
"‎",
"‏",
"–",
"—",
"‘",
"’",
"‚",
"“",
"”",
"„",
"†",
"†",
"‰",
"‹",
"›",
"€",
"ƒ",
"α",
"β",
"γ",
"δ",
"ε",
"ζ",
"η",
"θ",
"ι",
"κ",
"λ",
"μ",
"ν",
"ξ",
"ο",
"π",
"ρ",
"σ",
"τ",
"υ",
"φ",
"χ",
"ψ",
"ω",
"α",
"β",
"γ",
"δ",
"ε",
"ζ",
"η",
"θ",
"ι",
"κ",
"λ",
"μ",
"ν",
"ξ",
"ο",
"π",
"ρ",
"ς",
"σ",
"τ",
"υ",
"φ",
"χ",
"ψ",
"ω",
"ϑ",
"ϒ",
"ϖ",
"•",
"…",
"′",
"′",
"‾",
"⁄",
"℘",
"ℑ",
"ℜ",
"™",
"ℵ",
"←",
"↑",
"→",
"↓",
"↔",
"↵",
"←",
"↑",
"→",
"↓",
"↔",
"∀",
"∂",
"∃",
"∅",
"∇",
"∈",
"∉",
"∋",
"∏",
"∑",
"−",
"∗",
"√",
"∝",
"∞",
"∠",
"∧",
"∨",
"∩",
"∪",
"∫",
"∴",
"∼",
"≅",
"≈",
"≠",
"≡",
"≤",
"≥",
"⊂",
"⊃",
"⊄",
"⊆",
"⊇",
"⊕",
"⊗",
"⊥",
"⋅",
"⌈",
"⌉",
"⌊",
"⌋",
"⟨",
"⟩",
"◊",
"♠",
"♣",
"♥",
"♦",
];
return this.swapArrayVals(s, arr1, arr2);
},
numEncode(s: string) {
if (this.isEmpty(s)) return "";
let e = "";
for (let i = 0; i < s.length; i = +1) {
let c = s.charAt(i);
if (c < " " || c > "~") {
c = `&#${c.charCodeAt(0)};`;
}
e += c;
}
return e;
},
htmlDecode(s: string) {
let c;
let m;
let d = s;
if (this.isEmpty(d)) return "";
d = this.HTML2Numerical(d);
const arr = d.match(/&#[0-9]{1,5};/g);
if (arr != null) {
for (let x = 0; x < arr.length; x += 1) {
m = arr[x];
c = +m.substring(2, m.length - 1);
if (c >= -32768 && c <= 65535) {
d = d.replace(m, String.fromCharCode(c));
} else {
d = d.replace(m, "");
}
}
}
return d;
},
htmlEncode(s: string, dbl: boolean) {
if (this.isEmpty(s)) return "";
dbl = dbl || false;
if (dbl) {
if (this.EncodeType === "numerical") {
s = s.replace(/&/g, "&#38;");
} else {
s = s.replace(/&/g, "&amp;");
}
}
s = this.XSSEncode(s, false);
if (this.EncodeType === "numerical" || !dbl) {
s = this.HTML2Numerical(s);
}
s = this.numEncode(s);
if (!dbl) {
s = s.replace(/&#/g, "##AMPHASH##");
if (this.EncodeType === "numerical") {
s = s.replace(/&/g, "&#38;");
} else {
s = s.replace(/&/g, "&amp;");
}
s = s.replace(/##AMPHASH##/g, "&#");
}
s = s.replace(/&#\d*([^\d;]|$)/g, "$1");
if (!dbl) {
s = this.correctEncoding(s);
}
if (this.EncodeType === "entity") {
s = this.NumericalToHTML(s);
}
return s;
},
XSSEncode(s: string, en: boolean) {
if (!this.isEmpty(s)) {
en = en || true;
if (en) {
s = s.replace(/\'/g, "&#39;");
s = s.replace(/\"/g, "&quot;");
s = s.replace(/</g, "&lt;");
s = s.replace(/>/g, "&gt;");
} else {
s = s.replace(/\'/g, "&#39;");
s = s.replace(/\"/g, "&#34;");
s = s.replace(/</g, "&#60;");
s = s.replace(/>/g, "&#62;");
}
return s;
}
return "";
},
hasEncoded(s: string) {
if (/&#[0-9]{1,5};/g.test(s)) {
return true;
}
if (/&[A-Z]{2,6};/gi.test(s)) {
return true;
}
return false;
},
stripUnicode(s: string) {
return s.replace(/[^\x20-\x7E]/g, "");
},
correctEncoding(s: string) {
return s.replace(/(&amp;)(amp;)+/, "$1");
},
swapArrayVals(s: string, arr1: string[], arr2: string[]) {
if (this.isEmpty(s)) return "";
let re;
if (arr1 && arr2) {
if (arr1.length === arr2.length) {
for (let x = 0, i = arr1.length; x < i; x += 1) {
re = new RegExp(arr1[x], "g");
s = s.replace(re, arr2[x]);
}
}
}
return s;
},
};