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

Ditch the bloody chrome registry.

This commit is contained in:
Kris Maglione
2011-01-13 16:04:32 -05:00
parent 203730ae62
commit 6fcd00e8ca
15 changed files with 122 additions and 101 deletions

28
common/bootstrap.js vendored
View File

@@ -123,16 +123,9 @@ function init() {
for each (let line in manifest.split("\n")) { for each (let line in manifest.split("\n")) {
let fields = line.split(/\s+/); let fields = line.split(/\s+/);
switch(fields[0]) { switch(fields[0]) {
case "content": case "#":
fields[2] = url(fields[2]); if (fields[1] == "Suffix:")
default: var suffix = fields[1];
result.push(fields);
break;
case "locale":
case "skin":
fields[3] = url(fields[3]);
result.push(fields);
break; break;
case "category": case "category":
@@ -146,10 +139,6 @@ function init() {
break; break;
case "resource": case "resource":
let str = "dactyl-";
if (fields[1].indexOf(str) == 0)
var suffix = fields[1].substr(str.length - 1);
resourceProto.setSubstitution(fields[1], getURI(fields[2])); resourceProto.setSubstitution(fields[1], getURI(fields[2]));
} }
} }
@@ -174,17 +163,6 @@ function init() {
let manifestText = result.map(function (line) line.join(" ")).join("\n"); let manifestText = result.map(function (line) line.join(" ")).join("\n");
if (manifestURI instanceof Ci.nsIFileURL)
manager.autoRegister(manifestURI.QueryInterface(Ci.nsIFileURL).file);
else {
var file = basePath.parent;
file.append(addon.id + ".manifest");
writeFile(file, manifestText);
manager.autoRegister(file);
file.remove(false);
}
require(global, "overlay"); require(global, "overlay");
} }

View File

@@ -22,7 +22,7 @@ var global = this;
var Cc = Components.classes; var Cc = Components.classes;
var Ci = Components.interfaces; var Ci = Components.interfaces;
var Cu = Components.utils; var Cu = Components.utils;
var DNE = "chrome://dactyl/content/does/not/exist"; var DNE = "resource://dactyl/content/does/not/exist";
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
@@ -162,7 +162,7 @@ Dactyl.prototype = {
let path = decodeURIComponent(uri.path.replace(/^\/|#.*/g, "")); let path = decodeURIComponent(uri.path.replace(/^\/|#.*/g, ""));
switch(uri.host) { switch(uri.host) {
case "content": case "content":
return makeChannel(this.pages[path] || "chrome://dactyl/content/" + path, uri); return makeChannel(this.pages[path] || "resource://dactyl-content/" + path, uri);
case "help": case "help":
return makeChannel(this.FILE_MAP[path], uri); return makeChannel(this.FILE_MAP[path], uri);
case "help-overlay": case "help-overlay":
@@ -174,9 +174,9 @@ Dactyl.prototype = {
if (tag in this.HELP_TAGS) if (tag in this.HELP_TAGS)
return redirect("dactyl://help/" + this.HELP_TAGS[tag] + "#" + tag, uri); return redirect("dactyl://help/" + this.HELP_TAGS[tag] + "#" + tag, uri);
case "locale": case "locale":
return makeChannel("chrome://dactyl/locale/" + path, uri); return makeChannel(["resource://dactyl-locale", config.locale, path].join("/"), uri);
case "locale-local": case "locale-local":
return makeChannel("chrome://" + config.name + "/locale/" + path, uri); return makeChannel(["resource://dactyl-local-locale", config.locale, path].join("/"), uri);
} }
} }
catch (e) {} catch (e) {}
@@ -303,7 +303,7 @@ AboutHandler.prototype = {
newChannel: function (uri) { newChannel: function (uri) {
let channel = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService) let channel = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService)
.newChannel("chrome://dactyl/content/about.xul", null, null); .newChannel("resource://dactyl-content/about.xul", null, null);
channel.originalURI = uri; channel.originalURI = uri;
return channel; return channel;
}, },

View File

@@ -34,14 +34,14 @@ var CommandWidgets = Class("CommandWidgets", {
<vbox id={config.commandContainer}> <vbox id={config.commandContainer}>
<vbox class="dactyl-container" id="dactyl-multiline-output-container" hidden="false" collapsed="true"> <vbox class="dactyl-container" id="dactyl-multiline-output-container" hidden="false" collapsed="true">
<iframe id="dactyl-multiline-output" src="chrome://dactyl/content/buffer.xhtml" <iframe id="dactyl-multiline-output" src="resource://dactyl-content/buffer.xhtml"
flex="1" hidden="false" collapsed="false" flex="1" hidden="false" collapsed="false"
contextmenu="dactyl-contextmenu" contextmenu="dactyl-contextmenu"
onclick="dactyl.modules.commandline.onMultilineOutputEvent(event)"/> onclick="dactyl.modules.commandline.onMultilineOutputEvent(event)"/>
</vbox> </vbox>
<vbox class="dactyl-container" hidden="false" collapsed="true"> <vbox class="dactyl-container" hidden="false" collapsed="true">
<iframe class="dactyl-completions" id="dactyl-completions-dactyl-commandline" src="chrome://dactyl/content/buffer.xhtml" <iframe class="dactyl-completions" id="dactyl-completions-dactyl-commandline" src="resource://dactyl-content/buffer.xhtml"
contextmenu="dactyl-contextmenu" contextmenu="dactyl-contextmenu"
flex="1" hidden="false" collapsed="false" flex="1" hidden="false" collapsed="false"
onclick="dactyl.modules.commandline.onMultilineOutputEvent(event)"/> onclick="dactyl.modules.commandline.onMultilineOutputEvent(event)"/>
@@ -75,7 +75,7 @@ var CommandWidgets = Class("CommandWidgets", {
before: <e4x xmlns={XUL} xmlns:dactyl={NS}> before: <e4x xmlns={XUL} xmlns:dactyl={NS}>
<toolbar id={statusline.statusBar.id}> <toolbar id={statusline.statusBar.id}>
<vbox id={"dactyl-completions-" + _status + "commandline-container"} class="dactyl-container" hidden="false" collapsed="true"> <vbox id={"dactyl-completions-" + _status + "commandline-container"} class="dactyl-container" hidden="false" collapsed="true">
<iframe class="dactyl-completions" id={"dactyl-completions-" + _status + "commandline"} src="chrome://dactyl/content/buffer.xhtml" <iframe class="dactyl-completions" id={"dactyl-completions-" + _status + "commandline"} src="resource://dactyl-content/buffer.xhtml"
contextmenu="dactyl-contextmenu" contextmenu="dactyl-contextmenu"
flex="1" hidden="false" collapsed="false" flex="1" hidden="false" collapsed="false"
onclick="dactyl.modules.commandline.onMultilineOutputEvent(event)"/> onclick="dactyl.modules.commandline.onMultilineOutputEvent(event)"/>
@@ -161,12 +161,12 @@ var CommandWidgets = Class("CommandWidgets", {
}); });
let fontSize = util.computedStyle(document.documentElement).fontSize; let fontSize = util.computedStyle(document.documentElement).fontSize;
styles.registerSheet("chrome://dactyl/skin/dactyl.css"); styles.registerSheet("resource://dactyl-skin/dactyl.css");
styles.system.add("font-size", "chrome://dactyl/content/buffer.xhtml", styles.system.add("font-size", "resource://dactyl-content/buffer.xhtml",
"body { font-size: " + fontSize + "; }"); "body { font-size: " + fontSize + "; }");
}, },
cleanup: function cleanup() { cleanup: function cleanup() {
styles.unregisterSheet("chrome://dactyl/skin/dactyl.css"); styles.unregisterSheet("resource://dactyl-skin/dactyl.css");
}, },
addElement: function (obj) { addElement: function (obj) {
const self = this; const self = this;

View File

@@ -594,10 +594,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
if (context && context.INFO instanceof XML) { if (context && context.INFO instanceof XML) {
let info = context.INFO; let info = context.INFO;
if (info.*.@lang.length()) { if (info.*.@lang.length()) {
let langs = set(String(a) for each (a in info.*.@lang)); let lang = config.bestLocale(String(a) for each (a in info.*.@lang));
let lang = [config.language, config.language.replace(/-.*/, ""),
"en", "en-US", info.*.@lang[0]
].filter(function (l) set.has(langs, l))[0];
info.* = info.*.(function::attribute("lang").length() == 0 || @lang == lang); info.* = info.*.(function::attribute("lang").length() == 0 || @lang == lang);
@@ -613,7 +610,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
let help = let help =
'<?xml version="1.0"?>\n' + '<?xml version="1.0"?>\n' +
'<?xml-stylesheet type="text/xsl" href="dactyl://content/help.xsl"?>\n' + '<?xml-stylesheet type="text/xsl" href="dactyl://content/help.xsl"?>\n' +
'<!DOCTYPE document SYSTEM "chrome://dactyl/content/dactyl.dtd">\n' + '<!DOCTYPE document SYSTEM "resource://dactyl-content/dactyl.dtd">\n' +
unescape(encodeURI( // UTF-8 handling hack. unescape(encodeURI( // UTF-8 handling hack.
<document xmlns={NS} <document xmlns={NS}
name="plugins" title={config.appName + " Plugins"}> name="plugins" title={config.appName + " Plugins"}>

View File

@@ -36,7 +36,7 @@ var Tabs = Module("tabs", {
}; };
this.tabBinding = styles.system.add("tab-binding", "chrome://browser/content/browser.xul", String.replace(<><![CDATA[ this.tabBinding = styles.system.add("tab-binding", "chrome://browser/content/browser.xul", String.replace(<><![CDATA[
xul|tab { -moz-binding: url(chrome://dactyl/content/bindings.xml#tab) !important; } xul|tab { -moz-binding: url(resource://dactyl-content/bindings.xml#tab) !important; }
]]></>, /tab-./g, function (m) util.OS.isMacOSX ? "tab-mac" : m), ]]></>, /tab-./g, function (m) util.OS.isMacOSX ? "tab-mac" : m),
false, true); false, true);
}, },

View File

@@ -52,15 +52,21 @@ if (!JSMLoader || JSMLoader.bump != 1)
.getService(Components.interfaces.mozIJSSubScriptLoader) .getService(Components.interfaces.mozIJSSubScriptLoader)
.loadSubScript(url, global.global || global); .loadSubScript(url, global.global || global);
} }
let global = Components.utils.import(url, target); try {
let global = Components.utils.import(url, target);
if (name == "base.jsm") { if (name == "base.jsm") {
global.JSMLoader = this; global.JSMLoader = this;
Components.utils.import(url, this.global); Components.utils.import(url, this.global);
this.global.EXPORTED_SYMBOLS = global.EXPORTED_SYMBOLS; this.global.EXPORTED_SYMBOLS = global.EXPORTED_SYMBOLS;
}
return this.globals[url] = global;
}
catch (e) {
dump("Importing " + url + ": " + e + "\n" + (e.stack || Error().stack));
throw e;
} }
return this.globals[url] = global;
}, },
cleanup: function unregister() { cleanup: function unregister() {
for each (let factory in this.factories.splice(0)) for each (let factory in this.factories.splice(0))

View File

@@ -55,7 +55,50 @@ var ConfigBase = Class("ConfigBase", {
return addon; return addon;
}), }),
language: Class.memoize(function () services.chromeRegistry.getSelectedLocale("dactyl")), /**
* The current application locale.
*/
appLocale: Class.memoize(function () services.chromeRegistry.getSelectedLocale("global")),
/**
* The current dactyl locale.
*/
locale: Class.memoize(function () this.bestLocale(this.locales)),
/**
* The current application locale.
*/
locales: Class.memoize(function () {
// TODO: Merge with completion.file code.
function getDir(str) str.match(/^(?:.*[\/\\])?/)[0];
let uri = "resource://dactyl-locale/";
let jar = io.isJarURL(uri);
if (jar) {
let prefix = getDir(jar.JAREntry);
return iter(s.slice(prefix.length).replace(/\/.*/, "") for (s in io.listJar(jar.JARFile, prefix)))
.uniq().toArray();
}
else {
return array(f.leafName
for (f in util.getFile(uri).iterDirectory())
if (f.isDirectory())).array;
}
}),
/**
* Returns the best locale match to the current locale from a list
* of available locales.
*
* @param {[string]} list A list of available locales
* @returns {string}
*/
bestLocale: function (list) {
let langs = set(list);
return values([this.appLocale, this.appLocale.replace(/-.*/, ""),
"en", "en-US", iter(langs).next()])
.nth(function (l) set.has(langs, l), 0);
},
/** @property {string} The Dactyl version string. */ /** @property {string} The Dactyl version string. */
version: Class.memoize(function () { version: Class.memoize(function () {
@@ -593,14 +636,14 @@ var ConfigBase = Class("ConfigBase", {
]]></>) ]]></>)
}); });
services.subscriptLoader.loadSubScript("chrome://dactyl/content/config.js", this); services.subscriptLoader.loadSubScript("resource://dactyl-local-content/config.js", this);
config.INIT = update(Object.create(config.INIT), config.INIT, { config.INIT = update(Object.create(config.INIT), config.INIT, {
init: function init(dactyl, modules, window) { init: function init(dactyl, modules, window) {
init.superapply(this, arguments); init.superapply(this, arguments);
let img = window.Image(); let img = window.Image();
img.src = this.logo || "chrome://" + this.name + "/content/logo.png"; img.src = this.logo || "chrome://dactyl-local-content/logo.png";
img.onload = function () { img.onload = function () {
highlight.loadCSS(<>{"!Logo {"} highlight.loadCSS(<>{"!Logo {"}
display: inline-block; display: inline-block;

View File

@@ -43,7 +43,7 @@ Highlight.defaultValue("selector", function () highlight.selector(this.class));
Highlight.defaultValue("sites", function () Highlight.defaultValue("sites", function ()
this.base ? this.base.sites this.base ? this.base.sites
: ["chrome://dactyl/*", "dactyl:*", "file://*"].concat( : ["resource://dactyl*", "dactyl:*", "file://*"].concat(
highlight.styleableChrome)); highlight.styleableChrome));
Highlight.defaultValue("style", function () Highlight.defaultValue("style", function ()

View File

@@ -296,7 +296,7 @@ var IO = Module("io", {
return File(file); return File(file);
}, },
isJarURL: function (url) { isJarURL: function isJarURL(url) {
try { try {
let uri = util.newURI(url); let uri = util.newURI(url);
let channel = services.io.newChannelFromURI(uri); let channel = services.io.newChannelFromURI(uri);
@@ -308,6 +308,22 @@ var IO = Module("io", {
return false; return false;
}, },
listJar: function listJar(file, path) {
file = util.getFile(file);
if (file) {
// let jar = services.zipReader.getZip(file); Crashes.
let jar = services.ZipReader(file);
try {
for (let entry in jar.findEntries("*"))
if (filter.test(s))
yield entry;
}
finally {
jar.close();
}
}
},
readHeredoc: function (end) { readHeredoc: function (end) {
return ""; return "";
}, },
@@ -869,25 +885,12 @@ unlet s:cpo_save
let uri = io.isJarURL(dir); let uri = io.isJarURL(dir);
if (uri) if (uri)
context.generate = function generate_jar() { context.generate = function generate_jar() {
let file = util.getFile(uri.JARFile); return [
if (file) { {
// let jar = services.zipReader.getZip(file); Crashes. isDirectory: function () s.substr(-1) == "/",
let jar = services.ZipReader(file); leafName: /([^\/]*)\/?$/.exec(s)[1]
try {
let filter = RegExp("^" + util.regexp.escape(decodeURI(getDir(uri.JAREntry)))
+ "[^/]*/?$");
return [
{
isDirectory: function () s.substr(-1) == "/",
leafName: /([^\/]*)\/?$/.exec(s)[1]
}
for (s in iter(jar.findEntries("*"))) if (filter.test(s))
]
} }
finally { for (s in io.listJar(getDir(uri.JARFile, uri.JAREntry)))]
jar.close();
}
}
}; };
else else
context.generate = function generate_file() { context.generate = function generate_file() {

View File

@@ -84,7 +84,7 @@ var Overlay = Module("Overlay", {
Module.list = []; Module.list = [];
Module.constructors = {}; Module.constructors = {};
const BASE = "chrome://dactyl/content/"; const BASE = "resource://dactyl-content/";
const create = window.Object.create || (function () { const create = window.Object.create || (function () {
window.__dactyl_eval_string = "(function (proto) ({ __proto__: proto }))"; window.__dactyl_eval_string = "(function (proto) ({ __proto__: proto }))";
@@ -143,7 +143,7 @@ var Overlay = Module("Overlay", {
modules.modules = modules; modules.modules = modules;
window.dactyl = { modules: modules }; window.dactyl = { modules: modules };
let prefix = [BASE]; let prefix = [BASE, "resource://dactyl-local-content/"];
defineModule.time("load", null, function _load() { defineModule.time("load", null, function _load() {
["base", ["base",
@@ -156,7 +156,6 @@ var Overlay = Module("Overlay", {
"storage", "storage",
"util" "util"
].forEach(function (name) require(jsmodules, name)); ].forEach(function (name) require(jsmodules, name));
prefix.unshift("chrome://" + config.name + "/content/");
["dactyl", ["dactyl",
"modes", "modes",

View File

@@ -1,7 +1,9 @@
BEGIN { BEGIN {
chrome = "chrome" chrome = "chrome"
if (suffix) if (suffix) {
chrome = suffix chrome = suffix
print "# Suffix: " suffix
}
} }
{ content = $1 ~ /^(content|skin|locale|resource)$/ } { content = $1 ~ /^(content|skin|locale|resource)$/ }
content && $NF ~ /^[a-z]/ { $NF = "/" name "/" $NF } content && $NF ~ /^[a-z]/ { $NF = "/" name "/" $NF }

View File

@@ -4,11 +4,11 @@
/* Applied to all content */ /* Applied to all content */
[dactyl|activeframe] { [dactyl|activeframe] {
-moz-binding: url(chrome://dactyl/content/bindings.xml#frame) !important; -moz-binding: url(resource://dactyl-content/bindings.xml#frame) !important;
} }
[dactyl|highlight~=hints] { [dactyl|highlight~=hints] {
-moz-binding: url(chrome://dactyl/content/bindings.xml#hints) !important; -moz-binding: url(resource://dactyl-content/bindings.xml#hints) !important;
} }
[dactyl|highlight~=HintImage], [dactyl|highlight~=HintImage],
@@ -21,14 +21,14 @@
url-prefix(dactyl:) { url-prefix(dactyl:) {
[dactyl|highlight~=HelpDefault] { [dactyl|highlight~=HelpDefault] {
-moz-binding: url(chrome://dactyl/content/bindings.xml#compitem-td); -moz-binding: url(resource://dactyl-content/bindings.xml#compitem-td);
} }
} }
/* Applied only to completion buffer and MOW */ /* Applied only to completion buffer and MOW */
@-moz-document @-moz-document
url-prefix(chrome://dactyl/) { url-prefix(resource://dactyl) {
*:-moz-loading, *:-moz-broken { display: none !important; } *:-moz-loading, *:-moz-broken { display: none !important; }
@@ -45,7 +45,7 @@
} }
[dactyl|highlight~=CompItem] > *, [dactyl|highlight~=CompItem] > *,
[dactyl|highlight~=CompTitle] > * { [dactyl|highlight~=CompTitle] > * {
-moz-binding: url(chrome://dactyl/content/bindings.xml#compitem-td); -moz-binding: url(resource://dactyl-content/bindings.xml#compitem-td);
display: table-cell; display: table-cell;
vertical-align: middle; vertical-align: middle;
} }
@@ -75,7 +75,7 @@
} }
@-moz-document @-moz-document
url-prefix(chrome://dactyl/) { url-prefix(resource://dactyl) {
*:-moz-any-link:hover { *:-moz-any-link:hover {
text-decoration: underline; text-decoration: underline;
@@ -84,7 +84,8 @@
/* Applied to completion buffer, MOW, browser window */ /* Applied to completion buffer, MOW, browser window */
@-moz-document @-moz-document
url-prefix(chrome://) { url-prefix(chrome://),
url-prefix(resource://) {
#TabsToolbar .tab-icon-image, .tab-throbber { -moz-box-ordinal-group: 10; } #TabsToolbar .tab-icon-image, .tab-throbber { -moz-box-ordinal-group: 10; }
[dactyl|highlight~=tab-number] { -moz-box-ordinal-group: 20; } [dactyl|highlight~=tab-number] { -moz-box-ordinal-group: 20; }

View File

@@ -6,11 +6,6 @@ ARCHITECTURE:
on the website - is there even a documentation tool that can parse our source on the website - is there even a documentation tool that can parse our source
sensibly? sensibly?
There are a few that can, to some extent. We more or less follow the
ScriptDoc standard, and we're very close to a few other standards.
Unfortunately, nearly all of the parsers are lacking in some way, bloated to
hell, and/or lack support for JS 1.8. --Kris
- unify the disgusting hodge podge of contract specification styles - unify the disgusting hodge podge of contract specification styles
REFACTORING: REFACTORING:
@@ -21,7 +16,6 @@ BUGS:
- :sidebar improvements (:sidebar! Downloads while downloads is open should refocus the sidebar) - :sidebar improvements (:sidebar! Downloads while downloads is open should refocus the sidebar)
- ;s saves the page rather than the image - ;s saves the page rather than the image
- RC file is sourced once per window - RC file is sourced once per window
- :undo seems to be affected by the tabstrip state
- the :help version-information page is no longer generated - the :help version-information page is no longer generated
FEATURES: FEATURES:

View File

@@ -1,15 +1,12 @@
# Firefox # Firefox
content pentadactyl content/ resource dactyl-local-content content/
skin pentadactyl classic/1.0 skin/ resource dactyl-local-skin skin/
locale pentadactyl en-US locale/en-US/ resource dactyl-local-locale locale/
locale dactyl en-US ../common/locale/en-US/
content dactyl ../common/content/
resource dactyl ../common/modules/ resource dactyl ../common/modules/
skin dactyl classic/1.0 ../common/skin/ resource dactyl-content ../common/content/
resource dactyl-skin ../common/skin/
override chrome://dactyl/content/dactyl.dtd chrome://pentadactyl/content/dactyl.dtd resource dactyl-locale ../common/locale/
override chrome://dactyl/content/config.js chrome://pentadactyl/content/config.js
component {16dc34f7-6d22-4aa4-a67f-2921fb5dcb69} components/commandline-handler.js component {16dc34f7-6d22-4aa4-a67f-2921fb5dcb69} components/commandline-handler.js
contract @mozilla.org/commandlinehandler/general-startup;1?type=dactyl {16dc34f7-6d22-4aa4-a67f-2921fb5dcb69} contract @mozilla.org/commandlinehandler/general-startup;1?type=dactyl {16dc34f7-6d22-4aa4-a67f-2921fb5dcb69}

View File

@@ -7,11 +7,12 @@
em:version="1.0b5pre" em:version="1.0b5pre"
em:description="Firefox for Vim and Links addicts" em:description="Firefox for Vim and Links addicts"
em:homepageURL="http://dactyl.sourceforge.net/pentadactyl" em:homepageURL="http://dactyl.sourceforge.net/pentadactyl"
em:iconURL="chrome://pentadactyl/skin/icon.png" em:iconURL="resource://dactyl-local-skin/icon.png"
em:optionsURL="chrome://dactyl/content/preferences.xul"
em:bootstrap="true"> em:bootstrap="true">
<em:creator>Kris Maglione, Doug Kearns</em:creator> <em:creator>Kris Maglione, Doug Kearns</em:creator>
<em:developer>Kris Maglione</em:developer>
<em:developer>Doug Kearns</em:developer>
<em:developer>Štěpán Němec</em:developer> <em:developer>Štěpán Němec</em:developer>
<em:contributor>anekos</em:contributor> <em:contributor>anekos</em:contributor>
@@ -30,7 +31,7 @@
<Description <Description
em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}" em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
em:minVersion="3.5" em:minVersion="3.5"
em:maxVersion="4.0b9pre"/> em:maxVersion="4.0"/>
</em:targetApplication> </em:targetApplication>
</Description> </Description>
</RDF> </RDF>