(i) Дакументацыя

Выкарыстоўваецца для адлюстравання класіфікацыі ў шаблонах {{Мова}} и {{Моўная група}}.

Каб пазбегнуць паломак старонак, дзе ўжыты гэты модуль, пажадана эксперыментаваць у пясочніцы для модуляў.


local p = {}
local WDS = require( 'Module:WikidataSelectors' )

--[[ 
  Функцыя для афармлення ідэнтыфікатара існасці

  Прамае: радок ідэнтыфікатара (тыпу Q42) і табліцу параметраў,
  Вяртае: радок аформленага тэксту
]]
function p.formatEntityId( entityId, options )
	-- атрыманне лакалізаванай назвы
    local label = nil
    if options and options.text and options.text ~= '' then
        label = options.text
    else
		label = mw.wikibase.label( entityId )
    end

	-- атрыманне спасылкі па ідэнтыфікатары
    local link = mw.wikibase.sitelink( entityId )
    if link then
        if label then
            return '[[' .. link .. '|' .. label .. ']]'
        else
            return '[[' .. link .. ']]'
        end
    end

    if label then
        -- чырвоная спасылка
        if not mw.title.new( label ).exists then
            return options.frame:expandTemplate{
                title = 'не перакладзена 5',
                args = { label, '', 'd', entityId }
            }
        end

        -- аднайменны артыкул ужо існуе — выводзіцца тэкст і спасылка на ВД
        return '<span class="iw" data-title="' .. label .. '">' .. label
        	.. '<sup class="noprint">[[:d:' .. entityId .. '|[d]]]</sup>'
        	.. '</span>'
    end
    -- паведамленне аб адсутнасці лакалізаванай назвы
    -- not good, but better than nothing
    return '[[:d:' .. entityId .. '|' .. entityId .. ']]'
    	.. '<span style="border-bottom: 1px dotted; cursor: help; white-space: nowrap"'
    	.. ' title="У Вікіданых няма беларускага подпісу да элемента. Вы можаце дапамагчы, пазначыўшы беларускі варыянт подпісу."'
    	.. '>?</span>' -- .. categoryLinksToEntitiesWithMissingLabel
end

--[[
  Абірае ўласцівасці па property id, фільтруючы іх па ранзе, і вяртае першае са значэнняў
]]
local function selectFirstClaim( entityId, propertySelector )
	if not entityId then
		error( 'Адсутнічае entityId' )
	end
	if not propertySelector then
		error( 'Не ўказаны propertySelector' )
	end
	
	local claims = WDS.load( entityId, propertySelector )
	if claims and claims[ 1 ] then
		return claims[ 1 ]
	end

	return nil
end

local function itemString( frame, entityId, formatEntityId )
	return formatEntityId( entityId, { frame = frame } )
end

--[[ 
  Функцыя для фармавання дрэва па ўласцівасці для вышэйстаячага элемента для бягучай старонкі
]]
function p.parentTree( frame )
	local entityId = frame.args.from
	if not entityId or entityId == '' then
		entityId = mw.wikibase.getEntityIdForCurrentPage()
	end
	if not entityId then
		return ''
	end

	local list = {}
	local level = 1

	local parentProperty = 'P279'
	if frame.args.parent then
		parentProperty = string.upper( frame.args.parent )
	end

	local formatterFunction = itemString
	if frame.args[ 'value-module' ] then
		local formatter = require( 'Module:' .. frame.args[ 'value-module' ] )
		formatterFunction = formatter[ frame.args[ 'value-function' ] ]
	end

	while true do
		list[ level ] = formatterFunction( frame, entityId, p.formatEntityId )
		level = level + 1

		parentClaim = selectFirstClaim( entityId, parentProperty )
		if ( not parentClaim
			or not parentClaim.mainsnak
			or not parentClaim.mainsnak.datavalue
			or not parentClaim.mainsnak.datavalue.value
			or not parentClaim.mainsnak.datavalue.value.id
		) then
			break
		end
		entityId = parentClaim.mainsnak.datavalue.value.id
	end

	local out = ''
	local maxLevel = level
	local tab = frame.args[ 'tab' ]
	if tab and tab ~= '' then
		for level, value in pairs( list ) do
			out = string.rep( tab, maxLevel - level ) .. value .. '\n' .. out
		end
	else
		for level, value in pairs( list ) do
			out = value .. '\n' .. out
		end
	end

	local before = frame.args[ 'before' ]
	if before and before ~= '' then
		out = before .. out;
	end

	local after = frame.args[ 'after' ]
	if after and after ~= '' then
		out = out .. after;
	end

	return out
end

return p