From 9f73f73cd2f1f7f659173325dea4e7dfbf5e556d Mon Sep 17 00:00:00 2001 From: janus_wel Date: Wed, 14 Jan 2009 13:19:43 +0000 Subject: refactoring. add license text. add PLUGIN_INFO git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28416 d0d07461-0603-4401-acd4-de1884942a52 --- googledocs.js | 213 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 152 insertions(+), 61 deletions(-) (limited to 'googledocs.js') diff --git a/googledocs.js b/googledocs.js index ddf51a4..e4fb0fe 100644 --- a/googledocs.js +++ b/googledocs.js @@ -1,82 +1,173 @@ /* - * ==VimperatorPlugin== - * @name googledocs.js - * @description extended-hints modes for Google Docs. - * @description-ja Google Docs 用 extended-hints mode 詰め合わせ。 - * @author janus_wel - * @version 0.10 - * @minversion 2.0pre - * @maxversion 2.0pre - * ==/VimperatorPlugin== - * * LICENSE - * New BSD License + * New BSD License: http://opensource.org/licenses/bsd-license.php + * + * Copyright (c) 2008-2009, janus_wel + * All rights reserved. * - * USAGE - * hit ';d' on top-page of Google Docs: in default setting. - * setting is available to change the variable 'googledocs_mapping' + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: * - * let googledocs_mapping='g' + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * * Neither the name of the nor the names of its + * contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. * */ +// Last Change: 2009/01/14 22:14:16. +let PLUGIN_INFO = + + {NAME} + provide extended-hints modes for Google Docs + Google Docs 用 extended-hints mode 詰め合わせ + janus_wel + New BSD License + 0.20 + 2.0pre + 2.0pre + http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/googledocs.js + || +let googledocs_mapping='g' +||< + ]]> + || +let googledocs_mapping='g' +||< + ]]> +; + + ( function () { + +// configuration --- +// enumerate clickable div and span classes +// plz FOLLOW latest edition of Google Docs +const divClasses = [ + 'goog-listitem-content', + 'goog-listheaderitem-content', + 'goog-toolbar-button', + 'goog-toolbar-popup-button', + 'goog-toolbar-menu-button', + 'detroit-menuitem', +]; +const spanClasses = [ + 'goog-listheaderitem-zippy', + 'actionstatusbox-undo', +]; + +// build XPath expression +function classXPath(c) 'contains(concat(" ", @class, " "), " ' + c + ' ")'; +const divXpath = '//div[' + divClasses.map(classXPath).join(' or ') + ']'; +const spanXpath = '//span[' + spanClasses.map(classXPath).join(' or ') + ']'; +const clickableXPath = [divXpath, spanXpath].join(' | '); + + +// main --- +// add extended-hints mode for buttons of Google Docs hints.addMode( liberator.globalVariables.googledocs_mapping || 'd', 'operate Google Docs', function (element) { - if (element.localName.toLowerCase() === 'div') { - let mousedown = document.createEvent('MouseEvent'); - mousedown.initMouseEvent( - 'mousedown', true, true, - window.content.document.defaultView, 1, - 0, 0, 0, 0, - false, false, false, false, - 0, null - ); - let mouseup = document.createEvent('MouseEvent'); - mouseup.initMouseEvent( - 'mouseup', true, true, - window.content.document.defaultView, 1, - 0, 0, 0, 0, - false, false, false, false, - 0, null - ); - element.dispatchEvent(mousedown); - element.dispatchEvent(mouseup); - } - else { - let click = document.createEvent('MouseEvent'); - click.initMouseEvent( - 'click', true, true, - window.content.document.defaultView, 1, - 0, 0, 0, 0, - false, false, false, false, - 0, null - ); - element.dispatchEvent(click); + let d = window.content.document; + let v = d.defaultView; + switch (element.localName.toLowerCase()) { + case 'div': + mouseDown(element, d, v); + mouseUp(element, d, v); + break; + case 'span': + mouseClick(element, d, v); + break; + default: + break; } }, function () { if (!/^https?:\/\/docs\.google\.com\//.test(buffer.URL)) return; - const divClassNames = [ - 'goog-listitem-content', - 'goog-listheaderitem-content', - 'goog-toolbar-button', - 'goog-toolbar-popup-button', - 'goog-toolbar-menu-button', - 'detroit-menuitem', - ].map(function (c) 'contains(concat(" ", @class, " "), " ' + c + ' ")').join(' or '); - const spanClassNames = [ - 'goog-listheaderitem-zippy', - 'actionstatusbox-undo', - ].map(function (c) 'contains(concat(" ", @class, " "), " ' + c + ' ")').join(' or '); - return [ - '//div[' + divClassNames + ']', - '//span[' + spanClassNames + ']', - ].join(' | '); + return clickableXPath; } ); + +// stuff --- +function mouseDown(target, document, view) { + let mousedown = document.createEvent('MouseEvent'); + mousedown.initMouseEvent( + 'mousedown', true, true, + view, 1, + 0, 0, 0, 0, + false, false, false, false, + 0, null + ); + target.dispatchEvent(mousedown); + + return true; +} +function mouseUp(target, document, view) { + let mouseup = document.createEvent('MouseEvent'); + mouseup.initMouseEvent( + 'mouseup', true, true, + view, 1, + 0, 0, 0, 0, + false, false, false, false, + 0, null + ); + target.dispatchEvent(mouseup); + + return true; +} +function mouseClick(target, document, view) { + let click = document.createEvent('MouseEvent'); + click.initMouseEvent( + 'click', true, true, + view, 1, + 0, 0, 0, 0, + false, false, false, false, + 0, null + ); + target.dispatchEvent(click); + + return true; +} } )(); // vim: set sw=4 ts=4 et; -- cgit v1.2.3