UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

39 lines (38 loc) 1.88 kB
import { get_html_translation_table as getHtmlTranslationTable } from "../strings/get_html_translation_table.js"; export function htmlentities(string, quoteStyle, charset, doubleEncode) { // discuss at: https://locutus.io/php/htmlentities/ // parity verified: PHP 8.3 // original by: Kevin van Zonneveld (https://kvz.io) // revised by: Kevin van Zonneveld (https://kvz.io) // revised by: Kevin van Zonneveld (https://kvz.io) // improved by: nobbler // improved by: Jack // improved by: Rafał Kukawski (https://blog.kukawski.pl) // improved by: Dj (https://locutus.io/php/htmlentities:425#comment_134018) // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman) // bugfixed by: Brett Zamir (https://brett-zamir.me) // input by: Ratheous // note 1: function is compatible with PHP 5.2 and older // example 1: htmlentities('Kevin & van Zonneveld') // returns 1: 'Kevin & van Zonneveld' // example 2: htmlentities("foo'bar","ENT_QUOTES") // returns 2: 'foo'bar' const hashMap = getHtmlTranslationTable('HTML_ENTITIES', quoteStyle); const source = string === null ? '' : string + ''; if (quoteStyle && quoteStyle === 'ENT_QUOTES') { hashMap["'"] = '''; } const shouldDoubleEncode = doubleEncode === null || !!doubleEncode; const regex = new RegExp('&(?:#\\d+|#x[\\da-f]+|[a-zA-Z][\\da-z]*);|[' + Object.keys(hashMap) .join('') // replace regexp special chars .replace(/([()[\]{}\-.*+?^$|/\\])/g, '\\$1') + ']', 'g'); return source.replace(regex, function (ent) { if (ent.length > 1) { return shouldDoubleEncode ? hashMap['&'] + ent.substring(1) : ent; } return hashMap[ent] ?? ent; }); }