1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. bege

Beiträge von bege

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 2. März 2015 um 16:23
    Zitat von aborix

    In Word Highlight Toolbar ist in Fx 36 der Button im deaktivierten Zustand unsichtbar.

    Ändert man Zeile 1062 wie folgt, ist er wieder sichtbar: ...

    Hallo,
    die Skript-Version, die aktuell auf Github ist, funktioniert bei mir gar nicht. Ich habe diesen Code, bei dem der Button verschiebbar ist. Ich weiß nicht mehr, woher ich den habe, vermutlich irgendwann mit aborix' Hilfe zusammengebastelt.
    Die neueste Änderung ist eingebaut.
    Bei mir (Fx 36.0) funktioniert er. Mag es noch jemand testen?
    (Versionsnummer, Name eventuell noch ändern)

    CSS
    // ==UserScript==
    // @name           WordHighlightToolbar.uc.js
    // @description    word highlight toolbar.
    // @namespace      http://d.hatena.ne.jp/Griever/
    // @author         Griever
    // @license        MIT License
    // @compatibility  Firefox 17
    // @charset        UTF-8
    // @include        main
    // @version        0.0.8
    // @note           0.0.8 Firefox 25 でエラーが出ていたのを修正
    // @note           0.0.7 ツールバーが自動で消えないことがあったのを修正
    // @note           0.0.6 アイコンを作って検索時の強調を ON/OFF できるようにした
    // @note           0.0.6 背面のタブを複数開いた際の引き継ぎを修正
    // @note           0.0.5 大幅に変更(変更し過ぎてどこを変更したのかすら忘れた)
    // @note           0.0.5 外部からイベントでハイライトできるようにした
    // @note           0.0.5 "戻る"動作にツールバーが連動するようにした
    // @note           0.0.5 色を選んで強調できるようにしてみた
    // @note           0.0.5 ツールバーが無駄にスペースをとる場合があるのを修正
    // @note           0.0.5
    // ==/UserScript==
    
    
    (function(CSS){
    "use strict";
    
    
    if (window.gWHT) {
    	window.gWHT.destroy();
    	delete window.gWHT;
    }
    
    
    
    
    const UID = Math.random().toString(36).slice(-8);
    const PREFIX = 'wordhighlight-toolbar-';
    const CLASS_ICON  = PREFIX + 'icon';
    const CLASS_ITEM  = PREFIX + 'item';
    const CLASS_SPAN  = PREFIX + 'span';
    const CLASS_INDEX = PREFIX + 'index';
    const EVENT_RESPONSE = 'RESPONSE_' + UID;
    
    
    var GET_KEYWORD = true;
    var wmap = new WeakMap();
    
    
    window.gWHT = {
    	DEBUG: false,
    	SITEINFO: [
    		/**
    			url     URL。正規表現。keyword, input が無い場合は $1 がキーワードになる。
    			keyword キーワード。スペース区切り。省略可。
    			input   検索ボックスの CSS Selector。
    		**/
    		{
    			url: '.*\\btbm=isch\\b.*',
    			keyword: ' '
    		},
    		{
    			url: '^https?://\\w+\\.google\\.[a-z.]+/search',
    			input: 'input[name="q"]'
    		},
    		{
    			url: '^http?://[\\w.]+\\.yahoo\\.co\\.jp/search',
    			input: 'input[name="p"]'
    		},
    		{
    			url: '^https?://\\w+\\.bing\\.com/search',
    			input: 'input[name="q"]'
    		},
    		{
    			url: '^http://[\\w.]+\\.nicovideo\\.jp/(?:search|tag)/.*',
    			input: '#search_united, #bar_search'
    		},
    //		{// MICROFORMAT
    //			url: '^https?://.*[?&](?:q|word|keyword|search|query|search_query)=([^&]+)',
    //			input: 'input[type="text"]:-moz-any([name="q"],[name="word"],[name="keyword"],[name="search"],[name="query"],[name="search_query"]), input[type="search"]'
    //		},
    	],
    
    
    	FIND_FOUND   : 0,
    	FIND_NOTFOUND: 1,
    	FIND_WRAPPED : 2,
    	sound: Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound),
    	getWins: getWins,
    	checkDoc: checkDoc,
    	getFocusedWindow: getFocusedWindow,
    	getRangeAll: getRangeAll,
    	wmap:wmap,
    	tabhistory: {},
    	get prefs() {
    		delete this.prefs;
    		return this.prefs = Services.prefs.getBranch("WordHighlightToolbar.");
    	},
    	get GET_KEYWORD() GET_KEYWORD,
    	set GET_KEYWORD(bool) {
    		bool = !!bool;
    		var icon = $(PREFIX + "icon");
    		if (icon) {
    			icon.setAttribute("state", bool ? "Aktiviert" : "Deaktiviert");
    			icon.setAttribute("tooltiptext", bool ? "Aktiviert" : "Deaktiviert");
    		}
    		return GET_KEYWORD = bool;
    	},
    
    
    	init: function() {
    		this.xulstyle = addStyle(CSS);
    
    
    		var icon = document.createElement('toolbarbutton');
           icon.id = 'wordhighlight-toolbar-icon';
           icon.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
           icon.setAttribute('context', '');
           icon.setAttribute('onclick', 'gWHT.GET_KEYWORD = !gWHT.GET_KEYWORD');
           icon.style.padding = '0px 2px';
    
    
           document.getElementById('navigator-toolbox').palette.appendChild(icon);
    
    
           var toolbars = Array.slice(document.querySelectorAll('toolbar'));
           for (var i=0; i<toolbars.length; i++) {         
              var currentset = toolbars[i].getAttribute('currentset');     
              if (currentset.split(',').indexOf(icon.id) >= 0) {     
                 var j;
                 if (i == 0) j = 1
                 else j = 0;         
                 toolbars[j].currentSet += ',' + icon.id;         
                 toolbars[i].currentSet = currentset;     
              };     
           };
    
    
    		var bb = document.getElementById("appcontent");
    		var container = bb.appendChild(document.createElement("hbox"));
    		container.setAttribute("id", PREFIX + "box");
    		container.setAttribute("style", "max-height: 23px;");
    		//container.setAttribute("ordinal", "0");
    		this.container = container;
    
    
    		var sep = document.getElementById("context-viewpartialsource-selection");
    		var menu = sep.parentNode.insertBefore(document.createElement("menu"), sep);
    		menu.setAttribute("label", "Hervorheben");
    		menu.setAttribute("id", PREFIX + "highlight");
    		menu.setAttribute("class", CLASS_ICON + " menu-iconic");
    		menu.setAttribute("accesskey", "H");
    		menu.setAttribute("onclick", "\
    			if (event.target != this) return;\
    			closeMenus(this);\
    			if (event.button === 0) gWHT.highlightWord();\
    			else if (event.button === 1) gWHT.highlightWordAuto();\
    		");
    		var menupopup = menu.appendChild(document.createElement("menupopup"));
    
    
    		var menuitem = menupopup.appendChild(document.createElement("menuitem"));
    		menuitem.setAttribute("class", CLASS_ICON + " menuitem-iconic");
    		menuitem.setAttribute("label", "Hervorheben");
    		menuitem.setAttribute("accesskey", "H");
    		menuitem.setAttribute("oncommand", "gWHT.highlightWord();");
    		var menuitem = menupopup.appendChild(document.createElement("menuitem"));
    		menuitem.setAttribute("class", CLASS_ICON + " menuitem-iconic");
    		menuitem.setAttribute("label", "Getrennt Hervorheben");
    		menuitem.setAttribute("oncommand", "gWHT.highlightWordAuto();");
    
    
    		var cp = menupopup.appendChild(document.createElement("colorpicker"));
    		cp.setAttribute("onclick", "\
    			closeMenus(this);\
    			var word = getBrowserSelection();\
    			setTimeout(function(){\
    				gWHT.addWord({ word: word, bgcolor: this.color, bold: true });\
    			}.bind(this), 10);\
    		");
    
    
    		try {
    			this.GET_KEYWORD = this.prefs.getBoolPref("GET_KEYWORD");
    		} catch (e) {
    			this.GET_KEYWORD = GET_KEYWORD;
    		}
    
    
    		gBrowser.mPanelContainer.addEventListener("DOMContentLoaded", this, false);
    		// gBrowser.mPanelContainer.addEventListener("click", this, false);
    		// gBrowser.mPanelContainer.addEventListener("dragend", this, false);
    		gBrowser.mPanelContainer.addEventListener("pageshow", this, false);
    		gBrowser.mPanelContainer.addEventListener(EVENT_RESPONSE, this, true);
    		gBrowser.mPanelContainer.addEventListener("WordHighlightToolbarAddWord", this, false, true);
    		gBrowser.mPanelContainer.addEventListener("WordHighlightToolbarRemoveWord", this, false, true);
    		gBrowser.mTabContainer.addEventListener("TabOpen", this, false);
    		gBrowser.mTabContainer.addEventListener("TabSelect", this, false);
    		gBrowser.mTabContainer.addEventListener("TabClose", this, false);
    		document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", this, false);
    		window.addEventListener("unload", this, false);
    	},
    	uninit: function() {
    		gBrowser.mPanelContainer.removeEventListener("DOMContentLoaded", this, false);
    		// gBrowser.mPanelContainer.removeEventListener("click", this, false);
    		// gBrowser.mPanelContainer.removeEventListener("dragend", this, false);
    		gBrowser.mPanelContainer.removeEventListener("pageshow", this, false);
    		gBrowser.mPanelContainer.removeEventListener(EVENT_RESPONSE, this, true);
    		gBrowser.mPanelContainer.removeEventListener("WordHighlightToolbarAddWord", this, false);
    		gBrowser.mPanelContainer.removeEventListener("WordHighlightToolbarRemoveWord", this, false);
    		gBrowser.mTabContainer.removeEventListener("TabOpen", this, false);
    		gBrowser.mTabContainer.removeEventListener("TabSelect", this, false);
    		gBrowser.mTabContainer.removeEventListener("TabClose", this, false);
    		document.getElementById("contentAreaContextMenu").removeEventListener("popupshowing", this, false);
    		window.removeEventListener("unload", this, false);
    		this.prefs.setBoolPref("GET_KEYWORD", this.GET_KEYWORD);
    	},
    	destroy: function() {
    		[PREFIX + "icon", PREFIX + "box", PREFIX + "highlight"].forEach(function(id){
    			var elem = $(id);
    			if (elem) elem.parentNode.removeChild(elem);
    		}, this);
    		this.uninit();
    		if (this.xulstyle) this.xulstyle.parentNode.removeChild(this.xulstyle);
    	},
    
    
    	handleEvent: function(event) {
    		switch(event.type) {
    			case "click":
    				this.lastClickedTime = new Date().getTime();
    				break;
    			case "dragend":
    				var dt = event.dataTransfer;
    				if (dt) {
    					if (dt.types.contains("text/x-moz-place")) return;
    					if (!dt.types.contains("text/x-moz-url")) return;
    				}
    				this.lastClickedTime = new Date().getTime();
    				break;
    			case "DOMContentLoaded":
    				if (!this.GET_KEYWORD) return;
    				var doc = event.target;
    				var win = doc.defaultView;
    				// frame 内では動作しない
    				if (win != win.parent) return;
    				// HTMLDocument じゃない場合
    				if (!checkDoc(doc)) return;
    
    
    				var keywords = this.GET_KEYWORD ? this.getKeyword(this.SITEINFO, doc) : [];
    				this.launch(doc, keywords);
    				break;
    			case "pageshow":
    				var doc = event.target;
    				var win = doc.defaultView;
    				if (win != win.parent) return;
    				this.updateToolbar( wmap.get(doc) );
    				break;
    			case EVENT_RESPONSE:
    				event.stopPropagation();
    				this.onResponse(event);
    				break;
    			case "WordHighlightToolbarAddWord":
    				var { target, type, detail } = event;
    				debug(type, detail);
    				if (!detail) return;
    				var doc = target.ownerDocument || target;
    				var range;
    				if (doc != target) {
    					range = doc.createRange();
    					range.selectNode(target);
    				}
    				this.addWord(detail, false, range);
    				break;
    			case "WordHighlightToolbarRemoveWord":
    				var { target, type, detail } = event;
    				debug(type, detail);
    				var doc = target.ownerDocument || target;
    				if (!doc.wht) return;
    				var words = Array.isArray(detail) ? detail : [detail];
    				words.forEach(function(word) doc.wht.removeWord(word));
    				break;
    			case "TabSelect":
    				var doc = event.target.linkedBrowser.contentDocument;
    				var toolbar = wmap.get(doc);
    				this.updateToolbar(toolbar);
    				break;
    			case "TabOpen":
    				var tab = event.target;
    				tab.whtOwner = gBrowser.mCurrentTab;
    				tab.whtTime = new Date().getTime();
    				break;
    			case "TabClose":
    				delete this.tabhistory[event.target.linkedPanel];
    				break;
    			case "popupshowing":
    				if (event.target != event.currentTarget) return;
    				var {isTextSelected, onTextInput, target} = gContextMenu;
    				gContextMenu.showItem(PREFIX + "highlight", isTextSelected && !onTextInput);
    				break;
    			case "unload":
    				this.uninit();
    				break;
    		}
    	},
    	onResponse: function(event) {
    		var { target, detail: { name, args } } = event;
    		debug(name, args, target);
    		var doc = target.ownerDocument || target;
    		var win = doc.defaultView;
    		var topWin = win.top;
    
    
    		if ('initialized' === name) {
    			doc.addEventListener("dragend", this, false);
    			doc.addEventListener("click", this, false);
    			var tab = gBrowser._getTabForContentWindow(topWin);
    			var linkedPanel = tab.linkedPanel;
    			var { index, count } = tab.linkedBrowser.docShell.sessionHistory;
    			this.tabhistory[linkedPanel][index] = doc.wht.items;
    			return;
    		}
    
    
    		var toolbar = wmap.get(topWin.document);
    		if (!toolbar) {
    			toolbar = this.addToolbar();
    			wmap.set(doc, toolbar);
    			wmap.set(topWin.document, toolbar);
    		}
    		if ('highlight' === name || 'highlightAll' === name) {
    			var itemArr = args.length > 0 ? args : Object.keys(doc.wht.items).map(function(key) doc.wht.items[key]);
    			itemArr.forEach(function(item) {
    				var button = toolbar.querySelector('.' + CLASS_ITEM + '[index="'+ item.index +'"]');
    				button = this.addButton(toolbar, item, button);
    			}, this);
    			this.updateToolbar(toolbar);
    			return;
    		}
    		if ('lowlight' === name) {
    			var item = args[0];
    			var button = toolbar.querySelector('.' + CLASS_ITEM + '[index="'+ item.index +'"]');
    			if (button) {
    				button.parentNode.removeChild(button);
    			}
    			return;
    		}
    		if ('lowlightAll' === name) {
    			var range = document.createRange();
    			range.selectNodeContents(toolbar.getElementsByTagName('arrowscrollbox')[0]);
    			range.deleteContents();
    			//delete this.tabhistory[linkedPanel][index];
    			return;
    		}
    	},
    	_launch: function(doc, tab) {
    		if (!tab) {
    			tab = gBrowser._getTabForContentWindow(doc.defaultView.top);
    		}
    		var linkedPanel = tab.linkedPanel;
    		var { count, index } = tab.linkedBrowser.docShell.sessionHistory;
    		var tabhis = this.tabhistory[linkedPanel] || (this.tabhistory[linkedPanel] = []);
    		if (!doc.wht) {
    			doc.wht = new this.ContentClass(doc);
    			tabhis[index] = doc.wht.items;
    			if (tabhis.length > count) {
    				tabhis.splice(count);
    			}
    		}
    	},
    	launch: function(doc, keywords) {
    		var win = doc.defaultView;
    		var tab = gBrowser._getTabForContentWindow(win.top);
    		var linkedPanel = tab.linkedPanel;
    
    
    		// loadType 1=Bookmark, 2=Reload, 4=History, 4>other
    		var { loadType, sessionHistory: { count, index } } = tab.linkedBrowser.docShell;
    		var tabhis = this.tabhistory[linkedPanel] || (this.tabhistory[linkedPanel] = []);
    
    
    		var newtabflag = (tab.whtTime || Infinity) - this.lastClickedTime < 250; // newtab from user.
    		tab.whtTime = Infinity;
    		keywords || (keywords = []);
    
    
    		let hikitugi = [];
    		let hiki_for_items = function(items, boldOnly) {
    			Object.keys(items).map(function(key) {
    				var item = items[key];
    				if (boldOnly && !item.bold) return;
    				hikitugi.push({
    					word: item.word,
    					//index: item.index,
    					bgcolor: item.bgcolor,
    					fgcolor: item.fgcolor,
    					bold: item.bold,
    				});
    			})
    		}
    		if (newtabflag) { // newtab from user.
    			if (tab.whtOwner) {
    				let ownhis = this.tabhistory[tab.whtOwner.linkedPanel];
    				if (ownhis) {
    					let items = ownhis[tab.whtOwner.linkedBrowser.docShell.sessionHistory.index];
    					if (items) {
    						hiki_for_items(items, keywords.length > 0);
    					}
    				}
    			}
    			tab.whtOwner = null;
    		} else if (loadType === 2) { // reload
    			var items = tabhis[index];
    			if (items) {
    				hiki_for_items(items, keywords.length > 0);
    			}
    		} else if (loadType > 1) { // currenttab for user
    			var items = tabhis[index-1] || tabhis[index];
    			if (items) {
    				hiki_for_items(items, keywords.length > 0);
    			}
    		}
    
    
    		// debug([doc.URL + '\n'
    		// ,'loadType:' + loadType,'newtabflag:' + newtabflag
    		// ,'keywords:[' + keywords + ']'
    		// ,'hikitugi:[' + hikitugi.map(function(o) o.word) + ']'
    		// ].join(', '));
    
    
    		if (keywords.length || hikitugi.length) {
    			this._launch(doc, tab);
    			doc.wht.addWord(keywords.concat(hikitugi));
    		}
    	},
    	launchFrame: function(doc) {
    
    
    	},
    	updateToolbar: function(toolbar) {
    		if (this.updateTimer) clearTimeout(this.updateTimer);
    		this.updateTimer = setTimeout(function() {
    			var toolbar = toolbar || wmap.get(content.document);
    			if (toolbar && toolbar.parentNode) {
    				return;
    			}
    			var range = document.createRange();
    			range.selectNodeContents(this.container);
    			if (toolbar) {
    				range.collapse(true);
    				range.insertNode(toolbar);
    				range.selectNodeContents(this.container);
    				range.setStartAfter(toolbar);
    			}
    			range.deleteContents();
    		}.bind(this), 150);
    	},
    	updateToolbar_: function(toolbar) {
    		if (toolbar && toolbar.parentNode) {
    			return;
    		}
    		var range = document.createRange();
    		range.selectNodeContents(this.container);
    		range.deleteContents();
    		if (toolbar)
    			range.insertNode(toolbar);
    	},
    	addToolbar: function() {
    		var toolbar = document.createElement("hbox");
    		toolbar.setAttribute("class", PREFIX + "toolbar");
    		toolbar.setAttribute("flex", "1");
    
    
    		var box = toolbar.appendChild(document.createElement("arrowscrollbox"));
    		box.setAttribute("class", PREFIX + "arrowscrollbox");
    		box.setAttribute("flex", "1");
    		box.setAttribute("orient", "horizontal");
    		box.setAttribute("ordinal", "5");
    
    
    		var closebutton = toolbar.appendChild(document.createElement("toolbarbutton"));
    		closebutton.setAttribute("class", PREFIX + "closebutton tabs-closebutton");
    		closebutton.setAttribute("oncommand", "gWHT.destroyToolbar();");
    		closebutton.setAttribute("ordinal", "1");
    
    
    		var reloadbutton = toolbar.appendChild(document.createElement("toolbarbutton"));
    		reloadbutton.setAttribute("class", PREFIX + "reloadbutton");
    		reloadbutton.setAttribute("tooltiptext", "Markierte Wörter nachladen");
    		reloadbutton.setAttribute("ordinal", "10");
    		reloadbutton.setAttribute("oncommand", "gWHT.recoveryToolbar();");
    
    
    		var addbutton = toolbar.appendChild(document.createElement("toolbarbutton"));
    		addbutton.setAttribute("class", PREFIX + "addbutton");
    		addbutton.setAttribute("tooltiptext", "Wort hinzufügen");
    		addbutton.setAttribute("ordinal", "10");
    		addbutton.setAttribute("oncommand", "gWHT.addWord();");
    		return toolbar;
    	},
    	destroyToolbar: function() {
    		var win = getFocusedWindow();
    		var doc = win.document;
    		if (doc.wht) {
    			doc.wht.lowlightAll();
    		}
    		this.updateToolbar();
    	},
    	recoveryToolbar: function() {
    		var win = getFocusedWindow();
    		var doc = win.document;
    		if (doc.wht) {
    			doc.wht.highlightAll();
    			// マッチしなかったワードを削除
    			Object.keys(doc.wht.items).forEach(function(key){
    				var item = doc.wht.items[key];
    				if (item.length === 0)
    					doc.wht.removeWord(item.word);
    			}, this);
    		}
    	},
    	addButton: function(toolbar, aItem, aButton) {
    		var button = aButton;
    		if (!button) {
    			button = document.createElement('toolbarbutton');
    			button.style.setProperty('-moz-appearance', 'none', 'important');
    			button.setAttribute('oncommand', 'gWHT.find(this.getAttribute("word"), event.shiftKey);');
    			button.setAttribute('onDOMMouseScroll', 'event.stopPropagation(); gWHT.find(this.getAttribute("word"), event.detail < 0);');
    			button.setAttribute('onclick', 'if (event.button != 1) return; this.hidden = true; gWHT.removeWord(this.getAttribute("word"));');
    			button.setAttribute('class', CLASS_ITEM);
    			button.setAttribute('tooltiptext', [
    				'Mausrad runter, oder Linksklick zum Weitersuchen',
    				'Shift + Linksklick, oder Mausrad zum vorherigen Wort',
    				'Mittelklick auf Mausrad zum Löschen'].join('\n'));
    			toolbar.getElementsByTagName('arrowscrollbox')[0].appendChild(button);
    		}
    		button.style.setProperty('color', aItem.fgcolor, 'important');
    		button.style.setProperty('background-color', aItem.bgcolor, 'important');
    		button.setAttribute('word', aItem.word);
    		button.setAttribute('index', aItem.index);
    		button.setAttribute('bgcolor', aItem.bgcolor);
    		button.setAttribute('fgcolor', aItem.fgcolor);
    		button.setAttribute('length', aItem.length);
    		button.setAttribute('label', aItem.word + '(' + aItem.length + ')');
    		button.setAttribute('hidden', 'false');
    		if (aItem.bold) {
    			button.setAttribute('bold', aItem.bold);
    			button.style.setProperty('font-weight', 'bold', 'important');
    		} else {
    			button.style.removeProperty('font-weight');
    		}
    		return button;
    	},
    	highlightWord: function() {
    		var keywords = getRangeAll().map(function(r) r.toString());
    		if (keywords.length)
    			this.addWord(keywords, true);
    	},
    	highlightWordAuto: function() {
    		var keywords = getRangeAll().join(' ').match(this.tangoReg) || [];
    		if (keywords.length)
    			this.addWord(keywords, true);
    	},
    	addWord: function(aWord, aBold, aRange) {
    		if (!aWord) {
    			aWord = prompt('Bitte geben Sie den gewünschten Text zum Hervorheben', getBrowserSelection());
    			aBold = true;
    		}
    		if (!aWord) return;
    
    
    		var keywords = Array.isArray(aWord) ? aWord : [aWord];
    		var doc, win;
    		if (aRange) {
    			doc = aRange.startContainer.ownerDocument;
    			win = doc.defaultView;
    		} else {
    			win = getFocusedWindow();
    			doc = win.document;
    		}
    		if (!doc.wht) {
    			win.getSelection().removeAllRanges();
    			this._launch(doc);
    		}
    		keywords = keywords.map(function(str){
    			return typeof str === "string" ? str.trim() : str;
    		});
    		doc.wht.addWord(keywords, aBold, aRange);
    	},
    	removeWord: function(aWord) {
    		if (!aWord) return;
    		var doc = getFocusedWindow().document;
    		if (!doc.wht) return;
    		doc.wht.removeWord(aWord);
    	},
    	getLength: function(aWord, aWin) {
    		var w = aWord.toLowerCase();
    		var len = 0;
    		getWins(aWin).forEach(function(win) {
    			var doc = win.document;
    			if (!doc.wht) return;
    			var item = doc.wht.items[w];
    			if (item)
    				len += item.length;
    		}, this);
    		return len;
    	},
    	get tangoReg() {
    		if (this._tangoReg) return this._tangoReg;
    		var arr = [
    			"[\\u4E00-\\u9FA0]{2,}" // 漢字
    			,"[\\u4E00-\\u9FA0][\\u3040-\\u309F]+" // 漢字1文字+ひらがな
    			,"[\\u30A0-\\u30FA\\u30FC]{2,}" // カタカナ
    			,"[\\uFF41-\\uFF5A\\uFF21-\\uFF3A\\uFF10-\\uFF19]{2,}" // 全角英数数字(小文字、大文字、数字)
    			,"[\\w%$\\@#+]{5,}"
    			,"\\d[\\d.,]+"
    			,"\\w[\\w.]+"
    		];
    		return this._tangoReg = new RegExp(arr.join('|'), 'g');
    	},
    	get kukuriReg() {
    		if (this._kukuriReg) return this._kukuriReg;
    		var obj = {
    			'"': '"',
    			"'": "'",
    			'\uFF3B': '\uFF3D',//[]
    			'\u3010': '\u3011',//【】
    			'\u300E': '\u300F',//『』
    			'\uFF08': '\uFF09',//()
    			'\u201D': '\u201D',// ””
    			'\u2019': '\u2019',// ’’
    		};
    		var arr = Object.keys(obj).map(function(key) '\\' + key + '[^\\n\\'+ obj[key] +']{2,}\\' + obj[key]);
    		return this._kukuriReg = new RegExp(arr.join('|'), 'g');
    	},
    	getKeyword: function (list, aDoc) {
    		if (!list) list = this.SITEINFO;
    		var locationHref = aDoc.location.href;
    
    
    		for (let [index, info] in Iterator(list)) {
    			try {
    				var exp = info.url_regexp || (info.url_regexp = new RegExp(info.url));
    				if ( !exp.test(locationHref) ) continue;
    				if (info.keyword)
    					return Array.isArray(info.keyword) ? info.keyword : info.keyword.split(/\s+/);
    				if (info.input) {
    					var input = aDoc.querySelector(info.input);
    					if (input && input.value && /\S/.test(input.value))
    						return this.clean(input.value);
    				} else if (RegExp.$1) {
    					try {
    						return this.clean(decodeURIComponent(RegExp.$1));
    					} catch (e) {}
    					return this.clean(RegExp.$1);
    				}
    			} catch(e) {
    				log('error at ' + e);
    			}
    		}
    		return [];
    	},
    	clean: function clean(str) {
    		var res = [];
    		var kukuri = str.match(this.kukuriReg);
    		if (kukuri) {
    			[].push.apply(res, kukuri.map(function(w) w.slice(1,-1)));
    			str = str.replace(this.kukuriReg, ' ');
    		}
    
    
    		str = str.replace(/\b(?:(?:all)?(?:inurl|inanchor)|link|cache|related|info|site|filetype|daterange|movie|weather|blogurl):\S*/g, "");
    		str = str.replace(/\b(?:AND|OR)\b|\s\-\S+/g, " ")
    		str = str.replace(/(?:all)?(?:intitle|intext):/g, " ");
    		//str = (' ' + str + ' ').replace(/\s\-\S+|(?:(?:all)?(?:inurl|intitle|intext|inanchor)|link|cache|related|info|site|filetype|daterange|movie|weather|blogurl)\:\S*|\s(?:AND|OR)\s/g, ' ');
    		// \x20-\x29  !"#$%&'()*+,-./    \x3A-\x40 :;<=>?@    \x5B-\x60 [\]^_`    x7B-\x7E {|}~
    		var tango = str.match(/[^\x20-\x29\x3B-\x3F\x5B-\x5E\x60\x7B-\x7E\s]{2,}/g);
    		if (tango) {
    			[].push.apply(res, tango/*.sort(function(a,b) b.length - a.length)*/);
    		}
    		return res.filter(function(e,i,a) e && a.indexOf(e) === i);
    	},
    	find: function(aWord, isBack) {
    		var res;
    		var fastFind = gBrowser.mCurrentBrowser.fastFind;
    		if (fastFind.searchString != aWord) {
    			res = fastFind.find(aWord, false);
    			if (isBack) {
    				res = fastFind.findAgain(isBack, false);
    			}
    		} else {
    			res = fastFind.findAgain(isBack, false);
    		}
    		if (res === this.FIND_NOTFOUND)
    			return this.sound.beep();
    		if (res === this.FIND_WRAPPED)
    			this.sound.beep();
    		var win = fastFind.currentWindow;
    		if (!win) return;
    		var sel = win.getSelection();
    		var node = sel.getRangeAt(0).startContainer;
    		var span = node.parentNode;
    		if (!span.classList.contains(CLASS_SPAN)) return;
    		isBack ? sel.collapseToStart() : sel.collapseToEnd();
    //		sel.collapse(node, 1);
    		span.style.setProperty('outline', '4px solid #36F', 'important');
    		win.setTimeout(function () {
    			span.style.removeProperty('outline');
    		}, 400);
    	},
    };
    
    
    
    
    window.gWHT.ContentClass = function(){ this.init.apply(this, arguments) };
    window.gWHT.ContentClass.prototype = {
    	finder: Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind),
    	styles: [
    		 ['hsl( 60, 100%, 80%)','#000'] // bgcolor, textcolor
    		,['hsl(120, 100%, 80%)','#000']
    		,['hsl(180, 100%, 80%)','#000']
    		,['hsl(240, 100%, 80%)','#000']
    		,['hsl(300, 100%, 80%)','#000']
    		,['hsl(360, 100%, 80%)','#000']
    		,['hsl( 30, 100%, 80%)','#000']
    		,['hsl( 90, 100%, 80%)','#000']
    		,['hsl(150, 100%, 80%)','#000']
    		,['hsl(210, 100%, 80%)','#000']
    		,['hsl(270, 100%, 80%)','#000']
    		,['hsl(330, 100%, 80%)','#000']
    	],
    	css: [
    		'font: inherit !important;'
    		,'margin: 0px !important;'
    		,'padding: 0px !important;'
    		,'border: none !important;'
    		,'text-shadow: none !important;'
    	].join(' '),
    	throughSelector: ['textarea', 'input', '.' + CLASS_SPAN].map(function(w) w+', '+w+' *').join(','),
    
    
    	init: function(doc, keywords) {
    		this.doc = doc;
    		this.win = doc.defaultView;
    		this.body = doc.body,
    		this.items = {};
    		this.finder.findBackwards = false; /* 後ろから前に向かって検索するか */
    		this.finder.caseSensitive = false; /* 大文字小文字を区別するか */
    		this.isEmpty = true; // TreeWalker で無駄に探さない為のフラグ
    
    
    		if (keywords) {
    			this.initItems(keywords);
    		}
    		this.doc.addEventListener("keypress", this, false);
    		this.doc.addEventListener("GM_AutoPagerizeNextPageLoaded", this, false);
    		this.win.setTimeout(function() {
    			this.fireEvent('initialized', this.doc);
    		}.bind(this), 100);
    	},
    	handleEvent: function(event) {
    		switch (event.type) {
    			case "keypress":
    				if (event.target instanceof HTMLTextAreaElement ||
    				    event.target instanceof HTMLSelectElement ||
    				    event.target instanceof HTMLInputElement && (event.target.mozIsTextField(false)))
    					return;
    				var {charCode, ctrlKey, shiftKey, altKey} = event;
    				if ((charCode === 78 || charCode === 110) && !ctrlKey && !altKey) {
    					this.find(shiftKey);
    					event.preventDefault();
    					event.stopPropagation();
    				}
    				break;
    			case "GM_AutoPagerizeNextPageLoaded":
    				// AutoPagerizeの最後の区切り以降のRangeを取得
    				var sep = this.doc.querySelectorAll('.autopagerize_page_separator, .autopagerize_page_info');
    				sep = sep[sep.length-1];
    				if (!sep) return;
    				var range = this.doc.createRange();
    				if (sep.parentNode.localName == 'td') {
    					range.setStartAfter(sep.parentNode.parentNode);
    					range.setEndAfter(sep.parentNode.parentNode.parentNode);
    				} else {
    					range.setStartAfter(sep);
    					range.setEndAfter(sep.parentNode.lastChild);
    				}
    				this.highlightAll(range);
    				break;
    		}
    	},
    	initItem: function(aWord, aBold, aBG, aFG, aIndex) {
    		if (!aWord) return null;
    		if (typeof aWord === 'object') {
    			aBold = aWord.bold;
    			aBG = aWord.bgcolor;
    			aFG = aWord.fgcolor;
    			aIndex = aWord.index;
    			aWord = aWord.word;
    			if (!aWord) return null;
    		}
    		var w = aWord.toLowerCase();
    		if (this.items[w]) return null;
    
    
    		var index = typeof aIndex == 'number' && aIndex != NaN ? aIndex : this.newIndexOf();
    		var [bg, fg] = this.styles[index % this.styles.length];
    		if (aBG) {
    			bg = aBG;
    			fg = aFG || rgb2bw(aBG);
    		}
    		var obj = this.items[w] = {
    			word: aWord,
    			index: index,
    			bgcolor: bg,
    			fgcolor: fg,
    			bold: !!aBold,
    			length: 0,
    		};
    		Object.defineProperty(obj, 'toString', {
    			enumerable: false,
    			value: function() {
    				return '[' + this.index + ':' + this.length + ':' + this.word + ']';
    			}
    		});
    		return obj;
    	},
    	initItems: function(array, aBold) {
    		return array.map(function(aWord, index) {
    			return this.initItem(aWord, aBold);
    		}, this);
    	},
    	_highlight: function(aItem, aRange) {
    		this.finder.findBackwards = false; /* 後ろから前に向かって検索するか */
    		var doc = this.doc;
    		var range = aRange;
    		if (!range) {
    			range = doc.createRange();
    			range.selectNodeContents(this.body);
    		}
    		var sRange = range.cloneRange();
    		sRange.collapse(true);
    		var eRange = range.cloneRange();
    		eRange.collapse(false);
    
    
    		// タイマーを使わなくて良いおまじない
    		// http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2010-07-06_dynamic.htm
    		doc.documentElement.clientHeight;
    
    
    		var rangeArr = [];
    		var len = 0;
    		for (var retRange = null;
    		     retRange = this.finder.Find(aItem.word, range, sRange, eRange);
    		     sRange = retRange.cloneRange(), sRange.collapse(false)) {
    			rangeArr[++len] = retRange;
    		}
    
    
    		if (len > 0) {
    			var temp = doc.createElementNS("http://www.w3.org/1999/xhtml", "font");
    			temp.setAttribute("style", this.css +
    				'background-color: ' + aItem.bgcolor + ' !important;' +
    				'color: ' + aItem.fgcolor + ' !important;');
    			temp.setAttribute("class", CLASS_SPAN + ' ' + CLASS_INDEX + aItem.index);
    
    
    			len = 0;
    			rangeArr.forEach(function(range){
    				var node = range.startContainer;
    				if (node.nodeType != 1)
    					node = node.parentNode;
    				if (node.mozMatchesSelector(this.throughSelector)) {
    					if (node.classList.contains( CLASS_INDEX + aItem.index ))
    						++len;
    					return;
    				}
    
    
    				node = range.endContainer;
    				if (node.nodeType != 1)
    					node = node.parentNode;
    				if (node.mozMatchesSelector(this.throughSelector)) {
    					if (node.classList.contains( CLASS_INDEX + aItem.index ))
    						++len;
    					return;
    				}
    
    
    				var span = temp.cloneNode(false);
    				try {
    					range.surroundContents(span);
    					++len;
    					return;
    				} catch (e) {}
    				try {// 範囲内の要素を細切れにしてでも強調する。行儀が悪い
    					span.appendChild(range.extractContents());
    					range.insertNode(span);
    					++len;
    					return;
    				} catch (e) {}
    			}, this);
    		}
    		if (aRange)
    			aItem.length += len;
    		else
    			aItem.length = len;
    		if (aItem.length)
    			this.isEmpty = false;
    	},
    	_lowlight: function(aItem) {
    		var doc = this.doc;
    		$A(doc.getElementsByClassName(CLASS_INDEX + aItem.index)).forEach(function(elem){
    			var range = doc.createRange();
    			range.selectNodeContents(elem);
    			var df = range.extractContents();
    			range.setStartBefore(elem);
    			range.insertNode(df);
    			range.selectNode(elem);
    			range.deleteContents();
    		}, this);
    		aItem.length = 0;
    		if (Object.keys(this.items).length === 0)
    			this.isEmpty = true;
    	},
    	highlightAll: function(aRange) {
    		Object.keys(this.items).forEach(function(key){
    			this._highlight(this.items[key], aRange);
    		}, this);
    		this.fireEvent('highlightAll', this.doc);
    	},
    	lowlightAll: function() {
    		var doc = this.doc;
    		$A(doc.getElementsByClassName(CLASS_SPAN)).forEach(function(elem){
    			var range = doc.createRange();
    			range.selectNodeContents(elem);
    			var df = range.extractContents();
    			range.setStartBefore(elem);
    			range.insertNode(df);
    			range.selectNode(elem);
    			range.deleteContents();
    		}, this);
    		Object.keys(this.items).forEach(function(key){
    			delete this.items[key];
    		}, this);
    		this.isEmpty = true;
    		this.fireEvent('lowlightAll', this.doc);
    	},
    	addWord: function(aWord, aBold, aRange) {
    		var itemArr = Array.isArray(aWord) ? this.initItems(aWord, aBold) : [this.initItem(aWord, aBold)];
    		itemArr = itemArr.filter(function(item) {
    			if (item) {
    				this._highlight(item, aRange);
    				return true;
    			}
    		}, this);
    		if (itemArr.length) {
    			var args = ['highlight', this.doc].concat(itemArr);
    			this.fireEvent.apply(this, args);
    		}
    	},
    	removeWord: function(aWord) {
    		var w = aWord.toLowerCase();
    		var obj = this.items[w];
    		if (obj) {
    			this._lowlight(obj);
    			this.fireEvent('lowlight', this.doc, obj);
    		}
    		delete this.items[w];
    	},
    	newIndexOf: function() {
    		// index プロパティの欠番を探す
    		var arr = [];
    		Object.keys(this.items).forEach(function(key) arr[this.items[key].index] = true, this);
    
    
    		for (var i = 0, len = arr.length; i < len; i++) {
    			if (!arr[i]) return i;
    		};
    		return arr.length;
    	},
    	find: function(isPrev) {
    		if (this.isEmpty) {
    			debug('強調されていないようなので検索しません');
    			return;
    		}
    		var tw = this.tw;
    		if (!tw) {
    			let fn = function(node) {
    				if (node.classList.contains(CLASS_SPAN)) {
    					return NodeFilter.FILTER_ACCEPT;
    				}
    				return NodeFilter.FILTER_SKIP;
    			}
    			tw = this.tw = this.doc.createTreeWalker(this.doc.body, NodeFilter.SHOW_ELEMENT, fn, false);
    		}
    		// ツリーの現在地を最後にクリックした位置に合わせる
    		var sel = this.win.getSelection();
    		if (sel.focusNode) {
    			var n = isPrev ? sel.anchorNode : sel.focusNode;
    			var o = isPrev ? sel.anchorOffset : sel.focusOffset;
    			tw.currentNode = o ? (n.childNodes[o] || n) : n;
    		}
    		sel.removeAllRanges();
    
    
    		var node;
    		if (isPrev) {
    			node = tw.previousNode();
    			if (!node) {
    				node = Array.pop(this.doc.getElementsByClassName(CLASS_SPAN));
    				tw.currentNode = node || this.doc.body.lastChild;
    				if (node)
    					gWHT.sound.beep();
    			}
    		} else {
    			node = tw.nextNode();
    			if (!node) {
    				node = this.doc.getElementsByClassName(CLASS_SPAN)[0];
    				tw.currentNode = node || this.doc.body;
    				if (node)
    					gWHT.sound.beep();
    			}
    		}
    		if (!node) {
    			gWHT.sound.beep();
    			this.isEmpty = true;
    			return;
    		}
    		this.isEmpty = false;
    
    
    		sel.selectAllChildren(node);
    		try {
    			sel.QueryInterface(Ci.nsISelectionPrivate)
    				.scrollIntoView(Ci.nsISelectionController.SELECTION_ANCHOR_REGION, true, 50, 50);
    		} catch (e) {}
    
    
    		var anchor = this.doc.evaluate('descendant-or-self::a[@href]|ancestor-or-self::a[@href]',
    			node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    		if (anchor && !/^mailto/.test(anchor.href)) {
    			anchor.focus();
    			sel.selectAllChildren(node);
    		}
    		isPrev ? sel.collapseToStart() : sel.collapseToEnd();
    		node.style.setProperty('outline', '3px solid #36F', 'important');
    		this.win.setTimeout(function() {
    			node.style.removeProperty('outline');
    		}, 400);
    	},
    	fireEvent: function (aName, aTarget) {
    		var evt = new CustomEvent(EVENT_RESPONSE, { bubbles: true, cancelable: true, detail: {
    			name: aName,
    			args: $A(arguments).slice(2),
    		} });
    		aTarget.dispatchEvent(evt);
    	},
    };
    
    
    function rgb2bw(code) {
    	if (!code) return "#000";
    	var m = code.match(/^#?([0-9a-f]{1,2})([0-9a-f]{1,2})([0-9a-f]{1,2})$/i);
    	if (!m || !m[1]) return "#000";
    	m = m.slice(1, 4).map(function(c){
    		return parseInt(!c[1] ? c[0] + c[0] : c, 16);
    	});
    	return (m[0] + m[1] + m[2]) > 128*3 ? "#000" : "#fff";
    }
    
    
    function getWins(win) {
    	var wins = win.frames.length ? [win].concat(Array.slice(win.frames)) : [win];
    	return wins.filter(function(win) checkDoc(win.document));
    }
    function checkDoc(doc) {
    	if (!(doc instanceof HTMLDocument)) return false;
    	if (!window.mimeTypeIsTextBased(doc.contentType)) return false;
    	if (!doc.body || !doc.body.hasChildNodes()) return false;
    	if (doc.body instanceof HTMLFrameSetElement) return false;
    	return true;
    }
    function getFocusedWindow() {
    	var win = document.commandDispatcher.focusedWindow;
    	return (!win || win == window) ? content : win;
    }
    function getRangeAll(win) {
    	var sel = (win || getFocusedWindow()).getSelection();
    	var res = [];
    	if (sel.isCollapsed) return res;
    
    
    	for(var i = 0, l = sel.rangeCount; i < l; i++) {
    		res.push(sel.getRangeAt(i));
    	}
    	return res;
    }
    
    
    function $(id) { return document.getElementById(id); }
    function $$(exp, doc) { return Array.prototype.slice.call((doc || document).querySelectorAll(exp)); }
    function $A(args) { return Array.prototype.slice.call(args); }
    function log() { Services.console.logStringMessage($A(arguments).join(', ')); }
    function debug() { if (gWHT.DEBUG) log("wht debug: " + $A(arguments).join(', ')); }
    function addStyle(css) {
    	var pi = document.createProcessingInstruction(
    		'xml-stylesheet',
    		'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    	);
    	return document.insertBefore(pi, document.documentElement);
    }
    
    
    window.gWHT.init();
    
    
    })('\
    #wordhighlight-toolbar-icon, .wordhighlight-toolbar-icon {\
      list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAANUlEQVQ4jWNgGBTg6dOi/6RgrAb8/19PFB7EBlAUBoMDFD0t+k8qxjCgngQ4SA2gKAwGDAAAM3SE/usVkKQAAAAASUVORK5CYII=");\
    }\
    #wordhighlight-toolbar-icon[state="Deaktiviert"] {\
            filter: '
           + (Number(Application.version.substring(0,2))>=36 ? 'grayscale(1)' : 'url("chrome://mozapps/skin/extensions/extensions.svg#greyscale")')
           + ';\
    }\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-up,\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-down {\
      list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-left.png");\
    }\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-down {\
      transform: scaleX(-1);\
    }\
    .wordhighlight-toolbar-item {\
      text-shadow: none;\
    }\
    .wordhighlight-toolbar-item > .toolbarbutton-icon { visibility: collapse; }\
    \
    .wordhighlight-toolbar-reloadbutton,\
    .wordhighlight-toolbar-addbutton {\
      list-style-image: url("chrome://browser/skin/Toolbar.png");\
    }\
    .wordhighlight-toolbar-reloadbutton { -moz-image-region: rect(0pt, 72px, 18px, 54px); }\
    .wordhighlight-toolbar-addbutton    { -moz-image-region: rect(0pt, 306px, 18px, 288px); }\
    \
    #wordhighlight-toolbar-box:empty,\
    .wordhighlight-toolbar-arrowscrollbox:empty,\
    .wordhighlight-toolbar-arrowscrollbox:empty ~ * { visibility: collapse; }\
    \
    \
    /*.wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-up:-moz-lwtheme-brighttext,\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-down:-moz-lwtheme-brighttext {\
      list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-left-inverted.png");\
    }\
    .wordhighlight-toolbar-reloadbutton:-moz-lwtheme-brighttext,\
    .wordhighlight-toolbar-addbutton:-moz-lwtheme-brighttext {\
      list-style-image: url("chrome://browser/skin/Toolbar-inverted.png");\
    }*/\
    \
    ');
    Alles anzeigen
  • WordHighlightToolbar deaktivierter Button unsichtbar

    • bege
    • 27. Februar 2015 um 18:17

    Tausend Dank, aborix :)

  • WordHighlightToolbar deaktivierter Button unsichtbar

    • bege
    • 27. Februar 2015 um 15:53

    Hallo,
    seit dem Update auf FF 36 ist der Button des Skriptes WordHighlightToolbar im deaktivierten Zustand unsichtbar. Er funktioniert ansonsten einwandfrei, lässt sich umschalten, der Tooltip ist da, nur der Button ist im deaktivierten Zustand nicht zu sehen. Weiß jemand eine Lösung?

  • Duckduckgo !bangs/Schlüsselwörter einfügen

    • bege
    • 24. Januar 2015 um 18:27

    Hallo,
    ich habe in der Suchleiste eine ganze Reihe von Suchmaschinen eingerichtet, einige mit Schlüsselwörtern, so dass ich damit in der Adressleiste suchen kann. Inzwischen bietet die Suchmaschine Duckduckgo eine riesige Auswahl an Schlüsselwörtern, sogenannte "!bangs", mit denen in anderen Suchmaschinen gesucht werden kann: Duckduckgo als Standardsuchmaschine einrichten, "!bang" und Suchbegriff eingeben, und schon wird in der entsprechenden Suchmaschine gesucht. Die "!bangs" kann ich mir aber nicht merken. Deshalb habe ich mir aus dem Skript "Locationbar Characters" ein Skript gebastelt, mit dem ich die Schlüsselwörter per Rechtsklick in die Adressleiste einfügen kann. Das geht natürlich nicht nur für die "!bangs", sondern auch für alle eigenen Schlüsselwörter.
    Vielleicht kann noch jemand das Skript gebrauchen.

    [Blockierte Grafik: http://abload.de/img/screenshot_022hvdc7.png]

    Code
    /* DuckduckgoBangs.uc.js
    verändert aus LocationbarCharacters.uc.js
    die !bangs können ab Zeile 16 geändert werden,
    die maximale Länge der !bangs wird bei "var sym = label.slice(0, 15),""
    eingestellt (z.Zt. max. 15 Stellen) */
    
    
    function initLocationBarCharacters() {
        var urlbar = window.document.getElementById("urlbar"),
            textBox = window.document.getAnonymousElementByAttribute(urlbar, "anonid", "textbox-input-box"),
            cxmenu = window.document.getAnonymousElementByAttribute(textBox, "anonid", "input-box-contextmenu"),
            separator = document.createElement("menuseparator"),
            menu = document.createElement("menu"),
            popup = document.createElement("menupopup"),
            i,
            labelArray = [
    		"!sp             Startpage",
    		"!ge             Google SSL",
    		"!gi             Google Bilder",
    		"!spi            Startpage Bilder",
    		"!gm             Google Maps",
    		"!wde            Wikipedia",
    		"!leo            LEO",
    		"!gtde           Google Übersetzer ->de",
    		"!ade            Amazon",
    		"!ebde           ebay",
    ],
    		insertCharacters = function(sym) {
    		    var urlbar = window.document.getElementById("urlbar"),
    		        urlbarText = urlbar.value,
    		        pos,
    		        urlbarFocus = window.document.getElementById("Browser:OpenLocation");
    
    
    		    urlbarFocus.doCommand();
    
    
    		    if (urlbarText.length === 0) {
    		        urlbarText = sym + " ";
    		    } else if (urlbarText.slice(-1) === " ") {
    		        urlbarText = urlbarText + sym + " ";
    		    } else {
    		        urlbarText = urlbarText + " " + sym + " ";
    		    }
    		    urlbar.value = urlbarText;
    
    
    		    pos = urlbarText.length;
    		    urlbar.setSelectionRange(pos, pos);
    		},
            makeMenuItem = function(label) {
    	        var sym = label.slice(0, 15),
    		        node = document.createElement("menuitem");
    		    node.setAttribute("label", label);
    		    node.addEventListener("command", function() { insertCharacters(sym); }, false);
    		    popup.appendChild(node);
            };
    
    
        menu.setAttribute("label", "!bangs" );
        menu.appendChild(popup);
        for (i = 0; i < labelArray.length; i += 1) {
    	    makeMenuItem(labelArray[i]);
    	}
        cxmenu.appendChild(separator);
        cxmenu.appendChild(menu);
    }
    
    
    initLocationBarCharacters();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 24. November 2014 um 19:13
    Zitat von aborix

    Löschbutton links:

    Ersetze in Zeile 180 'find-next' durch 'find-previous' .

    Danke für den Tipp, aborix. Und für gaaaanz links durch 'findbar-textbox'.

    [attachment=0]screenshot_014.png[/attachment]

    Bilder

    • screenshot_014.png
      • 4,18 kB
      • 517 × 38
  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 24. November 2014 um 17:14

    Findbar Plus:

    Sitzt bei euch der Löschen-Button auch zwischen den beiden Pfeilen?

    [attachment=0]screenshot_013.png[/attachment]

    ganz links wäre er mir lieber.

    Bilder

    • screenshot_013.png
      • 3,6 kB
      • 519 × 41
  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 2. November 2014 um 18:11

    Bei mir heißt der entsprechende Abschnitt

    Code
    var icon = $("ctraddon_addon-bar").appendChild(document.createElement("toolbarbutton"));
    		icon.setAttribute("id", PREFIX + "icon");
    		icon.setAttribute("class", "toolbarbutton-1");
    		icon.setAttribute("onclick", "gWHT.GET_KEYWORD = !gWHT.GET_KEYWORD");
    		icon.setAttribute("context", "");
     		icon.setAttribute("style", "padding: 0px 2px;");
                    document.getElementById('ctraddon_addon-bar').insertBefore(icon, document.getElementById('MemoryDisplay'));

    warum benutzt ihr "image" statt "toolbarbutton"?

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 4. Oktober 2014 um 17:37

    Die CTR Option, den Feedbutton in die urlbar zu verschieben, funktioniert bei mir - aus welchem Grund auch immer - nicht. Deshalb verwende ich stattdessen das Skript move-feedbutton-to-urlbar. Das funkioniert seit CTR 1.2.5beta13 nicht mehr richtig (Buttongröße passt nicht mehr). Wie Aris schreibt http://forums.mozillazine.org/viewtopic.php?…7985&start=1395
    liegt das daran, dass das Skript nicht für kleine Buttons passt. Bisher wurde das durch CTR korrigiert. Nachdem der Code von CTR bereinigt wurde, tritt das Problem zutage. Aris hat u.a. diese Korrektur des Skripts angeboten, die bei mir funktioniert:

    CSS
    //   Feed Button  0.5 (modified for CTR 1.2.5beta13+)
    
            (function () {
    
    
               if (location != 'chrome://browser/content/browser.xul') return;
    
               const buttonLabel = 'RSS Button für Adressleiste';
               const buttonTooltiptext = 'RSS Button für Adressleiste';
               const buttonIcon = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhNJREFUeNqkk9%2BLjGEUxz%2FPM%2B80Q1rmiqstm0K7dlOSRjbFBSGsK1ruiMTFti6sP0AoN4rcSO2FCyWxS42EMrhZrB9xMS0mwtXKMjtr5n1f53nPzPtOflzI6T095%2Bn9nu%2F5nvM8jwnDkImBnmLg%2B3lCH2SvZuQzupIsGhusTX3pOD2e89w%2B8Ov5Res2wsy02yjIWnGvxW2DRQpYQ6lwfZ6DRQRRUq4d1hxOqlQmoXQPXo7A24eQngUpgYcBrN6na0zgVAc1uHxA4jpk26BzK3RvU58sw%2FAuLeTU1GfiVr1mT4Q%2F4N19AQXK%2BPqGxuuPwYo9sFf2F7aAL7hgOh5KoqBegcHnSQsfJX5wFu6egM8vYNNJ6B%2BGi9sFW41hXjJhkTc6ID%2BlwuINsGQz7DgnBMdh%2FBI86Ybl%2FbBwlUArMYGNz8j1%2FuERvJeB3RqC83np%2FQ2sPQodvVA8pdCenVLke0N2TNBooVPkHRyDQ89gqSi4slv%2FrdwvWtNQLsKCZaKg2sxvELiJBt%2FkeI4kM%2BgdUmDpJszvEgLpdqIAmbmCr%2F6phRq%2FWSYjd%2BC2xmlPVarcXwjcMXriY2eSZBdn5wjJ7AZZVj3KEsXGtpyCTclPCT%2FdgWsFBaWk5za5rVOvYKRP4hx8lXi0T4ltC0EtNOXS1cft0cVpPiZj%2BKvJWwitnYpg7jUaY7qcSP7NfMl9GhH8j%2F0UYAByQLfCOoz1CQAAAABJRU5ErkJggg%3D%3D)';   
    
               var feedButton = document.getElementById('feed-button');
               if (!feedButton) {
                 window.CustomizableUI.addWidgetToArea('feed-button','nav-bar');
                 feedButton = document.getElementById('feed-button');
               };
               feedButton.setAttribute('label', buttonLabel);
               feedButton.setAttribute('tooltiptext', buttonTooltiptext);
               feedButton.style.listStyleImage = buttonIcon;
               feedButton.style.MozImageRegion = 'rect(0px 0px 0px 0px)';
    
    
               var urlbarIcons = document.getElementById('urlbar-icons');
               urlbarIcons.appendChild(feedButton);     
    
               var css = '#feed-button .toolbarbutton-icon {padding: 0px !important; margin-bottom: -2px!important;} #feed-button {margin-top: -6px !important; margin-bottom: -6px !important;} #feed-button[disabled]{display: none !important;}';
    		   var stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
               document.insertBefore(stylesheet, document.documentElement);
    
    		   const sss = Components.classes["@mozilla.org/content/style-sheet-service;1"].getService(Components.interfaces.nsIStyleSheetService);
    
    		   var sheet = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService)
    						.newURI('data:text/css;charset=utf-8,' + encodeURIComponent('\
    				#main-window toolbar #urlbar-icons #feed-button .toolbarbutton-icon{\
    				  padding:0 !important;\
    				}\
    				#main-window toolbar #urlbar-icons #feed-button{\
    				  margin:-6px 1px !important;\
    				}\
    		   '), null, null);
    
    
    		   sss.loadAndRegisterSheet(sheet,sss.AGENT_SHEET);
    
            }) ();
    Alles anzeigen
  • Classic-Theme-Restorer-Menü (Firefox-Menü) anpassen

    • bege
    • 23. September 2014 um 14:41

    Nur als Hinweis, falls noch jemand mit diesem Script arbeitet:
    Die ID für das Web-Entwickler-Menü hat sich (bei einem der letzten Updates von CTR?) von

    Code
    ctraddon_appmenubox_developer

    zu

    Code
    appmenu_webDeveloper

    verändert.
    Deshalb funktionierte das ganze Script nicht mehr.

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 24. August 2014 um 19:39

    Stoiker
    Danke, das sieht interessant aus.

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 23. August 2014 um 14:38

    Gefunden :!:

    Die genannte Option in den Firefox-Einstellungen schreibt die pref "browser.display.use_document_fonts".
    In gui:config gibt es eine Option "Eingebundene Schriftarten herunterladen", die die pref "gfx.downloadable_fonts.enabled" schreibt.
    Ist die erste pref deaktiviert, werden die Buttons und Zeichen nicht dargestellt, egal wie die zweite pref eingestellt ist.
    Ist die erste aktiviert, wie es ja der Fall war, hängt die Darstellung von der zweiten ab.

    Wer oder was ist gfx...? Es gibt da noch eine Reihe weiterer prefs, die so beginnen.

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 23. August 2014 um 14:15

    Ich lerne durch eure Beiträge wieder richtig was dazu. Danke :)

    Mir fiel noch die Erweiterung gui:config ein, die nur Firefox-eigene Einstellungen schreibt.
    https://addons.mozilla.org/de/firefox/addon/guiconfig/
    Ich habe mit dem angebotenen Button alles zurückgesetzt, und siehe da: die Buttons auf den Websites sind wieder da. :D
    Nun habe ich versucht herauszufinden, welche Einstellung das Übel verursacht hat, aber trotz aller Änderungen bleiben die Buttons und Zeichen da. Das ist ja erfreulich, aber meine Neugier ist nicht gestillt.
    Jedenfalls haben mich eure Beiträge auf diese Spur gebracht :klasse: , vielen Dank für die Hilfe. :D
    Falls ich die entsprechende Einstellung doch noch finde, trage ich es hier nach.

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 23. August 2014 um 13:46

    Eure Antworten deuten darauf hin, dass es irgendwo an einer Einstellung für Schriften liegt. Bei den Buttons scheint es sich auch nicht um Grafiken zu handeln, zumindest sind die kryptischen Zeichen nicht das Zeichen für einen Grafikplatzhalter. Im DOM-Inspektor werden auch keine Grafikadressen angezeigt. Für was stehen diese Zeichen dann?
    Auf github sieht es übrigens auch so aus
    [attachment=0]Screenshot_002.png[/attachment]

    Edit: Ups, deinen neuen Beitrag hatte ich übersehen, Sören.

    Bilder

    • Screenshot_002.png
      • 81,58 kB
      • 700 × 300
  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 23. August 2014 um 13:36
    Zitat von 2002Andreas


    Stylish wäre aber im abges. Modus vom Fx deaktiviert, ergo auch der Code.

    Statt Stylish benutze ich den UserCSSLoader, aber für den gilt ja das gleiche, ist im abgesicherten Modus deaktivert.

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 23. August 2014 um 13:34
    Zitat von 2002Andreas


    Gute Idee :klasse:

    Sieht dann hier so aus:

    [Blockierte Grafik: http://www11.pic-upload.de/thumb/21.08.14/pmjh5hxztza.jpg]

    Diese Einstellung ist bei mir aktiviert, also das Benutzen eigener Schriftarten erlaubt.

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 23. August 2014 um 13:32
    Zitat von Sören Hentzschel

    Eine NoScript-Einstellung kann Auswirkungen auch im Abgesicherten Modus haben, wenn NoScript eine Einstellung von Firefox verändert, sprich Firefox selbst der Konsument dieser Einstellung ist und nicht nur NoScript

    Hast du eine Ahnung, was das in diesem Fall für eine Einstellung sein könnte?

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 21. August 2014 um 10:19
    Zitat von 2002Andreas

    Nutzt du die Erweiterung NoScript!?

    Ja. Duckduckgo.com ist erlaubt. Setzt NoScript eine about:config-Einstellung, die die Anzeige verhindert? Da es auch im abgesicherten Modus nicht geht, muss es ja eine Standard-Firefox-Einstellung sein, eine NoScript-eigene Einstellung kann im abgesicherten Modus ja keine Auswirkung haben, oder?

  • Buttons auf Webseiten werden oft nicht dargestellt

    • bege
    • 21. August 2014 um 09:48

    Hallo,
    seit einer Weile werden auf verschiedenen Webseiten Buttons nicht dargestellt. Hier ein Beispiel von https://duckduckgo.com
    [attachment=1]Screenshot_007.png[/attachment]
    Im IE sieht es dagegen so aus
    [attachment=0]Screenshot_008.png[/attachment]

    Das gleiche Problem im abgesicherten Modus, in einem neuen Profil dagegen werden die Buttons auch im FF dargestellt.
    Bevor ich jetzt (wieder) mit einem neuen Profil anfange, meine Frage:
    Kann mir jemand sagen, was das für Buttons sind und was es für Einstellungen bzw. about:config-Einstellungen braucht, damit sie angezeigt werden. Mit "Element untersuchen" bin ich nicht weitergekommen.
    Ich hoffe, dass es nur an einer von einer Erweiterung veränderten Einstellung liegt, die auch im abgesicherten Modus nicht zurückgesetzt wird, und es deshalb mit meinem Standardprofil nicht geht. Wenn ich diese Einstellung herausfinde, erspare ich mir das neue aufsetzen eines umfangreichen Profils.
    Danke.

    Bilder

    • Screenshot_008.png
      • 28,8 kB
      • 384 × 316
    • Screenshot_007.png
      • 25,08 kB
      • 337 × 317
  • Classic-Theme-Restorer-Menü (Firefox-Menü) anpassen

    • bege
    • 3. August 2014 um 19:43
    Zitat von aborix

    Ich kann das Problem nicht reproduzieren, bei mir befindet sich das Widget im CTR-Menü.


    Ich hatte ein leeres Profil und habe dann Stück für Stück Skripte und Add-ons hinzugefügt. Erst nach einer Weile habe ich die Einstellungen von CTR verändert, da waren also schon ein paar andere Skripte und Add-ons aktiv. Sowohl in diesem als auch in meinem alten Menü verschwindet das Widget mit dem Verschieben des Lesezeichen-Buttons, mit dem Button in der nav-bar ist das Widget wieder da.
    Nun habe ich also noch ein leeres Profil mit nur den genannten Add-ons und dem CTR-Menü-Skript aufgebaut, und da verschwindet das Widget auch bei mir nicht. Es muss also an der Kombination der CTR-Einstellung mit - ja was :?: liegen. Das sieht nach Kleinarbeit aus. Heute nicht mehr.

  • Classic-Theme-Restorer-Menü (Firefox-Menü) anpassen

    • bege
    • 2. August 2014 um 19:59

    So, Problem doch noch gelöst.
    Habe mich doch daran gemacht, mit einem neuen Profil zu experimentieren, und bin zum Glück schnell auf die Ursache des Problems gestoßen. Genauer gesagt, gibt es zwei Ursachen.

    • Das Widget verschwindet, wenn die CTR-Option "'Lesezeichen-Stern' in der Adressleiste" aktiviert ist.
    • Wenn das Widget nicht im CTR-Menü landet, ist der Timout-Wert zu klein. Wegen der vielen Addons in meinem Profil muss ich den Wert nicht in 100er-, sondern in 1000er-Schritten testen - irgendwann geht's. :wink:
      Buttons sind kein Problem, das Widget braucht 'ne Sonderbehandlung.

    Dass CTR mit dem Verschieben des Lesezeichen-Buttons auch das Widget verschluckt, ist ja nicht so weit hergeholt. Irgendwas kommt sich da in die Quere. Mit Buttons gibts kein Problem, bei dem Widget schon. aborix, Hast du spontan eine Idee, was da passieren könnte, dann könnte ich dem CTR-Autor einen Tipp geben, wenn ich ihm das Problem melde.

Unterstütze uns!

Jährlich (2025)

104,5 %

104,5% (679,10 von 650 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon