// PLUGIN_INFO//{{{ var PLUGIN_INFO = {NAME} browser act scenario semi-automatic. hogelog 0.0.6 2.0a2 http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/scenario-actor.js || // hatena sample javascript <|| action: {and: [ {sleep: 5000}, {follow: '//a[@rel="prev"]'}, ]} ||< is syntax-sugar of >|| action: [{and: [ {sleep: [5000]}, {follow: ['//a[@rel="prev"]']}, ]}] ||< and action expressions are quoted by {begin: ...}. == TODO == - write more examples. - add more functions. - fix bugs. - a lot. ]]> ; //}}} (function() { const debugMode = true; const VariablesName = 'ScenarioActorVariables'; const VariablesLabelID = 'ScenarioActorVariablesLabelID'; let SCENARIO_DIR = liberator.globalVariables.scenarioDir || 'scenario'; var libly = liberator.plugins.libly; var $U = libly.$U; var logger = $U.getLogger('scenario-actor'); function ScenarioActor () { //{{{ let variables = storage.newMap('scenarioactor', true); function ScenarioContext(event) { //{{{ let triggeredEvent = event; let win = (event.target.contentDocument||event.target).defaultView; let self = { glet: function (name, value) { if((typeof name)!='string') throw [name, value]; variables.set(name, self.eval(value)); return value; }, gvar: function (name) { if((typeof name)!='string') throw [name, value]; return variables.get(name); }, begin: function () { let lastValue; for(let i=0,len=arguments.length;i/* * ==VimperatorPlugin== * @name highlight.js * @description Factory for the object to highlight specified element[s]. this set in plugins.highlighterFactory. * @description-ja 指定した要素をハイライトするオブジェクトを返す Factory 。 plugins.highlighterFactory に構築される。 * @author janus_wel <janus_wel@fb3.so-net.ne.jp> * @version 0.11 * @minversion 2.0pre 2008/10/16 * ==/VimperatorPlugin== * * LICENSE * New BSD License * * USAGE * plugins.highlighterFactory() return the object to highlight element[s]. * arguments is object that have below properties. * color: color name that define by css or RGB format ( #xxxxxx ), * opacity: opacity for -moz-opacity property in css. * interval: interval to blink ( unit: msec ). if 0 specified, not blink. * * returned object has 3 methods. * set: setter that accept object have above properties. * highlight: method to highlight specified element. * unhighlightAll: unhighlight all. * * highlight is implement by "div" element that have style "position: absolute;". * it has class name "vimp_plugin_highlightelement", so you should use buffer.evaluateXPath * with query that like '//div[contains(concat(" ", @class, " "), " vimp_plugin_highlightelement ")]' * when you want to process elements to highlight. * * EXAMPLE * let h = plugins.highlighterFactory({ * color: '#0080ff', * opacity: 0.7, * interval: 0, * ); * h.highlight(content.document.getElementsByTagName('A')); * h.unhighlightAll(); * * TODO * need valid English. * */ ( function () { const fixedStyle = [ 'position: absolute;', 'display: block;', 'z-index: 2147483647;', ].join(''); // class definition function Highlighter() { this._initialize.apply(this, arguments); } Highlighter.prototype = { _initialize: function (args) { if (args) this.set(args); this.highlightList = []; }, set: function (args) { this.color = args.color; this.opacity = args.opacity; this.interval = args.interval; this._prepareTemplate(); return this; }, _prepareTemplate: function () { let div = window.document.createElement('div'); div.className = 'vimp_plugin_highlightelement'; let style = fixedStyle + [ 'background-color: ' + this.color + ';', '-moz-opacity: ' + this.opacity + ';' ].join(''); div.setAttribute('style', style); this._highlightTemplate = div; }, highlight: function (element) { if (!this._isDisplay(element)) return; let doc = element.ownerDocument; // TODO: highlight XUL elements if (!doc.body) return; let scrollX = doc.defaultView.scrollX; let scrollY = doc.defaultView.scrollY; let rects = element.getClientRects(); for (let i=0, l=rects.length ; i<l ; ++i) { let r = rects[i]; let h = this._buildHighlighter({ top: r.top + scrollY, left: r.left + scrollX, width: r.right - r.left, height: r.bottom - r.top, }); this.highlightList.push(h); doc.body.appendChild(h); } }, _unhighlight: function (element) { if (element.intervalId) clearInterval(element.intervalId); element.parentNode.removeChild(element); }, unhighlightAll: function () { let list = this.highlightList; while (list.length) this._unhighlight(list.pop()); }, _isDisplay: function (element) { let computedStyle = content.document.defaultView.getComputedStyle(element, null); return ( computedStyle.getPropertyValue('visibility') !== 'hidden' && computedStyle.getPropertyValue('display') !== 'none'); }, _buildHighlighter: function (rect) { let div = this._highlightTemplate.cloneNode(false); div.style.top = rect.top + 'px'; div.style.left = rect.left + 'px'; div.style.width = rect.width + 'px'; div.style.height = rect.height + 'px'; if (this.interval > 0) { div.intervalId = setInterval( function () { let d = div.style.display; div.style.display = (d === 'block' ? 'none' : 'block'); }, this.interval ); } else { div.intervalId = undefined; } return div; }, }; if (!plugins.highlighterFactory) { plugins.highlighterFactory = function () { let h = new Highlighter(); return h.set.apply(h, arguments); } } } )(); // vim: set sw=4 ts=4 et;