]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/modules/styles.jsm
Import 1.0b7.1 supporting Firefox up to 8.*
[dactyl.git] / common / modules / styles.jsm
index adfc725c8269780495c182289689e672b9c1af67..70608b9fb170eca5cddec2992b490b093028bb25 100644 (file)
@@ -68,17 +68,20 @@ update(Sheet.prototype, {
     get fullCSS() {
         let filter = this.sites;
         let css = this.css;
+
+        let preamble = "/* " + this.uri + (this.agent ? " (agent)" : "") + " */\n\n" + namespace + "\n";
         if (filter[0] == "*")
-            return namespace + css;
+            return preamble + css;
 
         let selectors = filter.map(function (part)
-                                    (/[*]$/.test(part)   ? "url-prefix" :
-                                     /[\/:]/.test(part)  ? "url"
-                                                         : "domain")
-                                    + '("' + part.replace(/"/g, "%22").replace(/\*$/, "") + '")')
+                                    !/^(?:[a-z-]+[:*]|[a-z-.]+$)/i.test(part) ? "regexp(" + (".*(?:" + part + ").*").quote() + ")" :
+                                       (/[*]$/.test(part)   ? "url-prefix" :
+                                        /[\/:]/.test(part)  ? "url"
+                                                            : "domain")
+                                       + '("' + part.replace(/"/g, "%22").replace(/\*$/, "") + '")')
                               .join(",\n               ");
-        return "/* " + this.uri + (this.agent ? " (agent)" : "") + " */\n\n"
-             + namespace + "\n@-moz-document " + selectors + " {\n\n" + css + "\n\n}\n";
+
+        return preamble + "@-moz-document " + selectors + " {\n\n" + css + "\n\n}\n";
     }
 });
 
@@ -253,8 +256,8 @@ var Styles = Module("Styles", {
 
         services["dactyl:"].providers["style"] = function styleProvider(uri) {
             let id = /^\/(\d*)/.exec(uri.path)[1];
-            if (set.has(styles.allSheets, id))
-                return ["text/css", unescape(encodeURI(styles.allSheets[id].fullCSS))];
+            if (Set.has(styles.allSheets, id))
+                return ["text/css", styles.allSheets[id].fullCSS];
             return null;
         };
     },
@@ -296,13 +299,15 @@ var Styles = Module("Styles", {
     systemNames: Class.Property({ get: deprecated("Styles#system.names", function systemNames() this.system.names) }),
     sites: Class.Property({ get: deprecated("Styles#user.sites", function sites() this.user.sites) }),
 
-    list: function list(content, filter, name, hives) {
+    list: function list(content, sites, name, hives) {
         const { commandline, dactyl } = this.modules;
 
         hives = hives || styles.hives.filter(function (h) h.modifiable && h.sheets.length);
 
         function sheets(group)
             group.sheets.slice()
+                 .filter(function (sheet) (!name || sheet.name === name) &&
+                                          (!sites || sites.every(function (s) sheet.sites.indexOf(s) >= 0)))
                  .sort(function (a, b) a.name && b.name ? String.localeCompare(a.name, b.name)
                                                         : !!b.name - !!a.name || a.id - b.id);
 
@@ -312,9 +317,9 @@ var Styles = Module("Styles", {
                 <tr highlight="Title">
                     <td/>
                     <td/>
-                    <td style="padding-right: 1em;">Name</td>
-                    <td style="padding-right: 1em;">Filter</td>
-                    <td style="padding-right: 1em;">CSS</td>
+                    <td style="padding-right: 1em;">{_("title.Name")}</td>
+                    <td style="padding-right: 1em;">{_("title.Filter")}</td>
+                    <td style="padding-right: 1em;">{_("title.CSS")}</td>
                 </tr>
                 <col style="min-width: 4em; padding-right: 1em;"/>
                 <col style="min-width: 1em; text-align: center; color: red; font-weight: bold;"/>
@@ -365,9 +370,13 @@ var Styles = Module("Styles", {
             for (let prop in Styles.propertyIter(str))
                 props[prop.name] = prop.value;
 
-        return Object.keys(props)[sort ? "sort" : "slice"]()
-                     .map(function (prop) prop + ": " + props[prop] + ";")
-                     .join(" ");
+        let val = Object.keys(props)[sort ? "sort" : "slice"]()
+                        .map(function (prop) prop + ": " + props[prop] + ";")
+                        .join(" ");
+
+        if (/^\s*(\/\*.*?\*\/)/.exec(src))
+            val = RegExp.$1 + " " + val;
+        return val;
     },
 
     completeSite: function (context, content, group) {
@@ -377,8 +386,8 @@ var Styles = Module("Styles", {
             context.fork("current", 0, this, function (context) {
                 context.title = ["Current Site"];
                 context.completions = [
-                    [content.location.host, "Current Host"],
-                    [content.location.href, "Current URL"]
+                    [content.location.host, /*L*/"Current Host"],
+                    [content.location.href, /*L*/"Current URL"]
                 ];
             });
         }
@@ -389,7 +398,7 @@ var Styles = Module("Styles", {
         context.generate = function () values(group.sites);
 
         context.keys.text = util.identity;
-        context.keys.description = function (site) this.sheets.length + " sheet" + (this.sheets.length == 1 ? "" : "s") + ": " +
+        context.keys.description = function (site) this.sheets.length + /*L*/" sheet" + (this.sheets.length == 1 ? "" : "s") + ": " +
             array.compact(this.sheets.map(function (s) s.name)).join(", ");
         context.keys.sheets = function (site) group.sheets.filter(function (s) s.sites.indexOf(site) >= 0);
         context.keys.active = function (site) uris.some(Styles.matchFilter(site));
@@ -434,7 +443,7 @@ var Styles = Module("Styles", {
         for (let item in Iterator({ Active: true, Inactive: false })) {
             let [name, active] = item;
             context.split(name, null, function (context) {
-                context.title[0] = name + " " + (title || "Sheets");
+                context.title[0] = /*L*/name + " " + (title || "Sheets");
                 context.filters.push(function (item) !!item.active == active);
             });
         }
@@ -553,17 +562,16 @@ var Styles = Module("Styles", {
                 let [filter, css] = args;
 
                 if (!css)
-                    styles.list(window.content, filter, args["-name"], args.explicitOpts["-group"] ? [args["-group"]] : null);
+                    styles.list(window.content, filter ? filter.split(",") : null, args["-name"], args.explicitOpts["-group"] ? [args["-group"]] : null);
                 else {
                     util.assert(args["-group"].modifiable && args["-group"].hive.modifiable,
-                                "Cannot modify styles in the builtin group");
+                                _("group.cantChangeBuiltin", _("style.styles")));
 
                     if (args["-append"]) {
                         let sheet = args["-group"].get(args["-name"]);
                         if (sheet) {
-                            filter = sheet.sites.concat(filter).join(",");
+                            filter = array(sheet.sites).concat(filter).uniq().join(",");
                             css = sheet.css + " " + css;
-
                         }
                     }
                     let style = args["-group"].add(args["-name"], filter, css, args["-agent"]);
@@ -573,7 +581,6 @@ var Styles = Module("Styles", {
                 }
             },
             {
-                bang: true,
                 completer: function (context, args) {
                     let compl = [];
                     let sheet = args["-group"].get(args["-name"]);
@@ -584,7 +591,9 @@ var Styles = Module("Styles", {
                     }
                     else if (args.completeArg == 1) {
                         if (sheet)
-                            context.completions = [[sheet.css, "Current Value"]];
+                            context.completions = [
+                                [sheet.css, _("option.currentValue")]
+                            ];
                         context.fork("css", 0, modules.completion, "css");
                     }
                 },
@@ -607,9 +616,8 @@ var Styles = Module("Styles", {
                                     command: "style",
                                     arguments: [style.sites.join(",")],
                                     literalArg: style.css,
-                                    options: update({
-                                            "-group": hive.name,
-                                        },
+                                    options: update(
+                                        hive.name == "user" ? {} : { "-group": hive.name },
                                         style.name ? { "-name": style.name } : {})
                                 })))
                         .flatten().array
@@ -642,7 +650,7 @@ var Styles = Module("Styles", {
             commands.add(cmd.name, cmd.desc,
                 function (args) {
                     dactyl.assert(args.bang ^ !!(args[0] || args[1] || args["-name"] || args["-index"]),
-                                  "Argument or ! required");
+                                  _("error.argumentOrBang"));
 
                     args["-group"].find(args["-name"], args[0], args.literalArg, args["-index"])
                                   .forEach(cmd.action);