Материал из Википедии — свободной энциклопедии
# -*- coding: UTF-8 -*-
__version__='$Id:'
import wikipedia
import re, sys
import codecs
def iskat(t,s):
lt=len(t)
ls=len(s)
i=0
while i<=lt-ls:
if t[i:i+ls]==s:
return i
i+=1
return -1
def iskats(t,i,s):
lt=len(t)
ls=len(s)
while i<=lt-ls:
if t[i:i+ls]==s:
return i
i+=1
return -1
def iskato(t,i,s):
ls=len(s)
while i>=0:
if t[i:i+ls]==s:
return i
i-=1
return -1
def iskats_mn(t,p0,ss):
i=p0
while i<len(t):
for j in range(len(ss)):
if t[i].startswith(ss[j]):
return (i,j)
i+=1
return (-1,0)
def ubr_nk_prob(t):
i=0
while i<len(t) and ((t[i]==u' ') or (t[i]==u'\n') or (t[i]==u'\t') or
(t[i]==u'\r')):
i+=1
j=len(t)-1
while j>i and ((t[j]==u' ') or (t[j]==u'\n') or (t[j]==u'\t') or
(t[j]==u'\r')):
j-=1
return t[i:j+1]
def vivod(b):
# wikipedia.output(b)
otch.write(b)
otch.flush()
def ubr_podp(t):
os=u'[['
zs=u']]'
p0=0
while p0<len(t):
p=iskats(t,p0,os)
if p==-1:
break
# pk=iskkonpodp(t,p+len(os),os,zs)
pk=iskats(t,p+len(os),zs)
if pk==-1:
break
pd=iskats(t[:pk],p+len(os),u'|')
if pd!=-1:
t=t[:pd]+t[pk:]
p0=pd
else:
p0=pk
p0+=len(zs)
return t
def zamen_ssilk(tblss,tblpovt,t):
os=u'[['
zs=u']]'
p0=0
while p0<len(t):
p=iskats(t,p0,os)
if p==-1:
break
pn=p+len(os)
pk=iskats(t,pn,zs)
if pk==-1:
break
ss=t[pn:pk]
ss1=ss
i=iskats(ss1,0,u' (')
if i!=-1 and not tblpovt.has_key(ss1[:i]):
ss1=ss1[:i]
if tblss.has_key(ss1):
# novt=tblss[ss1]+u'|'+ss1
novt=tblss[ss1]
t=t[:pn]+novt+t[pk:]
p0=pk+len(novt)-len(ss)
else:
pk1=pk+len(zs)
tpr=u'Provincia di '
tnach_slo=u' (\'\''
tkon_slo=u'\'\') (SLO)'
if t[pn:].startswith(tpr):
t=t[:pn]+t[pn+len(tpr):]
p0=pk+len(tpr)
elif t[pk1:].startswith(tnach_slo) and iskats(t,pk1,tkon_slo)!=-1:
p2=iskats(t,pk1,tkon_slo)
t=(t[:pn]+t[pk1+len(tnach_slo):p2]+u']] (SLO)'+
t[p2+len(tkon_slo):])
p0=pn
elif not (t[pk1:].startswith(u' (FR') or
t[pk1:].startswith(u' (CH') or
t[pk1:].startswith(u' (AT') or
t[pk1:].startswith(u' (SLO')):
vivod(u'!!! ne najd %s\n'%ss)
p0=pk
else:
p0=pk
p0+=len(zs)
return t
class Tsh:
def __init__(self, im,t,imnk,provinc):
self.im = im
self.t = t
self.imnk=imnk
self.provinc=provinc
def vz_prioritet(self):
return self.im
def obrab(imst1,fvh,f1,f1a,tblss,tblpovt,flzap):
provinc_t={
u'AO': u'',
u'CI': u'Provinco Carbonia-Iglesias',
u'KR': u'Provinco Crotone',
u'MD': u'Provinco Medio Campidano',
u'OG': u'Provinco L\'Ogliastra',
u'OT': u'Provinco Olbia-Tempio',
u'MN': u'Provinco Mantova',
u'AG': u'Provinco Agrigento',
u'AL': u'Provinco Alessandria',
u'AN': u'Provinco Ancona',
u'AP': u'Provinco Ascoli Piceno',
u'AQ': u'Provinco L\'Aquila',
u'AR': u'Provinco Arezzo',
u'AT': u'Provinco Asti',
u'AV': u'Provinco Avellino',
u'BA': u'Provinco Bari',
u'BG': u'Provinco Bergamo',
u'BI': u'Provinco Biella',
u'BL': u'Provinco Belluno',
u'BN': u'Provinco Benevento',
u'BO': u'Provinco Bolonjo',
u'BR': u'Provinco Brindisi',
u'BS': u'Provinco Brescia',
u'BZ': u'Sudtirolo',
u'CA': u'Provinco Cagliari',
u'CB': u'Provinco Campobasso',
u'CE': u'Provinco Caserta',
u'CH': u'Provinco Chieti',
u'CL': u'Provinco Caltanissetta',
u'CN': u'Provinco Cuneo',
u'CO': u'Provinco Como',
u'CR': u'Provinco Cremona',
u'CS': u'Provinco Cosenza',
u'CT': u'Provinco Catania',
u'CZ': u'Provinco Catanzaro',
u'EN': u'Provinco Enna',
u'FC': u'Provinco Forlì-Cesena',
u'FE': u'Provinco Ferrara',
u'FG': u'Provinco Foggia',
u'FI': u'Provinco Firenze',
u'FR': u'Provinco Frosinone',
u'GE': u'Provinco Genova',
u'GO': u'Provinco Gorizia',
u'GR': u'Provinco Grosseto',
u'IM': u'Provinco Imperia',
u'IS': u'Provinco Isernia',
u'LC': u'Provinco Lecco',
u'LE': u'Provinco Lecce',
u'LI': u'Provinco Livorno',
u'LO': u'Provinco Lodi',
u'LT': u'Provinco Latina',
u'LU': u'Provinco Lucca',
u'MC': u'Provinco Macerata',
u'ME': u'Provinco Messina',
u'MI': u'Provinco Milano',
u'MO': u'Provinco Modena',
u'MS': u'Provinco Massa-Carrara',
u'MT': u'Provinco Matera',
u'NA': u'Provinco Napoli',
u'NO': u'Provinco Novara',
u'NU': u'Provinco Nuoro',
u'OR': u'Provinco Oristano',
u'PA': u'Provinco Palermo',
u'PC': u'Provinco Piacenza',
u'PD': u'Provinco Padova',
u'PE': u'Provinco Pescara',
u'PG': u'Provinco Perugia',
u'PI': u'Provinco Pisa',
u'PN': u'Provinco Pordenone',
u'PO': u'Provinco Prato',
u'PR': u'Provinco Parma',
u'PT': u'Provinco Pistoia',
u'PU': u'Provinco Pesaro e Urbino',
u'PV': u'Provinco Pavia',
u'PZ': u'Provinco Potenza',
u'RA': u'Provinco Ravenna',
u'RC': u'Provinco Reggio Calabria',
u'RE': u'Provinco Reggio Emilia',
u'RG': u'Provinco Ragusa',
u'RI': u'Provinco Rieti',
u'RM': u'Provinco Roma',
u'RN': u'Provinco Rimini',
u'RO': u'Provinco Rovigo',
u'SA': u'Provinco Salerno',
u'SI': u'Provinco Siena',
u'SO': u'Provinco Sondrio',
u'SP': u'Provinco La Spezia',
u'SR': u'Provinco Siracusa',
u'SS': u'Provinco Sassari',
u'SV': u'Provinco Savona',
u'TA': u'Provinco Taranto',
u'TE': u'Provinco Teramo',
u'TN': u'Provinco Trento',
u'TO': u'Provinco Torino',
u'TP': u'Provinco Trapani',
u'TR': u'Provinco Terni',
u'TS': u'Provinco Trieste',
u'TV': u'Provinco Treviso',
u'UD': u'Provinco Udine',
u'VA': u'Provinco Varese',
u'VB': u'Provinco Verbano Cusio Ossola',
u'VC': u'Provinco Vercelli',
u'VE': u'Provinco Venezia',
u'VI': u'Provinco Vicenza',
u'VR': u'Provinco Verona',
u'VT': u'Provinco Viterbo',
u'VV': u'Provinco Vibo Valentia',
}
mesjac=[
(u'gennaio',u'januaro'),
(u'febbraio',u'februaro'),
(u'marzo',u'marto'),
(u'aprile',u'aprilo'),
(u'maggio',u'majo'),
(u'giugno',u'junio'),
(u'luglio',u'julio'),
(u'agosto',u'auxgusto'),
(u'settembre',u'septembro'),
(u'ottobre',u'oktobro'),
(u'novembre',u'novembro'),
(u'dicembre',u'decembro')]
sh_nach=u'{{Italia komunumo\n'
tbpa=[(u'nomo',1,u'',u''),
(u'blazono',2,u'',u''),
(u'regiono',3,u'{{Italio ',u'}} (2005)'),
(u'provinco',4,u'{{Italio ',u'}} (2005)'),
(u'latitudo_gradoj',5,u'',u''),
(u'latitudo_minutoj',6,u'',u''),
(u'latitudo_sekundoj',7,u'',u''),
(u'latitudo_direkto',-1,u'',u''),
(u'longitudo_gradoj',8,u'',u''),
(u'longitudo_minutoj',9,u'',u''),
(u'longitudo_sekundoj',10,u'',u''),
(u'longitudo_direkto',-2,u'',u''),
(u'koord_X_en_mapo',11,u'',u''),
(u'koord_Y_en_mapo',12,u'',u''),
(u'alto',13,u'',u''),
(u'areo',14,u'',u' (2005)'),
(u'kvanto_de_logxantoj',15,u'',u' (2005)'),
# (u'dato_de_kvanto_de_logxantoj',16,u'',u''),
(u'denso_de_logxantoj',17,u'',u' (2005)'),
(u'subdividajxoj',18,u'',u' (2005)'),
(u'najbaraj_komunumoj',19,u'',u' (2005)'),
(u'posxtkodo',20,u'',u' (2005)'),
(u'telefona_kodo',21,u'',u' (2005)'),
(u'ISTAT_kodo',22,u'',u' (2005)'),
(u'imposta_kodo',23,u'',u' (2005)'),
(u'nomo_de_logxantoj',24,u'\'\'',u'\'\''),
(u'patrono',25,u'',u''),
(u'festo',26,u'',u' (2005)'),
(u'retpagxo',27,u'',u''),
(u'mapo',3,u'',u'-Mappa.png'),
(u'mapamplekso',-3,u'',u''),
]
dopp=[u'N',u'E',u'300']
# sh_kon=u'}}\n<br clear=all>\n'
sh_kon=u'}}\n\n'
imst0=u'Komunumoj de '
nachtekst0=u'\'\'\'%s\'\'\' estas [[komunumo]] de [[Italio]].\n'
# nachtekst1a=u'.\n\n'
# nachtekst1b=(u' ekde \'\'%s\'\' gxis \'\'%s\'\'.\n\nVidu cxiujn komunumojn '+
# u'de la regiono cxe [[%s]]\n\n')
kateg0=(u'[[Kategorio:Komunumoj de Italio]]\n'+
u'[[Kategorio:Komunumoj de %s]]\n')
kateg1= u'[[Kategorio:Komunumoj de %s]]\n'
f=codecs.open(fvh,'rb',encoding='utf-8')
tsh=[]
fl1=1
impr=u''
for s in f.readlines():
if ord(s[0]) == 65279:
s=s[1:]
s=s.replace(u'\r',u'')
if s[len(s)-1]==u'\n':
s=s[:len(s)-1]
if len(s)<1:
continue
# if fl1:
# imst1=s.split(u'/')[-1]
# fl1=0
st=s.split(u'\t')
tp=ubr_nk_prob(st[0])
if tp!=u'':
tp=tp.replace(u'_',u' ').replace(u'<br>',u' ')
impr=u''
os=u'[['
zs=u']]'
p1=iskats(tp,0,os)
if p1!=-1:
p2=iskats(tp,p1,zs)
if p2!=-1:
impr=tp[p1+len(os):p2]
k=iskats(impr,0,u' (')
if k!=-1:
if not tblpovt.has_key(impr[:k]):
impr=impr[:k]
else:
vivod(u'! tblpovt %s\n'%impr[:k])
continue
t=sh_nach
imja=u''
imjank=u''
provinc=u''
for i in range(len(tbpa)):
(imp,i1,tdn,tdk)=tbpa[i]
if i1==15 and len(st)>=17:
tdk1=ubr_nk_prob(st[16])
if tdk1!=u'':
tdk=u' ('+tdk1+u')'
if i1>=0:
i2=i1
if i2>=len(st):
vivod(u'!!! nehv param %s %d\n'%(imja,i))
tp=u''
else:
tp=st[i2]
else:
tp=dopp[-1-i1]
if i1!=27:
tp=tp.replace(u'_',u' ').replace(u'<br>',u' ')
while u' ' in tp:
tp = tp.replace(u' ',u' ')
tp=ubr_nk_prob(tp)
tp=ubr_podp(tp)
tp=tp.replace(u'[[:Immagine:',u'[[Dosiero:')
if i1==1:
imja=tp
imjank=tp
k=iskats(imja,0,u' (')
if k!=-1 and not tblpovt.has_key(imja[:k]):
imja=imja[:k]
vivod(u'* '+imja+u'\n')
if imja!=impr:
vivod(u'!!! nesovp, impr=%s fvh=%s\n'%(impr,fvh))
if len(impr)>len(imja):
imja=impr
if i1==4:
provinc=tp
if i1==15:
tp=tp.replace(u'.',u'')
if i1==19 and flzap:
tp=zamen_ssilk(tblss,tblpovt,tp)
if i1==24:
tp=tp.replace(u' o ',u'\'\' aux \'\'')
if i1==26:
flu=0
for k in range(len(mesjac)):
(ms,mn)=mesjac[k]
if iskat(tp,ms)!=-1:
tp=tp.split(' ')[0]+u'-a de '+mn+u']]'
flu=1
break
if flu==0 and tp!=u'':
vivod(u'!!! neperev data %s %d\n'%(imja,i))
if tp!=u'':
tp=tdn+tp+tdk
t+=u'| '+imp+u' = '+tp+u'\n'
t+=sh_kon
if not provinc_t.has_key(provinc):
vivod(u'!!! provinc %s\n'%imja)
else:
provinc=provinc_t[provinc]
tsh.append(Tsh(imja,t,imjank,provinc))
f.close()
tsh.sort(key=Tsh.vz_prioritet,reverse=0)
nomerf=0
stob=u''
jn=len(tsh)
i=0
while i<jn:
im=tsh[i].im
vivod(u'+ %s\n'%im)
imst=im
nachtekst=nachtekst0%tsh[i].imnk
kateg=kateg0%imst1
provinc=tsh[i].provinc
if provinc!=u'':
kateg+=kateg1%provinc
kateg+=u'\n[[it:%s]]\n'%imst
# stob+=u'* [[%s|%s - %s]] (%d)\n'%(imst,imk0,imk1,jk-j)
if flzap:
f1.write(imst+u'\n'+nachtekst+tsh[i].t+kateg+u'========\n')
f1.flush()
else:
nt=im
if tblss.has_key(im):
vivod(u'!!! uzxe %s %s %s\n'%(im,tblss[im],nt))
else:
tblss[im]=nt
# f1a.write(u'%s\n#REDIRECT [[%s]]\n========\n'%(im,nt))
# f1a.flush()
i+=1
# if flzap:
# nachtekst=nachtekst0%imst1+nachtekst1a
# f1.write(imst0+imst1+u'\n'+nachtekst+stob+kateg+u'========\n')
# f1.flush()
def main(fvh,fvih,fviha):
f1=codecs.open(fvih, 'w', 'utf-8')
# f1a=codecs.open(fviha, 'w', 'utf-8')
f1a=0
tblss={}
tblpovt={}
i=0
while i<2:
f=codecs.open(fvh,'rb',encoding='utf-8')
for s in f.readlines():
if ord(s[0]) == 65279:
s=s[1:]
s=s.replace(u'\r',u'')
if s[len(s)-1]==u'\n':
s=s[:len(s)-1]
if len(s)<1:
continue
st=s.split(u'|',2)
if st[0]==u'm':
if i==0:
tblpovt[ubr_nk_prob(st[1])]=1
else:
obrab(st[0],st[1],f1,f1a,tblss,tblpovt,i)
i+=1
f1.close()
# for (im,ss) in tblss.iteritems():
# f1a.write(u'%s\n#REDIRECT [[%s]]\n========\n'%(im,ss))
# f1a.flush()
# f1a.close()
if __name__ == "__main__":
try:
fvh = wikipedia.argHandler(sys.argv[1], 'perevod')
fvih = wikipedia.argHandler(sys.argv[2], 'perevod')
# fviha = wikipedia.argHandler(sys.argv[3], 'perevod')
# fotch = wikipedia.argHandler(sys.argv[4], 'perevod')
fviha = u''
fotch = wikipedia.argHandler(sys.argv[3], 'perevod')
otch = codecs.open(fotch, 'w', 'utf-8')
#otch2 = codecs.open(fotch2, 'w', 'utf-8')
main(fvh,fvih,fviha)
finally:
wikipedia.stopme()