אונטערשייד צווישן ווערסיעס פון "יחידה:WikidataCrossValidation"

פון המכלול
קפיצה לניווט קפיצה לחיפוש
קאין תקציר עריכה
 
ק (rv)
צייכן: צוריקגעשטעלט
שורה 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 Date = require('יחידה:דאטע')
local CrossValidate = {}
local CrossValidate = {}
CrossValidate.CrossValidateResult = {
CrossValidate.CrossValidateResult = {
שורה 9: שורה 9:
INCOMPATIBLE='לא מתאים',
INCOMPATIBLE='לא מתאים',
COMPATIBLE='מתאים',
COMPATIBLE='מתאים',
MISSING_WIKIDATA_LABEL='חסרה תווית עברית'
MISSING_WIKIDATA_LABEL='פעלט יידיש עטיקעט'
}
}


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 )
שורה 25: שורה 25:
     entityId = mw.wikibase.getEntityIdForCurrentPage()
     entityId = mw.wikibase.getEntityIdForCurrentPage()
     end
     end
if entityId == nil then
if entityId ==nil then
if mw.title.getCurrentTitle().namespace==0 then
if mw.title.getCurrentTitle().namespace==0 then
return CrossValidate.CrossValidateResult.MISSING_WIKIDATA
return CrossValidate.CrossValidateResult.MISSING_WIKIDATA
שורה 31: שורה 31:
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT
return CrossValidate.CrossValidateResult.INVALID_WIKITEXT
end
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)
שורה 45: שורה 41:
     else
     else
     -- try to remove links
     -- try to remove links
     if mw.ustring.gsub(wikitext, '[%[%]]', '') == formattedValue or mw.ustring.gsub(wikitext, '%[%[[^%|%[%]]+%|(.+)%]%]', '%1') == formattedValue then
     if mw.ustring.gsub(wikitext, '[%[%]]', '') == formattedValue then
     return CrossValidate.CrossValidateResult.COMPATIBLE
     return CrossValidate.CrossValidateResult.COMPATIBLE
     end
     end
שורה 58: שורה 54:
    if propValue['type'] == 'wikibase-entityid' then
    if propValue['type'] == 'wikibase-entityid' then
    local localLabel, langLabel = mw.wikibase.getLabelWithLang( "Q" .. propValue.value['numeric-id'] )
    local localLabel, langLabel = mw.wikibase.getLabelWithLang( "Q" .. propValue.value['numeric-id'] )
    local isLocalLabel = langLabel=='he'
    local isLocalLabel = langLabel=='yi'
    if not isLocalLabel then
    if not isLocalLabel then
    return CrossValidate.CrossValidateResult.MISSING_WIKIDATA_LABEL
    return CrossValidate.CrossValidateResult.MISSING_WIKIDATA_LABEL
שורה 70: שורה 66:
if not  isCompatible then
if not  isCompatible then
local entityObject =  mw.wikibase.getEntity( "Q" .. propValue.value['numeric-id'] )
local entityObject =  mw.wikibase.getEntity( "Q" .. propValue.value['numeric-id'] )
local entityAliases = entityObject and entityObject.aliases and entityObject.aliases['he']
local entityAliases = entityObject and entityObject.aliases and entityObject.aliases['yi']
if entityAliases then
if entityAliases then
for _, curAlias in ipairs(entityAliases) do
for _, curAlias in ipairs(entityAliases) do
שורה 95: שורה 91:
     end
     end
    elseif propValue['type'] == 'quantity' then
    elseif propValue['type'] == 'quantity' then
    local noramlizeUnit = mw.ustring.gsub(wikitext, '[%[%]]', '')
    return MISSING_WIKIDATA -- TODO: parse quantity and units
    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 success, res = pcall(Date.newFromWikitext, wikitext )
    local success, res = pcall(Date.newFromWikitext, wikitext )
שורה 142: שורה 116:
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

רעוויזיע פון 12:21, 13 אפריל 2022

מען קען שאפן דאקומענטאציע פאר דעם מאדול ביי יחידה:WikidataCrossValidation/דאק

--[[
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 = {}
CrossValidate.CrossValidateResult = {
	INVALID_WIKITEXT='לא ידוע', --wikitext is empty or too complex
	MISSING_WIKIDATA='חסר', -- data doesnt exist in wikidata (no entity/no claim)
	INCOMPATIBLE='לא מתאים',
	COMPATIBLE='מתאים',
	MISSING_WIKIDATA_LABEL='פעלט יידיש עטיקעט'
}

function CrossValidate.maintainceCategory(value, propertyName) 
	if value==CrossValidate.CrossValidateResult.INVALID_WIKITEXT then return '' end
	return '[[קאטעגאריע: ויקינתונים - השוואת ערכים: ' .. value.. ']]' ..  '[[קאטעגאריע: ויקינתונים - השוואת ערכים: ' .. value.. ': '..(mw.wikibase.label( propertyName) or propertyName)..']]'
end
--function CrossValidate.crossValidate( wikitext, propertyName, allowMulti, allowNA, entityId, multiSeperator, optionalQualifier, genderAware )
function CrossValidate.crossValidate( wikitext, propertyName, entityId )
	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
	end
    
    if entityId == nil then
    	entityId = mw.wikibase.getEntityIdForCurrentPage()
    end
	if entityId ==nil then
		if mw.title.getCurrentTitle().namespace==0 then
			return CrossValidate.CrossValidateResult.MISSING_WIKIDATA
		else
			return CrossValidate.CrossValidateResult.INVALID_WIKITEXT
		end
	end
    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 then
    		return CrossValidate.CrossValidateResult.COMPATIBLE
    	end
    end
    
    local resTable = {}
    for i, property in ipairs(propertyVals) do
	    local propValue = property.mainsnak and property.mainsnak.datavalue
	    if not propValue then 
    		return CrossValidate.CrossValidateResult.MISSING_WIKIDATA -- no value/someone etc are considered as missing
		end
		
	    if propValue['type'] == 'wikibase-entityid' then
	    	local localLabel, langLabel = mw.wikibase.getLabelWithLang( "Q" .. propValue.value['numeric-id'] )
	    	local isLocalLabel = langLabel=='yi'
	    	if not isLocalLabel then
	    		return CrossValidate.CrossValidateResult.MISSING_WIKIDATA_LABEL
	    	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['yi']
				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
        	end
	    elseif propValue['type'] == 'string' then
	    	local isImage = (property.mainsnak.datatype=='commonsMedia')
	    	if isImage then
	    		return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- images are too complex
	    	else
	    		if not (mw.ustring.find(wikitext, propValue.value, 1, true)) then
	    			return CrossValidate.CrossValidateResult.INCOMPATIBLE
	    		end
	    	end
    	elseif propValue['type'] == 'monolingualtext' then
    		if not mw.ustring.find(wikitext, propValue.value.text, 1, true) then
    			return CrossValidate.CrossValidateResult.INCOMPATIBLE
    		end
	    elseif propValue['type'] == 'quantity' then
	    	return MISSING_WIKIDATA -- TODO: parse quantity and units
	    elseif propValue['type'] == 'time' then
	    	local success, res = pcall(Date.newFromWikitext, wikitext )
    		if success and property.mainsnak.datavalue and property.mainsnak.datavalue.value then
    			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
    		end
	    else
	    	return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- ignore other types
	    end
	end
	
	return CrossValidate.CrossValidateResult.COMPATIBLE
end

return CrossValidate