Vandaag gaan we het hebben over Gebruiker:Edoderoobot/AWL, een onderwerp dat de aandacht heeft getrokken van miljoenen mensen over de hele wereld. Gebruiker:Edoderoobot/AWL is een onderwerp van groot belang in de huidige samenleving, en de relevantie ervan wordt weerspiegeld in de diversiteit aan meningen die het oproept. Van de impact ervan op het dagelijks leven van mensen tot de implicaties ervan op gebieden als politiek, economie en cultuur, Gebruiker:Edoderoobot/AWL is het onderwerp geweest van intens debat en analyse. In dit artikel zullen we verschillende aspecten onderzoeken die verband houden met Gebruiker:Edoderoobot/AWL, met als doel de reikwijdte en invloed ervan op onze hedendaagse realiteit te begrijpen.
import pywikibot
import sys
from urllib.request import urlopen
from bs4 import BeautifulSoup
from datetime import date
"""
Things to do:
*fix demonym, to auto-add correct categories
*int\roduce variables, first one to drive clean-up of non-used properties
*add SparQL lists, alike Lysteria for lists of books/films/etc
*add switches : fill in a value depending on another value : ##switch#P21#Q6581097:voetballer#Q6581072:voetbalspeelster#else:speler##
*fix 'van/de/van de(r)' in a defaultsort
*units dependant on infobox (cm for athlete, nothing for soccer players)
"""
demonymList={
'Q16':'Canadees','Q17':'Japans',
'Q20':'Noors','Q21':'Engels','Q22':'Schots','Q25':'Welsh','Q26':'Noord-Iers','Q27':'Iers','Q28':'Hongaars','Q29':'Spaans',
'Q30':'Amerikaans','Q31':'Belgisch','Q32':'Luxemburgs','Q33':'Fins','Q34':'Zweeds','Q35':'Deens','Q36':'Pools','Q37':'Litouws','Q38':'Italiaans','Q39':'Zwitsers',
'Q40':'Oostenrijks','Q41':'Grieks','Q43':'Turks','Q45':'Portugees',
'Q77':'Uruguayaans','Q79':'Egyptisch','Q96':'Mexicaans',
'Q114':'Keniaans','Q115':'Ethiopisch','Q117':'Ghanees',
'Q142':'Frans',
'Q145':'Brits',
'Q148':'Chinees',
'Q155':'Braziliaans',
'Q159':'Russisch',
'Q183':'Duits','Q184':'Wit-Russisch','Q189':'IJslands',
'Q191':'Estisch',
'Q212':'Oekraïens','Q213':'Tsjechisch','Q214':'Slowaaks','Q215':'Sloveens','Q217':'Moldavisch','Q218':'Roemeens','Q219':'Bulgaars',
'Q221':'Noord-Macedonisch','Q222':'Albanees','Q223':'Groenlands','Q224':'Kroatisch','Q225':'Bosnisch','Q227':'Azerbeidzjaans','Q228':'Andorrees','Q229':'Cypriotisch',
'Q241':'Cubaans','Q242':'Belizaans',
'Q252':'Indonesisch','Q258':'Zuid-Afrikaans',
'Q398':'Bahreins','Q399':'Armeens',
'Q408':'Australisch','Q414':'Argentijns',
'Q664':'Nieuw-Zeelands',
'Q730':'Surinaams','Q739':'Colombiaans','Q766':'Jamaicaans','Q778':'Bahamaans','Q781':'Antiguees','Q786':'Dominikaans',
'Q801':'Israëlisch','Q884':'Zuid-Koreaans',
'Q916':'Angolees','Q924':'Tanzaniaans','Q928':'Filipijns','Q953':'Zambiaans',
'Q1009':'Kameroens','Q1028':'Marokkaans','Q1032':'Nigerees','Q1033':'Nigeriaans', 'Q1041':'Senegalees',
'Q9676':'Brits', #eiland Man
'Q15180':'Russisch','Q16635':'Guamees',
'Q29999':'Nederlands',
'Q33946':'Tsjecho-Slowaaks','Q36704':'Joegoslavisch',
}
lng='nl'
site=pywikibot.Site(lng,'wikipedia')
repo=site.data_repository()
AWLversion='AWL20211103'
cleanup=True
fallback=
SaR={'[[:Categorie:':'[[Categorie:',
'Categorie:Antiguees olympisch deelnemer':'Categorie:Olympisch deelnemer uit Antigua en Barbuda',
'uit [[Verenigde Staten':'uit de [[Verenigde Staten',
'uit [[Verenigd K':'uit het [[Verenigd K',
'Koninkrijk der Nederlanden':'Nederland',
'(, ':'(',
'Categorie:Dominicaans atleet':'Categorie:Atleet uit de Dominicaanse Republiek',
'Categorie:Dominikaans olympisch deelnemer':'Categorie:Olympisch deelnemer uit de Dominicaanse Republiek',
'op de Olympische Zomerspelen 1928]]':'op de Olympische Zomerspelen 1928|Olympische Zomerspelen van Amsterdam]] in 1928',
'op de Olympische Zomerspelen 1932]]':'op de Olympische Zomerspelen 1932|Olympische Zomerspelen van Los Angeles]] in 1932',
'op de Olympische Zomerspelen 1936]]':'op de Olympische Zomerspelen 1936|Olympische Zomerspelen van Berlijn]] in 1936',
'op de Olympische Zomerspelen 1948]]':'op de Olympische Zomerspelen 1948|Olympische Zomerspelen van Londen]] in 1948',
'op de Olympische Zomerspelen 1952]]':'op de Olympische Zomerspelen 1952|Olympische Zomerspelen van Helsinki]] in 1952',
'op de Olympische Zomerspelen 1956]]':'op de Olympische Zomerspelen 1956|Olympische Zomerspelen van Melbourne]] in 1956',
'op de Olympische Zomerspelen 1960]]':'op de Olympische Zomerspelen 1960|Olympische Zomerspelen van Rome]] in 1960',
'op de Olympische Zomerspelen 1964]]':'op de Olympische Zomerspelen 1964|Olympische Zomerspelen van Tokio]] in 1964',
'op de Olympische Zomerspelen 1968]]':'op de Olympische Zomerspelen 1968|Olympische Zomerspelen van Mexico]] in 1968',
'op de Olympische Zomerspelen 1972]]':'op de Olympische Zomerspelen 1972|Olympische Zomerspelen van München]] in 1972',
'op de Olympische Zomerspelen 1976]]':'op de Olympische Zomerspelen 1976|Olympische Zomerspelen van Montreal]] in 1976',
'op de Olympische Zomerspelen 1980]]':'op de Olympische Zomerspelen 1980|Olympische Zomerspelen van Moskou]] in 1980',
'op de Olympische Zomerspelen 1984]]':'op de Olympische Zomerspelen 1984|Olympische Zomerspelen van Los Angeles]] in 1984',
'op de Olympische Zomerspelen 1988]]':'op de Olympische Zomerspelen 1988|Olympische Zomerspelen van Seoul]] in 1988',
']':'Op de ] in 1988',
'op de Olympische Zomerspelen 1992]]':'op de Olympische Zomerspelen 1992|Olympische Zomerspelen van Barcelona]] in 1992',
'op de Olympische Zomerspelen 1996]]':'op de Olympische Zomerspelen 1996|Olympische Zomerspelen van Atlanta]] in 1996',
'op de Olympische Zomerspelen 2000]]':'op de Olympische Zomerspelen 2000|Olympische Zomerspelen van Sydney]] in 2000',
'op de Olympische Zomerspelen 2004]]':'op de Olympische Zomerspelen 2004|Olympische Zomerspelen van Athene]] in 2004',
'op de Olympische Zomerspelen 2008]]':'op de Olympische Zomerspelen 2008|Olympische Zomerspelen van Beijing]] in 2008',
'op de Olympische Zomerspelen 2012]]':'op de Olympische Zomerspelen 2012|Olympische Zomerspelen van Londen]] in 2012',
'op de Olympische Zomerspelen 2016]]':'op de Olympische Zomerspelen 2016|Olympische Zomerspelen van Rio de Janeiro]] in 2016',
'op de Olympische Zomerspelen 2020]]':'op de Olympische Zomerspelen 2020|Olympische Zomerspelen van Tokio]] in 2021',
}
eventconvert={
'Javelin Throw':'speerwerpen',
'Javelin Throw (700gr)':'speerwerpen (700gr)',
'Long Jump':'verspringen',
'Long Jump ind.':'verspringen ind.',
'High Jump':'hoogspringen',
'High Jump ind.':'hoogspringen ind.',
'Pole Vault':'polsstokspringen',
'Pole Vault ind.':'polsstokspringen ind.',
'Decathlon':'tienkamp',
'Decathlon - U20':'tienkamp - O20',
'Decathlon - U18':'tienkamp - O18',
'Heptathlon ind.':'zevenkamp ind.',
'Heptathlon - U20 ind.':'zevenkamp - U20 ind',
'Distance Medley':'afstandsestafette',
'Distance Medley ind.':'afstandsestafette ind.',
'Hammer Throw':'kogelslingeren',
'100mH':'100 m horden',
'Shot Put':'kogelstoten',
'Shot Put ind.':'kogelstoten ind.',
'Discus Throw':'discuswerpen',
}
eventunit={'100m':'s','200m':'s','300m':'s','400m':'s','4x100':'s','Long Jump':'m','Pole Vault':'m','Decathlon':'p','High Jump':'m','100mH':'s',
'100m ind.':'s','200m ind.':'s','300m ind.':'s','400m ind.':'s','4x100 ind.':'s','Long Jump ind.':'m','Pole Vault ind.':'m','High Jump ind.':'m',
}
hdrconvert={'Event':'Onderdeel','Result':'Prestatie','Wind':'Wind','Venue':'Plaats','Date':'Datum'}
def monthname(month):
nl_months= {1:'januari',2:'februari',3:'maart',4:'april',5:'mei',6:'juni',7:'juli',8:'augustus',9:'september',10:'oktober',11:'november',12:'december'}
papmonths= {1:'yanüari',2:'febrüari',3:'mart',4:'aprel',5:'mei',6:'yüni',7:'yüli',8:'ougùstùs',9:'sèptèmber',10:'oktober',11:'novèmber',12:'desèmber',}
months={'nl':nl_months, 'pap':papmonths}
return(months)
def get_formatter(wd,ppty):
URLformat=''
URLformatter=''
if not ppty in wd.claims: return(f'no url for {wd.title()}.{ppty}')
value=wd.claims.getTarget()
if value==None: return('')
prop=pywikibot.PropertyPage(repo,ppty)
if not ('P1630' in prop.claims): return(f'no P1630 for {prop.title()}')
for c in prop.claims:
if (c.rank!='deprecated'):
URLformat=c.getTarget()
if (((URLformatter=='') or (c.rank=='preferred')) and (c.rank!='deprecated')):
URLformatter=URLformat
return(URLformatter.replace('$1',value))
def getAthletePB(diamondID):
url='https://www.diamondleague.com/athletes/%s.html'%diamondID
f=urlopen(url)
htmltext=f.read().decode('utf-8')
soup=BeautifulSoup(htmltext)
pbtable=soup.find("table", attrs={"class":"personal-bests data"})
pbevents=
identifier='<!--leave for future auto-update -->'
pbresult =
for row in pbtable.find_all("tr"):
dataset = dict(zip(pbevents, (td.get_text() for td in row.find_all("td"))))
pbresult.append(dataset)
wikitable='==Persoonlijke records==\n'
#outdoortable=f';Outdoor\n{{| class="wikitable"\n!Onderdeel\n!Prestatie\n!Plaats\n!Datum\n|-\n'
#indoortable =f';Indoor\n{{| class="wikitable"\n!Onderdeel\n!Prestatie\n!Plaats\n!Datum\n|-\n'
outdoortable=f';Outdoor\n{{| class="wikitable"'
indoortable =f';Indoor\n{{| class="wikitable"'
for event in pbevents:
outdoortable += '\n!'+hdrconvert
indoortable += '\n!'+hdrconvert
outdoortable += '\n|-\n'
indoortable += '\n|-\n'
hasindoor=hasoutdoor=False
for item in pbresult:
itsout=itsin=False
for event in pbevents:
if (event=='Event') and (item in eventunit):
unit=eventunit]
elif (event!='Result'):
unit=''
if event!='Event':
unitnow=unit
else:
unitnow=''
if (item.find('ind.')==-1):
if item in eventconvert:
item = eventconvert]
outdoortable+='| '+item+unitnow+'\n'
hasoutdoor=itsout=True
else:
if (item in eventconvert):
item=eventconvert]
indoortable+='| '+item+unitnow+'\n'
hasindoor=itsin=True
if (itsout): outdoortable+='|-\n'
if (itsin): indoortable+='|-\n'
month=date.today().strftime('%m')
monthstr=monthname(month)
#monthstr=date.today().strftime('%B')
yearstr =date.today().strftime('%Y')
if hasindoor or hasoutdoor:
if hasoutdoor:
wikitable += outdoortable + '|}\n'
if hasindoor:
wikitable += indoortable + '|}\n'
wikitable += f'bijgewerkt {monthstr}-{yearstr}<ref>––profiel</ref>{identifier}\n'
return(wikitable)
def findifs(wd,txt):
"""
Find all ##if:P1234# constructions
if P1234 is a claim, the line will stay, else it will be deleted
"""
p=txt.find('##if:')
while (p>0):
end=p+2
while txt!='#':
end+=1
property=txt
if property in wd.claims:
txt=txt+txt
else:
while txt!='\n': #find end of line
end+=1
txt=txt+txt
p=txt.find('##if:')
"""
Find all #profiel:Pxxx# constructions
if P1234 is a valid claim, the line will be filled out based on the URL-formtter of P1234
"""
p=txt.find('##profiel:')
while (p>0):
end=p+2
while txt!='#':
end+=1
property=txt
if property in wd.claims:
txt=txt+txt.replace('##format#',get_formatter(wd,property),1)
else:
while txt!='\n': #find end of line
end+=1
txt=txt+txt
p=txt.find('##profiel:')
"""
Find all ##loop:Pxxx# constructions
if P1234 is a valid claim, it will add all linked claims as wikitext-link
"""
p=txt.find('##loop:')
while (p>0):
end=p+2
while txt!='#':
end+=1
property=txt
if property in wd.claims:
looptxt=''
for x in range(0,len(wd.claims)):
looptxt+=f'{wd_value(wd,property,True,x)}\n'
txt=txt+looptxt+txt
else:
while txt!='\n': #find end of line
end+=1
txt=txt+txt
p=txt.find('##loop:')
return(txt)
def demonym(wd,lng):
#return('')
if 'P27' in wd.claims:
countryID=wd.claims.getTarget().title()
if countryID in demonymList:
return demonymList
land_bestaat_niet(countryID/0)
country=pywikibot.ItemPage(repo,countryID)
country.get(get_redirect=True)
if ('P1549' in country.claims):
dmn=country.claims
for dmnclaim in dmn:
dmnclaim.get()
if dmnclaim.has_qualifier:
qlf=dmnclaim.qualifiers
if ('P518') in qlf:
vtod=qlf.getTarget().title()
if vtod=='Q47088290': #mannelijk enkelvoud
pass
else:
for x in dir(dmnclaim):
print(x)
print(f'claim={dmnclaim}')
#print(f'vtod={vtod}')
else:
pass
#print(f'qlf={qlf}')
else:
print(dmnclaim)
return('xXx')
return('-nd-')
def find_properties(txt):
i=0
end=0
while(i<len(txt)):
if txt=='<P':
end=i
while txt!='>':
end+=1
yield(txt,'<')
i=end
if txt=='[P':
end=i
while txt!=']':
end+=1
yield(txt,'[')
i=end
if txt=='!P':
end=i
while txt!='!':
end+=1
yield(txt,'!')
i=end
i+=1
if txt=='<label>':
yield('label','')
i+=7
if txt=='<demoniem>':
yield('demoniem','')
i+=10
if txt=='<templates>':
yield('templates','')
i+=11
if txt=='<inlinks>':
yield('inlinks','')
i+=9
if txt=='<sources>':
yield('sources','')
i+=9
if txt=='<diamond>':
yield('diamond','')
i+=9
if txt=='##var:':
i=i+6
end=i
while txt!=':':
end+=1
print(f'-var-: <{txt}>, {i},{end}')
yield(txt,'')
def fill_in(txt,find,replace):
return(txt.replace(find,replace,-1))
def getUnit(value):
try:
wdUnit=value.unit
unit=pywikibot.ItemPage(repo,wdUnit)
unit.get(get_redirect=True)
return(unit.labels)
except Exception as e:
print(e)
def wd_value(wd,property,isLinked=False,index=0):
image=pywikibot.page.FilePage(site,'image.png')
if property in wd.claims:
value=wd.claims.getTarget()
if value==None:
return('none')
if (type(value)==type(pywikibot.ItemPage(repo,'Q5'))):
valuerec=pywikibot.ItemPage(repo,value.title())
valuerec.get(get_redirect=True)
if not lng in valuerec.labels:
print(f'label missing in {valuerec.title()}.{property}')
error('')
if ((isLinked) and (lng+'wiki' in valuerec.sitelinks)):
lbl=valuerec.labels
lnk=valuerec.sitelinks.title
if (lbl.lower()==lnk.lower()) and (lbl==lnk):
return(f']')
else:
return(f']')
else:
return(valuerec.labels)
elif (type(value)==type(pywikibot.WbTime(1,1,1))):
if value.precision==11:
return(str(value.day)+' '+monthname(value.month)+' '+str(value.year))
elif value.precision==9:
return(str(value.year))
elif value.precision==7: #precision like 20th century : nothing valueble to return
return('')
return(f'date-time: precision={value.precision}')
elif (type(value)==type('str')):
return(value)
elif (type(value)==type(pywikibot.WbMonolingualText('nl','nl'))):
return(value.text)
elif (type(value)==type(pywikibot.WbQuantity(0,site=site))):
if value.unit:
return(f'{str(value.amount)} {getUnit(value)}')
return(str(value.amount))
elif (type(value)==type(pywikibot.page.FilePage(site,'image.png'))): #P18 image on Commons
return(value.title())
else:
print(f'unknown type: {type(value)}')
return('else')
return value
elif property=='label':
try:
return(wd.labels)
except:
pass
elif property=='demoniem':
return(demonym(wd,lng))
elif property=='templates':
return(whatlinkshere(lng,wd.labels,)) #actually wd.links
elif property=='inlinks':
return(whatlinkshere(lng,wd.labels,)) #but lemma does not exist yet
elif property=='sources':
return(getSources(wd))
elif property=='diamond':
if ('P3923' in wd.claims):
return(getAthletePB(wd.claims.getTarget()))
return('')
else:
if (cleanup):
return('')
else:
return('<'+property+'>')
return('')
def getSourceURLs(wd):
urls=
for c in wd.claims:
claimlist=wd.claims
for claim in claimlist:
sources=claim.getSources()
if sources!=:
for sourcelist in sources:
if ('P854' in sourcelist):
for source in sourcelist:
url=source.getTarget()
if (not(url in urls)):
urls.append(url)
return(urls)
def getSources(wd):
sourcelist=''
count=0
for sourceURL in getSourceURLs(wd):
count+=1
sourcelist=sourcelist+f'<ref>––</ref>\n'
return(sourcelist)
def whatlinkshere(lng,item,namespaces):
site=pywikibot.Site(lng,'wikipedia')
page=pywikibot.Page(site,item)
result=''
for found in page.getReferences(namespaces=namespaces):
start=found.title().find(':')
if (10 in namespaces):
result+='{{'+found.title()+'}}\n'
else:
result+='+']]\n'
return result
def readTemplate(name):
site=pywikibot.Site(lng,'wikipedia')
page=pywikibot.Page(site,'gebruiker:Edoderoo/template/'+name)
try:
#print('1')
glbPage=pywikibot.Page(site,'gebruiker:Edoderoo/template/global')
#print('22')
globaltxt=glbPage.text
#print('333')
except:
globaltxt=''
print('gebruiker:Edoderoo/template/global not found')
if (page.exists()):
return(page.text.replace('<global>',globaltxt))
else:
return(name+'does not exist!')
def getTemplate(wd):
if 'P106' in wd.claims:
for beroep in wd.claims:
beroepID=beroep.getTarget().title()
if (False): pass
elif beroepID=='Q2309784' : return readTemplate('wielrenner')
elif beroepID=='Q15117395': return readTemplate('wielrenner')
elif beroepID=='Q15117415': return readTemplate('wielrenner')
elif beroepID=='Q19799599': return readTemplate('wielrenner')
elif beroepID=='Q937857' : return readTemplate('voetballer')
elif beroepID=='Q11513337': return readTemplate('atleet')
elif beroepID=='Q4009406' : return readTemplate('atleet')
elif beroepID=='Q13381689': return readTemplate('atleet')
elif beroepID=='Q13724897': return readTemplate('atleet')
elif beroepID=='Q15306067': return readTemplate('sporter') #triatleet
elif beroepID=='Q13381753': return readTemplate('atleet')
elif beroepID=='Q21141408': return readTemplate('atleet')
elif beroepID=='Q15972912': return readTemplate('sporter') #moderne vijfkamp
elif beroepID=='Q482980' : return readTemplate('auteur')
elif beroepID=='Q36180' : return readTemplate('auteur')
elif beroepID=='Q4853732' : return readTemplate('auteur')
elif beroepID=='Q33999' : return readTemplate('acteur')
elif beroepID=='Q10800557': return readTemplate('acteur')
elif beroepID=='Q177220' : return readTemplate('artiest')
elif beroepID=='Q82955' : return readTemplate('politicus')
elif beroepID=='Q10866633': return readTemplate('schaatser')
elif beroepID=='Q18200514': return readTemplate('schaatser')
elif beroepID=='Q10843263': return readTemplate('hockeyspeler')
elif beroepID=='Q10843402': return readTemplate('zwemmer')
elif beroepID=='Q13141064': return readTemplate('badmintonner')
elif beroepID=='Q10833314': return readTemplate('tennisser')
elif beroepID=='Q13381863': return readTemplate('schermer')
elif beroepID=='Q11774891': return readTemplate('ijshockeyer')
elif beroepID=='Q17516936': return readTemplate('curlingspeler')
elif beroepID=='Q859528' : return readTemplate('scheidsrechter')
elif beroepID=='Q3665646' : return readTemplate('basketballer')
elif beroepID=='Q15117302': return readTemplate('volleyballer')
elif beroepID=='Q12840545': return readTemplate('handballer')
elif beroepID=='Q13382519': return readTemplate('tafeltennisser')
elif beroepID=='Q10873124': return readTemplate('schaker')
elif beroepID=='Q13382608': return readTemplate('wintersporter')
elif beroepID=='Q4270517' : return readTemplate('wintersporter')
elif beroepID=='Q4144610' : return readTemplate('wintersporter')
elif beroepID=='Q13382981': return readTemplate('sporter') #rodelaar
elif beroepID=='Q16029547': return readTemplate('sporter') #biatleet
elif beroepID=='Q6665249' : return readTemplate('sporter')
print(f'beroep not found: {beroep}')
if 'P31' in wd.claims:
for is_a in wd.claims:
its_a=is_a.getTarget().title()
if its_a=='Q8502': return readTemplate('berg')
elif its_a=='Q4022': return readTemplate('rivier')
elif its_a=='Q23397': return readTemplate('meer')
elif its_a=='Q1134686': return readTemplate('frazione')
elif its_a=='Q16917': return readTemplate('ziekenhuis')
elif its_a=='': return readTemplate('error')
else:
print('Unknown %s', its_a)
error('')
return wd.title()
def standardReplace(input):
output=input
for fnd in SaR:
output=output.replace(fnd,SaR)
return(output)
def maak_item(qid):
wd=pywikibot.ItemPage(repo,qid)
wd.get(get_redirect=True)
txt=getTemplate(wd)
if not(lng+'wiki' in wd.sitelinks):
if not lng in wd.labels:
error('Add a label first, it will become the title')
for p,isLinked in find_properties(txt):
value=wd_value(wd,p,isLinked=='[')
if isLinked=='[':
txt=fill_in(txt,'',value)
elif isLinked=='<':
txt=fill_in(txt,'<'+p+'>',value)
elif isLinked=='!':
txt=fill_in(txt,'!'+p+'!',value)
elif p in :
txt=fill_in(txt,f'<{p}>',value)
else:
sys.exit(f'unknown: {isLinked}{p}{isLinked}')
txt=txt+f'<!--{AWLversion}-->\n'
txt=txt+'<!--'+wd.title()+'-->'
return(standardReplace(findifs(wd,txt)))
else:
return('') #already exists for this language
####Red Flames - Belgisch nationaal elftal
print(maak_item('Q98070069')) #Hannah Eurlings