Created
August 8, 2017 20:26
-
-
Save bidiu/b9a028e1898b3b8fb7a90b30825a2ec6 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 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