-
Notifications
You must be signed in to change notification settings - Fork 18
/
index.js
82 lines (71 loc) · 3.34 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
'use strict';
const chalk = require('chalk');
const tinygradient = require('tinygradient');
const forbiddenChars = /\s/g;
function InitGradient(...args) {
const grad = tinygradient.apply(this, args);
const ret = (str, opts) => applyGradient(str ? str.toString() : '', grad, opts);
ret.multiline = (str, opts) => multilineGradient(str ? str.toString() : '', grad, opts);
return ret;
}
const getColors = (gradient, options, count) => options.interpolation.toLowerCase() === 'hsv' ?
gradient.hsv(count, options.hsvSpin.toLowerCase()) : gradient.rgb(count);
function applyGradient(str, gradient, opts) {
const options = validateOptions(opts);
const colorsCount = Math.max(str.replace(forbiddenChars, '').length, gradient.stops.length);
const colors = getColors(gradient, options, colorsCount);
let result = '';
for (const s of str) {
result += s.match(forbiddenChars) ? s : chalk.hex(colors.shift().toHex())(s);
}
return result;
}
function multilineGradient(str, gradient, opts) {
const options = validateOptions(opts);
const lines = str.split('\n');
const maxLength = Math.max.apply(null, lines.map(l => l.length).concat([gradient.stops.length]));
const colors = getColors(gradient, options, maxLength);
const results = [];
for (const line of lines) {
const lineColors = colors.slice(0);
let lineResult = '';
for (const l of line) {
lineResult += chalk.hex(lineColors.shift().toHex())(l);
}
results.push(lineResult);
}
return results.join('\n');
}
function validateOptions(opts) {
const options = {interpolation: 'rgb', hsvSpin: 'short', ...opts};
if (opts !== undefined && typeof opts !== 'object') {
throw new TypeError(`Expected \`options\` to be an \`object\`, got \`${typeof opts}\``);
}
if (typeof options.interpolation !== 'string') {
throw new TypeError(`Expected \`options.interpolation\` to be a \`string\`, got \`${typeof options.interpolation}\``);
}
if (options.interpolation.toLowerCase() === 'hsv' && typeof options.hsvSpin !== 'string') {
throw new TypeError(`Expected \`options.hsvSpin\` to be a \`string\`, got \`${typeof options.hsvSpin}\``);
}
return options;
}
const aliases = {
atlas: {colors: ['#feac5e', '#c779d0', '#4bc0c8'], options: {}},
cristal: {colors: ['#bdfff3', '#4ac29a'], options: {}},
teen: {colors: ['#77a1d3', '#79cbca', '#e684ae'], options: {}},
mind: {colors: ['#473b7b', '#3584a7', '#30d2be'], options: {}},
morning: {colors: ['#ff5f6d', '#ffc371'], options: {interpolation: 'hsv'}},
vice: {colors: ['#5ee7df', '#b490ca'], options: {interpolation: 'hsv'}},
passion: {colors: ['#f43b47', '#453a94'], options: {}},
fruit: {colors: ['#ff4e50', '#f9d423'], options: {}},
instagram: {colors: ['#833ab4', '#fd1d1d', '#fcb045'], options: {}},
retro: {colors: ['#3f51b1', '#5a55ae', '#7b5fac', '#8f6aae', '#a86aa4', '#cc6b8e', '#f18271', '#f3a469', '#f7c978'], options: {}},
summer: {colors: ['#fdbb2d', '#22c1c3'], options: {}},
rainbow: {colors: ['#ff0000', '#ff0100'], options: {interpolation: 'hsv', hsvSpin: 'long'}},
pastel: {colors: ['#74ebd5', '#74ecd5'], options: {interpolation: 'hsv', hsvSpin: 'long'}}
};
module.exports = InitGradient;
for (const a in aliases) { // eslint-disable-line guard-for-in
module.exports[a] = str => new InitGradient(aliases[a].colors)(str, aliases[a].options);
module.exports[a].multiline = str => new InitGradient(aliases[a].colors).multiline(str, aliases[a].options);
}