1
0
mirror of https://github.com/simple-icons/simple-icons.git synced 2025-01-05 01:20:39 +02:00
simple-icons/src/build.js

185 lines
5.9 KiB
JavaScript
Raw Normal View History

2015-10-14 17:52:04 +02:00
// Get JSON from source file
var source = require('./simple-icons.json');
2016-08-04 17:32:27 +02:00
console.log("\nBuilding " + source.icons.length + " icons...\n");
2015-10-14 17:52:04 +02:00
// Loop through icons
for (var i = 0; i < source.icons.length; i++) {
var hex = source.icons[i].hex;
// Add red, green and blue values to the JSON object
var red = parseInt(hex.substr(0,2), 16) / 255;
var green = parseInt(hex.substr(2,2), 16) / 255;
var blue = parseInt(hex.substr(4,2), 16) / 255;
// Add hue to the JSON object
var max = Math.max(red, green, blue);
var min = Math.min(red, green, blue);
var delta = max - min;
2015-10-16 15:35:52 +02:00
source.icons[i].luminance = 100 * (max + min) / 2;
2015-10-14 17:52:04 +02:00
if (delta === 0) {
var hue = 0;
2015-10-16 16:43:13 +02:00
source.icons[i].saturation = 0;
2015-10-14 17:52:04 +02:00
} else {
2015-10-16 16:43:13 +02:00
if (source.icons[i].luminance < 50) {
source.icons[i].saturation = 100 * (max - min) / (max + min);
} else {
source.icons[i].saturation = 100 * (max - min) / (2 - max - min);
}
2015-10-14 17:52:04 +02:00
if (max === red) {
var hue = ((green - blue) / delta) * 60;
if (hue < 0) {
hue += 360;
}
} else if (max === green) {
var hue = (((blue - red) / delta) + 2) * 60;
} else {
var hue = (((red - green) / delta) + 4) * 60;
}
}
source.icons[i].hue = hue;
}
// Sort icons by hue
2015-10-15 15:30:13 +02:00
for (var i = 0; i < source.icons.length; i++) {
2015-11-10 13:22:45 +02:00
source.icons[i].hue += 90;
2015-10-15 15:30:13 +02:00
source.icons[i].hue = source.icons[i].hue % 360;
}
2015-10-14 17:52:04 +02:00
source.icons.sort(function(a, b) {
return parseFloat(a.hue) - parseFloat(b.hue);
2015-10-14 17:52:04 +02:00
});
2015-10-15 15:30:13 +02:00
var tmp = [];
for (var i = 0; i < source.icons.length; i++) {
if (source.icons[i].luminance < 15) {
2015-10-15 15:30:13 +02:00
tmp.push(source.icons[i]);
source.icons.splice(i,1);
i--;
}
}
2015-10-16 15:35:52 +02:00
for (var i = 0; i < source.icons.length; i++) {
if (source.icons[i].saturation < 25) {
2015-10-16 15:35:52 +02:00
tmp.push(source.icons[i]);
source.icons.splice(i,1);
i--;
}
}
2015-10-15 15:30:13 +02:00
tmp.sort(function(a, b) {
return parseFloat(b.luminance) - parseFloat(a.luminance);
});
for (var i = 0; i < tmp.length; i++) {
source.icons.push(tmp[i]);
}
2015-10-14 17:52:04 +02:00
// Read header and footer content into variables
var fs = require('fs');
function readFile(path, callback) {
try {
var filename = require.resolve(path);
fs.readFile(filename, 'utf8', callback);
} catch (e) {
callback(e);
}
}
var fs = require('fs');
2015-10-22 15:57:08 +02:00
var header = fs.readFileSync('./header.html', 'utf8');
var footer = fs.readFileSync('./footer.html', 'utf8');
2015-10-14 17:52:04 +02:00
2015-10-15 15:30:13 +02:00
// Build content
2017-02-15 17:09:54 +02:00
var main = "<ul>";
2015-10-15 15:30:13 +02:00
2015-10-14 17:52:04 +02:00
for (var i = 0; i < source.icons.length; i++) {
2015-10-17 12:38:33 +02:00
var fileName = source.icons[i].title.toLowerCase();
2016-05-22 11:39:53 +02:00
fileName = fileName.replace(/[!|’|.| |-]/g, ''); // Replace bang, apostrophe, period and space with nothing.
2015-12-10 12:33:15 +02:00
fileName = fileName.replace(/[+]/, 'plus'); // Replace the plus symbol with “plus”.
filePath = "../icons/" + fileName + ".svg";
var fs = require('fs');
var svg = fs.readFileSync(filePath, 'utf8');
2017-02-23 13:16:16 +02:00
main += "\n<li style=\"background-color:#" + source.icons[i].hex + "\"><a href=\"/icons/" + fileName + ".svg\" class=\"icon--link\" download>" + svg + "<h2>" + source.icons[i].title + "</h2></a>" + "<span>#" + source.icons[i].hex + "</span></li>";
2015-10-14 17:52:04 +02:00
}
// Put all content together and export to index.html
var htmlOutput = header + main + footer;
2015-10-22 15:57:08 +02:00
fs.writeFile("../index.html", htmlOutput, function(err) {
2015-10-14 17:52:04 +02:00
if(err) {
return console.log(err);
}
2016-08-04 17:32:27 +02:00
console.log(" - index.html built successfully.");
2015-10-19 12:08:22 +02:00
});
2015-10-19 17:38:48 +02:00
// Also output to 404.html
2015-10-22 15:57:08 +02:00
fs.writeFile("../404.html", htmlOutput, function(err) {
2015-10-19 17:38:48 +02:00
if(err) {
return console.log(err);
}
2016-08-04 17:32:27 +02:00
console.log(" - 404.html built successfully.");
2016-08-04 17:26:46 +02:00
});
var sass = "// Brand colours from simpleicons.org\n";
var less = "// Brand colours from simpleicons.org\n";
var css = "/* Brand colours from simpleicons.org */\n\n:root {";
2016-08-04 17:26:46 +02:00
var maxNameLength = 0;
for (var i = 0; i < source.icons.length; i++) {
var fileName = source.icons[i].title.toLowerCase();
fileName = fileName.replace(/[!|’|.| |-]/g, ''); // Replace bang, apostrophe, period and space with nothing.
fileName = fileName.replace(/[+]/, 'plus'); // Replace the plus symbol with “plus”.
if (fileName.length > maxNameLength) {
maxNameLength = fileName.length;
}
}
// Sort icons alphabetically
source.icons.sort(function(a, b) {
if (a.title < b.title) {
return -1;
}
if (a.title > b.title) {
return 1;
}
// names must be equal
return 0;
});
for (var i = 0; i < source.icons.length; i++) {
var fileName = source.icons[i].title.toLowerCase();
fileName = fileName.replace(/[!|’|.| |-]/g, ''); // Replace bang, apostrophe, period and space with nothing.
fileName = fileName.replace(/[+]/, 'plus'); // Replace the plus symbol with “plus”.
spacing = "";
if (fileName.length < maxNameLength) {
spacing = " ".repeat(maxNameLength - fileName.length);
}
sass += "\n$color-brand-" + fileName.toLowerCase() + ": " + spacing + "#" + source.icons[i].hex.toUpperCase() + ";";
less += "\n@color-brand-" + fileName.toLowerCase() + ": " + spacing + "#" + source.icons[i].hex.toUpperCase() + ";";
css += "\n --color-brand-" + fileName.toLowerCase() + ": " + spacing + "#" + source.icons[i].hex.toUpperCase() + ";";
2016-08-04 17:26:46 +02:00
}
css += "\n}";
2016-08-04 17:26:46 +02:00
// Generate Sass file with colour variables
fs.writeFile("../colour-variables.scss", sass, function(err) {
if(err) {
return console.log(err);
}
2016-08-04 17:32:27 +02:00
console.log(" - brand-colours.scss built successfully.");
2016-08-04 17:26:46 +02:00
});
// Generate Less file with colour variables
fs.writeFile("../colour-variables.less", less, function(err) {
if(err) {
return console.log(err);
}
2016-08-04 17:32:27 +02:00
console.log(" - brand-colours.less built successfully.");
2017-02-06 20:34:58 +02:00
});
// Generate CSS file with colour variables
fs.writeFile("../colour-variables.css", css, function(err) {
if(err) {
return console.log(err);
}
2017-02-26 14:34:14 +02:00
console.log(" - brand-colours.css built successfully.");
});