Skip navigation

Lost password? | Help

My programs for Opera

STICKY POST

Compatibility with Opera 10.5

oGet - new version 2.5.17 is working.
Qsaver - latest version 2.4 is working.
AdBlock - is working. Userjs version very recommended.
GetSize - version 1.3.11 - don't work, because ini-file variables is broken.
FlashBlocker - is working.
Copying text with formatting and images to clipboard - is working.
Thumbnails and sorting in opera:cache - outdated. Similar function added to Opera.
Block images from menu Opera - don't work.

UserJS:
google-translate.js - version 1.7 is working.
bbcode.js - is working.
let-me-see-img.js - latest version is working.
open-in-background-with-long-press.js - is working in Opera 10.6.
block-external-scripts.js - new version is working.

Using jsonp in bookmarklets

, ,

Полезные ссылки

http://javascript.ru/unsorted/bookmarklet - Хорошее введение в предмет.
dean.edwards.name/packer/ - Пакует скрипты, убирая комментарии, пробелы, переносы строк, может укорачивать имена переменных.
Javascript unpacker and beautifier - Выполняет противоположную задачу, "распаковывая" сжатый код.
Javascript Buttonator - Создаёт кнопки для Opera, в том числе и из букмарклетов.

Но сначала о получении выделенного текста

Задача может показаться элементарной, да в сущности она и была таковой, пока в opera 10.5 не удалили объект document.selection. И теперь получить весь выделенный текст, включая input-ы и textarea, стало достаточно проблематично.
Соответствующее стандартам решение предполагает наличие на странице обработчика onFocus и в букмарклете малоприменимо.
Альтернативой могло бы быть использование document.activeElement, но в opera при вызове букмарклета фокус слетает на [object HTMLBodyElement] (хотя в остальных браузерах всё нормально), так что и этот вариант не подходит. Тоже самое относится и к хаку с "textarea:focus" отсюда.
Ну и последний оставшийся вариант, это перебор всех input-ов и textarea и поиск в них выделенного текста. Способ не идеальный, т.к. реальное выделение может оказаться и в другом input-е, но другой альтернативы похоже нет. Приведу код для этого варианта, с поддержкой фреймов:

var getSel = function (w) {
    var s, d = w.document;
    if (d.selection) {
        var r = d.selection.createRange();
        s = r ? r.text : ''
    } else {
        s = d.getSelection();
        if (!s) for (var i = 0, t = d.querySelectorAll('textarea,input'), e; e = t[ i ]; i++) {
            if (s = e.value.substring(e.selectionStart, e.selectionEnd)) break
        }
    };
    if (!s) for (var j = 0, f; f = w.frames[j]; j++) {
        try {
            if (s = arguments.callee(f)) break
        } catch(e) {}
    };
    return s
};

var str = getSel(window);

Собственно, получение информации с другого сайта

Делать кроссдоменные запросы, как таковые, в букмарклете нельзя, но ситуацию спасает то что многие сервисы поддерживают JSONP. Фактически это просто способ получить в ответ на GET-запрос, js-файл содержащий вызов функции с именем заданным в параметре callback и в которую передаётся JSON-объект. Нечто подобное:
showGoogleTranslate({responseStatus: "200"})
После загрузки этот js-файл вызовет предварительно созданную нами на странице функцию showGoogleTranslate и передаст ей объект содержащий нужную информацию. Как видим всё очень просто. И пара примеров для иллюстрации.

Получаем перевод выделенного текста:

javascript: (function () {
	var getSel = function (w) {
		var s, d = w.document;
		if (d.selection) {
			var r = d.selection.createRange();
			s = r ? r.text : ''
		} else {
			s = d.getSelection();
			if (!s) for (var i = 0, t = d.querySelectorAll('textarea,input'), e; e = t[ i ]; i++) {
				if (s = e.value.substring(e.selectionStart, e.selectionEnd)) break
			}
		};
		if (!s) for (var j = 0, f; f = w.frames[j]; j++) {
			try {
				if (s = arguments.callee(f)) break
			} catch(e) {}
		};
		return s
	};
	var txt = encodeURIComponent(getSel(window));
	if (!txt || txt.length > 1900) {
		window.open('http://translate.google.com/translate?u=' + escape(location.href) + '&hl=ru&langpair=auto|ru&tbb=1&ie=' + document.characterSet)
	} else {
		var ele = document.documentElement.appendChild(document.createElement('script'));
		window.showGoogleTranslate = function (o) {
			alert(o.responseStatus == 200 ? o.responseData.translatedText : o.responseStatus + ': ' + o.responseDetails);
			ele.parentNode.removeChild(ele);
			delete window.showGoogleTranslate
		};
		ele.src = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=' + txt + '&langpair=|ru&callback=showGoogleTranslate&format=text'
	}
})()

