Created
October 25, 2011 11:56
-
-
Save teramako/1312462 to your computer and use it in GitHub Desktop.
テストコード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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