ascii-art-utf
Version:
Write terminal strings in UTF typefaces
171 lines (164 loc) โข 8.97 kB
JavaScript
(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;
}));