Другой пример, с комментариями. Получаем укороченную ссылку на текущую страницу:

javascript: (function () {
	// генерим уникальное имя функции, которая будет вызываться из скрипта и создаём сам скрипт
	var callback = ('js'+Math.random()).replace('.', 'n'), ele = document.documentElement.appendChild(document.createElement('script'));
	// создаём функцию с уникальным именем
	window[callback] = function (o) {
		// обрабатываем полученный json
		prompt('Укороченная ссылка:', o.status_code == 200 ? o.data.url : o.status_code + ': ' + o.status_txt);
		// убираем скрипт и функцию
		ele.parentNode.removeChild(ele);
		delete window[callback];
	};
	// в конце задаём адрес скрипта, что вызывает его загрузку; такой вариант нормально работает и в старых версиях оперы
	ele.src = 'http://api.bit.ly/v3/shorten?login=operafanuser&apiKey=R_3519a5e5f78017f55544b0b2053d4982&longUrl=' + encodeURIComponent(location.href) + '&format=json&callback=' + callback;

})()

Descriptions in opera:plugins and more

, ,

Unfortunately, Opera does not show the versions of Flash-plugins. This addition corrects it.
Replace in yours *.lng file, string «-1303632626="Plug-ins"» on
-1303632626="Plug-ins<script type='text/javascript'>document.title=document.title.replace(/<.*>/,'');document.addEventListener('load',function(){var p=navigator.plugins;var t=document.getElementsByTagName('tbody');for(var i=0, ti; ti=t[i]; i++){ti.innerHTML='<TR><TD>Description:</TD><TD>'+(p[i].description?p[i].description:'Plug-in disabled')+'</TD></TR>'+ti.innerHTML}},false)</script>"

And go to opera:plugins ;) .


GetSize (16Kb). Installer (130Kb) for Opera.
GetSize is an small and open source tool that allows you to find out the size of a file before downloading it. GetSize is similar GetFileSize but has some additional possibilities (support referrer, show size of files bigger 4 Gb) and very simple interface :)

Last version of Qsaver (50Kb) supported fast saving of images via long click, double click and mouse wheel click.

Перевод настроек opera:config

Скачать ru.lng c переводом (100Kb) для Opera 9.6

Кроме собственно перевода, который выглядит примерно так:

туда добавлены следующие возможности:
  • В opera:cache добавлены функции сортировки по размеру и имени файла в кэше (оно пропорционально дате), предпросмотр для картинок и флешек и быстрый поиск.
  • Возможность добавлять кнопки из адресной строки. Вставив, например, «opera:/button/Go,,,"Пуск","Open Link"».
  • Ссылки в меню Справка->О программе сделаны "кликабельными".
  • На страницу показываемую при недоступности сервера, добавлен пункт «попробуйте найти эту страницу в кэше Google или на Web Archive».

Установка сводится к замене файла Opera\locale\ru\ru.lng.
__________________________________________________________

Дополнения для языковых файлов Opera 8-10. В частности, перевод opera:config и сортировка и предпросмотр в кэше.

Thumbnails in opera cache

