Supersignoj Esperantaj

By Allon Last update Oct 27, 2005 — Installed 1,209 times.
// ==UserScript==
// @name          Supersignoj Esperantaj
// @namespace     http://allon.nfs.co.il
// @description	  Tajpu x post c,g,h,j,s,u por aldoni chapelon
// @include       *
// ==/UserScript==
// Bazita sur TTT-KLAVARO POR ESPERANTO de A. Irvine 2005
// Redaktis kaj igis "user script" Allon R. 2005

(function(){
	function aldonu(o,f) { 
		if(o.addEventListener) o.addEventListener("keyup",f,false); 
		else if(o.attachEvent) o.attachEvent("onkeyup",f); 
		else o.onkeyup=f;
	}
	var t=["input","textarea"];
	for(i in t) {
		var e=document.getElementsByTagName(t[i]);
		for(j in e) aldonu(e[j],eotajpu);
	}
})();

function eotajpu(ev) {
	function leguLokon(kampo) {
		var i=-1, I=i, j=-1, J=j;
		if(typeof kampo.selectionStart=="number") {
			I=i=kampo.selectionStart;
			J=j=kampo.selectionEnd;
		} else if(document.selection && kampo.createTextRange) {
			var sel, rngi, rngj, r2;
			sel=document.selection;
			if(sel) { try {
				r2=sel.createRange();
				rngi=kampo.createTextRange();
				rngi.setEndPoint("EndToStart", r2);
				i=rngi.text.length;
				rngj=kampo.createTextRange();
				rngj.setEndPoint("EndToEnd", r2);
				j=rngj.text.length;
			} catch(e) {
				r2=sel.createRange();
				var r3= r2.duplicate();
				r3.moveToElementText(kampo); // Electu tutan tekston en la duobligita [range]
				r3.setEndPoint('EndToEnd',r2);
				var x2=r2.text;
				var x3=r3.text; 
				i = x3.length - x2.length;
				j = i + x2.length;
				x2 = x2.replace(/\r?\n/g,"\n"); // \r\n -> longeco 1 ne 2!
				x3 = x3.replace(/\r?\n/g,"\n"); // \r\n -> longeco 1 ne 2!
				I = x3.length - x2.length;
				J = I + x2.length;
			}}
		} else J=j=I=i=-1;
		if (i<0 || i!=j) J=j=I=i=-1;
		return [i,j,I,J]; 
	} 

	function skribuLokon(kampo, kie) {
		if(typeof kampo.selectionStart=="number") {
			kampo.selectionStart = kie;
			kampo.selectionEnd = kie; // <-- cimo en Opera 8.5, bug-182864 CHE bugs.opera.com
		} else if(kampo.createTextRange) {
			var r = kampo.createTextRange();
			r.move('character', kie);
			r.select(); 
		} 
	}

	function shanghu(k,a) {
		for(i in a) k=k.replace(a[i][0],a[i][1]);
		return k;
	}

	var klavo = -1;
	if (ev && ev.which) {
	    klavo = ev.which; // NS4 & NS6
	} else if (window.event && window.event.keyCode) {
	   klavo = window.event.keyCode; // IE
	}
	if(klavo<1 || klavo==16 || (klavo>32 && klavo<41)) return;
	try {
		var metu = false;
		var a = leguLokon(this);
		var i = a[0];
		if (i < 0) return;
		var I = a[2];
		var M = -1;
		var k = this.value.substr(0,i);
		var f = this.value.substr(i);
		var k0 = k;
		var f0 = f;
		k = shanghu(k, [
			[/c[Xx^]$/g,"\u0109"], [/C[Xx^]$/g,"\u0108"],
			[/g[Xx^]$/g,"\u011D"], [/G[Xx^]$/g,"\u011C"],
			[/H[Xx^]$/g,"\u0124"], [/h[Xx^]$/g,"\u0125"],
			[/J[Xx^]$/g,"\u0134"], [/j[Xx^]$/g,"\u0135"],
			[/S[Xx^]$/g,"\u015C"], [/s[Xx^]$/g,"\u015D"],
			[/U[Xx~]$/g,"\u016C"], [/u[Xx~]$/g,"\u016D"]]);
		if (k.length != k0.length) {
			metu = true;
			M=I-1;
		} else {
			k = shanghu(k, [
				[/\u0109x$/g,"cx"], [/\u0109X$/g,"cX"], [/\u0108x$/g,"Cx"], [/\u0108X$/g,"CX"],
				[/\u011Dx$/g,"gx"], [/\u011DX$/g,"gX"], [/\u011Cx$/g,"Gx"], [/\u011CX$/g,"GX"],
				[/\u0125x$/g,"hx"], [/\u0125X$/g,"hX"], [/\u0124x$/g,"Hx"], [/\u0124X$/g,"HX"],
				[/\u0135x$/g,"jx"], [/\u0135X$/g,"jX"], [/\u0134x$/g,"Jx"], [/\u0134X$/g,"JX"],
				[/\u015Dx$/g,"sx"], [/\u015DX$/g,"sX"], [/\u015Cx$/g,"Sx"], [/\u015CX$/g,"SX"],
				[/\u016Dx$/g,"ux"], [/\u016DX$/g,"uX"], [/\u016Cx$/g,"Ux"], [/\u016CX$/g,"UX"]]);
			if (k != k0) {
				metu = true;
				M=I;
			}
		}
		if (metu) {
			this.value = k+f;
			skribuLokon(this, M);
		}
	} catch(e) { status=e; }
}