UNPKG

unicode-to-plain-text

Version:

Convert fancy Unicode text to plain ASCII with smart language preservation

61 lines (60 loc) 2.67 kB
"use strict"; 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;