I find myself with a CSS file where I need to strip out all properties that don't relate to color but maintain any custom classes, ids, and standard HTML elements. I initially tried to do this by combining a reverse regex selection in vscode with an entire line selection based on the beginning string, but I'm terrible at regex.
This ^.((?!(color|background-color)).)*$ was as far as I was able to progress, which does eliminate the lines that don't begin with color or background-color from the selection. However, I couldn't determine how to address classes (.), ids(#), and regular HTML elements.
Or, if there is a simpler solution to the problem, please advise.
Thanks, in advance.
Example:
p {
line-height: 1.5;
padding: 10px;
color: #f4f4f4;
background-color: #444;
}
.my-class {
line-height: 1.5;
width: 20%;
color: #f4f4f4;
background-color: #444;
}
#my-id {
line-height: 1.5;
margin: auto;
color: #f4f4f4;
background-color: #444;
}
Should resolve to below with the non-color properties removed
p {
color: #f4f4f4;
background-color: #444;
}
.my-class {
color: #f4f4f4;
background-color: #444;
}
#my-id {
color: #f4f4f4;
background-color: #444;
}
CodePudding user response:
If we assuming the file is more or less formatted,
instead of advanced parsing, we can just filter the lines and remove those with : that don't contain the word color and has ';' in them.
EDIT:
This might still not be enough, because different files might be formatted differently. I have a better algorithm by checking only the parts between { and } and then splitting by ; and then checking each part for existence of word color...
But for now this might be good enough? For best results, format the css file. Size of css shouldn't be a limit.
var css = `p,
.another,
#id_new_line {
line-height: 1.5;
padding: 10px;
color: #f4f4f4;
background-color: #444;
}
.my-class,
.my-class::after {
line-height: 1.5;
width: 20%;
color: #f4f4f4;
background-color: #444;
}
#my-id {
line-height: 1.5;
margin: auto;
color: #f4f4f4;
background-color: #444;
}`;
var arr = css.split("\n");
var brr = arr.filter(function(line) {
if (line.indexOf(':') > -1 && line.toLowerCase().indexOf('color') == -1 && line.indexOf(';') > -1) {
return false
}
return true;
});
var new_css = brr.join("\n")
console.log(new_css)
CodePudding user response:
You could try this regex, see regex101 demo
Find: (^\s*(color|background-color).*$)|(^\s*.*{$)|(^\s*}$)|^\s*.*$\n
It is just a big alternation, order is important - the lines you don't want should be last so that more specific groups with { or } or the color properties are matched first.
Note that the last group also includes the trailing \n so that the line is removed in the replace.
Replace: $1$3$4
