module.exports = s => s.replace(/&[#a-z0-9]+?;/ig, m => { const entities = { // grave accented letters 'À': 'À', 'È': 'È', 'Ì': 'Ì', 'Ò': 'Ò', 'Ù': 'Ù', 'à': 'à', 'è': 'è', 'ì': 'ì', 'ò': 'ò', 'ù': 'ù', // acute accented letters 'Á': 'Á', 'É': 'É', 'Í': 'Í', 'Ó': 'Ó', 'Ú': 'Ú', 'Ý': 'Ý', 'á': 'á', 'é': 'é', 'í': 'í', 'ó': 'ó', 'ú': 'ú', 'ý': 'ý', // circumflex accented letters 'Â': 'Â', 'Ê': 'Ê', 'Î': 'Î', 'Ô': 'Ô', 'Û': 'Û', 'â': 'â', 'ê': 'ê', 'î': 'î', 'ô': 'ô', 'û': 'û', // tilde accented letters 'Ã': 'Ã', 'Ñ': 'Ñ', 'Õ': 'Õ', 'ã': 'ã', 'ñ': 'ñ', 'õ': 'õ', // umlaut accented letters 'Ä': 'Ä', 'Ë': 'Ë', 'Ï': 'Ï', 'Ö': 'Ö', 'Ü': 'Ü', 'Ÿ': 'Ÿ', 'ä': 'ä', 'ë': 'ë', 'ï': 'ï', 'ö': 'ö', 'ü': 'ü', 'ÿ': 'ÿ', // other foreign characters '¡': '¡', '¿': '¿', 'Ç': 'Ç', 'ç': 'ç', 'Œ': 'Œ', 'œ': 'œ', 'º': 'º', 'ª': 'ª', 'ß': 'ß', 'Ø': 'Ø', 'ø': 'ø', 'Å': 'Å', 'å': 'å', 'Æ': 'Æ', 'æ': 'æ', 'Þ': 'Þ', 'þ': 'þ', 'Ð': 'Ð', 'ð': 'ð', // currency units '¢': '¢', '£': '£', '¥': '¥', '€': '€', '¤': '¤', 'ƒ': 'ƒ', // math symbols '>': '>', '<': '<', '÷': '÷', '°': '°', '¬': '¬', '±': '±', 'µ': 'µ', '∴': '∴', '≠': '≠', '≥': '≥', '≤': '≤', '≈': '≈', '√': '√', '∞': '∞', '∫': '∫', '∂': '∂', '′': '′', '″': '″', '∑': '∑', '∏': '∏', '‰': '‰', '≡': '≡', '‾': '‾', '⁄': '⁄', '℘': '℘', 'ℑ': 'ℑ', 'ℜ': 'ℜ', 'ℵ': 'ℵ', '∀': '∀', '∃': '∃', '∅': '∅', '∇': '∇', '∈': '∈', '∉': '∉', '∋': '∋', '−': '−', '∗': '∗', '∝': '∝', '∠': '∠', '∧': '∧', '∨': '∨', '∩': '∩', '∪': '∪', '∼': '∼', '≅': '≅', '≈': '≈', '⊂': '⊂', '⊃': '⊃', '⊄': '⊄', '⊆': '⊆', '⊇': '⊇', '⊕': '⊕', '⊗': '⊗', '⊥': '⊥', '⋅': '⋅', '⌈': '⌈', '⌉': '⌉', '⌊': '⌊', '⌋': '⌋', '⟨': '〈', '⟩': '〉', // punctuations and others ' ': ' ', '&': '&', ''': '\'', '"': '"', '«': '«', '»': '»', '‹': '‹', '›': '›', '‚': '‚', '„': '„', '“': '“', '”': '”', '‘': '‘', '’': '’', '…': '…', '®': '®', '©': '©', '™': '™', '¶': '¶', '•': '•', '·': '·', '§': '§', '–': '–', '—': '—', '†': '†', '‡': '‡', '◊': '◊', '↑': '↑', '↓': '↓', '←': '←', '→': '→', '↔': '↔', '↵': '↵', '⇐': '⇐', '⇑': '⇑', '⇒': '⇒', '⇓': '⇓', '⇔': '⇔', '♠': '♠', '♣': '♣', '♥': '♥', '♦': '♦', // Greek letters 'Α': 'Α', 'Β': 'Β', 'Γ': 'Γ', 'Δ': 'Δ', 'Ε': 'Ε', 'Ζ': 'Ζ', 'Η': 'Η', 'Θ': 'Θ', 'Ι': 'Ι', 'Κ': 'Κ', 'Λ': 'Λ', 'Μ': 'Μ', 'Ν': 'Ν', 'Ξ': 'Ξ', 'Ο': 'Ο', 'Π': 'Π', 'Ρ': 'Ρ', 'Σ': 'Σ', 'Τ': 'Τ', 'Υ': 'Υ', 'Φ': 'Φ', 'Χ': 'Χ', 'Ψ': 'Ψ', 'Ω': 'Ω', 'α': 'α', 'β': 'β', 'γ': 'γ', 'δ': 'δ', 'ε': 'ε', 'ζ': 'ζ', 'η': 'η', 'θ': 'θ', 'ι': 'ι', 'κ': 'κ', 'λ': 'λ', 'μ': 'μ', 'ν': 'ν', 'ξ': 'ξ', 'ο': 'ο', 'π': 'π', 'ρ': 'ρ', 'ς': 'ς', 'σ': 'σ', 'τ': 'τ', 'υ': 'υ', 'φ': 'φ', 'χ': 'χ', 'ψ': 'ψ', 'ω': 'ω', 'ϑ': 'ϑ', 'ϒ': 'ϒ', 'ϖ': 'ϖ' }; let c = entities[m]; if (c) return c; if (m.match(/^&#[0-9]{1,4};$/i)) return String.fromCharCode(parseInt(/^&#([0-9a-f]+);$/i.exec(m)[1])); if (m.match(/^&#x[0-9a-f]{1,4};$/i)) return String.fromCharCode(parseInt(/^&#x([0-9a-f]+);$/i.exec(m)[1], 16)); return m; });