summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorKris Maglione <kris@vimperator.org>2009-10-24 16:49:21 -0400
committerKris Maglione <kris@vimperator.org>2009-10-24 16:49:21 -0400
commit2c1f7316a6d3ddb95d399b28dd35b3a377729fae (patch)
treec67f2def4ac97ef052f644763cd773c5d0d26913 /common
parent8b222085ec42fbebf8ac21ffbe23548ee7ecd37d (diff)
downloadpentadactyl-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.js44
-rw-r--r--common/content/help.xsl8
-rw-r--r--common/content/liberator.js1
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());