summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorKris Maglione <maglione.k@gmail.com>2010-12-03 16:55:00 -0500
committerKris Maglione <maglione.k@gmail.com>2010-12-03 16:55:00 -0500
commitf63b13d431185ba9684571ec04cfa6ac022db4a7 (patch)
tree822895e31321de7497d4b85a9e9e8c4ff184e569 /common
parent3886a82f477e1aafb02064132f90dd1f7c7b55b7 (diff)
downloadpentadactyl-f63b13d431185ba9684571ec04cfa6ac022db4a7.tar.gz
Profide default leaf names in :write for people who can't be bothered to think up their own.
--HG-- extra : rebase_source : 6bfef2eff2a7319af53fa9610fd8f16d5513e221
Diffstat (limited to 'common')
-rw-r--r--common/content/buffer.js23
-rw-r--r--common/locale/en-US/browsing.xml9
-rw-r--r--common/locale/en-US/developer.xml4
-rw-r--r--common/locale/en-US/options.xml6
-rw-r--r--common/modules/base.jsm4
-rw-r--r--common/modules/services.jsm1
-rw-r--r--common/modules/storage.jsm23
-rw-r--r--common/modules/util.jsm4
8 files changed, 47 insertions, 27 deletions
diff --git a/common/content/buffer.js b/common/content/buffer.js
index a8ba504d..2a00661a 100644
--- a/common/content/buffer.js
+++ b/common/content/buffer.js
@@ -147,6 +147,14 @@ const Buffer = Module("buffer", {
destroy: function () {
},
+ getDefaultNames: function getDefaultNames(doc) {
+ let ext = services.mime.getPrimaryExtension(doc.contentType, doc.location.href.replace(/.*\./, ""));
+ return [[doc.title, "Page Name"], [doc.location.pathname.replace(/.*\//, ""), "File Name"]]
+ .filter(function ([leaf, title]) leaf)
+ .map(function ([leaf, title]) [leaf.replace(util.OS.illegalCharacters, encodeURIComponent)
+ .replace(RegExp("(\\." + ext + ")?$"), "." + ext), title]);
+ },
+
_triggerLoadAutocmd: function _triggerLoadAutocmd(name, doc) {
let args = {
url: doc.location.href,
@@ -1307,10 +1315,12 @@ const Buffer = Module("buffer", {
});
}
- let file = io.File(filename);
+ let file = io.File(filename.replace(RegExp(File.PATH_SEP + "*$"), ""));
+
+ if (filename.substr(-1) === File.PATH_SEP || file.exists() && file.isDirectory())
+ file.append(buffer.getDefaultNames(doc)[0][0]);
- dactyl.assert(!file.exists() || args.bang,
- "E13: File exists (add ! to override)");
+ dactyl.assert(args.bang || !file.exists(), "E13: File exists (add ! to override)");
chosenData = { file: file, uri: window.makeURI(doc.location.href, doc.characterSet) };
}
@@ -1340,7 +1350,12 @@ const Buffer = Module("buffer", {
return;
if (/^>>/.test(context.filter))
context.advance(/^>>\s*/.exec(context.filter)[0].length);
- return completion.file(context);
+
+ context.fork("generated", context.filter.replace(/[^/]*$/, "").length,
+ this, function (context) {
+ context.completions = buffer.getDefaultNames(content.document);
+ });
+ return context.fork("files", 0, completion, "file");
},
literal: 0
});
diff --git a/common/locale/en-US/browsing.xml b/common/locale/en-US/browsing.xml
index 5440e153..2fa669ff 100644
--- a/common/locale/en-US/browsing.xml
+++ b/common/locale/en-US/browsing.xml
@@ -407,10 +407,11 @@ want to bypass &dactyl.appName;'s key handling and pass keys directly to
<spec>:sav<oa>eas</oa><oa>!</oa> <oa>file</oa></spec>
<description>
<p>
- Save current web page to disk. If <oa>file</oa> is
- omitted, save to the page's default filename. Existing
- documents will only be overwritten if <oa>!</oa> is
- given.
+ Save current web page to disk. If <oa>file</oa> is omitted, save to
+ the page's default filename. If <oa>file</oa> is a directory or ends
+ with your platform's path separator, save to the page's default
+ filename in that directory. Existing documents will only be
+ overwritten if <oa>!</oa> is given.
</p>
</description>
</item>
diff --git a/common/locale/en-US/developer.xml b/common/locale/en-US/developer.xml
index f7d16d8a..18d922b9 100644
--- a/common/locale/en-US/developer.xml
+++ b/common/locale/en-US/developer.xml
@@ -195,7 +195,7 @@ XML.prettyPrinting = <hl key="Boolean">false</hl>;
<hl key="HelpXMLAttribute">xmlns</hl>{NS}></hl></escape>
<author email="maglione.k@gmail.com">Kris Maglione</author>
<license href="http://opensource.org/licenses/mit-license.php">MIT</license>
- <project name="Pentadactyl" minVersion="1.0"/>
+ <project name="Pentadactyl" min-version="1.0"/>
<p>
This plugin provides the same features as the ever popular FlashBlock
Firefox addon. Flash animations are substituted with place holders which
@@ -204,7 +204,7 @@ XML.prettyPrinting = <hl key="Boolean">false</hl>;
triggers to toggle the playing of animation on the current page.
</p>
<item>
- <tags>'flashblock' 'fb'</tags>
+ <tags>'fb' 'flashblock'</tags>
<spec>'flashblock' 'fb'</spec>
<type>boolean</type>
<default>true</default>
diff --git a/common/locale/en-US/options.xml b/common/locale/en-US/options.xml
index 53afcbc0..b50b52f9 100644
--- a/common/locale/en-US/options.xml
+++ b/common/locale/en-US/options.xml
@@ -546,7 +546,7 @@
<warning>
&dactyl.appName; will not behave correctly if the editor forks its
- own process, rather than blocking until editing is complete. Gvim
+ own process rather than blocking until editing is complete. Gvim
invoked without the <em>-f</em> option is one such example.
</warning>
</description>
@@ -618,7 +618,7 @@
//area[@href] | //xhtml:area[@href] |
//img[@src] | //xhtml:img[@src] |
//iframe[@src] | //xhtml:iframe[@src]',
- [F]:'//div | //xhtml:div |
+ [F]:'//div | //xhtml:div |
//span | //xhtml:span |
//p | //xhtml:p |
//body | //xhtml:body |
@@ -961,7 +961,7 @@
<p>
Alternatively, you can specify which plugins to load and which to
omit in your <tt><t>&dactyl.name;rc</t></tt> using something like
- the below:
+ the following:
</p>
<code><ex>:set loadplugins=</ex>!<str delim="'">foo|bar</str>,<str delim="'">\.(js|&dactyl.fileExt;)$</str></code>
<p>
diff --git a/common/modules/base.jsm b/common/modules/base.jsm
index 7d9e03a6..97076991 100644
--- a/common/modules/base.jsm
+++ b/common/modules/base.jsm
@@ -391,9 +391,7 @@ function iter(obj) {
if (obj.constructor instanceof ctypes.StructType)
return (function () {
for (let prop in values(obj.constructor.fields))
- let ([name, type] = Iterator(prop).next()) {
- yield [name, obj[name]];
- }
+ yield let ([name, type] = Iterator(prop).next()) [name, obj[name]];
})();
obj = {};
}
diff --git a/common/modules/services.jsm b/common/modules/services.jsm
index 6591e73f..1e72ccfb 100644
--- a/common/modules/services.jsm
+++ b/common/modules/services.jsm
@@ -39,6 +39,7 @@ const Services = Module("Services", {
this.add("io", "@mozilla.org/network/io-service;1", Ci.nsIIOService);
this.add("json", "@mozilla.org/dom/json;1", Ci.nsIJSON, "createInstance");
this.add("livemark", "@mozilla.org/browser/livemark-service;2", Ci.nsILivemarkService);
+ this.add("mime", "@mozilla.org/mime;1", Ci.nsIMIMEService);
this.add("observer", "@mozilla.org/observer-service;1", Ci.nsIObserverService);
this.add("pref", "@mozilla.org/preferences-service;1", [Ci.nsIPrefBranch2, Ci.nsIPrefService]);
this.add("privateBrowsing", "@mozilla.org/privatebrowsing;1", Ci.nsIPrivateBrowsingService);
diff --git a/common/modules/storage.jsm b/common/modules/storage.jsm
index 5ebe36e5..c7d6f6d9 100644
--- a/common/modules/storage.jsm
+++ b/common/modules/storage.jsm
@@ -18,10 +18,8 @@ const win32 = /^win(32|nt)$/i.test(services.runtime.OS);
function loadData(name, store, type) {
try {
- if (storage.infoPath)
- var file = storage.infoPath.child(name).read();
- if (file)
- var result = services.json.decode(file);
+ let data = storage.infoPath.child(name).read();
+ let result = JSON.parse(data);
if (result instanceof type)
return result;
}
@@ -37,8 +35,11 @@ function saveData(obj) {
const StoreBase = Class("StoreBase", {
OPTIONS: ["privateData", "replacer"],
+
fireEvent: function (event, arg) { storage.fireEvent(this.name, event, arg); },
+
get serial() JSON.stringify(this._object, this.replacer),
+
init: function (name, store, load, options) {
this._load = load;
@@ -49,11 +50,14 @@ const StoreBase = Class("StoreBase", {
this[k] = v;
this.reload();
},
+
changed: function () { this.timer.tell() },
+
reload: function reload() {
this._object = this._load() || this._constructor();
this.fireEvent("change", null);
},
+
save: function () { saveData(this); },
});
@@ -205,8 +209,8 @@ const Storage = Module("Storage", {
fireEvent: function fireEvent(key, event, arg) {
this.removeDeadObservers();
- // Safe, since we have our own Array object here.
if (key in observers)
+ // Safe, since we have our own Array object here.
for each (let observer in observers[key])
observer.callback.get()(key, event, arg);
if (key in keys)
@@ -481,12 +485,11 @@ const File = Class("File", {
/**
* @property {string} The current platform's path separator.
*/
- get PATH_SEP() {
- delete this.PATH_SEP;
+ PATH_SEP: Class.memoize(function () {
let f = services.directory.get("CurProcD", Ci.nsIFile);
f.append("foo");
- return this.PATH_SEP = f.path.substr(f.parent.path.length, 1);
- },
+ return f.path.substr(f.parent.path.length, 1);
+ }),
DoesNotExist: function (error) ({
exists: function () false,
@@ -544,7 +547,7 @@ const File = Class("File", {
joinPaths: function (head, tail, cwd) {
let path = this(head, cwd);
try {
- // FIXME: should only expand env vars and normalise path separators
+ // FIXME: should only expand environment vars and normalize path separators
path.appendRelativePath(this.expandPath(tail, true));
}
catch (e) {
diff --git a/common/modules/util.jsm b/common/modules/util.jsm
index 9c208074..7f427d21 100644
--- a/common/modules/util.jsm
+++ b/common/modules/util.jsm
@@ -501,7 +501,9 @@ const Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference])
/** @property {boolean} True if the OS is Mac OS X. */
get isMacOSX() this._arch == "Darwin",
/** @property {boolean} True if the OS is some other *nix variant. */
- get isUnix() !this.isWindows && !this.isMacOSX
+ get isUnix() !this.isWindows && !this.isMacOSX,
+ /** @property {RegExp} A RegExp which matches illegal characters in path components. */
+ get illegalCharacters() this.isWindows ? /[<>:"/\\|?*\x00-\x1f]/ : /\//
},
/**