Přeskočit na obsah

Modul:Wikidata/compare

Tuto stránku mohou editovat jen zavedení uživatelé a správci.
Z Wikipedie, otevřené encyklopedie
require'strict'

localp={}

locallib=require'Modul:Wikidata/lib'

-- @const
localbr_split='%s*<[^<>%w]-br[^<>%w]->%s*'

localfunctionin_array(value,array)
localTableTools=require'Modul:TableTools'
returnTableTools.inArray(array,value)
end

localfunctionstripBrackets(text)
returnmw.ustring.gsub(text,'%s*%([^%)]+%)','')
end

localfunctionmarkValue(value,as,options)
return'<span class= "wd-'..as..' ">'..value..'</span>',
lib.category(as,options.catbaseor('Vlastnost '..options.property))
end

functionp.compareValues(value,Statements,options)
ifvalue==''then
returnnil,nil
end
localtitle=mw.title.getCurrentTitle()
iftitle.namespace~=0andtitle.namespace~=14then
returnnil,nil
end

if#Statements==0then
returnmarkValue(value,'not',options)
end

localdatatype=Statements[math.random(#Statements)].mainsnak.datatype
localtemp_value=mw.ustring.gsub(value,'<([a-z]+)%f[^%w][^>]->.-</%1>%s*','')
ifdatatype=="commonsMedia"ordatatype=="string"ordatatype=="external-id"then
for_,statementinipairs(Statements)do
iflib.IsSnakValue(statement.mainsnak)then
localtemp_value=stripBrackets(temp_value)
iftostring(statement.mainsnak.datavalue.value)==tostring(temp_value)then--TODO: normalizing
returnmarkValue(value,'same',options)
end
end
end
returnmarkValue(value,'diff',options)
elseifdatatype=="monolingualtext"then
for_,statementinipairs(Statements)do
iflib.IsSnakValue(statement.mainsnak)then
ifstatement.mainsnak.datavalue.value.text==mw.text.strip(temp_value)then
returnmarkValue(value,'same',options)
end
end
end
returnmarkValue(value,'diff',options)
elseifdatatype=="quantity"then
ifmw.ustring.match(temp_value,'%d+')then
fornumberinmw.ustring.gmatch(value,'(%-?%d+)')do
for_,statementinipairs(Statements)do
iflib.IsSnakValue(statement.mainsnak)then
locallowerBound=tonumber(statement.mainsnak.datavalue.value.lowerBound)
localupperBound=tonumber(statement.mainsnak.datavalue.value.upperBound)
number=tonumber(number)
ifnumber>=lowerBoundandnumber<=upperBoundthen
returnmarkValue(value,'same',options)
end
end
end
break-- only the first one
end
end
returnmarkValue(value,'diff',options)
elseifdatatype=="time"then
temp_value=mw.ustring.gsub(temp_value,'%[%[%s*([^|%]]+)%s*[^%]]*%]%]','%1')
temp_value=stripBrackets(mw.ustring.lower(temp_value))
localTime=require'Modul:Time'
localMonths={
["leden"]=1,["ledna"]=1,
["únor"]=2,["února"]=2,
["březen"]=3,["března"]=3,
["duben"]=4,["dubna"]=4,
["květen"]=5,["května"]=5,
["červen"]=6,["června"]=6,
["červenec"]=7,["července"]=7,
["srpen"]=8,["srpna"]=8,
["září"]=9,
["říjen"]=10,["října"]=10,
["listopad"]=11,["listopadu"]=11,
["prosinec"]=12,["prosince"]=12
}
for_,statementinipairs(Statements)do
iflib.IsSnakValue(statement.mainsnak)then
localtimevalue=Time.newFromWikidataValue(statement.mainsnak.datavalue.value)
iftimevaluethen
forparsedinmw.text.gsplit(temp_value,br_split)do
parsed=mw.ustring.sub(parsed,1,mw.ustring.match(parsed,'%d?%d%d()%d')or-1)
localparsedTable={}
for_,valueinipairs(mw.text.split(parsed,'[^%w]+'))do
iftonumber(value)then
table.insert(parsedTable,tonumber(value))
elseifMonths[value]then
table.insert(parsedTable,2,Months[value])
else
parsedTable={}
break
end
end
localTable
if#parsedTable==1then
Table=Time.new{
year=parsedTable[1]
}
elseif#parsedTable==2then
Table=Time.new{
year=parsedTable[1],
month=parsedTable[2]
}
elseif#parsedTable==3then
Table=Time.new{
year=math.max(parsedTable[1],parsedTable[3]),
month=parsedTable[2],
day=math.min(parsedTable[1],parsedTable[3])
}
end
ifnotTablethen
mw.log('Nepodařilo se zanalyzovat datum '..parsed)
elseiftimevalue==Tablethen
returnmarkValue(value,'same',options)
end
end
end
end
end
returnmarkValue(value,'diff',options)
elseifdatatype=="url"then
ifnotmw.ustring.match(temp_value,'https?://')then
returnmarkValue(value,'diff',options)
end
localWDValues={}
for_,statementinipairs(Statements)do
iflib.IsSnakValue(statement.mainsnak)then
table.insert(WDValues,statement.mainsnak.datavalue.value)
end
end
forurlinmw.ustring.gmatch(temp_value,'(https?://[^%[%]%s]+)')do
ifnotin_array(url,WDValues)then
returnmarkValue(value,'diff',options)
end
end
returnmarkValue(value,'same',options)
elseifdatatype=="wikibase-item"then
localfirstToUpper=(require'Modul:Functions').firstToUpper
localWDValues,parsedValues={},{}
for_,statementinipairs(Statements)do
iflib.IsSnakValue(statement.mainsnak)then
localid=lib.getEntityIdFromValue(statement.mainsnak.datavalue.value)
localvalue=mw.wikibase.sitelink(id)ormw.wikibase.label(id)
ifvaluethen
table.insert(WDValues,firstToUpper(value))
end
end
end
locallink_match='%[%[[^%]%[]-%]%]'
locallink_target='%[%[%s*([^|%]]-)%s*[|%]]'
ifmw.ustring.match(temp_value,br_split)then
forvalueinmw.text.gsplit(temp_value,br_split)do
localvalue=stripBrackets(value)
ifmw.ustring.match(value,link_match)then
forpageinmw.ustring.gmatch(value,link_target)do
table.insert(parsedValues,firstToUpper(page))
end
else
table.insert(parsedValues,mw.text.trim(value))
end
end
elseifmw.ustring.match(temp_value,link_match)then
forvalueinmw.ustring.gmatch(temp_value,link_target)do
table.insert(parsedValues,firstToUpper(value))
end
else
table.insert(parsedValues,mw.text.trim(temp_value))
end
if#parsedValues==0then
returnmarkValue(value,'diff',options)
end
for_,parsedinipairs(parsedValues)do
ifnotin_array(parsed,WDValues)then
returnmarkValue(value,'diff',options)
end
end
returnmarkValue(value,'same',options)
end
--elseif datatype == "globecoordinate" then
returnnil,nil
end

returnp