diff options
author | Kris Maglione <maglione.k@gmail.com> | 2010-12-03 16:55:00 -0500 |
---|---|---|
committer | Kris Maglione <maglione.k@gmail.com> | 2010-12-03 16:55:00 -0500 |
commit | f63b13d431185ba9684571ec04cfa6ac022db4a7 (patch) | |
tree | 822895e31321de7497d4b85a9e9e8c4ff184e569 /common | |
parent | 3886a82f477e1aafb02064132f90dd1f7c7b55b7 (diff) | |
download | pentadactyl-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.js | 23 | ||||
-rw-r--r-- | common/locale/en-US/browsing.xml | 9 | ||||
-rw-r--r-- | common/locale/en-US/developer.xml | 4 | ||||
-rw-r--r-- | common/locale/en-US/options.xml | 6 | ||||
-rw-r--r-- | common/modules/base.jsm | 4 | ||||
-rw-r--r-- | common/modules/services.jsm | 1 | ||||
-rw-r--r-- | common/modules/storage.jsm | 23 | ||||
-rw-r--r-- | common/modules/util.jsm | 4 |
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]/ : /\// }, /** |