Last active
August 9, 2017 03:59
-
-
Save bidiu/9b467061808d80bf8d7a8eb482885cb7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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