css-inline-stream
Version:
Inline CSS classes into styles from HTML streams
39 lines (31 loc) • 1.22 kB
JavaScript
const parseStyle = require("./parse-style");
module.exports = function parseCSSToMap(cssString) {
// Remove comments and whitespace
cssString = cssString
.replace(/\/\*[\s\S]*?\*\//g, '') // Remove comments
.replace(/\s+/g, ' ') // Normalize whitespace
.trim();
// Regex to match selectors and their rulesets
// Captures: Group 1 = selector, Group 2 = ruleset content
const ruleRegex = /([^{]+)\{([^}]+)\}/g;
// Create map to store results
const cssMap = new Map();
// Find all matches and add to map
let match;
while ((match = ruleRegex.exec(cssString)) !== null) {
const selector = match[1].trim();
const ruleset = parseStyle(match[2].trim());
// If selector already exists, combine rulesets
mergeSelectorRule(selector,ruleset,cssMap);
}
return cssMap;
}
module.exports.mergeSelectorRule = mergeSelectorRule;
function mergeSelectorRule(selector,ruleset,cssMap) {
if (cssMap.has(selector)) {
const existingRules = cssMap.get(selector);
cssMap.set(selector,{...existingRules, ...ruleset});
} else {
cssMap.set(selector, ruleset);
}
}