import { get_html_translation_table as getHtmlTranslationTable } from '../strings/get_html_translation_table.ts' export function htmlentities( string: string, quoteStyle?: string | number, charset?: string, doubleEncode?: boolean | null, ): string { // 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: string): string { if (ent.length > 1) { return shouldDoubleEncode ? hashMap['&'] + ent.substring(1) : ent } return hashMap[ent] ?? ent }) }