ניתן ליצור תיעוד על היחידה הזאת בדף יחידה:מיון/תיעוד

local p={}
local wikidataTreeCache = nil
local wikidataTaxonomicRanks = {
    	--[146481]= 'על-ממלכה',
        [36732]= 'ממלכה',
        --[2752679]= 'תת-ממלכה',
        [38348] = 'מערכה',
        [334460] = 'מערכה', -- division
        [3504061] = 'על-מחלקה',
        [37517] = 'מחלקה',
        [36602] = 'סדרה',
        [5867959] = 'תת-סדרה',
        [35409] = 'משפחה',
        [2455704] = 'תת-משפחה',
        [34740] = 'סוג',
        [7432] = 'מין'
    }
local wikidataTaxonomicLevels = {
	['ממלכה']=1,
	['מערכה']=1,
	['על-מחלקה']=1,
	['מחלקה']=1,
	['סדרה']=1,
	['תת-סדרה']=1,
	['משפחה']=1,
	['תת-משפחה']=1,
	['סוג']=1,
	['מין']=1
}

function p.header( kingdom, title )
     if not p.color then
        local colors = {
            [ "חיידקים אמיתיים" ] = "#D3D3D3",
            [ "חיידקים קדומים" ] = "#E0E0F3",
            [ "חיידקים" ] = "#D3D3D3",
            [ "בעלי חיים"]="#f4dda1",
            [ "פטריות"]="#ADD8E6",
            [ "איקריוטיים"]="#CE9EF2",
            [ "אוקריוטיים"]="#CE9EF2",
            [ "צומח"]="#90EE90",
            [ "צמחים"]="#90EE90"
        }        
        local colorKingdom = colors[kingdom]
        if not colorKingdom and kingdom then --pattern search - usefull for links...
            for k,v in pairs( colors ) do
                if string.find( kingdom,k ) then
                    colorKingdom = v
                    break
                end
            end
        end
        p.color = colorKingdom or "#CE9EF2"
    end
    return "! colspan=\"2\" style=\"text-align: center; background-color: " .. p.color .. ";\" | " .. title
end

--Get the Wikidata taxonom in localized form.
--@return [[first last|last]], date
local function getWikidataTaxonom(entity, pTaxonName, taxonDateQualifier)
	local taxonom
	local wikidataTaxonom = mw.wikibase.getAllStatements( entity, pTaxonName )
	wikidataTaxonom = wikidataTaxonom and wikidataTaxonom[1] and wikidataTaxonom[1].qualifiers and wikidataTaxonom[1].qualifiers['P405']
	local localizeWikidataTaxonoms = {}
	local missingTaxonomLoalization = false
	if wikidataTaxonom then
		for k,v in pairs(wikidataTaxonom) do
			local formattedValue = mw.wikibase.renderSnak(v)
			
			if v and v.datavalue and v.datavalue.value and v.datavalue.value.id then
				_, langLabel = mw.wikibase.getLabelWithLang( v.datavalue.value.id )
				if langLabel~='he' then
					missingTaxonomLoalization = true
				end
			end

			-- Link to author page in format: [[firstName lastName|lastName]]
			formattedValue = mw.ustring.gsub( formattedValue , '(.+ )(.*)', "[[%1 %2|%2]]")
			table.insert(localizeWikidataTaxonoms, formattedValue)
		end
		if #localizeWikidataTaxonoms > 0 then
			taxonom = table.concat(localizeWikidataTaxonoms, ' & ')
			if missingTaxonomLoalization then
				taxonom = taxonom .. '[[קטגוריה:ויקינתונים:ערכים_חסרי_תווית_בעברית: מתאר הטקסון]][[קטגוריה:ויקינתונים:ערכים_חסרי_תווית_בעברית]]'
			end
		end
	end
	local wikidataProp = require("יחידה:PropertyLink")
    local wikidataTaxonomYear = wikidataProp.getPropertyQualifier( pTaxonName, taxonDateQualifier)

	-- Append authority year
	if wikidataTaxonomYear then
   		taxonom = (taxonom and (taxonom .. ', '))   -- append comma seperator if author name exist
   		taxonom = (taxonom or '') .. wikidataTaxonomYear
	end
	return taxonom
end

