From 8f9b86ff7218860b8c10ffcdd7e7a061d9311958 Mon Sep 17 00:00:00 2001 From: janus_wel Date: Sun, 23 Nov 2008 20:58:13 +0000 Subject: cut off Highlighter object to highlight.js. bugfix: the process to compute absolute coordinate. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@24716 d0d07461-0603-4401-acd4-de1884942a52 --- highlight.js | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 highlight.js (limited to 'highlight.js') diff --git a/highlight.js b/highlight.js new file mode 100644 index 0000000..9329ce9 --- /dev/null +++ b/highlight.js @@ -0,0 +1,155 @@ +/* + * ==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 + * @version 0.10 + * @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 = content.document; + let scrollX = doc.defaultView.scrollX; + let scrollY = doc.defaultView.scrollY; + + let rects = element.getClientRects(); + for (let i=0, l=rects.length ; i 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; -- cgit v1.2.3