Skip to content

Commit cab158e

Browse files
(compressor) Fix
1 parent f986d20 commit cab158e

File tree

2 files changed

+33
-20
lines changed

2 files changed

+33
-20
lines changed

src/compress.js

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,40 @@ const path = require('path');
3030
const deployDir = process.argv[2] || __dirname;
3131
const parseCSS = require('./modules/ast/css.js');
3232

33-
function compressFile(filePath) {
34-
let content = fs.readFileSync(filePath, 'utf8');
35-
if (filePath.endsWith('.css')) {
36-
content = parseCSS.JSON(content);
37-
let compressed = '';
38-
const rule_ = (rule) => {
33+
function serializeRules(rules) {
34+
let result = '';
35+
36+
const ruleToString = (rule) => {
37+
if (!rule) return '';
38+
39+
if (rule.type === 'at-rule') {
40+
let innerContent = '';
41+
if (rule.rules && rule.rules.length > 0) {
42+
innerContent = serializeRules(rule.rules);
43+
}
44+
return `${rule.name}{${innerContent}}`;
45+
} else if (rule.type === 'rule') {
3946
const props = [];
4047
for (const [key, value] of Object.entries(rule.properties)) {
4148
props.push(`${key}:${value}`);
4249
}
43-
return rule.selectors.join(',') + '{' + props.join(';') + '}';
50+
return `${rule.selectors.join(',')}{${props.join(';')}}`;
4451
}
45-
content.forEach(rule => {
46-
if (rule && rule.type == 'at-rule') {
47-
compressed += rule.name + '{';
48-
rule.rules.forEach(rule__ => {
49-
if (rule__) {
50-
compressed += rule_(rule__);
51-
}
52-
})
53-
compressed += '}'
54-
} else if (rule) {
55-
compressed += rule_(rule);
56-
}
57-
});
52+
return '';
53+
};
54+
55+
for (const rule of rules) {
56+
result += ruleToString(rule);
57+
}
58+
59+
return result;
60+
}
61+
62+
function compressFile(filePath) {
63+
let content = fs.readFileSync(filePath, 'utf8');
64+
if (filePath.endsWith('.css')) {
65+
content = parseCSS.JSON(content);
66+
const compressed = serializeRules(content);
5867
fs.writeFileSync(filePath, compressed, 'utf8');
5968
return;
6069
}

src/modules/ast/css.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ SOFTWARE.
2424
2525
*/
2626

27+
/**
28+
* @param {string} cssText
29+
* @returns {Array}
30+
*/
2731
exports.JSON = function(cssText) {
2832
const cleanedCSS = cssText.replace(/\/\*[\s\S]*?\*\//g, '');
2933
let index = 0;

0 commit comments

Comments
 (0)