unicode-to-plain-text
Version:
Convert fancy Unicode text to plain ASCII with smart language preservation
61 lines (60 loc) • 2.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DECORATIVE_CHARS = exports.OTHER_DECORATIONS = exports.MUSIC_DECORATIVE = exports.STARS_DECORATIVE = exports.EMOTICON_PUNCTUATION = exports.ARROWS_SYMBOLS = exports.BOX_DRAWING_LINES = exports.CHESS_PIECES = exports.BOX_BLOCKS = exports.EMOTICON_DECORATIONS = exports.isEmoji = void 0;
const EMOJI_RANGES = [
[0x1f300, 0x1f9ff],
[0x1fa00, 0x1faff],
[0x2600, 0x26ff],
[0x2700, 0x27bf],
[0x2300, 0x23ff],
[0x2b50, 0x2b55],
[0xfe00, 0xfe0f],
[0x200d, 0x200d]
];
const isEmoji = (char) => {
const codePoint = char.codePointAt(0);
if (codePoint === undefined)
return false;
for (const [start, end] of EMOJI_RANGES) {
if (codePoint >= start && codePoint <= end)
return true;
}
return false;
};
exports.isEmoji = isEmoji;
exports.EMOTICON_DECORATIONS = '࿐►❚»«ᅳಠ益ノ彡‿ꜟ。◥◤゚言╬';
exports.BOX_BLOCKS = '░▒▓█▀▄▌▐▖▞▚▅⯊◀◗◣◤⧗';
exports.CHESS_PIECES = '♔♕♖♗♘♙♚♛♜♝♞♟';
exports.BOX_DRAWING_LINES = '┃━┏┓┗┛├┤┬┴┼╋═║╔╗╚╝╠╣╦╩╬';
exports.ARROWS_SYMBOLS = '↳↔↕➔►◗☡☭☋☿☈♗♭→';
exports.EMOTICON_PUNCTUATION = 'ʘ·¯´`().,';
exports.STARS_DECORATIVE = '※★☆✦✧✴✶✷✸✹✺';
exports.MUSIC_DECORATIVE = '♪♫';
const DECORATION_ONLY_RANGES = [
[0x2500, 0x257f, 'Box Drawing'],
[0x2580, 0x259f, 'Block Elements'],
[0x2200, 0x22ff, 'Mathematical Operators'],
[0x25a0, 0x25ff, 'Geometric Shapes'],
[0x2b00, 0x2b4f, 'Miscellaneous Symbols and Arrows (non-emoji part)'],
[0x2460, 0x24ff, 'Enclosed Alphanumerics'],
[0x0300, 0x036f, 'Combining Diacritical Marks (zalgo text)'],
[0x20d0, 0x20ff, 'Combining Diacritical Marks for Symbols'],
[0xfe20, 0xfe2f, 'Combining Half Marks'],
[0x1ab0, 0x1aff, 'Combining Diacritical Marks Extended'],
[0x1dc0, 0x1dff, 'Combining Diacritical Marks Supplement']
];
const expandRanges = (ranges) => ranges
.flatMap(([start, end]) => Array.from({ length: end - start + 1 }, (_, index) => String.fromCodePoint(start + index)))
.join('');
const EXPLICIT_DECORATIONS = [
exports.EMOTICON_DECORATIONS,
exports.BOX_BLOCKS,
exports.CHESS_PIECES,
exports.BOX_DRAWING_LINES,
exports.ARROWS_SYMBOLS,
exports.EMOTICON_PUNCTUATION,
exports.STARS_DECORATIVE,
exports.MUSIC_DECORATIVE
].join('');
exports.OTHER_DECORATIONS = new Set(EXPLICIT_DECORATIONS + expandRanges(DECORATION_ONLY_RANGES));
exports.DECORATIVE_CHARS = exports.OTHER_DECORATIONS;