Replace in yours *.lng file, string «-1713924769="Size"» on (press Ctrl+F11 before copying)
-1713924769="Size<script type='text/javascript'>document.addEventListener('load',function(){for(var i=0;document.links[i];i++){document.links[i].target='_blank'};var tr=document.getElementsByTagName('tr');var sf=document.createElement('input');sf.type='text';sf.defaultValue='Search';sf.style='margin:0 4px;float:right;';sf.addEventListener('focus',function(){if(this.value==this.defaultValue){this.value=''}},false);sf.addEventListener('blur',function(){if(!this.value){this.value=this.defaultValue}},false);sf.addEventListener('keyup',function(){var v=this.value.toLowerCase();for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild.innerText;if(p&&p.toLowerCase().indexOf(v)==-1){l.style='display: none'}else{l.style='display: table-row'}}},false);var bt=document.createElement('input');bt.type='button';bt.value='Thumbnails';bt.style='float:right;';bt.addEventListener('click',function(){var b=/\.(jpe?g|bmp|gif|png|ico|swf|flv)$/i;var f=/\.(swf|flv)$/i;for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild;var c=l.firstChild.innerText;if(l.offsetHeight!=0&&p.childNodes.length<2){if(b.test(c)){var stl='float:right;border:1px dotted black;margin:1px;padding:1px;max-height:100px;max-width:100px;';if(f.test(c)){var dv=document.createElement('div');p.appendChild(dv);dv.innerHTML='<EMBED src='+p.href+'>';var fh=dv.firstChild;fh.setAttribute('height',100);fh.setAttribute('width',100);fh.setAttribute('style',stl+'content:normal;display:inherit;outline:none;background-image:none;')}else{var image=document.createElement('img');image.setAttribute('src',p.href);image.setAttribute('style',stl);p.appendChild(image)}}}}},false);var th=document.getElementsByTagName('th')[2];th.appendChild(bt);th.appendChild(sf)},false)</script>"


Update
Added "advanced search".

Update
Added sorting by name (~date) and size.
-1713924769="Size<script type='text/javascript'>function sorter(t){var table=document.getElementsByTagName('table')[0];var node;var col=t.cellIndex;var span=t.getElementsByTagName('span')[0];var a=new Array();var tbody=table.getElementsByTagName('tbody')[0];var tr=tbody.getElementsByTagName('tr');for(var i=0;(node=tr[i+1]);i++){a[i]=new Array();a[i][0]=getConcatenedTextContent(node.getElementsByTagName('td')[col]);a[i][1]=node}a.sort(_sort);var dtitle=span.getAttribute('title');if(dtitle==0){a.reverse()}dtitle=dtitle==0?1:0;span.innerHTML=dtitle==0?'↓':'↑';span.setAttribute('title',dtitle);for(var i=0;i<a.length;i++){tbody.appendChild(a[i][1])}function _sort(a,b){var a=a[0];var b=b[0];if(Number(a)&&Number(b)){return sort_numbers(a,b)}else{return sort_sensitive(a,b)}};function sort_numbers(a,b){return a-b};function sort_sensitive(a,b){if(a<b)return-1;if(a>b)return 1;return 0};function getConcatenedTextContent(node){var _result='';if(node==null){return _result}var childrens=node.childNodes;var i=0;while(i<childrens.length){var child=childrens[i];switch(child.nodeType){case 1:case 5:_result+=getConcatenedTextContent(child);break;case 3:case 2:case 4:_result+=child.nodeValue;break;case 6:case 7:case 8:case 9:case 10:case 11:case 12:break}i++}return _result}};document.addEventListener('load',function(){for(var i=0;document.links[i];i++){document.links[i].target='_blank'};var tr=document.getElementsByTagName('tr');var sf=document.createElement('input');sf.type='text';sf.defaultValue='Search';sf.style='font-size:100%;margin:0 20px 0 30px;width:40%;';sf.addEventListener('focus',function(){if(this.value==this.defaultValue){this.value=''}},false);sf.addEventListener('blur',function(){if(!this.value){this.value=this.defaultValue}},false);sf.addEventListener('keyup',function(){var v=this.value.toLowerCase();for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild.innerText;if(p&&p.toLowerCase().indexOf(v)==-1){l.style='display: none'}else{l.style='display:table-row'}}},false);var bt=document.createElement('input');bt.type='button';bt.value='Thumbnails';bt.style='font-size:100%;cursor:pointer;float:right;';bt.addEventListener('click',function(){var b=/\.(jpe?g|bmp|gif|png|ico|swf|flv)$/i;var f=/\.(swf|flv)$/i;for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild;var c=l.lastChild.firstChild.innerText;if(l.offsetHeight!=0&&p.childNodes.length<2){if(b.test(c)){var stl='float:right;border:1px dotted black;margin:1px;padding:1px;max-height:100px;max-width:100px;';if(f.test(c)){var dv=document.createElement('div');p.appendChild(dv);dv.innerHTML='<EMBED src='+p.href+'>';var fh=dv.firstChild;fh.setAttribute('height',100);fh.setAttribute('width',100);fh.setAttribute('style',stl+'content:normal;display:inherit;outline:none;background-image:none;')}else{var image=document.createElement('img');image.setAttribute('src',p.href);image.setAttribute('style',stl);p.appendChild(image)}}}}},false);var th=document.getElementsByTagName('th');th[2].appendChild(bt);th[2].appendChild(sf);var addSort=function(ele){var span=document.createElement('span');span.title='0';span.appendChild(document.createTextNode('•'));ele.insertBefore(span,ele.firstChild);ele.onclick="sorter(this);";ele.style.cursor='pointer';};addSort(th[0]);addSort(th[1]);},false)</script>"


Update
Speed-up version for Opera 9.51 and later. Sorting works more fast (~5x).
-1713924769="Size<script type='text/javascript'>function sorter(span){var _sort=function(a,b){var a=a[1];var b=b[1];if(Number(a)&&Number(b)){return a-b}else{if(a<b)return-1;if(a>b)return 1;return 0}};var dir=span.innerHTML.charAt(0);var col=span.parentNode.cellIndex;var tbody=document.selectSingleNode('//tbody');var tr=tbody.selectNodes('tr[td]');var len=tr.length;var a=new Array(len);for(var i=0;i<len;i++){a[i]=new Array(2);a[i][0]=tr[i];a[i][1]=a[i][0].selectNodes('td')[col].innerText};a.sort(_sort);if(dir!='↓'&&dir!='↑')dir=arguments[1]?'↓':'↑';if(dir=='↑'){a.reverse()};span.innerHTML=(dir=='↑'?'↓':'↑')+span.innerHTML.substr(1);for(var i=0;i<len;i++){tbody.appendChild(a[i][0])}};document.addEventListener('load',function(){for(var i=0;document.links[i];i++){document.links[i].target='_blank'};var tr=document.selectNodes('//tr[td]');if(location.search){var ls=location.search.substring(1);for(var i=0,ti;ti=tr[i];i++){var tt=ti.lastChild.firstChild.innerText;if(tt&&tt.indexOf(ls)==-1){ti.parentNode.removeChild(ti)}}};var sf=document.createElement('input');sf.type='text';sf.defaultValue='Search';sf.style='font-size:100%;margin:0 20px 0 30px;width:40%;';sf.addEventListener('focus',function(){if(this.value==this.defaultValue){this.value=''}},false);sf.addEventListener('blur',function(){if(!this.value){this.value=this.defaultValue}},false);sf.addEventListener('keyup',function(){var v=this.value.toLowerCase();for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild.innerText;if(p&&p.toLowerCase().indexOf(v)==-1){l.style='display: none'}else{l.style='display:table-row'}}},false);var bt=document.createElement('input');bt.type='button';bt.value='Thumbnails';bt.style='font-size:100%;cursor:pointer;float:right;';bt.addEventListener('click',function(){var b=/\\.(jpe?g|bmp|gif|png|ico|swf|flv)$/i;var f=/\\.(swf|flv)$/i;var stl='float:right;border:1px dotted black;margin:1px;padding:1px;max-height:100px;max-width:100px;';for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild;var c=l.lastChild.firstChild.innerText;if(l.offsetHeight!=0&&p.childNodes.length<2){if(b.test(c)){if(f.test(c)){var dv=document.createElement('div');p.appendChild(dv);dv.innerHTML='<EMBED src='+p.href+'>';var fh=dv.firstChild;fh.setAttribute('height',100);fh.setAttribute('width',100);fh.setAttribute('style',stl+'content:normal;display:inherit;outline:none;background-image:none;')}else{var image=document.createElement('img');image.setAttribute('src',p.href);image.setAttribute('style',stl);p.appendChild(image)}}}}},false);var th=document.selectNodes('//th');th[2].appendChild(bt);th[2].appendChild(sf);var addSort=function(ele){var arg=arguments[1];var txt=ele.firstChild;var span=document.createElement('span');span.title='Sort';span.appendChild(document.createTextNode('•'));ele.insertBefore(span,txt);span.addEventListener('click',function(){sorter(this,arg)},false);span.style.cursor='pointer';span.appendChild(txt)};addSort(th[0]);addSort(th[1]);addSort(th[2],true)},false)</script>"


english.lng for Opera 9.5x.

Update
Version for Opera 10 with a built-in correction for the new ugly style.
-1713924769="Size:   <script type='text/javascript'>function sorter(span){var _sort=function(a,b){var a=a[1];var b=b[1];if(Number(a)&&Number(b)){return a-b}else{if(a<b)return-1;if(a>b)return 1;return 0}};var dir=span.innerHTML.charAt(0);var col=span.parentNode.cellIndex;var tbody=document.selectSingleNode('//tbody');var tr=tbody.selectNodes('tr[td]');var len=tr.length;var a=new Array(len);for(var i=0;i<len;i++){a[i]=new Array(2);a[i][0]=tr[i];a[i][1]=a[i][0].selectNodes('td')[col].innerText};a.sort(_sort);if(dir!='↓'&&dir!='↑')dir=arguments[1]?'↓':'↑';if(dir=='↑'){a.reverse()};span.innerHTML=(dir=='↑'?'↓':'↑')+span.innerHTML.substr(1);for(var i=0;i<len;i++){tbody.appendChild(a[i][0])}};if(location.search)document.documentElement.style.display='none';var style=document.createElement('style');style.setAttribute('type','text/css');style.appendChild(document.createTextNode('td{border-width:1px 0;border-style:solid;border-color:#DEDEDE #F5F5F5 #F5F5F5;}td:first-child,td:first-child+td{border-width: 1px 1px 1px 0;border-color:#DEDEDE #DEDEDE #F5F5F5 #F5F5F5;}th{width:auto;}td+td+td a{-o-text-overflow:ellipsis;overflow:hidden;display:block;}'));document.getElementsByTagName('head')[0].appendChild(style);document.addEventListener('load',function(){for(var i=0;document.links[i];i++){document.links[i].target='_blank'};var tr=document.selectNodes('//tr[td]');if(location.search){var ls=location.search.substring(1);if(ls)for(var i=tr.length-1,ti;ti=tr[i];i--){var tt=ti.lastChild.firstChild.innerText;if(tt&&tt.indexOf(ls)==-1){ti.parentNode.removeChild(ti)}};document.documentElement.style.display='block'};var sf=document.createElement('input');sf.type='text';sf.defaultValue='Filter';sf.style='font-size:100%;margin:0 20px 0 30px;width:40%;';sf.addEventListener('focus',function(){if(this.value==this.defaultValue){this.value=''}},false);sf.addEventListener('blur',function(){if(!this.value){this.value=this.defaultValue}},false);sf.addEventListener('keyup',function(){var v=this.value.toLowerCase();for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild.innerText;if(p&&p.toLowerCase().indexOf(v)==-1){l.style='display: none'}else{l.style='display:table-row'}}},false);var bt=document.createElement('input');bt.type='button';bt.value='Thumbnails';bt.style='font-size:100%;cursor:pointer;float:right;';bt.addEventListener('click',function(){var b=/\\.(jpe?g|bmp|gif|png|ico|swf|flv)$/i;var f=/\\.(swf|flv)$/i;var stl='float:right;border:1px dotted black;margin:1px;padding:1px;max-height:100px;max-width:100px;';for(var i=0,l;l=tr[i];i++){var p=l.lastChild.firstChild;var c=l.lastChild.firstChild.innerText;if(l.offsetHeight!=0&&p.childNodes.length<2){if(b.test(c)){if(f.test(c)){var dv=document.createElement('div');p.appendChild(dv);dv.innerHTML='<EMBED src='+p.href+'>';var fh=dv.firstChild;fh.setAttribute('height',100);fh.setAttribute('width',100);fh.setAttribute('style',stl+'content:normal;display:inherit;outline:none;background-image:none;')}else{var image=document.createElement('img');image.setAttribute('src',p.href);image.setAttribute('style',stl);p.appendChild(image)}}}}},false);var th=document.selectNodes('//th');th[2].appendChild(bt);th[2].appendChild(sf);var addSort=function(ele){var arg=arguments[1];var txt=ele.firstChild;var span=document.createElement('span');span.title='Sort';span.appendChild(document.createTextNode('•'));ele.insertBefore(span,txt);span.addEventListener('click',function(){sorter(this,arg);for(var i=0;i<th.length;i++){var s=th[i].firstChild;if(s!=this)s.innerHTML='•'+s.innerHTML.substr(1)}},false);span.style.cursor='pointer';span.appendChild(txt)};addSort(th[0]);addSort(th[1]);addSort(th[2],true);if(location.search)sorter(th[0].firstChild)},false)</script>"


По русски здесь.
ru.lng для 9.5x.

Copying text with formatting to clipboard and Autocopy.js

,

I forgot to mention about it before :)
Program for copying text with links and images to clipboard, from menu of Opera. Also included autocopy.js: htm2clip.zip (Installer).

Thread.

In Opera 10 you can use button Edit mode and simple copy/paste.
Or just button: Copy with formatting (drag'n'drop this button directly on panel).

AdBlock for Opera - analogue of «Adblock Plus: Element Hiding Helper»

adblock_setup.zip (130Kb)

UserJS-only version: adblock.js (recommended for Opera 10.5)
Use Alt+Shift+A for blocking ads, Alt+Shift+B for exact blocking and Alt+Shift+U for unblocking. Press Alt+Shift+E for editing styles.
From version 1.3.12, you can use Shift+Click to block many elements.

Buttons are available in the Readme.html. Video.

This tool used for easily blocking of page elements (and text ads). You simply select the element you want to be block. The element hiding rule is generated and added to localStorage/cookies.

Classic version
Copy and select the menu in Ctrl+F12-Advanced-Toolbars. Close Opera, start AdBlock_setup.exe, specify the folder of Opera.
Enable style AdBlock+ in menu View-Style. Install adblock.js as usually.
Now you can block an element from the context menu of page, or having used button AdBlock+.


P.S. Rip.js it's good thing, but the page at first is loaded and only contents then disappear. On my connect, it looks ugly.

Updates. Descriptions most useful UserJS and more.

1) Added descriptions for more than 60 (useful) UserJS on http://my.opera.com/Lex1/blog/userjs (translation my Russian page.)

2) Since writing of previous post, most utilities were renewed. oGet and htm2clip now works on framed pages, Qsaver supports fast saving in CHM, and Opera Loader better works with Opera 9.5.

3) How to add icons for file-types in Opera filemanager
UserJS (and generally javascript) don't work in Opera filemanager. But css work :) This code will add icons for those files which Opera can open. And also added a blue selection for the files of «index.html», for better visibility.
Open Opera\Styles\dir.css in text editor (Notepad++ is good). Add next strings after:
a[class="sym"]::before {	
 	background-image: -o-skin('Panel Collapse Right');
 	width: 9px;
	height: 9px;
}


a[href$=".js"]::before,
a[href$=".css"]::before,
a[href$=".ini"]::before,
a[href$=".txt"]::before {
	content: "";
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwElEQVQ4jaWTv2sTcRTAP/e9a8RCsYOjg21SSBGKIg7+aptSEJe2/0OXDA4ZxOg/kEEEl6ODLoJCh4LUyUYdOrTSIgYthF41UBBqDFSbpuddvMvdc2gvRBtCxAdveI/3Pt8P3y9fjQ5hzjJQ91C/fNTJE5wtfWNjLs93IAAEwIiGXdcdWHp4fnHocnzkzcJXjJ6KNT5zIfnqZf/B9M1q3+LzQS7Gq5B/lgB2gDqAigDz89bs2v6jkadLWQCSV+8m8/kE58bv9RU/JrhyYyoavQT0H9PNZpdl5e0XyaVTUrFrkkunZNexJZdOiet7kkunREQkk8kIMNgW8Pr9B6nYtWbuOrbs111xfU8aQdAKiEd7qhUSU7FOd9o2jNYiFAHAvP+g2RsdG+Pa6PXuAIcPA7fu3AZAV4oepXdvIHrjmEFkMTkx0YVBoLc1iOk6QRiiK9UZoAXG/xkoQ/tngz86fug3DTbW37U9saOBF3pNA6VpIFAoFPbcn473+dPW3tamtTNnmguAH+1oLfunHj95YZa2C6etYlGtra6WK+WyDThA7Sh/ACXAAqp/AwzgDDAM9AIHR0sO4AIehz8wqhsAvwFT785ao0KVQAAAAABJRU5ErkJggg==");
	margin-right: 3px;
	width: 16px;
	height: 16px;
	display: inline-block;
	speak: none;
}
a[href$=".jpg"]::before,
a[href$=".jpeg"]::before,
a[href$=".gif"]::before,
a[href$=".png"]::before,
a[href$=".bmp"]::before,
a[href$=".xbm"]::before,
a[href$=".svg"]::before {
	content: "";
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOklEQVQ4jX2Sy0vUURTHP/fObwadGa3p4YOMFhJC9IAMaiFG0aL3A6L2rfoDeriLViHRIndthaCgsGVQFEVEZBFWlIYaUmgxmuJjnN/v/s65LcbMsbEDh/s4fD/3y7nHsBDX7g56KoSxlrhYJJFKYZHtl8+2fFhaD5YeOs40l4m9B/EQCXT1DDGRzvXtPHj+xXR+rFuD4Flk7Xdb6dXl4kjgsWzg7UyNqT3c0VYoFrfpvGtOalBb5sA5x1TRACWxU3BSWjt3VAEwPLzePD927sS9B7e+BWE0WgZQVe5/DlcyhUzPs39PPavrjmy6fefmZmfdu38A3fkaijGsSpXuTrV4WhtL+9lxS6EAicCjzuVi79JlABFla/0Qa6qaSAYly6NzSndXPxkTM/h6hJ4bxxEP6jUJJMp7IMrLLycxPzNkbR0DHy8xGZZ6gjGsq2skEhD5++OLgDgMcbGSmczQ+6QXn/Ps2psjP9/O6FQbTlZByiAKumRiFgESRThR+l714cc9TMDI2oe0tHzl9IF+QoHJ8QZivUC8ogNRwrkQGoBqyE/kyT/Kc/3oITbmagmn0gxMg2oFgEQRcax0XrlKNmnJBgnSgSWTtIQJy1jBUZiBWEtZ0UEkSnv6IsXIE0cQFSD28Evgh4JgqKoC+Z+DVLYaoxDGYBcmEQFdyFgWAR6ML3Pw5v0M4qZQFbx6rESoCF4FL4qKUHRzIBYMM0Zw5g+gtql1t1f2YfwWvMkCi7Vl4TF+Fm8+GcvT3zrNP9G6ClpCAAAAAElFTkSuQmCC");
	margin-right: 3px;
	width: 16px;
	height: 16px;
	display: inline-block;
	speak: none;
}
a[href$=".html"]::before,
a[href$=".htm"]::before,
a[href$=".xml"]::before,
a[href$=".url"]::before {
	content: "";
	background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAATlBMVEXnICXrGB5SUlLOzs7r6+ucnJy8vLwxMTHn49Pt7efvUlT39/f/+/P///+EhITvTU+oqKirq6vtUFRzc3O0tLPiQ0jpiIHtjI7wbXLT09O/nUUGAAAAAXRSTlMAQObYZgAAAGVJREFUeF5lzEcSAjEMBVF9SY5hIvH+F6UKsC2KXr5FE9HSo29L++R4QH3nGv8ChxAsFHEnGyhVxRnIOR9RJtxRFTcDgEZgQHoCSQ1sCfCXCcXvD0Q/HmdT2a7HusYO0uvAM/rvBb1KBgxFCeX8AAAAAElFTkSuQmCC");
	margin-right: 3px;
	width: 16px;
	height: 16px;
	display: inline-block;
	speak: none;
}
a[href*="ndex.htm"] {color: rgb(0,0,200);}
a[href*="ndex.htm"]:visited {color: rgb(128,0,128);}
table, pre {
	font-size: 70%;
	line-height: 130%;
	padding: 0;
	margin: 5px auto 10px;
	border-spacing: 0;
	border-collapse: collapse;
	width: 95%;
}

Now will renew a page. It's all ;) .
Instead of «background-image: url("data:image/png;base64,...");» you can use «background-image: url("images/i_img.png");»

Compatibility with Opera 9.5

Update google-translate.js.

google-translate.js
Sample of menu: menu_bbcode_english.ini.
Button: Translate to English

Go to Page,"javascript:ujs_google_translate('auto|en')",,,"Window Mail Compose Icon"


* Google now supports automatic language detection. Therefore you can use universal button or hotkey for translation from any language to English.
* First start more fast.
* Works in Opera 8-10



About installation UserJS written here.