--[[
    Fetch recursively the taxonomic data from wikidata
    -- @param {string} highestRank highest taxonomic rank to fetch for early termination
]]
function p.wikidataTaxonTree(highestRank)
	if wikidataTreeCache~=nil then
		return wikidataTreeCache[highestRank]
	end
    local currentEntityId = mw.wikibase.getEntityIdForCurrentPage()
    local taxonomicTree= {}
    local parentTaxonProperty = 'P171'
    local taxonomicRankproperty = 'P105'
    local parents= {}
    while currentEntityId ~= nil do
		mw.log('Access to entity: ' .. currentEntityId)
        local taxLevel = mw.wikibase.getBestStatements( currentEntityId, taxonomicRankproperty )
        taxLevel = taxLevel and taxLevel[1] and taxLevel[1].mainsnak
        taxLevel = taxLevel and taxLevel.datavalue and taxLevel.datavalue.value['numeric-id']
		
		local linkTarget = mw.wikibase.sitelink( currentEntityId )
        local linkTitle, linkLang = mw.wikibase.getLabelWithLang( currentEntityId ) 
        if not linkTitle or linkLang~='he' then
        	linkTitle = mw.wikibase.getBestStatements(currentEntityId, 'P225')
        	linkTitle = linkTitle and linkTitle[1] and linkTitle[1].mainsnak and mw.wikibase.renderSnak(linkTitle[1].mainsnak)
        	if wikidataTaxonomicRanks[taxLevel]=='סוג' or  wikidataTaxonomicRanks[taxLevel]=='מין' then
        		linkTitle = mw.ustring.format('\'\'%s\'\'', linkTitle)
        	end
      	end
        if wikidataTaxonomicRanks[taxLevel] and linkTitle then
                taxonomicTree[wikidataTaxonomicRanks[taxLevel]] = (linkTarget and mw.ustring.format( "[[%s|%s]]", linkTarget, linkTitle )) or linkTitle
        end
		local parentTaxon = nil
		if highestRank~=wikidataTaxonomicRanks[taxLevel] then
		        parentTaxon = mw.wikibase.getBestStatements( currentEntityId, parentTaxonProperty )
		        parentTaxon = parentTaxon and parentTaxon[1] and parentTaxon[1].mainsnak
		        parentTaxon = parentTaxon and parentTaxon.datavalue
		        parentTaxon = parentTaxon and parentTaxon.value['numeric-id']
		end
        if parentTaxon and not parents[parentTaxon] then
    		parents[parentTaxon]=1
			currentEntityId = 'Q'..parentTaxon
        else 
			currentEntityId = nil
        end
    end
	wikidataTreeCache = taxonomicTree
    return taxonomicTree[highestRank]
end

function p.taxbox( frame )
    local realParams={}
    for i,j in pairs( frame:getParent().args ) do
        if string.len(j)>0 then
            realParams[i]=j
        end
    end
    frame.args=realParams
    
    local wikidataProp = require("יחידה:PropertyLink")
    local classificationParam = {
        "על-ממלכה",
        "קבוצה_1",
        "ממלכה",
        "תת-ממלכה",
        "קבוצה_2",
        "על-מערכה",
        "קבוצה_3",
        "מערכה",
        "קבוצה_4",
        "תת-מערכה",
        "קבוצה",
        "על-מחלקה",
        "קבוצה_5",
        "מחלקה",
        "קבוצה_6",
        "תת-מחלקה",
        "קבוצה_7",
        "אינפרא-מחלקה",
        "על-סדרה",
        "קבוצה_8",
        "סדרה",
        "קבוצה_9",
        "תת-סדרה",
        "קבוצה_10",
        "אינפרא-סדרה",
        "על-משפחה",
        "משפחה",
        "קבוצה_11",
        "תת-משפחה",
        "שבט",
        "תת-שבט",
        "סוג",
        "תת-סוג",
        "מין",
        "תת-מין"
    }
    local wikidataTaxonProperties = {
        [ "שם מדעי"] = 'P225',
        [ "שנת תיאור הטקסון" ] = 'P574',
        [ "שימור"] = 'P141',
        [ "תפוצה"] = 'P181'
    }
    local classifiedUnderParams = {
        "מחלקות",
        "סדרות",
        "משפחות",
        "תת-משפחות",
        "סוגים",
        "מינים",
        "תת-מינים"
    }
    local taxonomicNameToCode = {
	['ללא חשש'] = 'שימור LC',
	['מין קרוב לאיום'] = 'שימור NT',
	['מין תלוי שימור'] = 'שימור CD',
	['מין פגיע'] = 'שימור VU',
	['מינים בסכנת הכחדה'] = 'שימור EN',
	['מין בסכנת הכחדה חמורה'] = 'שימור CR',
	['מינים שנכחדו בטבע'] = 'שימור EW',
	['נכחד'] = 'שימור EX',
    ['אין מספיק נתונים'] = 'שימור DD'
	}
	
    local currTitle = tostring( mw.title.getCurrentTitle() )
    local title = frame.args[ "שם"] or mw.ustring.gsub(currTitle, '%(.+%)', '')
    local headerKingdom = frame.args[ "ממלכה"] or frame.args[ "על-ממלכה"] or p.wikidataTaxonTree("ממלכה")
    local mainHeader = p.header( headerKingdom, '<span style="float:left; font-size:70%;">[[קובץ:Information-silk.svg|קישור=ויקיפדיה:קריאת טבלת מיון|קריאת טבלת מיון]]</span>' .. title )
    local wikidataEntity = mw.wikibase.getEntityIdForCurrentPage()
    local wikidataEdit = '[[File:Wikidata-logo S.svg|20px|לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית|link=' ..((wikidataEntity and 'd:' .. wikidataEntity) or '//www.wikidata.org/wiki/Special:NewItem?label='..mw.uri.encode( currTitle )) .. ']]'

    local imageArea = frame.args[ 'תמונה' ] or wikidataProp.getImageLink() 
    imageArea = imageArea and string.format([[
|-
| colspan="2" style="text-align:center;" | %s
]], imageArea )
    if frame.args['כיתוב']  and imageArea then
        imageArea = imageArea .. '<div style="clear: both;"></div>' .. frame.args['כיתוב']
    end

    local distributionMap = frame.args['תפוצה'] or wikidataProp.getImageLink( wikidataTaxonProperties["תפוצה"] ) 
    distributionMap = distributionMap and string.format([[
|-
%s
|-
| colspan="2" style="text-align:center;" | %s
]],p.header( headerKingdom,'תחום תפוצה'), distributionMap )
    
    if frame.args['כיתוב תפוצה'] and distributionMap then  
        distributionMap = distributionMap ..frame.args['כיתוב תפוצה'] 
    end

    local floweringSeason = frame.args['עונת פריחה']
    floweringSeason = floweringSeason and string.format([[
|-
%s
|-
| colspan="2" style="text-align:center;" | %s
]],p.header( headerKingdom,'עונת פריחה'), floweringSeason )
    
    local synoyms = frame.args[ "שמות נוספים"]
    synoyms = synoyms and string.format([[
|-
%s
|- 
|colspan="2" style="font-size:90%%;text-align:center" |
%s
]],p.header( headerKingdom,'שמות נוספים'), synoyms )
    
    local period = frame.args[ "תקופה"] 
    period = period and string.format([[
|-
%s
|-
| colspan="2" style="text-align:center;" | %s
]],p.header( headerKingdom,'[[יחידת זמן גאולוגית|תקופה]]'), frame.args[ "תקופה"])

    local conservationNote = frame.args[ "הערת שימור"] 
    local iucnStatus = frame.args[ "שימור"] or frame.args[ "מצב שימור"] 
    local wikidataIucnStatus = wikidataProp.getLabel( wikidataTaxonProperties[ "שימור"] )
    if wikidataIucnStatus and taxonomicNameToCode[wikidataIucnStatus] then
        wikidataIucnStatus=taxonomicNameToCode[wikidataIucnStatus]
    end
    local iucnStatusWarn=''
    iucnStatus = iucnStatus or wikidataIucnStatus
    if (wikidataIucnStatus ~= iucnStatus) then
         iucnStatusWarn = '[[קטגוריה:דפים עם מצב שימור שאינו תואם את ויקינתונים]]'
    end
    if iucnStatus then
        iucnStatus = frame:expandTemplate{ title = iucnStatus }
        if wikidataEntity then
            local icunStatement = mw.wikibase.getBestStatements(wikidataEntity, wikidataTaxonProperties[ "שימור"])
            icunStatement = icunStatement and icunStatement[1]
            if icunStatement and icunStatement.references and icunStatement.references[1] and icunStatement.references[1].snaks['P627'] then
                local iucnRef = mw.wikibase.renderSnak(icunStatement.references[1].snaks['P627'][1])
                iucnRef = mw.ustring.format('<span dir="rtl">[https://apiv3.iucnredlist.org/api/v3/taxonredirect/%s %s] באתר הרשימה האדומה של [[IUCN]]</span>', iucnRef, title)
                iucnRef = frame:extensionTag{ name = 'ref', content = iucnRef, args = { name = 'IucnRedList' } }
                iucnStatus = iucnStatus..iucnRef
            end
        end
     elseif conservationNote then
          iucnStatus=''
     end
     if iucnStatus or conservationNote then
     	conservationNote = conservationNote or ''
        iucnStatus=iucnStatus..conservationNote..iucnStatusWarn
        iucnStatus = string.format([[
|-
%s
|-
| colspan="2" style="text-align:center;" |
%s
]],p.header( headerKingdom,'[[מצב שימור]]'), iucnStatus )
    end
    
    local classifictionSection = ''
    local taxonRank
    local usesWikidataParam = false
    for i,j in ipairs( classificationParam ) do
        local taxonVal = frame.args[j]
        if not taxonVal and wikidataTaxonomicLevels[j] then
            taxonVal = p.wikidataTaxonTree(j)
            if taxonVal then
                usesWikidataParam = true
            end
        end
        if taxonVal then
            local taxonHeader = mw.ustring.gsub( j, 'קבוצה_.+','קבוצה')
            taxonRank = j
            if taxonHeader==j then
                local taxonHeaderDisplay = string.gsub( taxonHeader,'-','־')
                if ( mw.title.new( j .. ' (טקסונומיה)', 0 ).id >0) then
                    taxonHeader='[['..taxonHeader..' (טקסונומיה)|'..taxonHeaderDisplay..']]'
                else
                    taxonHeader = taxonHeaderDisplay
                end
            end        
            
            classifictionSection = classifictionSection..'\n|-\n| style="text-align:center;" | '..taxonHeader..': || style="text-align:center;" | '..((currTitle==taxonVal and "'''"..taxonVal.."'''") or taxonVal)
        end
    end
    
    if not taxonRank then --there is no classification either by parameter or by wikidata
        classifictionSection = '\n|-\n| colspan="2" | '..wikidataEdit
    end
    
    local classificationSectionHeader = '[[טקסונומיה (ביולוגיה)|מיון מדעי]]'
    classifictionSection = ('|-\n' .. p.header( headerKingdom, classificationSectionHeader ).. classifictionSection)
    
    
    local underClassification
    for i,j in ipairs( classifiedUnderParams ) do
        if frame.args[j] then
            underClassification='|-\n'..p.header( headerKingdom,j )..'\n|-\n| colspan="2" style="text-align:center;" |\n'..frame.args[j]
            break
        end
    end
    
    local taxonomicName = frame.args[ "שם מדעי"] or wikidataProp.getProperty( wikidataTaxonProperties[ "שם מדעי"])  
    if taxonomicName then
        local taxonomicDisplay = ((not string.find(taxonomicName,"''")) and ( taxonRank=="מין" or taxonRank=="סוג" or taxonRank=="תת-מין") and "''"..taxonomicName.."''" ) or taxonomicName
        local taxonom = frame.args[ "טקסונום"]
        if wikidataEntity and not taxonom then
			taxonom = getWikidataTaxonom(wikidataEntity, wikidataTaxonProperties[ "שם מדעי"], wikidataTaxonProperties["שנת תיאור הטקסון"])
        end

        taxonomicName = '|-\n'..p.header( headerKingdom,"[[שם מדעי]]")..'\n|-\n| colspan="2" style="text-align:center" | [[קובץ:Wikispecies-logo.svg|21px|קישור=ויקימינים]] [[wikispecies:'..taxonomicName..'|'..taxonomicDisplay..']]'
        if taxonom then
            taxonom = '<br /><small>&rlm;'..taxonom..'</small>'
            taxonomicName = taxonomicName..taxonom
        end
    end
    local taxonSections = { imageArea or "", period or "" ,iucnStatus or "", classifictionSection or "", underClassification or "", taxonomicName or "", distributionMap or "", synoyms or "", floweringSeason or "" }
    if usesWikidataParam then
        table.insert(taxonSections, '|-\n| colspan="2" style="text-align:left;" | <span class="editsection">'..wikidataEdit..'</span>' )
    end
    local realSections = {}
    for i,j in ipairs( taxonSections ) do
        if string.len( j )>0 then table.insert( realSections,j ) end
    end
    
    taxonSections = table.concat( realSections, "\n")
    result = string.format([[

{| class="infobox" style="margin-right: 0.5em; text-align: center;padding:2.5px;max-width:250px;"
|-
%s
%s
|}]], mainHeader,taxonSections )

    return result
end

return p