Przejdź do zawartości

Wikipedysta:ABX/infobox.js: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
Usunięta treść Dodana treść
ABX (dyskusja | edycje)
test
ABX (dyskusja | edycje)
drobne techniczne
Linia 309: Linia 309:
addOnloadHook(insertInfoboxSelector)
addOnloadHook(insertInfoboxSelector)

addOnloadHook(function(){infoboxes[infoboxes.length]=
{
name:'Test infobox',
selname:'Test infobox',
para:
[
['test1','<<rok>>',''],
['test2','[[<<rok>>]]',''],
['test3','[[<<rok:1990>>]]','']
]
}})

Wersja z 18:22, 7 sie 2008

var infoboxes = []
var ib_debug = false
 
function insertInfoboxSelector() //wstawia selectboksa
{
	var editform = document.getElementById('editform');
	if (!editform) return;
 
	var txt = "";
	txt += '<table border="0"><tr><td valign="middle"><select id="infobox_selector" name="infobox_selector" size="1">';
	txt += '<option selected="selected" value="-1">Wybierz infobox do wstawienia:';
	for (ibx=0; ibx<infoboxes.length; ibx++) {
			txt += '<option value="' + ibx + '">' + infoboxes[ibx].selname
	}
 
	txt += '</select></td>';
	txt += '<td valign="middle">';
	txt += '<input id="wpInfobox" name="wpInfobox" type="submit" value="Wypełnij" accesskey="i" title="Wstaw infobox na początku artykułu" onclick="openInsertingInfobox()">';
	txt += '</td></tr></table>';
 
	var selector = document.createElement('div');
	selector.innerHTML = txt;
	editform.parentNode.insertBefore(selector,editform)
}
 
function getRealValue(el) //pobiera ciągi tekstowe + wartości inputów w elemencie
{
	/*
	isempty=true //domyślnie - puste inputy	
	ipts=el.getElementsByTagName('input')
 
	for(i=0;i<ipts.length;i++) //na każdym inpucie
	{
		if(ipts[i].value!='') //sprawdzamy, czy nie jest pusty
		{
			isempty=false
			break //koniec pętli
		}
	}
 
 
	if(isempty) return ''
	*/
 
	val=''	
	for(z=0;z<el.childNodes.length;z++)
	{
		if(el.childNodes[z].nodeType==3) //string
		{
			val+=el.childNodes[z].nodeValue
		}
		else //nie string - element HTML
		{
			if(el.childNodes[z].value) val+=el.childNodes[z].value
		}
	}
 
	return val
}
 
function parseIboxLine(name,val,info) //parsowanie zmiennych <<>>
{
	if(val.indexOf('<<')==-1) //brak specjalnych znaków - jeden zwykły input
	{
		txt=
		' | '+name+(info?' <dfn class="info">('+info+')</dfn>':'')+
		' = '+
		'<span id="ibox-'+name+'">'+
		'<input value="'+val+'" />'+
		'</span><br />'
 
		return txt
	}
	else //parsujemy wszystkie <<>>
	{
		arr=[]
		//tablica, w niej na przemian string, <<>>, string, <<>>, itd.
		//w razie potrzeby (gdy po sobie są dwa <<>>) string jest pusty
		//pierwszy element to zawsze string
		//ostatni to <<>> lub string
 
		//substr to nie to samo co substring!
 
		while(val.indexOf('<<')!=-1) //dopóki jest tu jeszcze jakieś <<>>
		{
			idx=val.indexOf('<<') //pozycja <<
 
			if(idx!=0) //gdy mamy najpierw zwykły string
			{
				arr.push(val.substring(0,idx)) //wrzucamy do tablicy ów string
 
				val=val.substr(idx) //po czym odcinamy do od val
			}
			else
			{
				arr.push('') //a gdy nie, wrzucamy pusty
			}
 
			//teraz index << jest równy 0
 
			idx=val.indexOf('>>') //dokąd wycinamy?
 
			arr.push(val.substring(2,idx)) //wrzucamy do tablicy to, co jest pomiędzy << a >>
 
			val=val.substr(idx+2) //odcinamy <<>> z początku
		}
 
		if(val!='') //jeszcze jakiś string na końcu
		{
			arr.push(val)
			val=''
		}
 
 
 
		txt='' //to będzie to, co jest między = a kolejnym |
		for(i in arr)
		{
			if(i%2==0) //liczba parzysta - string
			{
				txt+=arr[i] //po prostu dopisujemy string
			}
			else //nieparzysta - <<>>
			{
				if(arr[i].indexOf(':')!=-1) //zawiera domyślną wartość
				{
					idx=arr[i].indexOf(':')
 
					_name=arr[i].substring(0,idx)
					_default=arr[i].substr(idx+1)
				}
				else
				{
					_name=arr[i]
					_default=''
				}
				// _name - nazwa zmiennej
				// _default - wartość domyślna
 
 
				//parametr "validate" to regex, który musi pasować do zawartości pola
				//w przeciwnym razie wstawienie jest anulowane
 
				switch(_name) //parsujemy!
				{
					case 'input': //podstawowy input
						txt+='<input value="'+_default+'" />'
						break
					case 'rok':
						txt+='<input maxlength="4" value="'+_default+'" validate="^[0-9]{1,4}$" />'
						break
					default:
						txt+='<strong>Błąd! Nieznany typ "'+_name+'"!</strong>'
				}
			}
		}
 
		txt=
		' | '+name+(info?' <dfn class="info">('+info+')</dfn>':'')+
		' = '+
		'<span id="ibox-'+name+'">'+
		txt+
		'</span><br />'
 
		return txt
	}
}
 
