UNPKG

ascii-art-utf

Version:

Write terminal strings in UTF typefaces

171 lines (164 loc) โ€ข 8.97 kB
(function (root, factory){ if(typeof define === 'function' && define.amd){ define(['ascii-art-ansi'], factory); }else if (typeof module === 'object' && module.exports){ module.exports = factory(require('ascii-art-ansi')); }else{ root.AsciiArtUTF = factory(root.AsciiArtAnsi); } }(this, function(ansi){ var unicodeSplit = function(str){ var result = []; for(var c of str) result.push(c); return result; } var fonts = { 'default' : { upper : unicodeSplit('ABCDEFGHIJKLMNOPQRSTUVWXYZ'), lower : unicodeSplit('abcdefghijklmnopqrstuvwxyz'), numbers : unicodeSplit('0123456789') }, 'script' : { upper : unicodeSplit('๐’œโ„ฌ๐’ž๐’Ÿโ„ฐโ„ฑ๐’ขโ„‹โ„๐’ฅ๐’ฆโ„’โ„ณ๐’ฉ๐’ช๐’ซ๐’ฌโ„›๐’ฎ๐’ฏ๐’ฐ๐’ฑ๐’ฒ๐’ณ๐’ด๐’ต'), lower : unicodeSplit('๐’ถ๐’ท๐’ธ๐’นโ„ฏ๐’ป๐“ฐ๐’ฝ๐’พ๐’ฟ๐“€๐“๐“‚๐“ƒโ„ด๐“…๐“†๐“‡๐“ˆ๐“‰๐“Š๐“‹๐“Œ๐“๐“Ž๐“') }, 'script+bold' : { upper : unicodeSplit('๐“๐“‘๐“’๐““๐“”๐“•๐“–๐“—๐“˜๐“™๐“š๐“›๐“œ๐“๐“ž๐“Ÿ๐“ ๐“ก๐“ข๐“ฃ๐“ค๐“ฅ๐“ฆ๐“ง๐“จ๐“ฉ'), lower : unicodeSplit('๐“ช๐“ซ๐“ฌ๐“ญ๐“ฎ๐“ฏ๐“ฐ๐“ฑ๐“ฒ๐“ณ๐“ด๐“ต๐“ถ๐“ท๐“ธ๐“น๐“บ๐“ป๐“ผ๐“ฝ๐“พ๐“ฟ๐”€๐”๐”‚๐”ƒ') }, 'gothic' : { upper : unicodeSplit('๐”„๐”…โ„ญ๐”‡๐”ˆ๐”‰๐”Šโ„Œโ„๐”๐”Ž๐”๐”๐”‘๐”’๐”“๐””โ„œ๐”–๐”—๐”˜๐”™๐”š๐”›๐”œโ„จ'), lower : unicodeSplit('๐”ž๐”Ÿ๐” ๐”ก๐”ข๐”ฃ๐”ค๐”ฅ๐”ฆ๐”ง๐”จ๐”ฉ๐”ช๐”ซ๐”ฌ๐”ญ๐”ฎ๐”ฏ๐”ฐ๐”ฑ๐”ฒ๐”ณ๐”ด๐”ต๐”ถ๐”ท') }, 'gothic+bold' : { upper : unicodeSplit('๐•ฌ๐•ญ๐•ฎ๐•ฏ๐•ฐ๐•ฑ๐•ฒ๐•ณ๐•ด๐•ต๐•ถ๐•ท๐•ธ๐•น๐•บ๐•ป๐•ผ๐•ฝ๐•พ๐•ฟ๐–€๐–๐–‚๐–ƒ๐–„๐–…'), lower : unicodeSplit('๐–†๐–‡๐–ˆ๐–‰๐–Š๐–‹๐–Œ๐–๐–Ž๐–๐–๐–‘๐–’๐–“๐–”๐–•๐––๐–—๐–˜๐–™๐–š๐–›๐–œ๐–๐–ž๐–Ÿ') }, 'serif' : { //copy of bold, for now upper : unicodeSplit('๐€๐๐‚๐ƒ๐„๐…๐†๐‡๐ˆ๐‰๐Š๐‹๐Œ๐๐Ž๐๐๐‘๐’๐“๐”๐•๐–๐—๐˜๐™'), lower : unicodeSplit('๐š๐›๐œ๐๐ž๐Ÿ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ'), numbers : unicodeSplit('๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—') }, 'serif+bold+italic' : { upper : unicodeSplit('๐‘จ๐‘ฉ๐‘ช๐‘ซ๐‘ฌ๐‘ญ๐‘ฎ๐‘ฏ๐‘ฐ๐‘ฑ๐‘ฒ๐‘ณ๐‘ด๐‘ต๐‘ถ๐‘ท๐‘ธ๐‘น๐‘บ๐‘ป๐‘ผ๐‘ฝ๐‘พ๐‘ฟ๐’€๐’'), lower : unicodeSplit('๐’‚๐’ƒ๐’„๐’…๐’†๐’‡๐’ˆ๐’‰๐’Š๐’‹๐’Œ๐’๐’Ž๐’๐’๐’‘๐’’๐’“๐’”๐’•๐’–๐’—๐’˜๐’™๐’š๐’›') }, 'serif+bold' : { //copy of bold, for now upper : unicodeSplit('๐€๐๐‚๐ƒ๐„๐…๐†๐‡๐ˆ๐‰๐Š๐‹๐Œ๐๐Ž๐๐๐‘๐’๐“๐”๐•๐–๐—๐˜๐™'), lower : unicodeSplit('๐š๐›๐œ๐๐ž๐Ÿ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ'), numbers : unicodeSplit('๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—') }, 'serif+italic' : { //copy of bold, for now upper : unicodeSplit('๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐‘€๐‘๐‘‚๐‘ƒ๐‘„๐‘…๐‘†๐‘‡๐‘ˆ๐‘‰๐‘Š๐‘‹๐‘Œ๐‘'), lower : unicodeSplit('๐‘Ž๐‘๐‘๐‘‘๐‘’๐‘“๐‘”๐‘–๐‘—๐‘˜๐‘™๐‘š๐‘›๐‘œ๐‘๐‘ž๐‘Ÿ๐‘ ๐‘ก๐‘ข๐‘ฃ๐‘ค๐‘ฅ๐‘ฆ๐‘ง') }, 'monospace' : { //copy of bold, for now upper : unicodeSplit('๐™ฐ๐™ฑ๐™ฒ๐™ณ๐™ด๐™ต๐™ถ๐™ท๐™ธ๐™น๐™บ๐™ป๐™ผ๐™ฝ๐™พ๐™ฟ๐š€๐š๐š‚๐šƒ๐š„๐š…๐š†๐š‡๐šˆ๐š‰'), lower : unicodeSplit('๐šŠ๐š‹๐šŒ๐š๐šŽ๐š๐š๐š‘๐š’๐š“๐š”๐š•๐š–๐š—๐š˜๐š™๐šš๐š›๐šœ๐š๐šž๐šŸ๐š ๐šก๐šข๐šฃ'), numbers: unicodeSplit('๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ') }, 'sansserif' : { //copy of bold, for now upper : unicodeSplit('๐– ๐–ก๐–ข๐–ฃ๐–ค๐–ฅ๐–ฆ๐–ง๐–จ๐–ฉ๐–ช๐–ซ๐–ฌ๐–ญ๐–ฎ๐–ฏ๐–ฐ๐–ฑ๐–ฒ๐–ณ๐–ด๐–ต๐–ถ๐–ท๐–ธ๐–น'), lower : unicodeSplit('๐–บ๐–ป๐–ผ๐–ฝ๐–พ๐–ฟ๐—€๐—๐—‚๐—ƒ๐—„๐—…๐—†๐—‡๐—ˆ๐—‰๐—Š๐—‹๐—Œ๐—๐—Ž๐—๐—๐—‘๐—’๐—“'), numbers : unicodeSplit('๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ') }, 'sansserif+bold+italic' : { //copy of bold, for now upper : unicodeSplit('๐˜ผ๐˜ฝ๐˜พ๐˜ฟ๐™€๐™๐™‚๐™ƒ๐™„๐™…๐™†๐™‡๐™ˆ๐™‰๐™Š๐™‹๐™Œ๐™๐™Ž๐™๐™๐™‘๐™’๐™“๐™”๐™•'), lower : unicodeSplit('๐™–๐™—๐™˜๐™™๐™š๐™›๐™œ๐™๐™ž๐™Ÿ๐™ ๐™ก๐™ข๐™ฃ๐™ค๐™ฅ๐™ฆ๐™ง๐™จ๐™ฉ๐™ช๐™ซ๐™ฌ๐™ญ๐™ฎ๐™ฏ') }, 'sansserif+bold' : { //copy of bold, for now upper : unicodeSplit('๐—”๐—•๐—–๐——๐—˜๐—™๐—š๐—›๐—œ๐—๐—ž๐—Ÿ๐— ๐—ก๐—ข๐—ฃ๐—ค๐—ฅ๐—ฆ๐—ง๐—จ๐—ฉ๐—ช๐—ซ๐—ฌ๐—ญ'), lower : unicodeSplit('๐—ฎ๐—ฏ๐—ฐ๐—ฑ๐—ฒ๐—ณ๐—ด๐—ต๐—ถ๐—ท๐—ธ๐—น๐—บ๐—ป๐—ผ๐—ฝ๐—พ๐—ฟ๐˜€๐˜๐˜‚๐˜ƒ๐˜„๐˜…๐˜†๐˜‡'), numbers : unicodeSplit('๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต') }, 'sansserif+italic' : { //copy of bold, for now upper : unicodeSplit('๐˜ˆ๐˜‰๐˜Š๐˜‹๐˜Œ๐˜๐˜Ž๐˜๐˜๐˜‘๐˜’๐˜“๐˜”๐˜•๐˜–๐˜—๐˜˜๐˜™๐˜š๐˜›๐˜œ๐˜๐˜ž๐˜Ÿ๐˜ ๐˜ก'), lower : unicodeSplit('๐˜ข๐˜ฃ๐˜ค๐˜ฅ๐˜ฆ๐˜ง๐˜จ๐˜ฉ๐˜ช๐˜ซ๐˜ฌ๐˜ญ๐˜ฎ๐˜ฏ๐˜ฐ๐˜ฑ๐˜ฒ๐˜ณ๐˜ด๐˜ต๐˜ถ๐˜ท๐˜ธ๐˜น๐˜บ๐˜ป') }, 'doublestrike' : { //copy of bold, for now upper : unicodeSplit('๐”ธ๐”น๐”ป๐”ผ๐”ฝ๐”พโ„๐•€๐•๐•‚๐•ƒ๐•„๐•†โ„™โ„šโ„๐•Š๐•‹๐•Œ๐•๐•Ž๐•Yโ„ค'), lower : unicodeSplit('๐•’๐•“๐•”๐••๐•–๐•—๐•˜๐•™๐•š๐•›๐•œ๐•๐•ž๐•Ÿ๐• ๐•ก๐•ข๐•ฃ๐•ค๐•ฅ๐•ฆ๐•ง๐•จ๐•ฉ๐•ช๐•ซ'), numbers: unicodeSplit('๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก') } } var siggy = { //todo: make this usable for others A : unicodeSplit('ษ…'), b : unicodeSplit('ใ‡‹ใ„‹๐กŽ'), e : unicodeSplit('๊ ต'), y : unicodeSplit('๐…'), S : unicodeSplit('S'), p : unicodeSplit('แŽต'), a : unicodeSplit('แญดแฅˆ'), r : unicodeSplit('แ–‡ใƒžใƒž'), o : unicodeSplit('๐ˆ๊™จ'), w : unicodeSplit('๊›ƒแœฆ') }; var randomLetter = function(letter, lookup){ if(!lookup[letter]) return letter; // in order to get an even-ish spread, increase the range by one, and cap the value var index = Math.min( Math.floor((lookup[letter].length+1)*Math.random()), lookup[letter].length-1 ); return lookup[letter][index]; } var getCharFor = function(chr, font, styles){ if(isAlphabeticChar(chr) || isNumericChar(chr)){ var type = isNumericChar(chr)?'number':(chr === chr.toLowerCase()?'lower':'upper'); var isBold = styles.indexOf('bold') !== -1 || styles.indexOf('1') !== -1; var isItalic = styles.indexOf('italic') !== -1 || styles.indexOf('3') !== -1; var pos; switch(type){ case 'number': pos = fonts.default.numbers.indexOf(chr); break; case 'upper': pos = fonts.default.upper.indexOf(chr); break; case 'lower': pos = fonts.default.lower.indexOf(chr); break; } if(isBold && isItalic && fonts[font+'+bold+italic']){ if( fonts[font+'+bold+italic'][type] && fonts[font+'+bold+italic'][type][pos] ) return fonts[font+'+bold+italic'][type][pos]; } if(isBold && fonts[font+'+bold']){ if( fonts[font+'+bold'][type] && fonts[font+'+bold'][type][pos] ) return fonts[font+'+bold'][type][pos]; } if(isItalic && fonts[font+'+italic']){ if( fonts[font+'+italic'][type] && fonts[font+'+italic'][type][pos] ) return fonts[font+'+italic'][type][pos]; } if(fonts[font]){ if( fonts[font][type] && fonts[font][type][pos] ) return fonts[font][type][pos]; } } return chr; } var isAlphabeticChar = function(str){ return str.length === 1 && str.match(/[a-z]/i); } var isNumericChar = function(n){ return !isNaN(parseFloat(n)) && isFinite(n); } var utf = { font : function(str, font){ return ansi.map(str, function(chr, codes){ var result = getCharFor(chr, font, codes); return result; }); }, signature : function(str, alt){ return ansi.map(str, function(chr, codes){ return alt?randomLetter(chr, siggy):getCharFor(chr, 'script', codes); }); } } return utf; }));