redesign buffer-modes and page-modes
[conkeror.git] / modules / page-modes / stackexchange.js
blobd9055096058f3e4d7bf72c6425fc7130c6d75762
1 /**
2  * (C) Copyright 2010 Dave Kerschner
3  *
4  * Use, modification, and distribution are subject to the terms specified in the
5  * COPYING file.
6  *
7  * StackExchange page mode
8  *
9  * Provides ability to vote on Stack Exchange sites without having to grab
10  * the mouse.
11  */
13 in_module(null);
15 /**
16  * browser_object_class that finds the vote images
17  */
18 define_browser_object_class("stackexchange-votes",
19     "Browser object class for selecting a vote arrow via hinting.",
20                             xpath_browser_object_handler('//span[contains(@class,"vote-up-off")]' +
21                                   ' | //span[contains(@class,"vote-down-off")]'),
22      $hint = "select a vote");
24 define_browser_object_class("stackexchange-accept-answers",
25     "Browser object class for selecting an accepted answer check via hinting.",
26                             xpath_browser_object_handler('//span[contains(@class,"vote-accepted-off")]'),
27     $hint = "select an accepted answer");
30 interactive("stackexchange-vote",
31     "Vote on StackExchange sites",
32     function (I) {
33         var elem = yield read_browser_object(I);
34         dom_node_click(elem, 1, 1);
35     },
36     $browser_object = browser_object_stackexchange_votes);
38 interactive("stackexchange-accept-answer",
39     "Accept an answer on StackExchange site",
40     function (I) {
41         var elem = yield read_browser_object(I);
42         dom_node_click(elem, 1, 1);
43     },
44     $browser_object = browser_object_stackexchange_accept_answers);
46 interactive("stackexchange-favorite-question",
47     "Favorite a question on StackExchange site",
48     function (I) {
49         var xpr = I.buffer.document.evaluate(
50             '//span[contains(@class,"star-off")]',
51             I.buffer.document, null,
52             Ci.nsIDOMXPathResult.ORCERD_NOTE_ITERATOR_TYPE, null);
53         let elem;
54         if(xpr && (elem = xpr.iterateNext())) {
55             dom_node_click(elem, 1, 1);
56         }
57     });
60 define_keymap("stackexchange_keymap", $display_name = "stackexchange");
61 define_key(stackexchange_keymap, "V", "stackexchange-vote");
62 define_key(stackexchange_keymap, "A", "stackexchange-accept-answer");
63 define_key(stackexchange_keymap, "O", "stackexchange-favorite-question");
66 var stackexchange_modality = {
67     normal: stackexchange_keymap
71 define_page_mode("stackexchange-mode",
72     /^https?:\/\/(?:www.|meta.)?(stackoverflow|serverfault|superuser|stackapps)\.(?:com)\//,
73     function enable (buffer) {
74         buffer.content_modalities.push(stackexchange_modality);
75     },
76     function disable (buffer) {
77          var i = buffer.content_modalities.indexOf(stackexchange_modality);
78          if (i > -1)
79              buffer.content_modalities.splice(i, 1);
80     },
81     $display_name = "StackExchange");
83 page_mode_activate(stackexchange_mode);
85 provide("stackexchange");