cssToRules(css) { css = css.replace(/url\(\'(.+)\'\)/g, 'url($1)'); var rules = []; var parsedCSS = cssParse(css, { silent: true }); if (parsedCSS.stylesheet && parsedCSS.stylesheet.rules) { rules = this._buildRules(parsedCSS.stylesheet.rules, css); } return rules; }
module.exports = function (theme) { var aceTheme = ace.require(theme.theme); if (!theme) return {}; var cssClass = aceTheme.cssClass; var prefix = new RegExp("^." + cssClass + " "); var rules = {}; try { var aceCss = aceTheme.cssText; parseCss(aceCss).stylesheet.rules.forEach(function (rule) { if (rule.type !== "rule") return; var declarations = {}; rule.declarations.forEach(function (declaration) { if (declaration.type !== "declaration") return; declarations[declaration.property] = declaration.value; }); rule.selectors.forEach(function (selector) { if (selector === "." + cssClass) selector += " "; if (!prefix.test(selector)) return; var name = selector.replace(prefix, ""); rules[name] = declarations; }); }); } catch (err) { console.log(aceTheme.cssText); console.error(theme.theme, err.toString()); return {}; } // console.log(rules); var css = Object.keys(template).map(function (name) { var props = template[name]; var contents = Object.keys(props).map(function (key) { var values = props[key]; if (!Array.isArray(values)) return " " + key + ":" + values + ";"; for (var i = 0, l = values.length; i < l; i++) { var option = values[i]; var rule = rules[option]; if (rule && rule[key]) { // console.log("Matched", [name, key, option, rule[key]]); return " " + key + ":" + rule[key] + ";"; } } if (i === l) { // console.warn("Not Matched", [name, key]); return ""; } }).join("\n").trim(); if (!contents) return; return name + "{\n " + contents + "\n}"; }).join("\n"); if (tag) document.head.removeChild(tag); tag = document.createElement("style"); tag.setAttribute("data-theme", theme.theme); tag.textContent = css; document.head.appendChild(tag); };