Skip to content

Instantly share code, notes, and snippets.

@teramako
Created October 25, 2011 11:56
Show Gist options
  • Save teramako/1312462 to your computer and use it in GitHub Desktop.
Save teramako/1312462 to your computer and use it in GitHub Desktop.
テストコード
commands.addUserCommand(["bookmarks", "bm"], "Bookmarks",
function (args) {
var folderId = PlacesUtils.bookmarksMenuFolderId;
if (args["-tag"])
folderId = PlacesUtils.tagsFolderId;
else if (args["-toolbar"])
folderId = PlacesUtils.toolbarFolderId;
var str = args.literalArg;
var folders = str.split("/");
var item = folders.pop();
var folder = getFolder(folders, folderId);
if (!item) {
liberator.echo(getNodeList(folder), true);
return;
}
for (let child in iterateFolder(folder)) {
if (child.title == item) {
if (PlacesUtils.nodeIsContainer(child)) {
liberator.echo(getNodeList(child), true);
} else {
liberator.open(child.uri);
}
}
}
folder.containerOpen = false;
//liberator.echo(str, true);
}, {
literal: 0,
options: [
[["-tag", "-T"], commands.OPTION_NOARG],
[["-toolbar"], commands.OPTION_NOARG],
],
completer: function (context, args) {
var folderId = PlacesUtils.bookmarksMenuFolderId;
if (args["-tag"])
folderId = PlacesUtils.tagsFolderId;
else if (args["-toolbar"])
folderId = PlacesUtils.toolbarFolderId;
completion.bookmarksWalker(context, args, folderId);
},
}, true);
completion.bookmarksWalker = function bookmarksWalker (context, args, rootFolderId, onlyFolder) {
if (!rootFolderId)
rootFolderId = PlacesUtils.bookmarksMenuFolderId;
var filter = context.filter;
var folders = filter.split("/");
var index = filter.lastIndexOf("/");
var item = folders.pop();
var folder = getFolder(folders, rootFolderId, onlyFolder);
//if (index > 0)
// context.advance(index+1+ context.quote ? 1 : 0);
//context.keys = { text: "title", description: "uri", icon: "icon" };
context.title = ["Bookmarks", folders.join("/") + "/"];
//context.filter = item;
var results = [];
if (folder) {
for (let child in iterateFolder(folder, onlyFolder)) {
if (PlacesUtils.nodeIsSeparator(child))
continue;
//results.push(nodeToItem(child, folders.join("/")));
results.push([
(folders.length ? folders.join("/") + "/" : "") + PlacesUIUtils.getBestTitle(child),
child.uri
]);
}
folder.containerOpen = false;
}
return context.completions = results;
}
function getNodeList (node) {
let xml = <table></table>;
for (let child in iterateFolder(node)) {
if (PlacesUtils.nodeIsURI(child)) {
let item = nodeToItem(child);
xml.appendChild(<tr>
<td>{template.icon(item, item.title)}</td>
<td>{template.highlightURL(item.uri)}</td>
</tr>);
}
}
node.containerOpen = false;
return xml;
}
function nodeToItem (node, path) {
var item = {
title: (path ? path + "/" : "")+ PlacesUIUtils.getBestTitle(node),
uri: node.uri,
icon: node.icon || PlacesUtils.favicons.defaultFavicon.spec,
};
if (PlacesUtils.nodeIsTagQuery(node)) {
item.uri = "Tag: " + node.title;
item.icon = "chrome://mozapps/skin/places/tagContainerIcon.png";
} else if (PlacesUtils.nodeIsContainer(node)) {
item.uri = "Folder";
item.icon = "chrome://global/skin/dirListing/folder.png";
}
return item;
}
function getFolder (folders, rootFolderId) {
var q = PlacesUtils.history.getNewQuery(),
o = PlacesUtils.history.getNewQueryOptions();
if (rootFolderId == PlacesUtils.tagsFolderId) {
o.resultType = o.RESULTS_AS_TAG_QUERY;
} else {
q.setFolders([rootFolderId], 1);
o.expandQueries = false;
}
var res = PlacesUtils.history.executeQuery(q, o);
var node = res.root;
for (let [, folder] in Iterator(folders)) {
node = getFolderFromNode(node, folder);
if (!node)
break;
}
return node;
}
function getFolderFromNode (node, title) {
for (let child in iterateFolder(node)) {
if (child.title == title && child instanceof Ci.nsINavHistoryContainerResultNode) {
node.containerOpen = false;
return child;
}
}
return null;
}
function iterateFolder (node, onlyFolder) {
if (!node.containerOpen)
node.containerOpen = true;
for (let i = 0, len = node.childCount; i < len; i++) {
let child = node.getChild(i);
if (PlacesUtils.nodeIsContainer(child))
child.QueryInterface(Ci.nsINavHistoryContainerResultNode);
else if (onlyFolder)
continue;
yield child;
}
}
commands.get("bmark").options[3] = [
["-folder", "-f"],
commands.OPTION_STRING,
null,
function folderCompleter (context, args) {
var folderId = PlacesUtils.bookmarksMenuFolderId;
return completion.bookmarksWalker(context, args, folderId, true);
}
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment