示例#1
0
 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;
 }
示例#2
0
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);
};