1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-22 23:28:15 +01:00

Lazy load help files. Store command names in a map.

--HG--
branch : testing
This commit is contained in:
Kris Maglione
2010-06-10 01:16:36 -04:00
parent a6f90714e4
commit a14e5127df
3 changed files with 86 additions and 73 deletions

View File

@@ -73,9 +73,9 @@ const Command = Class("Command", {
modifiers = modifiers || {}; modifiers = modifiers || {};
let self = this; let self = this;
function exec(args) { function exec(command) {
// FIXME: Move to parseCommand? // FIXME: Move to parseCommand?
args = self.parseArgs(args); args = self.parseArgs(command);
if (!args) if (!args)
return; return;
args.count = count; args.count = count;
@@ -237,6 +237,7 @@ const ArgType = Struct("description", "parse");
const Commands = Module("commands", { const Commands = Module("commands", {
init: function () { init: function () {
this._exCommands = []; this._exCommands = [];
this._exMap = {};
}, },
// FIXME: remove later, when our option handler is better // FIXME: remove later, when our option handler is better
@@ -304,7 +305,7 @@ const Commands = Module("commands", {
repeat: null, repeat: null,
_addCommand: function (command, replace) { _addCommand: function (command, replace) {
if (this._exCommands.some(function (c) c.hasName(command.name))) { if (command.name in this._exMap) {
if (command.user && replace) if (command.user && replace)
commands.removeUserCommand(command.name); commands.removeUserCommand(command.name);
else { else {
@@ -314,6 +315,8 @@ const Commands = Module("commands", {
} }
this._exCommands.push(command); this._exCommands.push(command);
for(let [,name] in Iterator(command.names))
this._exMap[name] = command;
return true; return true;
}, },
@@ -387,7 +390,7 @@ const Commands = Module("commands", {
* @returns {Command} * @returns {Command}
*/ */
get: function (name) { get: function (name) {
return this._exCommands.filter(function (cmd) cmd.hasName(name))[0] || null; return this._exMap[name] || this._exCommands.filter(function (cmd) cmd.hasName(name))[0] || null;
}, },
/** /**
@@ -762,6 +765,10 @@ const Commands = Module("commands", {
* any of the command's names. * any of the command's names.
*/ */
removeUserCommand: function (name) { removeUserCommand: function (name) {
for(let [,cmd] in Iterator(this._exCommands))
if(cmd.user && cmd.hasName(name))
for(let [,name] in Iterator(cmd.names))
delete this._exMap[name];
this._exCommands = this._exCommands.filter(function (cmd) !(cmd.user && cmd.hasName(name))); this._exCommands = this._exCommands.filter(function (cmd) !(cmd.user && cmd.hasName(name)));
}, },

View File

@@ -597,6 +597,8 @@ lookup:
*/ */
source: function (filename, silent) { source: function (filename, silent) {
let wasSourcing = this.sourcing; let wasSourcing = this.sourcing;
liberator.dump("sourcing " + filename);
let time = Date.now();
try { try {
var file = File(filename); var file = File(filename);
this.sourcing = { this.sourcing = {
@@ -715,6 +717,7 @@ lookup:
liberator.echoerr(message); liberator.echoerr(message);
} }
finally { finally {
liberator.dump("done sourcing " + filename + ": " + (Date.now() - time) + "ms");
this.sourcing = wasSourcing; this.sourcing = wasSourcing;
} }
}, },

View File

@@ -544,85 +544,88 @@ const Liberator = Module("liberator", {
* Initialize the help system. * Initialize the help system.
*/ */
initHelp: function () { initHelp: function () {
let namespaces = [config.name.toLowerCase(), "liberator"]; if(!this.helpInitialized) {
services.get("liberator:").init({}); let namespaces = [config.name.toLowerCase(), "liberator"];
services.get("liberator:").init({});
let tagMap = services.get("liberator:").HELP_TAGS; let tagMap = services.get("liberator:").HELP_TAGS;
let fileMap = services.get("liberator:").FILE_MAP; let fileMap = services.get("liberator:").FILE_MAP;
let overlayMap = services.get("liberator:").OVERLAY_MAP; let overlayMap = services.get("liberator:").OVERLAY_MAP;
// Left as an XPCOM instantiation so it can easilly be moved // Left as an XPCOM instantiation so it can easilly be moved
// into XPCOM code. // into XPCOM code.
function XSLTProcessor(sheet) { function XSLTProcessor(sheet) {
let xslt = Cc["@mozilla.org/document-transformer;1?type=xslt"].createInstance(Ci.nsIXSLTProcessor); let xslt = Cc["@mozilla.org/document-transformer;1?type=xslt"].createInstance(Ci.nsIXSLTProcessor);
xslt.importStylesheet(util.httpGet(sheet).responseXML); xslt.importStylesheet(util.httpGet(sheet).responseXML);
return xslt; return xslt;
}
// Find help and overlay files with the given name.
function findHelpFile(file) {
let result = [];
for (let [, namespace] in Iterator(namespaces)) {
let url = ["chrome://", namespace, "/locale/", file, ".xml"].join("");
let res = util.httpGet(url);
if (res) {
if (res.responseXML.documentElement.localName == "document")
fileMap[file] = url;
if (res.responseXML.documentElement.localName == "overlay")
overlayMap[file] = url;
result.push(res.responseXML);
}
} }
return result;
}
// Find the tags in the document.
function addTags(file, doc) {
doc = XSLT.transformToDocument(doc);
for (let elem in util.evaluateXPath("//xhtml:a/@id", doc))
tagMap[elem.value] = file;
}
const XSLT = XSLTProcessor("chrome://liberator/content/help-single.xsl"); // Find help and overlay files with the given name.
function findHelpFile(file) {
let result = [];
for (let [, namespace] in Iterator(namespaces)) {
let url = ["chrome://", namespace, "/locale/", file, ".xml"].join("");
let res = util.httpGet(url);
if (res) {
if (res.responseXML.documentElement.localName == "document")
fileMap[file] = url;
if (res.responseXML.documentElement.localName == "overlay")
overlayMap[file] = url;
result.push(res.responseXML);
}
}
return result;
}
// Find the tags in the document.
function addTags(file, doc) {
doc = XSLT.transformToDocument(doc);
for (let elem in util.evaluateXPath("//xhtml:a/@id", doc))
tagMap[elem.value] = file;
}
// Scrape the list of help files from all.xml const XSLT = XSLTProcessor("chrome://liberator/content/help-single.xsl");
// Always process main and overlay files, since XSLTProcessor and
// XMLHttpRequest don't allow access to chrome documents.
tagMap.all = "all";
let files = findHelpFile("all").map(function (doc)
[f.value for (f in util.evaluateXPath(
"//liberator:include/@href", doc))]);
// Scrape the tags from the rest of the help files. // Scrape the list of help files from all.xml
util.Array.flatten(files).forEach(function (file) { // Always process main and overlay files, since XSLTProcessor and
findHelpFile(file).forEach(function (doc) { // XMLHttpRequest don't allow access to chrome documents.
addTags(file, doc); tagMap.all = "all";
let files = findHelpFile("all").map(function (doc)
[f.value for (f in util.evaluateXPath(
"//liberator:include/@href", doc))]);
// Scrape the tags from the rest of the help files.
util.Array.flatten(files).forEach(function (file) {
findHelpFile(file).forEach(function (doc) {
addTags(file, doc);
});
}); });
});
// Process plugin help entries. // Process plugin help entries.
XML.ignoreWhiteSpace = false; XML.ignoreWhiteSpace = false;
XML.prettyPrinting = false; XML.prettyPrinting = false;
XML.prettyPrinting = true; // Should be false, but ignoreWhiteSpace=false doesn't work correctly. This is the lesser evil. XML.prettyPrinting = true; // Should be false, but ignoreWhiteSpace=false doesn't work correctly. This is the lesser evil.
XML.prettyIndent = 4; XML.prettyIndent = 4;
let body = XML(); let body = XML();
for (let [, context] in Iterator(plugins.contexts)) for (let [, context] in Iterator(plugins.contexts))
if (context.INFO instanceof XML) if (context.INFO instanceof XML)
body += <h2 xmlns={NS.uri} tag={context.INFO.@name + '-plugin'}>{context.INFO.@summary}</h2> + body += <h2 xmlns={NS.uri} tag={context.INFO.@name + '-plugin'}>{context.INFO.@summary}</h2> +
context.INFO; context.INFO;
let help = '<?xml version="1.0"?>\n' + let help = '<?xml version="1.0"?>\n' +
'<?xml-stylesheet type="text/xsl" href="chrome://liberator/content/help.xsl"?>\n' + '<?xml-stylesheet type="text/xsl" href="chrome://liberator/content/help.xsl"?>\n' +
'<!DOCTYPE document SYSTEM "chrome://liberator/content/liberator.dtd">' + '<!DOCTYPE document SYSTEM "chrome://liberator/content/liberator.dtd">' +
<document xmlns={NS} <document xmlns={NS}
name="plugins" title={config.name + " Plugins"}> name="plugins" title={config.name + " Plugins"}>
<h1 tag="using-plugins">Using Plugins</h1> <h1 tag="using-plugins">Using Plugins</h1>
{body} {body}
</document>.toXMLString(); </document>.toXMLString();
fileMap["plugins"] = function () ['text/xml;charset=UTF-8', help]; fileMap["plugins"] = function () ['text/xml;charset=UTF-8', help];
addTags("plugins", util.httpGet("liberator://help/plugins").responseXML); addTags("plugins", util.httpGet("liberator://help/plugins").responseXML);
this.helpInitialized = true;
}
}, },
/** /**
@@ -634,6 +637,7 @@ const Liberator = Module("liberator", {
* @returns {string} * @returns {string}
*/ */
help: function (topic, unchunked) { help: function (topic, unchunked) {
liberator.initHelp();
if (!topic) { if (!topic) {
let helpFile = unchunked ? "all" : options["helpfile"]; let helpFile = unchunked ? "all" : options["helpfile"];
if (helpFile in services.get("liberator:").FILE_MAP) if (helpFile in services.get("liberator:").FILE_MAP)
@@ -1717,6 +1721,7 @@ const Liberator = Module("liberator", {
}; };
completion.help = function help(context, unchunked) { completion.help = function help(context, unchunked) {
liberator.initHelp();
context.title = ["Help"]; context.title = ["Help"];
context.anchored = false; context.anchored = false;
context.completions = services.get("liberator:").HELP_TAGS; context.completions = services.get("liberator:").HELP_TAGS;
@@ -1820,8 +1825,6 @@ const Liberator = Module("liberator", {
if (options["loadplugins"]) if (options["loadplugins"])
liberator.loadPlugins(); liberator.loadPlugins();
liberator.initHelp();
// after sourcing the initialization files, this function will set // after sourcing the initialization files, this function will set
// all gui options to their default values, if they have not been // all gui options to their default values, if they have not been
// set before by any RC file // set before by any RC file