taiga-front/gulp-utils.js

161 lines
4.0 KiB
JavaScript

var exports = module.exports = {};
var fs = require("fs");
var gutil = require('gulp-util');
var Theme = function() {
var defaultTheme = "taiga";
var themesPath = "app/themes";
var tmpThemesPath = "tmp/themes";
var themesSequenceIndex = 0;
var themesSequence = [];
var searchIndex = function(name) {
for(var i = 0; i < themesSequence.length; i++) {
if (themesSequence[i].name === name) {
return i;
}
}
};
var initThemes = function () {
var availableThemes = {};
var files = fs.readdirSync(themesPath);
files.forEach(function(file) {
var path = themesPath + '/' + file;
var tmpPath = tmpThemesPath + '/' + file;
if (fs.statSync(path).isDirectory()) {
availableThemes[file] = {
name: file,
path: path,
customVariables: path + "/variables.scss",
customScss: path + "/custom.scss",
customCss: tmpPath + "/custom.css",
};
}
});
themesSequence.push(availableThemes[defaultTheme]);
for (var theme in availableThemes) {
if (theme !== defaultTheme) {
themesSequence.push(availableThemes[theme]);
}
}
};
initThemes();
var obj = {};
obj.next = function() {
themesSequenceIndex++;
};
obj.set = function(name) {
themesSequenceIndex = searchIndex(name);
};
Object.defineProperty(obj, "current", {
get: function() {
return themesSequence[themesSequenceIndex];
}
});
return obj;
};
exports.themes = {
sequence: function() {
return Theme();
}
};
exports.unusedCss = function(options) {
var through = require('through2');
var css = require('css');
var path = require('path');
var content = fs.readFileSync(options.css, "utf8");
var ast = css.parse(content, {});
var files = [];
var validsSelectors = [];
ast.stylesheet.rules.forEach(function(rule) {
if (rule.selectors) {
rule.selectors.forEach(function(selectorRule) {
var selectors = selectorRule.split(" ");
selectors.forEach(function(selector) {
var valid = false;
if (selector.slice(0, 2) === 'tg') {
valid = true;
} else if (selector[0] === '.') {
valid = true;
selector = '.' + selector.split('.')[1]; // '.class1.class2 -> .class1'
}
selector = selector.split('::')[0];
selector = selector.split(':')[0];
if(valid && validsSelectors.indexOf(selector) === -1) {
validsSelectors.push(selector);
}
});
});
}
});
var addFile = function(file, encoding, cb) {
files.push(file);
cb();
};
var searchUnusedCss = function(cb) {
var invalid = [];
validsSelectors.forEach(function(validSelector) {
var finded = false;
files.every(function(file) {
var content = file.contents.toString();
var ext = path.extname(file.path);
var pattern = validSelector;
if (ext === '.html') {
pattern = validSelector.slice(1);
}
if(content.indexOf(pattern) !== -1) {
finded = true;
return false;
}
return true;
});
if (!finded) {
invalid.push(validSelector);
}
});
for(var i = 0; i < invalid.length; i++) {
gutil.log(gutil.colors.magenta(invalid[i]));
}
cb();
};
return through.obj(addFile, searchUnusedCss);
};