function hl(el,h) //podświetl/anuluj podświetlenie
{
	if(h==undefined) h=true
 
	if(h) el.style.border='3px solid red'
	else el.style.border=''
}
 
function createInfobox(form) //generuje kod i wstawia do wpTextbox1
{
	ipts=document.getElementById('insertingInfobox').getElementsByTagName('input')
	for(z=0;z<ipts.length;z++) hl(ipts[z],false) //wyłącz podświetlenie wszystkich inputów
 
	txt='{{'+form.__name.value+"\n"
 
	span=form.getElementsByTagName('span')
	errors=0
 
	for(i=0;i<span.length;i++)
	{
		if(span[i].id.indexOf('ibox-')==-1||span[i].id==undefined)
		{
			alert('Błąd!')
			continue //pomijamy
		}
 
		for(j=0;j<ipts.length;j++)
		{
			if(ib_debug) alert(ipts[j].validate)
			
			if(!ipts[j].validate) ipts[j].validate='' //sprawdzamy pole walidacji
 
			regex=new RegExp(ipts[j].validate) //robimy z niego regexa
 
			if(ib_debug) alert(regex)
 
			if(ipts[j].value.search(regex)==-1) //po czym sprawdzamy
			{
				hl(ipts[j])
				errors++ //i w razie potrzeby wywalamy error
			}
		}
 
		txt+=' | '+span[i].id.replace('ibox-','')+' = '+getRealValue(span[i])+"\n"
	}
 
	if(errors>0)
	{
		alert('W formularzu pojawiły się błędy ('+errors+')! Odpowiednie pola zostały podświetlone, popraw je i kliknij "Wstaw" ponownie.')
		return
	}
 
	txt+='}}'
 
	document.getElementById('wpTextbox1').value=txt+document.getElementById('wpTextbox1').value
 
	form.parentNode.parentNode.removeChild(form.parentNode)
}
 
function closeInsertingInfobox() //ukrywa wypełnianie pól
{
	el=document.getElementById("insertingInfoboxForm").parentNode
	el.parentNode.removeChild(el)
}
 
function openInsertingInfobox() //umożliwia wypełnianie pól
{
	if(document.getElementById('insertingInfoboxForm')) return
 
	var editform = document.getElementById('editform');
	if (!editform) return;
 
	var selector = document.getElementById('infobox_selector');
	if (!selector) return;
 
	var n = Number(selector.options[selector.selectedIndex].value)
 
	div=document.createElement('div')
 
	txt='<form id="insertingInfoboxForm" action="index.php" method="POST" onsubmit="createInfobox(this);return false">'
 
	txt+='{{<input type="hidden" id="__name" value="'+infoboxes[n].name+'" />'+infoboxes[n].name+' <input type="submit" value="Wstaw" /> <input type="reset" value="Anuluj" onclick="closeInsertingInfobox()" /><br /><div id="insertingInfobox">'
 
	for(i in infoboxes[n].para)
	{
		pname=infoboxes[n].para[i][0]
		pval=infoboxes[n].para[i][1]||''
		pinfo=infoboxes[n].para[i][2]||false
 
		txt+=parseIboxLine(pname,pval,pinfo)
	}
 
	txt+='</div>}} <input type="submit" value="Wstaw" /> <input type="reset" value="Anuluj" onclick="closeInsertingInfobox()" /></form>'
 
	div.innerHTML=txt
 
	editform.parentNode.insertBefore(div,editform)
}
 
function loadInfoboxFromCode(code) //ma generować wypełnianie na podstawie wywołania
{
	infoboxes[infoboxes.length]={}
 
	code=code.replace(/^\s*/g,'')
	code=code.replace(/\s*$/g,'')
 
	code=code.replace(/\{\{(.+?)\s*\|/,function(a,b)
	{
		infoboxes[infoboxes.length].name=infoboxes[infoboxes.length].selname=b
		return ''
	})
	code=code.replace(/\s*\}\}/,'')
 
	lines=code.split('|')
	infoboxes[infoboxes.length].para={}
 
	for(i in lines)
	{
		line=lines[i]
 
		line=line.replace(/^\s*(.+?)\s*=\s*(.+?)\s*$/,function(str,p1,p2)
		{
			var pname, pval, pinfo
 
			p2.replace(/\s*<!--\s*(.+?)\s*-->\s*/,function(str,info)
			{
				pinfo=info
				return ''
			})
			if(pinfo==''||!pinfo) pinfo=''
 
			infoboxes[infoboxes.length].para.push([p1,p2,pinfo])
 
			return ''
		})
	}
}
 
importScript('Wikipedysta:Matma Rex/infoboksy.js')
importStylesheet('Wikipedysta:Matma Rex/infobox.css')
 
addOnloadHook(insertInfoboxSelector)

addOnloadHook(function(){infoboxes[infoboxes.length]=
{
	name:'Test infobox',
	selname:'Test infobox',
 
	para:
	[
		['test1','<<rok>>',''],
		['test2','[[<<rok>>]]',''],
		['test3','[[<<rok:1990>>]]','']
	]
}})