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)
test
Linia 1: Linia 1:
var infoboxes = []
var infoboxes = []
var ib_debug = true


function insertInfoboxSelector() //wstawia selectboksa
function insertInfoboxSelector() //wstawia selectboksa

Wersja z 18:10, 4 sie 2008

var infoboxes = []
var ib_debug = true

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(!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(ib_debug) hl(ipts[j])
			
			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)