From 263d55a57013214280dd9ea6f7cfb3e044355a5e Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Mon, 20 Oct 2025 12:37:26 -0300 Subject: content: drop 'he' module --- src/data/language.js | 4 ---- src/data/things/language.js | 31 +++++++++++++++++-------------- 2 files changed, 17 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/data/language.js b/src/data/language.js index 3edf7e51..8dc06e7e 100644 --- a/src/data/language.js +++ b/src/data/language.js @@ -4,7 +4,6 @@ import path from 'node:path'; import {fileURLToPath} from 'node:url'; import chokidar from 'chokidar'; -import he from 'he'; // It stands for "HTML Entities", apparently. Cursed. import yaml from 'js-yaml'; import {annotateError, annotateErrorWithFile, showAggregate, withAggregate} @@ -251,9 +250,6 @@ async function processLanguageSpecFromFile(file, processLanguageSpecOpts) { export function initializeLanguageObject() { const language = new Language(); - language.escapeHTML = string => - he.encode(string, {useNamedReferences: true}); - language.externalLinkSpec = externalLinkSpec; return language; diff --git a/src/data/things/language.js b/src/data/things/language.js index 08c52cb8..7750a1b3 100644 --- a/src/data/things/language.js +++ b/src/data/things/language.js @@ -123,10 +123,6 @@ export class Language extends Thing { update: {validate: isExternalLinkSpec}, }, - // Update only - - escapeHTML: externalFunction(), - // Expose only isLanguage: [ @@ -170,12 +166,12 @@ export class Language extends Thing { strings_htmlEscaped: { flags: {expose: true}, expose: { - dependencies: ['strings', 'inheritedStrings', 'escapeHTML'], - compute({strings, inheritedStrings, escapeHTML}) { - if (!(strings || inheritedStrings) || !escapeHTML) return null; + dependencies: ['strings', 'inheritedStrings'], + compute({strings, inheritedStrings}) { + if (!(strings || inheritedStrings)) return null; const allStrings = {...inheritedStrings, ...strings}; return Object.fromEntries( - Object.entries(allStrings).map(([k, v]) => [k, escapeHTML(v)]) + Object.entries(allStrings).map(([k, v]) => [k, this.escapeHTML(v)]) ); }, }, @@ -206,6 +202,18 @@ export class Language extends Thing { } } + escapeHTML(string) { + // https://html.spec.whatwg.org/multipage/parsing.html#escapingString + + string = string + .replaceAll('&', '&') + .replaceAll('\u00a0', ' ') + .replaceAll('<', '<') + .replaceAll('>', '>'); + + return string; + } + getUnitForm(value) { this.assertIntlAvailable('intl_pluralCardinal'); return this.intl_pluralCardinal.select(value); @@ -428,14 +436,9 @@ export class Language extends Thing { // html.Tag objects - gets left as-is, preserving the value exactly as it's // provided. #sanitizeValueForInsertion(value) { - const escapeHTML = CacheableObject.getUpdateValue(this, 'escapeHTML'); - if (!escapeHTML) { - throw new Error(`escapeHTML unavailable`); - } - switch (typeof value) { case 'string': - return escapeHTML(value); + return this.escapeHTML(value); case 'number': case 'boolean': -- cgit 1.3.0-6-gf8a5