<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="he">
	<id>https://chabadpedia.co.il/index.php?action=history&amp;feed=atom&amp;title=%D7%99%D7%97%D7%99%D7%93%D7%94%3AWikidataCrossValidation</id>
	<title>יחידה:WikidataCrossValidation - היסטוריית גרסאות</title>
	<link rel="self" type="application/atom+xml" href="https://chabadpedia.co.il/index.php?action=history&amp;feed=atom&amp;title=%D7%99%D7%97%D7%99%D7%93%D7%94%3AWikidataCrossValidation"/>
	<link rel="alternate" type="text/html" href="https://chabadpedia.co.il/index.php?title=%D7%99%D7%97%D7%99%D7%93%D7%94:WikidataCrossValidation&amp;action=history"/>
	<updated>2026-04-11T21:12:27Z</updated>
	<subtitle>היסטוריית הגרסאות של הדף הזה בוויקי</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://chabadpedia.co.il/index.php?title=%D7%99%D7%97%D7%99%D7%93%D7%94:WikidataCrossValidation&amp;diff=774405&amp;oldid=prev</id>
		<title>מ. רובין: יצירת דף עם התוכן &quot;-- Cross validation with wikidata: parse the wikitext of a value related to wikidata and see if they are close enough.  local Date = require(&#039;יחידה:תאריך&#039;) local CrossValidate = {} CrossValidate.CrossValidateResult = { 	INVALID_WIKITEXT=&#039;לא ידוע&#039;, --wikitext is empty or too complex 	MISSING_WIKIDATA=&#039;חסר&#039;, -- data doesnt exist in wikidata (no entity/no claim) 	INCOMPATIBLE=&#039;לא מתאים&#039;, 	COMPATIBLE=&#039;מתאים&#039;, 	MISSING_WIKIDATA...&quot;</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.co.il/index.php?title=%D7%99%D7%97%D7%99%D7%93%D7%94:WikidataCrossValidation&amp;diff=774405&amp;oldid=prev"/>
		<updated>2025-06-10T13:32:07Z</updated>

		<summary type="html">&lt;p&gt;יצירת דף עם התוכן &amp;quot;--&lt;a href=&quot;/index.php?title=Cross_validation_with_wikidata:_parse_the_wikitext_of_a_value_related_to_wikidata_and_see_if_they_are_close_enough.&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Cross validation with wikidata: parse the wikitext of a value related to wikidata and see if they are close enough. (הדף אינו קיים)&quot;&gt;Cross validation with wikidata: parse the wikitext of a value related to wikidata and see if they are close enough. &lt;/a&gt; local Date = require(&amp;#039;יחידה:תאריך&amp;#039;) local CrossValidate = {} CrossValidate.CrossValidateResult = { 	INVALID_WIKITEXT=&amp;#039;לא ידוע&amp;#039;, --wikitext is empty or too complex 	MISSING_WIKIDATA=&amp;#039;חסר&amp;#039;, -- data doesnt exist in wikidata (no entity/no claim) 	INCOMPATIBLE=&amp;#039;לא מתאים&amp;#039;, 	COMPATIBLE=&amp;#039;מתאים&amp;#039;, 	MISSING_WIKIDATA...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;דף חדש&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
Cross validation with wikidata: parse the wikitext of a value related to wikidata and see if they are close enough.&lt;br /&gt;
]]&lt;br /&gt;
local Date = require(&amp;#039;יחידה:תאריך&amp;#039;)&lt;br /&gt;
local CrossValidate = {}&lt;br /&gt;
CrossValidate.CrossValidateResult = {&lt;br /&gt;
	INVALID_WIKITEXT=&amp;#039;לא ידוע&amp;#039;, --wikitext is empty or too complex&lt;br /&gt;
	MISSING_WIKIDATA=&amp;#039;חסר&amp;#039;, -- data doesnt exist in wikidata (no entity/no claim)&lt;br /&gt;
	INCOMPATIBLE=&amp;#039;לא מתאים&amp;#039;,&lt;br /&gt;
	COMPATIBLE=&amp;#039;מתאים&amp;#039;,&lt;br /&gt;
	MISSING_WIKIDATA_LABEL=&amp;#039;חסרה תווית עברית&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function CrossValidate.maintainceCategory(value, propertyName) &lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
--function CrossValidate.crossValidate( wikitext, propertyName, allowMulti, allowNA, entityId, multiSeperator, optionalQualifier, genderAware )&lt;br /&gt;
function CrossValidate.crossValidate( wikitext, propertyName, entityId )&lt;br /&gt;
	if wikitext == nil or wikitext == &amp;#039;-&amp;#039; or #wikitext ==0 or propertyName ==nil or #propertyName==0 then &lt;br /&gt;
		return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- comparing to null wikitext is meaningless&lt;br /&gt;
	end&lt;br /&gt;
    &lt;br /&gt;
	if entityId == nil then&lt;br /&gt;
		if mw.title.getCurrentTitle().namespace==0 then&lt;br /&gt;
			return CrossValidate.CrossValidateResult.MISSING_WIKIDATA&lt;br /&gt;
		else&lt;br /&gt;
			return CrossValidate.CrossValidateResult.INVALID_WIKITEXT&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- temporary fix for option param of (e.g P1/P2)&lt;br /&gt;
	if string.find(propertyName, &amp;#039;/&amp;#039;) then&lt;br /&gt;
		return CrossValidate.CrossValidateResult.INVALID_WIKITEXT&lt;br /&gt;
	end&lt;br /&gt;
    local propertyVals = mw.wikibase.getBestStatements(entityId, propertyName)&lt;br /&gt;
    if (not propertyVals) or (#propertyVals==0) then return CrossValidate.CrossValidateResult.MISSING_WIKIDATA end --no such property for this item&lt;br /&gt;
    &lt;br /&gt;
    -- parsing the wikidata value gives similar result to wikitext&lt;br /&gt;
    local formattedValue = require(&amp;#039;Module:PropertyLink&amp;#039;).getPropertyByOptions(propertyName, entityId, {allowMulti=1 })&lt;br /&gt;
    if formattedValue == wikitext then&lt;br /&gt;
    	return CrossValidate.CrossValidateResult.COMPATIBLE&lt;br /&gt;
    else&lt;br /&gt;
    	-- try to remove links&lt;br /&gt;
    	if mw.ustring.gsub(wikitext, &amp;#039;[%[%]]&amp;#039;, &amp;#039;&amp;#039;) == formattedValue or mw.ustring.gsub(wikitext, &amp;#039;%[%[[^%|%[%]]+%|(.+)%]%]&amp;#039;, &amp;#039;%1&amp;#039;) == formattedValue then&lt;br /&gt;
    		return CrossValidate.CrossValidateResult.COMPATIBLE&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local resTable = {}&lt;br /&gt;
    for i, property in ipairs(propertyVals) do&lt;br /&gt;
	    local propValue = property.mainsnak and property.mainsnak.datavalue&lt;br /&gt;
	    if not propValue then &lt;br /&gt;
    		return CrossValidate.CrossValidateResult.MISSING_WIKIDATA -- no value/someone etc are considered as missing&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	    if propValue[&amp;#039;type&amp;#039;] == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
    	local localLabel, langLabel = mw.wikibase.getLabelWithLang( &amp;quot;Q&amp;quot; .. propValue.value[&amp;#039;numeric-id&amp;#039;] )&lt;br /&gt;
	    	local isLocalLabel = langLabel==&amp;#039;he&amp;#039;&lt;br /&gt;
	    	if not isLocalLabel then&lt;br /&gt;
	    		return CrossValidate.CrossValidateResult.MISSING_WIKIDATA_LABEL&lt;br /&gt;
	    	end&lt;br /&gt;
	    	local isCompatible = mw.ustring.find(wikitext, localLabel, 1, true)&lt;br /&gt;
	    	if not isCompatible then&lt;br /&gt;
	    		local sitelink = mw.wikibase.sitelink( &amp;quot;Q&amp;quot; .. propValue.value[&amp;#039;numeric-id&amp;#039;] )&lt;br /&gt;
	    		isCompatible = sitelink and mw.ustring.find(wikitext, sitelink, 1, true)&lt;br /&gt;
	    	end&lt;br /&gt;
			if not  isCompatible then&lt;br /&gt;
				local entityObject =  mw.wikibase.getEntity( &amp;quot;Q&amp;quot; .. propValue.value[&amp;#039;numeric-id&amp;#039;] )&lt;br /&gt;
				local entityAliases = entityObject and entityObject.aliases and entityObject.aliases[&amp;#039;he&amp;#039;]&lt;br /&gt;
				if entityAliases then&lt;br /&gt;
					for _, curAlias in ipairs(entityAliases) do&lt;br /&gt;
						isCompatible = isCompatible or mw.ustring.find(wikitext, curAlias.value, 1, true)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
        	if not isCompatible then&lt;br /&gt;
        		return CrossValidate.CrossValidateResult.INCOMPATIBLE&lt;br /&gt;
        	end&lt;br /&gt;
	    elseif propValue[&amp;#039;type&amp;#039;] == &amp;#039;string&amp;#039; then&lt;br /&gt;
	    	local isImage = (property.mainsnak.datatype==&amp;#039;commonsMedia&amp;#039;)&lt;br /&gt;
	    	if isImage then&lt;br /&gt;
	    		return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- images are too complex&lt;br /&gt;
	    	else&lt;br /&gt;
	    		if not (mw.ustring.find(wikitext, propValue.value, 1, true)) then&lt;br /&gt;
	    			return CrossValidate.CrossValidateResult.INCOMPATIBLE&lt;br /&gt;
	    		end&lt;br /&gt;
	    	end&lt;br /&gt;
    	elseif propValue[&amp;#039;type&amp;#039;] == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
    		if not mw.ustring.find(wikitext, propValue.value.text, 1, true) then&lt;br /&gt;
    			return CrossValidate.CrossValidateResult.INCOMPATIBLE&lt;br /&gt;
    		end&lt;br /&gt;
	    elseif propValue[&amp;#039;type&amp;#039;] == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
	    	local noramlizeUnit = mw.ustring.gsub(wikitext, &amp;#039;[%[%]]&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	    	noramlizeUnit =  mw.ustring.gsub(noramlizeUnit, &amp;#039;(.+) מטרים&amp;#039;, &amp;#039;%1 מטר&amp;#039;)&lt;br /&gt;
	    	noramlizeUnit =  mw.ustring.gsub(noramlizeUnit, &amp;#039;(.+) ק&amp;quot;ג$&amp;#039;, &amp;#039;%1 קילוגרם&amp;#039;)&lt;br /&gt;
	    	if noramlizeUnit == formattedValue then&lt;br /&gt;
	    		return CrossValidate.CrossValidateResult.COMPATIBLE&lt;br /&gt;
	    	end&lt;br /&gt;
			if mw.ustring.match(noramlizeUnit, &amp;#039;^[%d.,]+ מטר$&amp;#039;) then&lt;br /&gt;
				local ConvertModule = require(&amp;#039;Module:Convert&amp;#039;)&lt;br /&gt;
		    	local success, wikidataMeter = pcall(ConvertModule.convert, mw.getCurrentFrame():newChild{ args = {&lt;br /&gt;
					[&amp;#039;input&amp;#039;] = propertyName,&lt;br /&gt;
					[2] = &amp;#039;מטר&amp;#039;,&lt;br /&gt;
					[&amp;#039;disp&amp;#039;] = &amp;#039;out&amp;#039;,&lt;br /&gt;
					[&amp;#039;qid&amp;#039;] = entityId,&lt;br /&gt;
					[&amp;#039;abbr&amp;#039;]=&amp;#039;off&amp;#039;&lt;br /&gt;
				} }:newChild{})&lt;br /&gt;
				if success then&lt;br /&gt;
					wikidataMeter =  mw.ustring.gsub(wikidataMeter, &amp;#039;(.+) מטרים&amp;#039;, &amp;#039;%1 מטר&amp;#039;)&lt;br /&gt;
					if wikidataMeter==noramlizeUnit then&lt;br /&gt;
						return CrossValidate.CrossValidateResult.COMPATIBLE&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
	    	end&lt;br /&gt;
	    	return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- TODO: parse quantity and units&lt;br /&gt;
	    elseif propValue[&amp;#039;type&amp;#039;] == &amp;#039;time&amp;#039; then&lt;br /&gt;
	    	local success, res = pcall(Date.newFromWikitext, wikitext )&lt;br /&gt;
    		if success and property.mainsnak.datavalue and property.mainsnak.datavalue.value then&lt;br /&gt;
    			local wikidataVal = Date.newFromWikidataValue(property.mainsnak.datavalue.value)&lt;br /&gt;
    			if wikidataVal.precision == res.precision then&lt;br /&gt;
    				if wikidataVal:toIso8601() == res:toIso8601() then&lt;br /&gt;
    					return CrossValidate.CrossValidateResult.COMPATIBLE&lt;br /&gt;
    				else&lt;br /&gt;
    					return CrossValidate.CrossValidateResult.INCOMPATIBLE&lt;br /&gt;
    				end&lt;br /&gt;
    			else&lt;br /&gt;
    				-- TODO: handle different precision&lt;br /&gt;
    				return CrossValidate.CrossValidateResult.INVALID_WIKITEXT&lt;br /&gt;
    			end&lt;br /&gt;
    		else&lt;br /&gt;
    			-- ignore parsing errors&lt;br /&gt;
    			return CrossValidate.CrossValidateResult.INVALID_WIKITEXT&lt;br /&gt;
    		end&lt;br /&gt;
	    else&lt;br /&gt;
	    	return CrossValidate.CrossValidateResult.INVALID_WIKITEXT -- ignore other types&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return CrossValidate.CrossValidateResult.COMPATIBLE&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CrossValidate.templateCrossVal(frame)&lt;br /&gt;
	local Arguments = require( &amp;quot;Module:Arguments&amp;quot; )&lt;br /&gt;
	local args = Arguments.getArgs(frame, { [&amp;#039;trim&amp;#039;] = true, [&amp;#039;removeBlanks&amp;#039;] = true })&lt;br /&gt;
	local wikitext = args[1]&lt;br /&gt;
	local propertyName = args[2]&lt;br /&gt;
	local res = CrossValidate.crossValidate(wikitext, propertyName)&lt;br /&gt;
	if res then&lt;br /&gt;
		return CrossValidate.maintainceCategory(res, propertyName)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return CrossValidate&lt;/div&gt;</summary>
		<author><name>מ. רובין</name></author>
	</entry>
</feed>