Skip to content

Instantly share code, notes, and snippets.

@bidiu
Last active August 9, 2017 03:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bidiu/9b467061808d80bf8d7a8eb482885cb7 to your computer and use it in GitHub Desktop.
Save bidiu/9b467061808d80bf8d7a8eb482885cb7 to your computer and use it in GitHub Desktop.
const path = require('path');
const fs = require('fs');
const readline = require('readline');
const ROOT = './src/app/assets/css';
const FILE_NAME = 'styles.css';
const EXCLUDES = [
'bloomberg', 'example_dark', 'merrilledge_blue', 'merrilledge_dark', 'merrilledge_light', 'trademonster_dark', 'schwab_dark'
];
const NEW_LINE = '\n';
fs.readdir(ROOT, (err, files) => {
files = files.filter((p) => p.indexOf('.') === -1 && EXCLUDES.indexOf(p) === -1);
files.forEach((p) => {
p = path.join(ROOT, p, FILE_NAME);
processOneFile(p);
});
});
// process one file
function processOneFile(filePath) {
const lineProcessor = getLineProcessor(ruleFilter, cssFilter)
readline.createInterface({
input: fs.createReadStream(filePath)
}).on('line', (line) => {
lineProcessor(line);
}).on('close', () => {
fs.writeFileSync(filePath, lineProcessor.getOutput());
});
}
// true -> leave it as it is
function ruleFilter(rule, css, headerPassed) {
// @textColor, @linkColor, @bullishColor, @bearishColor
if (rule.indexOf('@textColor') !== -1 || rule.indexOf('@linkColor') !== -1 || rule.indexOf('@bullishColor') !== -1 || rule.indexOf('@bearishColor') !== -1) {
return true;
}
// .tc-presto li, .tc-presto p, .tc-presto input, .tc-presto textarea, .tc-presto select ...
if (-1 !== css.selectors.indexOf('.tc-presto li, .tc-presto p, .tc-presto input, .tc-presto textarea, .tc-presto select, .tc-presto td, .tc-presto th, .tc-presto button, .tc-presto div, .tc-presto h1, .tc-presto span')) {
return true;
}
// .tc-search-bar-button-container {}, .tc-search-bar-button-icon {}
if (-1 !== css.selectors.indexOf('.tc-search-bar-button-container') || -1 !== css.selectors.indexOf('.tc-search-bar-button-icon')) {
return true;
}
// All "text" styles at top of file
if (!headerPassed && (rule.indexOf('color:') !== -1 && rule.indexOf('-color:') === -1 || rule.indexOf('font-') !== -1 || rule.indexOf('text-') !== -1)) {
return true;
}
// custom rules
if (css.selectors.indexOf('.tc-price-chart-eventclose_bear') !== -1 || css.selectors.indexOf('.tc-price-chart-eventclose_bull') !== -1) {
return true;
}
return false;
}
// true -> leave it as it is
function cssFilter(css, headerPassed) {
// .tc-presto li, .tc-presto p, .tc-presto input, .tc-presto textarea, .tc-presto select ...
if (-1 !== css.selectors.indexOf('.tc-presto li, .tc-presto p, .tc-presto input, .tc-presto textarea, .tc-presto select, .tc-presto td, .tc-presto th, .tc-presto button, .tc-presto div, .tc-presto h1, .tc-presto span')) {
return true;
}
// .tc-search-bar-button-container {}, .tc-search-bar-button-icon {}
if (-1 !== css.selectors.indexOf('.tc-search-bar-button-container') || -1 !== css.selectors.indexOf('.tc-search-bar-button-icon')) {
return true;
}
// filter out all empty css style like: selector {}
// 1 here, because ending bracket is in the rule array
return css.rules.length > 1;
}
function getLineProcessor(ruleFilter, cssFilter) {
let headerPassed = false;
const scanStates = {
selectorsDone: false,
};
let css = null;
let outputText = '';
function resetScanStates() {
scanStates.selectorsDone = false;
}
function isRuleLine(line) {
return line.indexOf(';') !== -1;
}
function isEndingBracket(line) {
return line.indexOf('}') !== -1;
}
// assume no empty css style in source files
function _processor(line) {
if (line.indexOf('.tc-auto-suggest {') !== -1) {
headerPassed = true;
}
if (!scanStates.selectorsDone) {
if (css) {
if (isRuleLine(line)) {
scanStates.selectorsDone = true;
if (ruleFilter(line, css, headerPassed)) { css.appendRule(line); }
} else {
css.appendSelector(line);
}
} else {
css = new Css();
css.appendSelector(line);
}
} else {
if (isRuleLine(line)) {
if (ruleFilter(line, css, headerPassed)) { css.appendRule(line); }
} else if (isEndingBracket(line)) {
css.appendRule(line);
// have read a whole css ..
if (cssFilter(css, headerPassed)) { outputText += css.toString(); }
css = null;
resetScanStates();
} else {
css.appendRule(line);
}
}
};
_processor.reset = function() {
headerPassed = false;
resetScanStates();
css = null;
outputText = '';
}
_processor.isHeaderPassed = function() {
return headerPassed;
}
_processor.getOutput = function() {
return outputText;
}
return _processor;
}
function Css() {
// including comments
this.selectors = '';
// including comments and ending bracket
this.rules = [];
}
Css.prototype.appendSelector = function(selector) {
this.selectors += selector + NEW_LINE;
};
Css.prototype.appendRule = function(rule) {
this.rules.push(rule + NEW_LINE);
};
Css.prototype.toString = function() {
return this.selectors + this.rules.reduce((rule1, rule2) => rule1 + rule2);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment