unicode-to-plain-text
Version:
Convert fancy Unicode text to plain ASCII with smart language preservation
41 lines (40 loc) • 1.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleFlipped = void 0;
const UPSIDE_DOWN_MAP_1 = require("./maps/UPSIDE_DOWN_MAP");
const FLIP_EMOTICONS_MAP_1 = require("./maps/FLIP_EMOTICONS_MAP");
const MIRRORED_MAP_1 = require("./maps/MIRRORED_MAP");
const handleFlipped = (text) => {
let result = removeEmoticons(text);
if (isUpsideDown(result)) {
return [...result]
.map((c) => UPSIDE_DOWN_MAP_1.UPSIDE_DOWN_MAP[c] ?? c)
.reverse()
.join('');
}
if (isMirrored(result)) {
return [...result]
.reverse()
.map((c) => MIRRORED_MAP_1.MIRRORED_LETTER_SWAPS[c] ?? c)
.join('');
}
return result;
};
exports.handleFlipped = handleFlipped;
const removeEmoticons = (text) => {
const emoticon = FLIP_EMOTICONS_MAP_1.FLIP_EMOTICONS_MAP.find((e) => text.includes(e));
return emoticon ? removeEmoticons(text.replace(emoticon, '').trim()) : text;
};
const isUpsideDown = (text) => {
const chars = [...text].filter((c) => c.trim() !== '');
const flipped = chars.filter((c) => UPSIDE_DOWN_MAP_1.UPSIDE_DOWN_MAP[c] && !UPSIDE_DOWN_MAP_1.UPSIDE_DOWN_MAP[UPSIDE_DOWN_MAP_1.UPSIDE_DOWN_MAP[c]]).length;
return flipped > 2 || flipped / chars.length > 0.5;
};
const isMirrored = (text) => {
const chars = [...text].filter((c) => c.trim() !== '');
const mirrored = chars.filter((c) => {
const mapped = MIRRORED_MAP_1.MIRRORED_MAP[c];
return mapped && !MIRRORED_MAP_1.MIRRORED_MAP[mapped];
}).length;
return mirrored > 2 && mirrored / chars.length >= 0.3;
};