1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 09:27:58 +01:00

Add :styenable, :stydisable, :stytoggle

This commit is contained in:
Kris Maglione
2009-09-10 18:20:47 -04:00
parent 94bd791028
commit 66a2579fb9
5 changed files with 137 additions and 94 deletions

View File

@@ -1021,7 +1021,7 @@ lookup:
} }
} }
else if (/\.css$/.test(filename)) else if (/\.css$/.test(filename))
storage.styles.registerSheet(uri.spec, true); storage.styles.registerSheet(uri.spec, false, true);
else else
{ {
let heredoc = ""; let heredoc = "";

View File

@@ -252,6 +252,7 @@ function Styles(name, store)
// Can't reference liberator or Components inside Styles -- // Can't reference liberator or Components inside Styles --
// they're members of the window object, which disappear // they're members of the window object, which disappear
// with this window. // with this window.
const self = this;
const util = modules.util; const util = modules.util;
const sleep = liberator.sleep; const sleep = liberator.sleep;
const storage = modules.storage; const storage = modules.storage;
@@ -260,7 +261,35 @@ function Styles(name, store)
const namespace = '@namespace html "' + XHTML + '";\n' + const namespace = '@namespace html "' + XHTML + '";\n' +
'@namespace xul "' + XUL + '";\n' + '@namespace xul "' + XUL + '";\n' +
'@namespace liberator "' + NS.uri + '";\n'; '@namespace liberator "' + NS.uri + '";\n';
const Sheet = new Struct("name", "sites", "css", "ref", "agent");
const Sheet = new Struct("name", "id", "sites", "css", "system", "agent");
Sheet.prototype.__defineGetter__("fullCSS", function wrapCSS() {
let filter = this.sites;
let css = this.css;
if (filter[0] == "*")
return namespace + css;
let selectors = filter.map(function (part) (/[*]$/.test(part) ? "url-prefix" :
/[\/:]/.test(part) ? "url"
: "domain")
+ '("' + part.replace(/"/g, "%22").replace(/[*]$/, "") + '")')
.join(", ");
return namespace + "/* Liberator style #" + this.id + " */ @-moz-document " + selectors + "{\n" + css + "\n}\n";
});
Sheet.prototype.__defineGetter__("enabled", function () this._enabled);
Sheet.prototype.__defineSetter__("enabled", function (on) {
this._enabled = Boolean(on);
if (on)
{
self.registerSheet(cssUri(this.fullCSS));
if (this.agent)
self.registerSheet(cssUri(this.fullCSS), true);
}
else
{
self.unregisterSheet(cssUri(this.fullCSS));
self.unregisterSheet(cssUri(this.fullCSS), true);
}
});
let cssUri = function (css) "chrome-data:text/css," + window.encodeURI(css); let cssUri = function (css) "chrome-data:text/css," + window.encodeURI(css);
@@ -269,6 +298,8 @@ function Styles(name, store)
let userNames = {}; let userNames = {};
let systemNames = {}; let systemNames = {};
let id = 0;
this.__iterator__ = function () Iterator(userSheets.concat(systemSheets)); this.__iterator__ = function () Iterator(userSheets.concat(systemSheets));
this.__defineGetter__("systemSheets", function () Iterator(systemSheets)); this.__defineGetter__("systemSheets", function () Iterator(systemSheets));
this.__defineGetter__("userSheets", function () Iterator(userSheets)); this.__defineGetter__("userSheets", function () Iterator(userSheets));
@@ -295,30 +326,20 @@ function Styles(name, store)
if (name && name in names) if (name && name in names)
this.removeSheet(system, name); this.removeSheet(system, name);
let sheet = sheets.filter(function (s) s.sites.join(",") == filter && s.css == css)[0]; let sheet = Sheet(name, id++, filter.split(",").filter(util.identity), css, null, system, agent);
if (!sheet)
sheet = new Sheet(name, filter.split(",").filter(util.identity), css, null, agent);
if (sheet.ref == null) // Not registered yet try
{ {
sheet.ref = []; sheet.enabled = true;
try
{
this.registerSheet(cssUri(wrapCSS(sheet)));
if (sheet.agent)
this.registerAgentSheet(cssUri(wrapCSS(sheet)));
}
catch (e)
{
return e.echoerr || e;
}
sheets.push(sheet);
} }
catch (e)
{
return e.echoerr || e;
}
sheets.push(sheet);
if (name) if (name)
{
sheet.ref.push(name);
names[name] = sheet; names[name] = sheet;
}
return null; return null;
}; };
@@ -381,6 +402,11 @@ function Styles(name, store)
this.removeSheet = function (system, name, filter, css, index) this.removeSheet = function (system, name, filter, css, index)
{ {
let self = this; let self = this;
if (arguments.length == 0)
{
var matches = [system];
system = sheet.system;
}
let sheets = system ? systemSheets : userSheets; let sheets = system ? systemSheets : userSheets;
let names = system ? systemNames : userNames; let names = system ? systemNames : userNames;
@@ -391,25 +417,20 @@ function Styles(name, store)
if (filter == undefined) if (filter == undefined)
filter = ""; filter = "";
let matches = this.findSheets(system, name, filter, css, index); if (!matches)
matches = this.findSheets(system, name, filter, css, index);
if (matches.length == 0) if (matches.length == 0)
return; return;
for (let [, sheet] in Iterator(matches.reverse())) for (let [, sheet] in Iterator(matches.reverse()))
{ {
sheet.enabled = false;
if (name) if (name)
{
if (sheet.ref.indexOf(name) > -1)
sheet.ref.splice(sheet.ref.indexOf(name), 1);
delete names[name]; delete names[name];
} if (sheets.indexOf(sheet) > -1)
if (!sheet.ref.length) sheets.splice(sheets.indexOf(sheet), 1);
{
this.unregisterSheet(cssUri(wrapCSS(sheet))); /* Re-add if we're only changing the site filter. */
this.unregisterAgentSheet(cssUri(wrapCSS(sheet)));
if (sheets.indexOf(sheet) > -1)
sheets.splice(sheets.indexOf(sheet), 1);
}
if (filter) if (filter)
{ {
let sites = sheet.sites.filter(function (f) f != filter); let sites = sheet.sites.filter(function (f) f != filter);
@@ -424,16 +445,17 @@ function Styles(name, store)
* Register a user style sheet at the given URI. * Register a user style sheet at the given URI.
* *
* @param {string} uri The URI of the sheet to register. * @param {string} uri The URI of the sheet to register.
* @param {boolean} agent If true, sheet is registered as an agent sheet.
* @param {boolean} reload Whether to reload any sheets that are * @param {boolean} reload Whether to reload any sheets that are
* already registered. * already registered.
*/ */
this.registerSheet = function (uri, reload) this.registerSheet = function (uri, agent, reload)
{ {
if (reload) if (reload)
this.unregisterSheet(uri); this.unregisterSheet(uri, agent);
uri = ios.newURI(uri, null, null); uri = ios.newURI(uri, null, null);
if (reload || !sss.sheetRegistered(uri, sss.USER_SHEET)) if (reload || !sss.sheetRegistered(uri, agent ? sss.AGENT_SHEET : sss.USER_SHEET))
sss.loadAndRegisterSheet(uri, sss.USER_SHEET); sss.loadAndRegisterSheet(uri, agent ? sss.AGENT_SHEET : sss.USER_SHEET);
}; };
/** /**
@@ -441,53 +463,12 @@ function Styles(name, store)
* *
* @param {string} uri The URI of the sheet to unregister. * @param {string} uri The URI of the sheet to unregister.
*/ */
this.unregisterSheet = function (uri) this.unregisterSheet = function (uri, agent)
{ {
uri = ios.newURI(uri, null, null); uri = ios.newURI(uri, null, null);
if (sss.sheetRegistered(uri, sss.USER_SHEET)) if (sss.sheetRegistered(uri, agent ? sss.AGENT_SHEET : sss.USER_SHEET))
sss.unregisterSheet(uri, sss.USER_SHEET); sss.unregisterSheet(uri, agent ? sss.AGENT_SHEET : sss.USER_SHEET);
}; };
// FIXME
/**
* Register an agent style sheet.
*
* @param {string} uri The URI of the sheet to register.
* @deprecated
*/
this.registerAgentSheet = function (uri)
{
this.unregisterAgentSheet(uri);
uri = ios.newURI(uri, null, null);
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
};
/**
* Unregister an agent style sheet.
*
* @param {string} uri The URI of the sheet to unregister.
* @deprecated
*/
this.unregisterAgentSheet = function (uri)
{
uri = ios.newURI(uri, null, null);
if (sss.sheetRegistered(uri, sss.AGENT_SHEET))
sss.unregisterSheet(uri, sss.AGENT_SHEET);
};
function wrapCSS(sheet)
{
let filter = sheet.sites;
let css = sheet.css;
if (filter[0] == "*")
return namespace + css;
let selectors = filter.map(function (part) (/[*]$/.test(part) ? "url-prefix" :
/[\/:]/.test(part) ? "url"
: "domain")
+ '("' + part.replace(/"/g, "%22").replace(/[*]$/, "") + '")')
.join(", ");
return namespace + "@-moz-document " + selectors + "{\n" + css + "\n}\n";
}
} }
let (array = util.Array) let (array = util.Array)
{ {
@@ -567,12 +548,17 @@ liberator.registerObserver("load_commands", function () {
if (!css) if (!css)
{ {
let list = Array.concat([i for (i in styles.userNames)], let list = Array.concat([i for (i in styles.userNames)],
[i for (i in styles.userSheets) if (!i[1].ref.length)]); [i for (i in styles.userSheets) if (!i[1].name)]);
let str = template.tabular(["", "Filter", "CSS"], let str = template.tabular(["", "Name", "Filter", "CSS"],
["padding: 0 1em 0 1ex; vertical-align: top", "padding: 0 1em 0 0; vertical-align: top"], ["min-width: 1em; text-align: center; color: red; font-weight: bold;",
([k, v[1].join(","), v[2]] "padding: 0 1em 0 1ex; vertical-align: top;",
for ([i, [k, v]] in Iterator(list)) "padding: 0 1em 0 0; vertical-align: top;"],
if ((!filter || v[1].indexOf(filter) >= 0) && (!name || v[0] == name)))); ([sheet.enabled ? "" : "\u00d7",
key,
sheet.sites.join(","),
sheet.css]
for ([i, [key, sheet]] in Iterator(list))
if ((!filter || sheet.sites.indexOf(filter) >= 0) && (!name || sheet.name == name))));
commandline.echo(str, commandline.HL_NORMAL, commandline.FORCE_MULTILINE); commandline.echo(str, commandline.HL_NORMAL, commandline.FORCE_MULTILINE);
} }
else else
@@ -620,18 +606,52 @@ liberator.registerObserver("load_commands", function () {
] ]
}); });
commands.add(["dels[tyle]"], [
"Remove a user style sheet",
function (args)
{ {
styles.removeSheet(false, args["-name"], args[0], args.literalArg, args["-index"]); name: ["stylee[nable]", "stye[nable]"],
desc: "Enable a user style sheet",
action: function (sheet) sheet.enabled = true,
filter: function (sheet) !sheet.enabled
}, },
{
name: ["styled[isable]", "styd[isable]"],
desc: "Disable a user style sheet",
action: function (sheet) sheet.enabled = false,
filter: function (sheet) sheet.enabled
},
{
name: ["stylet[oggle]", "styt[oggle]"],
desc: "Toggle a user style sheet",
action: function (sheet) sheet.enabled = !sheet.enabled
},
{
name: ["dels[tyle]"],
desc: "Remove a user style sheet",
action: function (sheet) styles.removeSheet(sheet)
}
].forEach(function (cmd) {
commands.add(cmd.name, cmd.desc,
function (args)
{
styles.findSheets(false, args["-name"], args[0], args.literalArg, args["-index"])
.forEach(cmd.action);
},
{ {
completer: function (context) { context.completions = styles.sites.map(function (site) [site, ""]); }, completer: function (context) { context.completions = styles.sites.map(function (site) [site, ""]); },
literal: 1, literal: 1,
options: [[["-index", "-i"], commands.OPTION_INT, null, function () [[i, <>{s.sites.join(",")}: {s.css.replace("\n", "\\n")}</>] for ([i, s] in styles.userSheets)]], options: [[["-index", "-i"], commands.OPTION_INT, null,
[["-name", "-n"], commands.OPTION_STRING, null, function () [[k, v.css] for ([k, v] in Iterator(styles.userNames))]]] function (context) {
context.compare = CompletionContext.Sort.number;
return [[i, <>{sheet.sites.join(",")}: {sheet.css.replace("\n", "\\n")}</>]
for ([i, sheet] in styles.userSheets)
if (!cmd.filter || cmd.filter(sheet))]
}],
[["-name", "-n"], commands.OPTION_STRING, null,
function () [[name, sheet.css]
for ([name, sheet] in Iterator(styles.userNames))
if (!cmd.filter || cmd.filter(sheet))]]]
}); });
});
commands.add(["hi[ghlight]"], commands.add(["hi[ghlight]"],
"Set the style of certain display elements", "Set the style of certain display elements",

View File

@@ -287,9 +287,10 @@ var observers = {};
var timers = {}; var timers = {};
var storage = { var storage = {
alwaysReload: [],
newObject: function newObject(key, constructor, store, type, options, reload) newObject: function newObject(key, constructor, store, type, options, reload)
{ {
if (!(key in keys) || reload) if (!(key in keys) || reload || key in this.alwaysReload)
{ {
if (key in this && !reload) if (key in this && !reload)
throw Error; throw Error;

View File

@@ -19,6 +19,7 @@
(this might change again, as this is REALLY inconsistent, and i don't (this might change again, as this is REALLY inconsistent, and i don't
know if I like copying bugs) know if I like copying bugs)
* add [c]:styledisable[c], [c]:styleenable[c], and [c]:styletoggle[c]
* add [c]:sanitize[c], 'sanitizetimespan' and 'sanitizeitems' * add [c]:sanitize[c], 'sanitizetimespan' and 'sanitizeitems'
* add [c]:verbose[c] * add [c]:verbose[c]
* add [c]:window[c] to run a command in a new window * add [c]:window[c] to run a command in a new window

View File

@@ -133,4 +133,25 @@ style for [a]www.google.com,mozilla.org[a], will result in a style for
(short option: *-i*) (short option: *-i*)
________________________________________________________________________________ ________________________________________________________________________________
|:styleenable| |:stylee| +
|:styenable| |:stye| +
||:styled[isable] [-name={name} [-index={index}] [{filter}] [{css}]|| +
________________________________________________________________________________
Enable any matching styles. Arguments are the same as for [c]:delstyle[c].
________________________________________________________________________________
|:styledisable| |:styled| +
|:stydisable| |:styd| +
||:stylee[nable] [-name={name} [-index={index}] [{filter}] [{css}]|| +
________________________________________________________________________________
Disable any matching styles. Arguments are the same as for [c]:delstyle[c].
________________________________________________________________________________
|:styletoggle| |:stylet| +
|:stytoggle| |:styt| +
||:stylet[oggle] [-name={name} [-index={index}] [{filter}] [{css}]|| +
________________________________________________________________________________
Toggle any matching styles. Arguments are the same as for [c]:delstyle[c].
________________________________________________________________________________
// vim: set filetype=asciidoc: // vim: set filetype=asciidoc: