Skip to content

Instantly share code, notes, and snippets.

@bidiu
Created August 8, 2017 20:26
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/b9a028e1898b3b8fb7a90b30825a2ec6 to your computer and use it in GitHub Desktop.
Save bidiu/b9a028e1898b3b8fb7a90b30825a2ec6 to your computer and use it in GitHub Desktop.
const fs = require('fs');
const readline = require('readline');
const FILE_PATH = './src/app/assets/css/phillip/styles.css';
const OUTPUT_PATH = './src/app/assets/css/phillip/styles.css';
const NEW_LINE = '\n';
const lineReader = readline.createInterface({
input: fs.createReadStream(FILE_PATH)
});
const lineProcessor = getLineProcessor(ruleFilter, cssFilter);
let outputText = '';
lineReader.on('line', (line) => {
lineProcessor(line);
}).on('close', () => {
fs.writeFileSync(OUTPUT_PATH, outputText);
});
// 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;
}
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;
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
return (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);
}
}
};
}
function Css() {
// including comments
this.selectors = '';
// including comments and ending bracket
this.rules = [];
this.emptyCss = true;
}
Css.prototype.appendSelector = function(selector) {
this.selectors += selector + NEW_LINE;
};
Css.prototype.appendRule = function(rule) {
this.rules.push(rule + NEW_LINE);
this.emptyCss = false;
};
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