diff options
author | Kris Maglione <kris@vimperator.org> | 2009-10-24 16:49:21 -0400 |
---|---|---|
committer | Kris Maglione <kris@vimperator.org> | 2009-10-24 16:49:21 -0400 |
commit | 2c1f7316a6d3ddb95d399b28dd35b3a377729fae (patch) | |
tree | c67f2def4ac97ef052f644763cd773c5d0d26913 /common | |
parent | 8b222085ec42fbebf8ac21ffbe23548ee7ecd37d (diff) | |
download | pentadactyl-2c1f7316a6d3ddb95d399b28dd35b3a377729fae.tar.gz |
Add machinery to allow app-specific help files.
--HG--
branch : xslt
Diffstat (limited to 'common')
-rw-r--r-- | common/components/chrome-data.js | 44 | ||||
-rw-r--r-- | common/content/help.xsl | 8 | ||||
-rw-r--r-- | common/content/liberator.js | 1 |
3 files changed, 43 insertions, 10 deletions
diff --git a/common/components/chrome-data.js b/common/components/chrome-data.js index a52875e3..01b66bff 100644 --- a/common/components/chrome-data.js +++ b/common/components/chrome-data.js @@ -94,6 +94,11 @@ function Liberator() { this.wrappedJSObject = this; + this.__defineGetter__("helpNamespaces", function () NAMESPACES ? NAMESPACES.slice() : null); + this.__defineSetter__("helpNamespaces", function (namespaces) { + if (!NAMESPACES) + NAMESPACES = Array.slice(namespaces) + }); this.__defineGetter__("helpFiles", function () HELP_FILES ? HELP_FILES.slice() : null); this.__defineSetter__("helpFiles", function (files) { if (!HELP_FILES) @@ -124,8 +129,10 @@ function Liberator() catch (e) {} } - const HELP_TAGS = {}; - this.HELP_TAGS = HELP_TAGS; + const self = this; + this.HELP_TAGS = {}; + this.FILE_MAP = {}; + var NAMESPACES = null; var HELP_FILES = null; function parseHelpTags(files) @@ -134,12 +141,26 @@ function Liberator() XSLT.importStylesheet(httpGet("chrome://liberator/content/help.xsl").responseXML); for each (let file in files) { - let res = httpGet("liberator://help/" + file); - if (res) + try + { + for each (let namespace in NAMESPACES) + { + let url = ["chrome://", namespace, "/locale/", file, ".xml"].join(""); + let res = httpGet(url); + if (res && res.responseXML.documentElement.localName == "document") + { + self.FILE_MAP[file] = url; + let doc = XSLT.transformToDocument(res.responseXML); + for (let elem in xpath(doc, "//liberator:tag/text()")) + self.HELP_TAGS[elem.textContent] = file; + break; + } + } + } + catch (e) { - let doc = XSLT.transformToDocument(res.responseXML); - for (let elem in xpath(doc, "//liberator:tag/text()")) - HELP_TAGS[elem.textContent] = file; + Components.utils.reportError(e); + dump(e); } } HELP_FILES = Array.slice(files); @@ -184,14 +205,19 @@ Liberator.prototype = { switch(uri.host) { case "help": - return makeChannel("chrome://liberator/locale" + uri.path.replace(/#.*/, "") + ".xml", uri); + let url = this.FILE_MAP[uri.path.replace(/^\/|#.*/g, "")]; + dump("name: " + uri.path.replace(/#.*/, "") + "\n"); + dump("uri: " + url + "\n"); + if (!url) + break; + return makeChannel(url, uri); case "help-tag": let tag = uri.path.substr(1); if (tag in this.HELP_TAGS) return redirect("liberator://help/" + this.HELP_TAGS[tag] + "#" + tag, uri); } } - catch (e) { dump(e + "\n"); dump(e.stack); } + catch (e) {} return fakeChannel(uri); } }; diff --git a/common/content/help.xsl b/common/content/help.xsl index 7736d18c..ecca718b 100644 --- a/common/content/help.xsl +++ b/common/content/help.xsl @@ -11,7 +11,7 @@ <xsl:output method="xml"/> <xsl:variable name="local" select="concat('chrome://&liberator.name;/locale/', /liberator:document/@name, '.xml')"/> - <xsl:variable name="localdoc" select="document($local)/liberator:document"/> + <xsl:variable name="localdoc" select="document($local)/liberator:overlay"/> <xsl:template match="liberator:document"> <html:html liberator:highlight="Help"> @@ -156,6 +156,12 @@ </xsl:for-each> </xsl:template> + <xsl:template match="liberator:document/liberator:tags|liberator:document/liberator:tag"> + <xsl:call-template name="splice-locals"> + <xsl:with-param name="tag" select="substring-before(concat(., ' '), ' ')"/> + <xsl:with-param name="elem" select="self::node()"/> + </xsl:call-template> + </xsl:template> <xsl:template match="liberator:document/*[liberator:tags]"> <xsl:call-template name="splice-locals"> <xsl:with-param name="tag" select="substring-before(concat(liberator:tags, ' '), ' ')"/> diff --git a/common/content/liberator.js b/common/content/liberator.js index def9fd12..5f004568 100644 --- a/common/content/liberator.js +++ b/common/content/liberator.js @@ -1724,6 +1724,7 @@ const liberator = (function () //{{{ let start = Date.now(); liberator.log("Initializing liberator object...", 0); + services.get("liberator:").helpNamespaces = [config.name.toLowerCase(), "liberator"]; services.get("liberator:").helpFiles = config.helpFiles.map(function (f) f.replace(/\..*/, "")); config.features.push(getPlatformFeature()); |