1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 06:07:59 +01:00

Profide default leaf names in :write for people who can't be bothered to think up their own.

--HG--
extra : rebase_source : 6bfef2eff2a7319af53fa9610fd8f16d5513e221
This commit is contained in:
Kris Maglione
2010-12-03 16:55:00 -05:00
parent 3886a82f47
commit f63b13d431
8 changed files with 47 additions and 27 deletions

View File

@@ -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 + "*$"), ""));
dactyl.assert(!file.exists() || args.bang,
"E13: File exists (add ! to override)");
if (filename.substr(-1) === File.PATH_SEP || file.exists() && file.isDirectory())
file.append(buffer.getDefaultNames(doc)[0][0]);
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
});

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>
@@ -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>

View File

@@ -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 = {};
}

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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]/ : /\//
},
/**