Wikipedysta:ABX/infobox.js: Różnice pomiędzy wersjami
Wygląd
Usunięta treść Dodana treść
test |
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>>]]','']
]
}})