From 9702666241a792f1eb3a363c31bddf149724c1db Mon Sep 17 00:00:00 2001 From: John Foerch Date: Fri, 27 Jan 2012 21:28:55 -0500 Subject: [PATCH] redesign buffer-modes and page-modes multiple page modes may be enabled at the same time. this will allow for granulated page-modes, a one-to-one relationship between modes and features, allowing the user to easily configure which features they want in a uniform way across all page-modes. (splitting up existing page-modes is a project for future patches.) call forms of both define_buffer_mode and define_page_mode have changed. 'enable' and 'disable' are now both required positional arguments instead of keyword arguments, and define_page_mode also takes its test regexp/function as an argument. buffer-modes and page-modes are now js objects instead of functions. these objects have 'enable' and 'disable' methods to turn them on and off, instead of the emacs style of having a toggle function that takes a -1/1 (or true/false) argument. the new style is more idiomatic of js, and not so arbitrary. buffer-mode classes removed: no longer any need for mutually exclusive groups of modes, like page-modes were. if need arises later, it's easy to add back. buffer.page now exists whether any page-modes are running or not. page-local variables apart from page-modes can be useful with cwd (setting cwd based on current host) for example. --- modules/buffer.js | 150 ++++++++++++---------------- modules/caret.js | 10 +- modules/content-buffer.js | 104 ++++++++++++------- modules/page-modes/dailymotion.js | 15 +-- modules/page-modes/duckduckgo.js | 14 +-- modules/page-modes/github.js | 12 +-- modules/page-modes/gmail.js | 16 +-- modules/page-modes/gmane.js | 13 +-- modules/page-modes/google-calendar.js | 20 ++-- modules/page-modes/google-gqueues.js | 18 ++-- modules/page-modes/google-images.js | 16 ++- modules/page-modes/google-maps.js | 14 +-- modules/page-modes/google-reader.js | 20 ++-- modules/page-modes/google-search-results.js | 24 ++--- modules/page-modes/google-video.js | 13 +-- modules/page-modes/google-voice.js | 18 ++-- modules/page-modes/reddit.js | 13 ++- modules/page-modes/stackexchange.js | 14 +-- modules/page-modes/twitter.js | 17 ++-- modules/page-modes/wikipedia.js | 16 ++- modules/page-modes/xkcd.js | 23 ++--- modules/page-modes/youtube.js | 23 +++-- modules/quote.js | 20 ++-- 23 files changed, 299 insertions(+), 304 deletions(-) diff --git a/modules/buffer.js b/modules/buffer.js index e3df224..43f4f8a 100644 --- a/modules/buffer.js +++ b/modules/buffer.js @@ -1,6 +1,6 @@ /** * (C) Copyright 2004-2007 Shawn Betts - * (C) Copyright 2007-2010 John J. Foerch + * (C) Copyright 2007-2010,2012 John J. Foerch * (C) Copyright 2007-2008 Jeremy Maitin-Shepard * * Use, modification, and distribution are subject to the terms specified in the @@ -851,95 +851,75 @@ function for_each_buffer (f) { /* - * BUFFER MODES + * Buffer Modes */ -var mode_functions = {}; -var mode_display_names = {}; - define_buffer_local_hook("buffer_mode_change_hook"); define_current_buffer_hook("current_buffer_mode_change_hook", "buffer_mode_change_hook"); -define_keywords("$display_name", "$class", "$enable", "$disable", "$doc"); -function define_buffer_mode (name) { +define_keywords("$display_name", "$doc"); +function buffer_mode (name, enable, disable) { keywords(arguments); - - var hyphen_name = name.replace("_","-","g"); - var display_name = arguments.$display_name; - var mode_class = arguments.$class; - var enable = arguments.$enable; - var disable = arguments.$disable; - - mode_display_names[name] = display_name; - - var can_disable; - - if (disable == false) { - can_disable = false; - disable = null; - } else - can_disable = true; - - var state = (mode_class != null) ? mode_class : (name + "_enabled"); - var enable_hook_name = name + "_enable_hook"; - var disable_hook_name = name + "_disable_hook"; - define_buffer_local_hook(enable_hook_name); - define_buffer_local_hook(disable_hook_name); - - var change_hook_name = null; - - if (mode_class) { - mode_functions[name] = { enable: enable, - disable: disable, - mode_class: mode_class, - disable_hook_name: disable_hook_name }; - change_hook_name = mode_class + "_change_hook"; - define_buffer_local_hook(change_hook_name); - } - - function func (buffer, arg) { - var old_state = buffer[state]; - var cur_state = (old_state == name); - var new_state = (arg == null) ? !cur_state : (arg > 0); - if ((new_state == cur_state) || (!can_disable && !new_state)) - // perhaps show a message if (!can_disable && !new_state) - // to tell the user that this mode cannot be disabled. do - // we have any existing modes that would benefit by it? - return null; - if (new_state) { - if (mode_class && old_state != null) { - // Another buffer-mode of our same mode-class is - // enabled. Buffer-modes within a mode-class are - // mutually exclusive, so turn the old one off. - buffer.enabled_modes.splice(buffer.enabled_modes.indexOf(old_state), 1); - let x = mode_functions[old_state]; - let y = x.disable; - if (y) y(buffer); - conkeror[x.disable_hook_name].run(buffer); - } - buffer[state] = name; - if (enable) - enable(buffer); - conkeror[enable_hook_name].run(buffer); - buffer.enabled_modes.push(name); - } else { - buffer.enabled_modes.splice(buffer.enabled_modes.indexOf(name), 1); - disable(buffer); - conkeror[disable_hook_name].run(buffer); - buffer[state] = null; + this.name = name.replace("-","_","g"); + this.hyphen_name = name.replace("_","-","g"); + this._enable = enable; + this._disable = disable; + this.display_name = arguments.$display_name; + this.doc = arguments.$doc; + this.enable_hook = name + "_enable_hook"; + this.disable_hook = name + "_disable_hook"; +} +buffer_mode.prototype = { + constructor: buffer_mode, + name: null, + display_name: null, + doc: null, + enable_hook: null, + disable_hook: null, + _enable: null, + _disable: null, + enable: function (buffer) { + try { + this._enable(buffer); + } finally { + buffer.enabled_modes.push(this.name); + if (conkeror[this.enable_hook]) + conkeror[this.enable_hook].run(buffer); + buffer_mode_change_hook.run(buffer); + } + }, + disable: function (buffer) { + try { + this._disable(buffer); + } finally { + var i = buffer.enabled_modes.indexOf(this.name); + if (i > -1) + buffer.enabled_modes.splice(i, 1); + if (conkeror[this.disable_hook]) + conkeror[this.disable_hook].run(buffer); + buffer_mode_change_hook.run(buffer); } - if (change_hook_name) - conkeror[change_hook_name].run(buffer, buffer[state]); - buffer_mode_change_hook.run(buffer); - return new_state; } - - conkeror[name] = func; - interactive(hyphen_name, arguments.$doc, function (I) { - var arg = I.P; - var new_state = func(I.buffer, arg && univ_arg_to_number(arg)); - I.minibuffer.message(hyphen_name + (new_state ? " enabled" : " disabled")); - }); +}; +define_keywords("$constructor"); +function define_buffer_mode (name, enable, disable) { + keywords(arguments, $constructor = buffer_mode); + var constructor = arguments.$constructor; + var m = new constructor(name, enable, disable, forward_keywords(arguments)); + name = m.name; // normalized + conkeror[name] = m; + define_buffer_local_hook(m.enable_hook); + define_buffer_local_hook(m.disable_hook); + interactive(m.hyphen_name, + arguments.$doc, + function (I) { + var enabledp = (I.buffer.enabled_modes.indexOf(name) > -1); + if (enabledp) + m.disable(I.buffer); + else + m.enable(I.buffer); + I.minibuffer.message(m.hyphen_name + (enabledp ? " disabled" : " enabled")); + }); } ignore_function_for_get_caller_source_code_reference("define_buffer_mode"); @@ -969,11 +949,7 @@ minibuffer_mode_indicator.prototype = { var buffer = this.window.buffers.current; var str = buffer.enabled_modes.map( function (x) { - let y = mode_display_names[x]; - if (y) - return y; - else - return null; + return (conkeror[x].display_name || null); }).filter(function (x) x != null).join(" "); this.element.value = str; }, diff --git a/modules/caret.js b/modules/caret.js index 804b224..eed2c92 100644 --- a/modules/caret.js +++ b/modules/caret.js @@ -13,8 +13,7 @@ function caret_modality (buffer, elem) { } define_buffer_mode('caret_mode', - $display_name = 'CARET', - $enable = function (buffer) { + function enable (buffer) { buffer.browser.setAttribute('showcaret', 'true'); var sc = buffer.focused_selection_controller; sc.setCaretEnabled(true); @@ -22,7 +21,7 @@ define_buffer_mode('caret_mode', buffer.modalities.push(caret_modality); buffer.set_input_mode(); }, - $disable = function (buffer) { + function disable (buffer) { buffer.browser.setAttribute('showcaret', 'false'); var sc = buffer.focused_selection_controller; sc.setCaretEnabled(false); @@ -31,10 +30,11 @@ define_buffer_mode('caret_mode', if (i > -1) buffer.modalities.splice(i, 1); buffer.set_input_mode(); - }); + }, + $display_name = 'CARET'); function caret_mode_enable (buffer) { - caret_mode(buffer, true); + caret_mode.enable(buffer); } watch_pref('accessibility.browsewithcaret', diff --git a/modules/content-buffer.js b/modules/content-buffer.js index 48c8baa..d029cc1 100644 --- a/modules/content-buffer.js +++ b/modules/content-buffer.js @@ -1,6 +1,6 @@ /** * (C) Copyright 2004-2007 Shawn Betts - * (C) Copyright 2007-2009,2011 John J. Foerch + * (C) Copyright 2007-2009,2011-2012 John J. Foerch * (C) Copyright 2007-2008 Jeremy Maitin-Shepard * * Use, modification, and distribution are subject to the terms specified in the @@ -120,6 +120,8 @@ function content_buffer (window) { content_buffer_popup_blocked_hook.run(buffer, event); }, true /* capture */); + this.page_modes = []; + this.ignore_initial_blank = true; var lspec = arguments.$load; @@ -261,6 +263,10 @@ content_buffer.prototype = { /* Use the real location URI now */ this._display_uri = null; this.set_input_mode(); + this.page = { + local: { __proto__: this.local } + }; + this.default_browser_object_classes = {}; content_buffer_location_change_hook.run(this, request, location); buffer_description_change_hook.run(this); }, @@ -635,48 +641,74 @@ browser_dom_window.prototype = { add_hook("window_initialize_early_hook", initialize_browser_dom_window); -define_keywords("$display_name", "$enable", "$disable", "$doc"); -function define_page_mode (name) { + +/* + * Page Modes + */ + +define_variable("page_modes", {}, + "Object containing all activated page-modes. "+ + "(See `page_mode_activate`.)"); + +define_keywords("$test"); +function page_mode (name, enable, disable) { + keywords(arguments); + buffer_mode.call(this, name, enable, disable, + forward_keywords(arguments)); + this.test = arguments.$test; +} +page_mode.prototype = { + constructor: page_mode, + __proto__: buffer_mode.prototype, + test: null, + enable: function (buffer) { + buffer_mode.prototype.enable.call(this, buffer); + buffer.page_modes.push(this.name); + buffer.set_input_mode(); + }, + disable: function (buffer) { + buffer_mode.prototype.disable.call(this, buffer); + var i = buffer.page_modes.indexOf(this.name); + if (i > -1) + buffer.page_modes.splice(i, 1); + buffer.set_input_mode(); + } +}; + +function define_page_mode (name, test, enable, disable) { keywords(arguments); - var display_name = arguments.$display_name; - var enable = arguments.$enable; - var disable = arguments.$disable; - var doc = arguments.$doc; - define_buffer_mode(name, - $display_name = display_name, - $class = "page_mode", - $enable = function (buffer) { - buffer.page = { - local: { __proto__: buffer.local } - }; - if (enable) - enable(buffer); - buffer.set_input_mode(); - }, - $disable = function (buffer) { - if (disable) - disable(buffer); - buffer.page = null; - buffer.default_browser_object_classes = {}; - buffer.set_input_mode(); - }, - $doc = doc); + define_buffer_mode(name, enable, disable, + $constructor = page_mode, + $test = test, + forward_keywords(arguments)); } ignore_function_for_get_caller_source_code_reference("define_page_mode"); -define_variable("auto_mode_list", [], - "A list of mappings from URI regular expressions to page modes."); +function page_mode_activate (page_mode) { + page_modes[page_mode.name] = page_mode; +} -function page_mode_auto_update (buffer) { - var uri = buffer.current_uri.spec; - var mode = predicate_alist_match(auto_mode_list, uri); - if (mode) - mode(buffer, true); - else if (buffer.page_mode) - conkeror[buffer.page_mode](buffer, false); +function page_mode_deactivate (page_mode) { + delete page_modes[page_mode.name]; +} + + +function page_mode_update (buffer) { + for (var i = buffer.page_modes.length - 1; i >= 0; --i) { + var p = buffer.page_modes[i]; + conkeror[p].disable(buffer); + } + var uri = buffer.current_uri; + for (let [name, m] in Iterator(page_modes)) { + if (m.test instanceof RegExp) { + if (m.test.exec(uri.spec)) + m.enable(buffer); + } else if (m.test(uri)) + m.enable(buffer); + } } -add_hook("content_buffer_location_change_hook", page_mode_auto_update); +add_hook("content_buffer_location_change_hook", page_mode_update); provide("content-buffer"); diff --git a/modules/page-modes/dailymotion.js b/modules/page-modes/dailymotion.js index fd29fea..75833e0 100644 --- a/modules/page-modes/dailymotion.js +++ b/modules/page-modes/dailymotion.js @@ -36,15 +36,16 @@ function media_scrape_dailymotion(buffer, results) { mime_type: "video/x-flv"})); } -define_page_mode("dailymotion_mode", - $display_name = "Dailymotion", - $enable = function (buffer) { +define_page_mode("dailymotion-mode", + build_url_regex($domain = /(?:[^\/]*\.)?dailymotion/), + function enable (buffer) { media_setup_local_object_classes(buffer); - }); + }, + function disable (buffer) {}, + $display_name = "Dailymotion"); +page_mode_activate(dailymotion_mode); -var dailymotion_re = build_url_regex($domain = /(?:[^\/]*\.)?dailymotion/); -auto_mode_list.push([dailymotion_re, dailymotion_mode]); -media_scrapers.unshift([dailymotion_re, media_scrape_dailymotion]); +media_scrapers.unshift([dailymotion_mode.test, media_scrape_dailymotion]); provide("dailymotion"); diff --git a/modules/page-modes/duckduckgo.js b/modules/page-modes/duckduckgo.js index 06ce302..0a6259d 100644 --- a/modules/page-modes/duckduckgo.js +++ b/modules/page-modes/duckduckgo.js @@ -81,18 +81,18 @@ var duckduckgo_modality = { select: duckduckgo_select_keymap }; -define_page_mode("duckduckgo_mode", - $display_name = "DuckDuckGo", - $enable = function (buffer) { +define_page_mode("duckduckgo-mode", + build_url_regex($domain = "duckduckgo"), + function enable (buffer) { buffer.content_modalities.push(duckduckgo_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(duckduckgo_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "DuckDuckGo"); -var duckduckgo_re = build_url_regex($domain = "duckduckgo"); -auto_mode_list.push([duckduckgo_re, duckduckgo_mode]); +page_mode_activate(duckduckgo_mode); provide("duckduckgo"); diff --git a/modules/page-modes/github.js b/modules/page-modes/github.js index e5d43c3..846f93c 100644 --- a/modules/page-modes/github.js +++ b/modules/page-modes/github.js @@ -86,20 +86,18 @@ var github_modality = { normal: github_keymap }; -define_page_mode("github_mode", - $enable = function (buffer) { +define_page_mode("github-mode", + build_url_regex($domain = "github", $allow_www = true), + function enable (buffer) { buffer.content_modalities.push(github_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(github_modality); if (i > -1) buffer.content_modalities.splice(i, 1); }, $display_name = "Github"); -auto_mode_list.push([ - build_url_regex($domain = "github", $allow_www = true), - github_mode -]); +page_mode_activate(github_mode); provide("github"); diff --git a/modules/page-modes/gmail.js b/modules/page-modes/gmail.js index 60e611d..1e4fc13 100644 --- a/modules/page-modes/gmail.js +++ b/modules/page-modes/gmail.js @@ -71,25 +71,25 @@ function gmail_focus_primary_frame (buffer) { buffer.top_frame.frames[3].focus(); } -define_page_mode("gmail_mode", - $display_name = "GMail", - $enable = function (buffer) { +define_page_mode("gmail-mode", + build_url_regex($domain = "mail.google", + $path = new RegExp('(?!support)')), + function enable (buffer) { add_hook.call(buffer, "buffer_dom_content_loaded_hook", gmail_focus_primary_frame); add_hook.call(buffer, "unfocus_hook", gmail_focus_primary_frame); buffer.content_modalities.push(gmail_modality); }, - $disable = function (buffer) { + function disable (buffer) { remove_hook.call(buffer, "buffer_dom_content_loaded_hook", gmail_focus_primary_frame); remove_hook.call(buffer, "unfocus_hook", gmail_focus_primary_frame); var i = buffer.content_modalities.indexOf(gmail_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "GMail"); -var gmail_re = build_url_regex($domain = "mail.google", - $path = new RegExp('(?!support)')); -auto_mode_list.push([gmail_re, gmail_mode]); +page_mode_activate(gmail_mode); provide("gmail"); diff --git a/modules/page-modes/gmane.js b/modules/page-modes/gmane.js index 7031dab..c60f4ee 100644 --- a/modules/page-modes/gmane.js +++ b/modules/page-modes/gmane.js @@ -68,21 +68,18 @@ var gmane_modality = { normal: gmane_keymap }; - -define_page_mode("gmane_mode", - $enable = function (buffer) { +define_page_mode("gmane-mode", + build_url_regex($domain = /(news|thread)\.gmane/, $tlds = ["org"]), + function enable (buffer) { buffer.content_modalities.push(gmane_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(gmane_modality); if (i > -1) buffer.content_modalities.splice(i, 1); }, $display_name = "Gmane"); - -let (re = build_url_regex($domain = /(news|thread)\.gmane/, $tlds = ["org"])) { - auto_mode_list.push([re, gmane_mode]); -} +page_mode_activate(gmane_mode); provide("gmane"); diff --git a/modules/page-modes/google-calendar.js b/modules/page-modes/google-calendar.js index 41646fe..195dcdc 100644 --- a/modules/page-modes/google-calendar.js +++ b/modules/page-modes/google-calendar.js @@ -38,22 +38,20 @@ var google_calendar_modality = { normal: google_calendar_keymap }; - -define_page_mode("google_calendar_mode", - $display_name = "Google Calendar", - $enable = function (buffer) { +define_page_mode("google-calendar-mode", + build_url_regex($domain = "google", + $path = "calendar/", + $allow_www = true), + function enable (buffer) { buffer.content_modalities.push(google_calendar_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(google_calendar_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "Google Calendar"); -let (re = build_url_regex($domain = "google", - $path = "calendar/", - $allow_www = true)) { - auto_mode_list.push([re, google_calendar_mode]); -} +page_mode_activate(google_calendar_mode); provide("google-calendar"); diff --git a/modules/page-modes/google-gqueues.js b/modules/page-modes/google-gqueues.js index 837ac19..486ebc7 100644 --- a/modules/page-modes/google-gqueues.js +++ b/modules/page-modes/google-gqueues.js @@ -46,20 +46,20 @@ var google_gqueues_modality = { normal: google_gqueues_keymap }; -define_page_mode("google_gqueues_mode", - $display_name = "Google GQueues", - $enable = function (buffer) { +define_page_mode("google-gqueues-mode", + build_url_regex($domain = "gqueues", + $allow_www = true, + $path = "main"), + function enable (buffer) { buffer.content_modalities.push(google_gqueues_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(google_gqueues_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "Google GQueues"); -var google_gqueues_re = build_url_regex($domain = "gqueues", - $allow_www = true, - $path = "main"); -auto_mode_list.push([google_gqueues_re, google_gqueues_mode]); +page_mode_activate("google_gqueues_mode"); provide("google-gqueues"); diff --git a/modules/page-modes/google-images.js b/modules/page-modes/google-images.js index ad8c0e0..e4a4885 100644 --- a/modules/page-modes/google-images.js +++ b/modules/page-modes/google-images.js @@ -62,9 +62,9 @@ define_browser_object_class("google-images-imgurl", null, yield co_return(u); }); -define_page_mode("google_images_mode", - $display_name = "Google Images", - $enable = function (buffer) { +define_page_mode("google-images-mode", + build_url_regex($domain = /(.*\.)?google/, $path = "images"), + function enable (buffer) { for each (var c in google_images_imgrefurl_commands) { buffer.default_browser_object_classes[c] = browser_object_google_images_imgrefurl; @@ -73,12 +73,10 @@ define_page_mode("google_images_mode", buffer.default_browser_object_classes[c] = browser_object_google_images_imgurl; } - }); - + }, + function disable (buffer) {}, + $display_name = "Google Images"); -let (rx = build_url_regex($domain = /(.*\.)?google/, - $path = "images")) { - auto_mode_list.push([rx, google_images_mode]); -}; +page_mode_activate(google_images_mode); provide("google-images"); diff --git a/modules/page-modes/google-maps.js b/modules/page-modes/google-maps.js index 74efd65..1ee91d0 100644 --- a/modules/page-modes/google-maps.js +++ b/modules/page-modes/google-maps.js @@ -76,18 +76,18 @@ var google_maps_modality = { normal: google_maps_keymap }; -define_page_mode("google_maps_mode", - $display_name = "Google Maps", - $enable = function (buffer) { +define_page_mode("google-maps-mode", + build_url_regex($domain = "maps.google"), + function enable (buffer) { buffer.content_modalities.push(google_maps_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(google_maps_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "Google Maps"); -var google_maps_re = build_url_regex($domain = "maps.google"); -auto_mode_list.push([google_maps_re, google_maps_mode]); +page_mode_activate(google_maps_mode); provide("google-maps"); diff --git a/modules/page-modes/google-reader.js b/modules/page-modes/google-reader.js index 2eb4124..2046785 100644 --- a/modules/page-modes/google-reader.js +++ b/modules/page-modes/google-reader.js @@ -56,21 +56,21 @@ var google_reader_modality = { normal: google_reader_keymap }; -define_page_mode("google_reader_mode", - $display_name = "Google Reader", - $enable = function (buffer) { +define_page_mode("google-reader-mode", + build_url_regex($domain = "google", + $tlds = ["com", "co.uk"], + $allow_www = true, + $path = "reader/"), + function enable (buffer) { buffer.content_modalities.push(google_reader_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(google_reader_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "Google Reader"); -var google_reader_re = build_url_regex($domain = "google", - $tlds = ["com", "co.uk"], - $allow_www = true, - $path = "reader/"); -auto_mode_list.push([google_reader_re, google_reader_mode]); +page_mode_activate(google_reader_mode); provide("google-reader"); diff --git a/modules/page-modes/google-search-results.js b/modules/page-modes/google-search-results.js index b6b7bf0..1b939ab 100644 --- a/modules/page-modes/google-search-results.js +++ b/modules/page-modes/google-search-results.js @@ -59,9 +59,13 @@ var google_search_results_modality = { }; -define_page_mode("google_search_results_mode", - $display_name = "Google Search Results", - $enable = function (buffer) { +define_page_mode("google-search-results-mode", + build_url_regex($domain = "google", + $allow_www = true, + $path = /search\?|cse\?/, + $tlds = ["com", "com.au", "co.uk", "de", "dk", "es", + "fr", "it", "no", "se", "uk"]), + function enable (buffer) { var link_using_commands = ["follow", "follow-new-buffer", "follow-new-buffer-background", @@ -74,19 +78,13 @@ define_page_mode("google_search_results_mode", browser_object_google_search_results_links; buffer.content_modalities.push(google_search_results_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(google_search_results_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "Google Search Results"); -let (google_search_re = build_url_regex( - $domain = "google", - $allow_www = true, - $path = /search\?|cse\?/, - $tlds = ["com", "com.au", "co.uk", "de", "dk", "es", - "fr", "it", "no", "se", "uk"])) { - auto_mode_list.push([google_search_re, google_search_results_mode]); -} +page_mode_activate(google_search_results_mode); provide("google-search-results"); diff --git a/modules/page-modes/google-video.js b/modules/page-modes/google-video.js index 0946dbb..d8191c0 100644 --- a/modules/page-modes/google-video.js +++ b/modules/page-modes/google-video.js @@ -47,14 +47,15 @@ function media_scrape_google_video(buffer, results) { } -define_page_mode("google_video_mode", - $display_name = "Google Video", - $enable = function (buffer) { +define_page_mode("google-video-mode", + build_url_regex($domain = "video.google"), + function enable (buffer) { buffer.page.local.media_scraper = [media_scrape_google_video]; media_setup_local_object_classes(buffer); - }); + }, + function disable (buffer) {}, + $display_name = "Google Video"); -var google_video_re = build_url_regex($domain = "video.google"); -auto_mode_list.push([google_video_re, google_video_mode]); +page_mode_activate(google_video_mode); provide("google-video"); diff --git a/modules/page-modes/google-voice.js b/modules/page-modes/google-voice.js index c6a18b4..c543247 100644 --- a/modules/page-modes/google-voice.js +++ b/modules/page-modes/google-voice.js @@ -47,20 +47,20 @@ var google_voice_modality = { }; -define_page_mode("google_voice_mode", - $display_name = "Google Voice", - $enable = function (buffer) { +define_page_mode("google-voice-mode", + build_url_regex($domain = "google", + $allow_www = true, + $path = "voice"), + function enable (buffer) { buffer.content_modalities.push(google_voice_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(google_voice_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "Google Voice"); -var google_voice_re = build_url_regex($domain = "google", - $allow_www = true, - $path = "voice"); -auto_mode_list.push([google_voice_re, google_voice_mode]); +page_mode_activate(google_voice_mode); provide("google-voice"); diff --git a/modules/page-modes/reddit.js b/modules/page-modes/reddit.js index beea815..dfece39 100644 --- a/modules/page-modes/reddit.js +++ b/modules/page-modes/reddit.js @@ -261,9 +261,9 @@ var reddit_modality = { }; -define_page_mode("reddit_mode", - $display_name = "reddit", - $enable = function (buffer) { +define_page_mode("reddit-mode", + build_url_regex($domain = /([a-zA-Z0-9\-]*\.)*reddit/), + function enable (buffer) { let (cmds = ["follow-current", "follow-current-new-buffer", "follow-current-new-buffer-background", @@ -276,15 +276,14 @@ define_page_mode("reddit_mode", } buffer.content_modalities.push(reddit_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(reddit_modality); if (i > -1) buffer.content_modalities.splice(i, 1); }, + $display_name = "reddit", $doc = "reddit page-mode: keyboard navigation for reddit."); -let (re = build_url_regex($domain = /([a-zA-Z0-9\-]*\.)*reddit/)) { - auto_mode_list.push([re, reddit_mode]); -}; +page_mode_activate(reddit_mode); provide("reddit"); diff --git a/modules/page-modes/stackexchange.js b/modules/page-modes/stackexchange.js index a51ca30..d905509 100644 --- a/modules/page-modes/stackexchange.js +++ b/modules/page-modes/stackexchange.js @@ -68,18 +68,18 @@ var stackexchange_modality = { }; -define_page_mode("stackexchange_mode", - $display_name = "StackExchange", - $enable = function (buffer) { +define_page_mode("stackexchange-mode", + /^https?:\/\/(?:www.|meta.)?(stackoverflow|serverfault|superuser|stackapps)\.(?:com)\//, + function enable (buffer) { buffer.content_modalities.push(stackexchange_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(stackexchange_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "StackExchange"); -auto_mode_list.push([/^https?:\/\/(?:www.|meta.)?(stackoverflow|serverfault|superuser|stackapps)\.(?:com)\//, - stackexchange_mode]); +page_mode_activate(stackexchange_mode); provide("stackexchange"); diff --git a/modules/page-modes/twitter.js b/modules/page-modes/twitter.js index 41f2b50..cc823a6 100644 --- a/modules/page-modes/twitter.js +++ b/modules/page-modes/twitter.js @@ -44,20 +44,19 @@ var twitter_modality = { normal: twitter_keymap }; -define_page_mode("twitter_mode", - $display_name = "Twitter", - $enable = function (buffer) { +define_page_mode("twitter-mode", + build_url_regex($domain = "twitter", + $allow_www = true), + function enable (buffer) { buffer.content_modalities.push(twitter_modality); }, - $disable = function (buffer) { + function disable (buffer) { var i = buffer.content_modalities.indexOf(twitter_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); + }, + $display_name = "Twitter"); -let (re = build_url_regex($domain = "twitter", - $allow_www = true)) { - auto_mode_list.push([re, twitter_mode]); -} +page_mode_activate(twitter_mode); provide("twitter"); diff --git a/modules/page-modes/wikipedia.js b/modules/page-modes/wikipedia.js index a4f89a8..747a795 100644 --- a/modules/page-modes/wikipedia.js +++ b/modules/page-modes/wikipedia.js @@ -134,26 +134,24 @@ var wikipedia_modality = { /*** MAIN LOADING FUNCTIONALITY ***/ -define_page_mode("wikipedia_mode", - $display_name = "Wikipedia", - $enable = function (buffer) { +define_page_mode("wikipedia-mode", + /wikipedia/, // TODO: Better regular expression + function enable (buffer) { if (wikipedia_enable_didyoumean) { do_when("buffer_dom_content_loaded_hook", buffer, wikipedia_didyoumean); } buffer.page.local.headings_xpath = '//h1[@id="firstHeading"] | //span[@class="mw-headline"] | //div[@id="toctitle"]'; buffer.content_modalities.push(wikipedia_modality); }, - $disable = function (buffer) { + function disable (buffer) { remove_hook.call(buffer, "buffer_dom_content_loaded_hook", wikipedia_didyoumean); var i = buffer.content_modalities.indexOf(wikipedia_modality); if (i > -1) buffer.content_modalities.splice(i, 1); - }); - -let (wikipedia_mode_re = /wikipedia/) { // TODO: Better regular expression - auto_mode_list.push([wikipedia_mode_re, wikipedia_mode]); -} + }, + $display_name = "Wikipedia"); +page_mode_activate(wikipedia_mode); /*** HERE BE DRAGONS ***/ /* No, here is really just "data" which is cumbersome to scroll through. */ diff --git a/modules/page-modes/xkcd.js b/modules/page-modes/xkcd.js index c521fc7..eb44841 100644 --- a/modules/page-modes/xkcd.js +++ b/modules/page-modes/xkcd.js @@ -43,9 +43,12 @@ function xkcd_do_add_title (buffer) { img.parentNode.insertBefore(span, node.nextSibling); } -define_page_mode("xkcd_mode", - $display_name = "XKCD", - $enable = function (buffer) { +define_page_mode("xkcd-mode", + build_url_regex($domain = "xkcd", + $allow_www = true, + $tlds = ["com", "net", "org"], + $path = /(\d+\/)?/), + function enable (buffer) { if (xkcd_add_title) { if (buffer.browser.webProgress.isLoadingDocument) add_hook.call(buffer, "buffer_loaded_hook", xkcd_do_add_title); @@ -58,19 +61,15 @@ define_page_mode("xkcd_mode", buffer.page.local.browser_relationship_patterns[RELATIONSHIP_PREVIOUS] = [new RegExp("\\bprev","i")]; }, - // When we disable the mode, remove the - $disable = function (buffer) { + function disable (buffer) { remove_hook.call(buffer, "buffer_loaded_hook", xkcd_do_add_title); + // When we disable the mode, remove the var span = buffer.document.getElementById('conkeror:xkcd-title-text'); if (span) span.parentNode.removeChild(span); - }); + }, + $display_name = "XKCD"); -let (re = build_url_regex($domain = "xkcd", - $allow_www = true, - $tlds = ["com", "net", "org"], - $path = /(\d+\/)?/)) { - auto_mode_list.push([re, xkcd_mode]); -} +page_mode_activate(xkcd_mode); provide("xkcd"); diff --git a/modules/page-modes/youtube.js b/modules/page-modes/youtube.js index a8c80c7..bfbf60e 100644 --- a/modules/page-modes/youtube.js +++ b/modules/page-modes/youtube.js @@ -84,19 +84,13 @@ function youtube_scrape_text (results, frame, url, id, text) { function youtube_scrape_buffer (buffer, results) { var url = buffer.current_uri.spec; - var id = regexp_exec(youtube_uri_regexp, url, 1); + var id = regexp_exec(youtube_mode.test, url, 1); if (! id) yield co_return(); var text = buffer.document.documentElement.innerHTML; yield youtube_scrape_text(results, buffer.top_frame, url, id, text); } -define_page_mode("youtube_mode", - $display_name = "YouTube", - $enable = function (buffer) { - media_setup_local_object_classes(buffer); - }); - function youtube_scrape_embedded (buffer, results) { const embedded_youtube_regexp = /^http:\/\/[a-zA-Z0-9\-.]+\.youtube\.com\/v\/([^?]*).*$/; for (let frame in frame_iterator(buffer.top_frame, buffer.focused_frame)) { @@ -136,11 +130,18 @@ function youtube_scrape_embedded (buffer, results) { } } +define_page_mode("youtube-mode", + build_url_regex($domain = /(?:[a-z]+\.)?youtube/, + $path = /watch\?(?:.*?&)?v=([A-Za-z0-9\-_]+)/), + function enable (buffer) { + media_setup_local_object_classes(buffer); + }, + function disable (buffer) {}, //FIXME: uninstall scraper + $display_name = "YouTube"); + +page_mode_activate(youtube_mode); -let youtube_uri_regexp = build_url_regex($domain = /(?:[a-z]+\.)?youtube/, - $path = /watch\?(?:.*?&)?v=([A-Za-z0-9\-_]+)/); media_scrapers.unshift([/.*/, youtube_scrape_embedded]); -media_scrapers.unshift([youtube_uri_regexp, youtube_scrape_buffer]); -auto_mode_list.push([youtube_uri_regexp, youtube_mode]); +media_scrapers.unshift([youtube_mode.test, youtube_scrape_buffer]); provide("youtube"); diff --git a/modules/quote.js b/modules/quote.js index 117906e..2fb44b7 100644 --- a/modules/quote.js +++ b/modules/quote.js @@ -8,33 +8,33 @@ in_module(null); -define_buffer_mode('quote_next_mode', - $display_name = 'QUOTE-NEXT', - $enable = function (buffer) { +define_buffer_mode("quote-next-mode", + function enable (buffer) { buffer.override_keymaps([quote_next_keymap]); }, - $disable = function (buffer) { + function disable (buffer) { buffer.override_keymaps(); }, + $display_name = "QUOTE-NEXT", $doc = "This mode sends the next key combo to the buffer, bypassing "+ "normal key handling. It disengages after one key combo."); interactive("quote-next-mode-disable", "Disable quote-next-mode.", function (I) { - quote_next_mode(I.buffer, false); + quote_next_mode.disable(I.buffer); I.buffer.set_input_mode(); }); -define_buffer_mode('quote_mode', - $display_name = 'QUOTE', - $enable = function (buffer) { +define_buffer_mode("quote-mode", + function enable (buffer) { buffer.override_keymaps([quote_keymap]); }, - $disable = function (buffer) { + function disable (buffer) { buffer.override_keymaps(); }, + $display_name = "QUOTE", $doc = "This mode sends all key combos to the buffer, "+ "bypassing normal key handling, until the escape "+ "key is pressed."); @@ -43,7 +43,7 @@ define_buffer_mode('quote_mode', interactive("quote-mode-disable", "Disable quote-mode.", function (I) { - quote_mode(I.buffer, false); + quote_mode.disable(I.buffer); I.buffer.set_input_mode(); }); -- 2.11.4.GIT