יחידה:WikidataCrossValidation: הבדלים בין גרסאות בדף
מאין תקציר עריכה |
מ 23 גרסאות של הדף wikipedia:he:יחידה:WikidataCrossValidation יובאו |
||
| (22 גרסאות ביניים של 3 משתמשים אינן מוצגות) | |||
| שורה 2: | שורה 2: | ||
Cross validation with wikidata: parse the wikitext of a value related to wikidata and see if they are close enough. | Cross validation with wikidata: parse the wikitext of a value related to wikidata and see if they are close enough. | ||
]] | ]] | ||
local Date = require('יחידה:תאריך') | |||
local CrossValidate = {} | local CrossValidate = {} | ||
CrossValidate.CrossValidateResult = { | CrossValidate.CrossValidateResult = { | ||
| שורה 14: | שורה 14: | ||
function CrossValidate.maintainceCategory(value, propertyName) | function CrossValidate.maintainceCategory(value, propertyName) | ||
if value==CrossValidate.CrossValidateResult.INVALID_WIKITEXT then return '' end | if value==CrossValidate.CrossValidateResult.INVALID_WIKITEXT then return '' end | ||
return '[[קטגוריה: ויקינתונים -השוואת ערכים: ' .. value ']]' .. '[[קטגוריה: ויקינתונים -השוואת ערכים: ' .. value ':'..(mw.wikibase.label( propertyName) or propertyName)..']]' | return '[[קטגוריה: ויקינתונים - השוואת ערכים: ' .. value.. ']]' .. '[[קטגוריה: ויקינתונים - השוואת ערכים: ' .. value.. ': '..(mw.wikibase.label( propertyName) or propertyName)..']]' | ||
end | end | ||
--function CrossValidate.crossValidate( wikitext, propertyName, allowMulti, allowNA, entityId, multiSeperator, optionalQualifier, genderAware ) | --function CrossValidate.crossValidate( wikitext, propertyName, allowMulti, allowNA, entityId, multiSeperator, optionalQualifier, genderAware ) | ||
function CrossValidate.crossValidate( wikitext, propertyName, entityId ) | function CrossValidate.crossValidate( wikitext, propertyName, entityId ) | ||
if wikitext == nil or wikitext == '-' or #wikitext ==0 then | if wikitext == nil or wikitext == '-' or #wikitext ==0 or propertyName ==nil or #propertyName==0 then | ||
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- comparing to null wikitext is meaningless | return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- comparing to null wikitext is meaningless | ||
end | end | ||
| שורה 25: | שורה 25: | ||
entityId = mw.wikibase.getEntityIdForCurrentPage() | entityId = mw.wikibase.getEntityIdForCurrentPage() | ||
end | end | ||
if entityId==nil then | if entityId == nil then | ||
return CrossValidate.CrossValidateResult.MISSING_WIKIDATA | if mw.title.getCurrentTitle().namespace==0 then | ||
return CrossValidate.CrossValidateResult.MISSING_WIKIDATA | |||
else | |||
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT | |||
end | |||
end | |||
-- temporary fix for option param of (e.g P1/P2) | |||
if string.find(propertyName, '/') then | |||
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT | |||
end | end | ||
local propertyVals = mw.wikibase.getBestStatements(entityId, propertyName) | local propertyVals = mw.wikibase.getBestStatements(entityId, propertyName) | ||
if (not propertyVals) or (#propertyVals==0) then return CrossValidate.CrossValidateResult.MISSING_WIKIDATA end --no such property for this item | |||
-- parsing the wikidata value gives similar result to wikitext | |||
local formattedValue = require('Module:PropertyLink').getPropertyByOptions(propertyName, entityId, {allowMulti=1 }) | |||
if formattedValue == wikitext then | |||
return CrossValidate.CrossValidateResult.COMPATIBLE | |||
else | |||
-- try to remove links | |||
if mw.ustring.gsub(wikitext, '[%[%]]', '') == formattedValue or mw.ustring.gsub(wikitext, '%[%[[^%|%[%]]+%|(.+)%]%]', '%1') == formattedValue then | |||
return CrossValidate.CrossValidateResult.COMPATIBLE | |||
end | |||
end | |||
local resTable = {} | local resTable = {} | ||
for i, property in ipairs(propertyVals) do | for i, property in ipairs(propertyVals) do | ||
local propValue = property.mainsnak and property.mainsnak.datavalue | local propValue = property.mainsnak and property.mainsnak.datavalue | ||
| שורה 41: | שורה 58: | ||
if propValue['type'] == 'wikibase-entityid' then | if propValue['type'] == 'wikibase-entityid' then | ||
local localLabel, langLabel = mw.wikibase.getLabelWithLang( "Q" .. propValue.value['numeric-id'] ) | |||
local isLocalLabel = langLabel=='he' | local isLocalLabel = langLabel=='he' | ||
if not isLocalLabel then | if not isLocalLabel then | ||
return CrossValidate.CrossValidateResult.MISSING_WIKIDATA_LABEL | return CrossValidate.CrossValidateResult.MISSING_WIKIDATA_LABEL | ||
end | end | ||
local isCompatible = mw.ustring.find(wikitext, localLabel, 1, true) | |||
if not isCompatible then | |||
local sitelink = mw.wikibase.sitelink( "Q" .. propValue.value['numeric-id'] ) | |||
isCompatible = sitelink and mw.ustring.find(wikitext, sitelink, 1, true) | |||
end | |||
if not isCompatible then | |||
local entityObject = mw.wikibase.getEntity( "Q" .. propValue.value['numeric-id'] ) | |||
local entityAliases = entityObject and entityObject.aliases and entityObject.aliases['he'] | |||
if entityAliases then | |||
for _, curAlias in ipairs(entityAliases) do | |||
isCompatible = isCompatible or mw.ustring.find(wikitext, curAlias.value, 1, true) | |||
end | |||
end | |||
end | |||
if not isCompatible then | |||
return CrossValidate.CrossValidateResult.INCOMPATIBLE | return CrossValidate.CrossValidateResult.INCOMPATIBLE | ||
end | end | ||
| שורה 63: | שורה 95: | ||
end | end | ||
elseif propValue['type'] == 'quantity' then | elseif propValue['type'] == 'quantity' then | ||
return | local noramlizeUnit = mw.ustring.gsub(wikitext, '[%[%]]', '') | ||
noramlizeUnit = mw.ustring.gsub(noramlizeUnit, '(.+) מטרים', '%1 מטר') | |||
noramlizeUnit = mw.ustring.gsub(noramlizeUnit, '(.+) ק"ג$', '%1 קילוגרם') | |||
if noramlizeUnit == formattedValue then | |||
return CrossValidate.CrossValidateResult.COMPATIBLE | |||
end | |||
if mw.ustring.match(noramlizeUnit, '^[%d.,]+ מטר$') then | |||
local ConvertModule = require('Module:Convert') | |||
local success, wikidataMeter = pcall(ConvertModule.convert, mw.getCurrentFrame():newChild{ args = { | |||
['input'] = propertyName, | |||
[2] = 'מטר', | |||
['disp'] = 'out', | |||
['qid'] = entityId, | |||
['abbr']='off' | |||
} }:newChild{}) | |||
if success then | |||
wikidataMeter = mw.ustring.gsub(wikidataMeter, '(.+) מטרים', '%1 מטר') | |||
if wikidataMeter==noramlizeUnit then | |||
return CrossValidate.CrossValidateResult.COMPATIBLE | |||
end | |||
end | |||
end | |||
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- TODO: parse quantity and units | |||
elseif propValue['type'] == 'time' then | elseif propValue['type'] == 'time' then | ||
local | local success, res = pcall(Date.newFromWikitext, wikitext ) | ||
if success and property.mainsnak.datavalue and property.mainsnak.datavalue.value then | |||
-- TODO: | local wikidataVal = Date.newFromWikidataValue(property.mainsnak.datavalue.value) | ||
if wikidataVal.precision == res.precision then | |||
if wikidataVal:toIso8601() == res:toIso8601() then | |||
return CrossValidate.CrossValidateResult.COMPATIBLE | |||
else | |||
return CrossValidate.CrossValidateResult.INCOMPATIBLE | |||
end | |||
else | |||
-- TODO: handle different precision | |||
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT | |||
end | |||
else | |||
-- ignore parsing errors | |||
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT | return CrossValidate.CrossValidateResult.INVALID_WIKITEXT | ||
end | |||
else | else | ||
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- ignore other types | return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- ignore other types | ||
| שורה 76: | שורה 142: | ||
return CrossValidate.CrossValidateResult.COMPATIBLE | return CrossValidate.CrossValidateResult.COMPATIBLE | ||
end | |||
function CrossValidate.templateCrossVal(frame) | |||
local Arguments = require( "Module:Arguments" ) | |||
local args = Arguments.getArgs(frame, { ['trim'] = true, ['removeBlanks'] = true }) | |||
local wikitext = args[1] | |||
local propertyName = args[2] | |||
local res = CrossValidate.crossValidate(wikitext, propertyName) | |||
if res then | |||
return CrossValidate.maintainceCategory(res, propertyName) | |||
end | |||
end | end | ||
return CrossValidate | return CrossValidate | ||