new module to enable editing and deleting of bookmarks
[conkeror/arlinius.git] / modules / bookmark.js
blobc49e1089d94c5652cc0d7109490cfbf6dc37d9a3
1 /**
2  * (C) Copyright 2011-2012 Peter Lunicks
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6 **/
8 function get_bookmarks_for_uri(uri) {
9     return nav_bookmarks_service.getBookmarkIdsForURI(make_uri(uri), {});
11 function set_bookmark_title(id, title) {
12     return nav_bookmarks_service.setItemTitle(id, title);
14 function get_bookmark_title(id) {
15     return nav_bookmarks_service.getItemTitle(id);
17 function get_bookmark_uri(id) {
18     return nav_bookmarks_service.getBookmarkURI(id);
20 function set_bookmark_uri(id, uri) {
21     return nav_bookmarks_service.changeBookmarkURI(id, make_uri(uri));
23 function is_bookmarked(uri) {
24     return nav_bookmarks_service.isBookmarked(make_uri(uri))
27 function remove_bookmark(id) {
28     return nav_bookmarks_service.removeItem(id);
31 define_keymap("bookmark_edit_keymap", $parent = minibuffer_keymap);
32 function bookmark_edit_modality (buffer, elem) {
33     buffer.keymaps.push(bookmark_edit_keymap);
36 function kill_current_bookmark (I) {
37     var id = I.window.minibuffer.current_bookmark_id;
38     if (typeof id == 'undefined' || id == null) {
39         minibuffer_abort(I.window);
40         I.minibuffer.message("Not currently editing a bookmark.");
41         return;
42     }
43     var uri_string = get_bookmark_uri(id).spec;
44     var title = get_bookmark_title(id);
45     remove_bookmark(id);
46     minibuffer_abort(I.window);
47     I.minibuffer.message("Removed bookmark: " + uri_string + " - " + title);
50 interactive("kill-current-bookmark",
51             "Remove the bookmark that is currently being edited in the minibuffer.",
52             kill_current_bookmark);
54 define_key(bookmark_edit_keymap, "M-k", "kill-current-bookmark");
56 function bookmark_edit_current_bookmark_uri (I) {
57     var id = I.window.minibuffer.current_bookmark_id;
58     if (typeof id == 'undefined' || id == null) {
59         minibuffer_abort(I.window);
60         I.minibuffer.message("Not currently editing a bookmark.");
61         return;
62     }
63     var list = keymap_lookup_command([bookmark_edit_keymap], "kill-current-bookmark");
64     var keymsg = "";
65     if (list.length)
66         keymsg = " (" + list.join(", ") + " to remove)";
68     try {
69         var uri_string = yield I.minibuffer.read($prompt = "Edit bookmark URI"+keymsg+":",
70                                                  $initial_value = get_bookmark_uri(id).spec || "",
71                                                  $keymap = bookmark_edit_keymap);
72     } catch (e) {
73         // e.g. escape (C-g) -- don't modify the URI
74         return;
75     }
76     set_bookmark_uri(id, make_uri(uri_string));
79 interactive("bookmark-edit-current-bookmark-uri",
80             "Switch to editing the URI of the currently-edited bookmark.",
81             bookmark_edit_current_bookmark_uri);
82 define_key(bookmark_edit_keymap, "M-e", "bookmark-edit-current-bookmark-uri");
84 function bookmark_add_or_edit (I) {
85     var element = yield read_browser_object(I);
86     var spec = load_spec(element);
87     var uri_string = load_spec_uri_string(spec);
88     var panel;
90     if (is_bookmarked(uri_string)) {
91         // If the URI is bookmarked, edit the first instance.
92         var id = get_bookmarks_for_uri(uri_string)[0];
94         var list = keymap_lookup_command([bookmark_edit_keymap], "kill-current-bookmark");
95         var keymsg = "";
96         if (list.length)
97             keymsg = " (" + list.join(", ") + " to remove)";
99         var list_uri = keymap_lookup_command([bookmark_edit_keymap], "bookmark-edit-current-bookmark-uri");
100         var keymsg_uri = "";
101         if (list_uri.length)
102             keymsg_uri = " (" + list_uri.join(", ") + " to edit URL)";
104         panel = create_info_panel(I.window, "bookmark-panel",
105                                   [["bookmarking",
106                                     element_get_operation_label(element, "Editing bookmark for"),
107                                     uri_string
108                                    + keymsg_uri
109                           ]]);
110         try {
111             I.window.minibuffer.current_bookmark_id = id;
112             var title = yield I.minibuffer.read($prompt = "Edit bookmark title"+keymsg+":",
113                                                 $initial_value = get_bookmark_title(id) || "",
114                                                 $keymap = bookmark_edit_keymap);
115             delete I.window.minibuffer.current_bookmark_id;
116         } catch (e) {
117             // e.g. escape (C-g) -- don't modify the title
118             return;
119         } finally {
120             panel.destroy();
121         }
122         set_bookmark_title(id, title);
123         I.minibuffer.message("Edited bookmark: " + uri_string + " - " + title);
124     } else {
125         panel = create_info_panel(I.window, "bookmark-panel",
126                                   [["bookmarking",
127                                     element_get_operation_label(element, "Bookmarking"),
128                                     uri_string]]);
129         try {
130             var title = yield I.minibuffer.read($prompt = "Bookmark with title:", $initial_value = load_spec_title(spec) || "");
131         } finally {
132             panel.destroy();
133         }
134         add_bookmark(uri_string, title);
135         I.minibuffer.message("Added bookmark: " + uri_string + " - " + title);
136     }
139 function bookmark_add (I) {
140     var element = yield read_browser_object(I);
141     var spec = load_spec(element);
142     var uri_string = load_spec_uri_string(spec);
143     var panel;
144     panel = create_info_panel(I.window, "bookmark-panel",
145                               [["bookmarking",
146                                 element_get_operation_label(element, "Bookmarking"),
147                                 uri_string]]);
148     try {
149         var title = yield I.minibuffer.read($prompt = "Bookmark with title:", $initial_value = load_spec_title(spec) || "");
150     } finally {
151         panel.destroy();
152     }
153     add_bookmark(uri_string, title);
154     I.minibuffer.message("Added bookmark: " + uri_string + " - " + title);
157 interactive("bookmark",
158             "Add or edit a bookmark."
159             + "C-u adds a new bookmark even if one already exists for this URI.",
160             alternates(bookmark_add_or_edit, bookmark_add),
161             $browser_object = browser_object_frames);
163 provide("bookmark");