From bf5797207fffdb47714d91282d5ce314314e65f6 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Thu, 22 Jan 2015 05:08:39 +0000 Subject: Visual/edit modes: consolidate both modes in a single file. These modes turn out to be almost identical. So they're better off in a single file. --- content_scripts/mode_edit.coffee | 37 --------- content_scripts/mode_movement.coffee | 75 ------------------ content_scripts/mode_visual.coffee | 26 ------- content_scripts/mode_visual_edit.coffee | 133 ++++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+), 138 deletions(-) delete mode 100644 content_scripts/mode_edit.coffee delete mode 100644 content_scripts/mode_movement.coffee delete mode 100644 content_scripts/mode_visual.coffee create mode 100644 content_scripts/mode_visual_edit.coffee (limited to 'content_scripts') diff --git a/content_scripts/mode_edit.coffee b/content_scripts/mode_edit.coffee deleted file mode 100644 index 0b17044a..00000000 --- a/content_scripts/mode_edit.coffee +++ /dev/null @@ -1,37 +0,0 @@ - -class EditMode extends Movement - @activeElements = [] - - constructor: (options = {}) -> - defaults = - name: "edit" - exitOnEscape: true - alterMethod: "move" - keydown: (event) => if @isActive() then @handleKeydown event else @continueBubbling - keypress: (event) => if @isActive() then @handleKeypress event else @continueBubbling - keyup: (event) => if @isActive() then @handleKeyup event else @continueBubbling - - @element = document.activeElement - if @element and DomUtils.isEditable @element - super extend defaults, options - - handleKeydown: (event) -> - @stopBubblingAndTrue - handleKeypress: (event) -> - @suppressEvent - handleKeyup: (event) -> - @stopBubblingAndTrue - - isActive: -> - document.activeElement and DomUtils.isDOMDescendant @element, document.activeElement - - exit: (event, target) -> - super() - @element.blur() if target? and DomUtils.isDOMDescendant @element, target - EditMode.activeElements = EditMode.activeElements.filter (element) => element != @element - - updateBadge: (badge) -> - badge.badge = "E" if @isActive() - -root = exports ? window -root.EditMode = EditMode diff --git a/content_scripts/mode_movement.coffee b/content_scripts/mode_movement.coffee deleted file mode 100644 index 5f35449c..00000000 --- a/content_scripts/mode_movement.coffee +++ /dev/null @@ -1,75 +0,0 @@ - -# This prevents unmapped printable characters from being passed through to underlying page. -class SuppressPrintable extends Mode - constructor: (options) -> - - handler = (event) => - if KeyboardUtils.isPrintable event - if event.type == "keydown" - DomUtils. suppressPropagation - @stopBubblingAndTrue - else - @suppressEvent - else - @stopBubblingAndTrue - - @suppressPrintableHandlerId = handlerStack.push - _name: "movement/suppress-printable" - keydown: handler - keypress: handler - keyup: handler - - super options - @onExit => handlerStack.remove @suppressPrintableHandlerId - -# This watches keyboard events, and maintains @countPrefix as count-prefic and other keys are pressed. -class MaintainCount extends SuppressPrintable - constructor: (options) -> - @countPrefix = "" - super options - - isNumberKey = (keyChar) -> - keyChar and keyChar.length == 1 and "0" <= keyChar <= "9" - - @push - _name: "movement/maintain-count" - keypress: (event) => - @alwaysContinueBubbling => - unless event.metaKey or event.ctrlKey or event.altKey - keyChar = String.fromCharCode event.charCode - @countPrefix = if isNumberKey keyChar then @countPrefix + keyChar else "" - - countPrefixTimes: (func) -> - countPrefix = if 0 < @countPrefix.length then parseInt @countPrefix else 1 - @countPrefix = "" - func() for [0...countPrefix] - -# This implements movement commands with count prefixes (using MaintainCount) for visual and edit modes. -class Movement extends MaintainCount - movements: - h: "backward character" - l: "forward character" - k: "backward line" - j: "forward line" - b: "backward word" - e: "forward word" - - constructor: (options) -> - @alterMethod = options.alterMethod || "extend" - super options - - @push - _name: "movement" - keypress: (event) => - @alwaysContinueBubbling => - unless event.metaKey or event.ctrlKey or event.altKey - keyChar = String.fromCharCode event.charCode - if @movements[keyChar] - @countPrefixTimes => - if "string" == typeof @movements[keyChar] - window.getSelection().modify @alterMethod, @movements[keyChar].split(/\s+/)... - else if "function" == typeof @movements[keyChar] - @movements[keyChar]() - -root = exports ? window -root.Movement = Movement diff --git a/content_scripts/mode_visual.coffee b/content_scripts/mode_visual.coffee deleted file mode 100644 index 64463a67..00000000 --- a/content_scripts/mode_visual.coffee +++ /dev/null @@ -1,26 +0,0 @@ - -class VisualMode extends Movement - constructor: (options = {}) -> - defaults = - name: "visual" - badge: "V" - exitOnEscape: true - exitOnBlur: options.targetElement - alterMethod: "extend" - - keypress: (event) => - @alwaysContinueBubbling => - unless event.metaKey or event.ctrlKey or event.altKey - switch String.fromCharCode event.charCode - when "y" - chrome.runtime.sendMessage - handler: "copyToClipboard" - data: window.getSelection().toString() - @exit() - # TODO(smblott). Suppress next keyup. - - super extend defaults, options - @debug = true - -root = exports ? window -root.VisualMode = VisualMode diff --git a/content_scripts/mode_visual_edit.coffee b/content_scripts/mode_visual_edit.coffee new file mode 100644 index 00000000..3a8f5839 --- /dev/null +++ b/content_scripts/mode_visual_edit.coffee @@ -0,0 +1,133 @@ + +# This prevents unmapped printable characters from being passed through to underlying page. +class SuppressPrintable extends Mode + constructor: (options) -> + + handler = (event) => + if KeyboardUtils.isPrintable event + if event.type == "keydown" + DomUtils. suppressPropagation + @stopBubblingAndTrue + else + @suppressEvent + else + @stopBubblingAndTrue + + @suppressPrintableHandlerId = handlerStack.push + _name: "movement/suppress-printable" + keydown: handler + keypress: handler + keyup: handler + + super options + @onExit => handlerStack.remove @suppressPrintableHandlerId + +# This watches keyboard events, and maintains @countPrefix as count-prefic and other keys are pressed. +class MaintainCount extends SuppressPrintable + constructor: (options) -> + @countPrefix = "" + super options + + isNumberKey = (keyChar) -> + keyChar and keyChar.length == 1 and "0" <= keyChar <= "9" + + @push + _name: "movement/maintain-count" + keypress: (event) => + @alwaysContinueBubbling => + unless event.metaKey or event.ctrlKey or event.altKey + keyChar = String.fromCharCode event.charCode + @countPrefix = if isNumberKey keyChar then @countPrefix + keyChar else "" + + countPrefixTimes: (func) -> + countPrefix = if 0 < @countPrefix.length then parseInt @countPrefix else 1 + @countPrefix = "" + func() for [0...countPrefix] + +# This implements movement commands with count prefixes (using MaintainCount) for visual and edit modes. +class Movement extends MaintainCount + movements: + h: "backward character" + l: "forward character" + k: "backward line" + j: "forward line" + b: "backward word" + e: "forward word" + + constructor: (options) -> + @alterMethod = options.alterMethod || "extend" + super options + + @push + _name: "movement" + keypress: (event) => + @alwaysContinueBubbling => + unless event.metaKey or event.ctrlKey or event.altKey + keyChar = String.fromCharCode event.charCode + if @movements[keyChar] + @countPrefixTimes => + if "string" == typeof @movements[keyChar] + window.getSelection().modify @alterMethod, @movements[keyChar].split(/\s+/)... + else if "function" == typeof @movements[keyChar] + @movements[keyChar]() + +class VisualMode extends Movement + constructor: (options = {}) -> + defaults = + name: "visual" + badge: "V" + exitOnEscape: true + exitOnBlur: options.targetElement + alterMethod: "extend" + + keypress: (event) => + @alwaysContinueBubbling => + unless event.metaKey or event.ctrlKey or event.altKey + switch String.fromCharCode event.charCode + when "y" + chrome.runtime.sendMessage + handler: "copyToClipboard" + data: window.getSelection().toString() + @exit() + # TODO(smblott). Suppress next keyup. + + super extend defaults, options + @debug = true + +class EditMode extends Movement + @activeElements = [] + + constructor: (options = {}) -> + defaults = + name: "edit" + exitOnEscape: true + alterMethod: "move" + keydown: (event) => if @isActive() then @handleKeydown event else @continueBubbling + keypress: (event) => if @isActive() then @handleKeypress event else @continueBubbling + keyup: (event) => if @isActive() then @handleKeyup event else @continueBubbling + + @element = document.activeElement + if @element and DomUtils.isEditable @element + super extend defaults, options + + handleKeydown: (event) -> + @stopBubblingAndTrue + handleKeypress: (event) -> + @suppressEvent + handleKeyup: (event) -> + @stopBubblingAndTrue + + isActive: -> + document.activeElement and DomUtils.isDOMDescendant @element, document.activeElement + + exit: (event, target) -> + super() + @element.blur() if target? and DomUtils.isDOMDescendant @element, target + EditMode.activeElements = EditMode.activeElements.filter (element) => element != @element + + updateBadge: (badge) -> + badge.badge = "E" if @isActive() + +root = exports ? window +root.VisualMode = VisualMode +root.EditMode = EditMode -- cgit v1.2.3