Этот модуль содержит некоторые вспомогательные функции для работы с Викиданными.

Вызываемые функции

эдер

Возвращает элемент текущей страницы на Викиданных (Qnnn). Если вызван с параметром Pnnn, достаёт id значения данного свойства, если оно имеет тип «элемент», иначе — его строковое значение (можно указать специальный формат его вывода третьим параметром, по умолчанию это %s). Если значений несколько, параметром n можно указать номер нужного; если этого параметра нет, они будут выведены через разделитель (по умолчанию это «;», можно переопределить вторым параметром).

Комментарий к элементу Викиданных, id которого передан первым параметром. Если такого нет, возвращает пустую строку, а если и быть не может (не соотв. формату Qnnn) — возникает ошибка.

Интервики для языка, указанного кодом (например, en), без квадратных скобок и префикса. Если вызвана без параметров, все интервики выводятся в виде маркированного списка ссылок.

Для заданного элемента Викиданных возвращает название статьи русской Википедии, которая в нём прописана.

wdprops

эдер

Автоматически формирует из всех свойств Викиданных для определённой страницы человеко-читаемую таблицу. Используется, например, следующим образом:

{| class=wikitable
{{#invoke:wikibase|wdprops}}
|}

В левом столбце отображаются русские метки свойств, в правом — ссылки на статьи русской Википедии, соответствующие их значению, или само это значение (для изображений с Викисклада — название файла). Использовать в статьях рекомендуется только в предпросмотре, пользуйтесь вместо него шаблонами-карточками.

Отладочная функция, возвращает структуру, передаваемую в Lua с Викиданных, в текстовом виде. Нумерованные параметры могут содержать путь до конкретной части этой структуры (например, чтобы посмотреть, что собой представляет mw.wikibase.getEntityObject().claims.P107[1].references[1], пишем {{#invoke:wikibase|struc|claims|P107|1|references|1}}). Параметры f и s задают формат вывода объекта (по умолчанию %s = %s) и разделитель (по умолчанию «;»). Если такого объекта нет, возникает ошибка; попробуйте вызвать функцию без параметров и уточнить структуру.

См. также

эдер

-- Модуль для функционала Викиданных
local M={};

local function tabletostr(t,fmt,s,o,c)--не для использования на страницах
    if type(t)=="table" then
            local f={};
            for k,v in pairs(t) do
                table.insert(f,string.format(fmt or '%s = %s',k,tabletostr(v,fmt,s,o,c)))
            end;
            table.sort(f);
            return (o or '')..table.concat(f, s or '')..(c or '')
        else return tostring(t)
        end
end

function M.wbview(ref,id)--вспом. функция для подписи из Викиданных
    local l=mw.wikibase.label(id);
    return l and ( l==ref and l or ref..'|'..l..(mw.ustring.lower(l)==mw.ustring.lower(ref) and '' or '<sup>*</sup>') ) or ref
end

function M.id(f)-- Элемент текущей страницы в Викиданных
    --Если вызван с параметром, достаёт id значения данного свойства, иначе возвращает id страницы
    --Второй параметр - разделитель, если значений несколько ("; " по умолчанию),
    -- либо можно указать номер параметром n. Третий параметр - формат для строкового свойства,
    -- по умолчанию "%s"
    local function try()
	    local e = mw.wikibase.getEntityObject();        
	    if f.args[1] then
			local function gv(i)
				local z=e.claims[f.args[1]][i].mainsnak.datavalue;
				if z.type == 'wikibase-entityid' then
					return 'Q'..z.value['numeric-id']
				else
					return string.format(f.args[3] or '%s',tabletostr(z.value,"%s",'; ','{','}'))
				end
			end
			if f.args['n'] then
				return gv(tonumber(f.args['n']))
			end
			local p,h = e.claims[f.args[1]],{}
	        for n,v in pairs(p) do
				h[n] = gv(n)
			end
			return table.concat(h,f.args[2] or "; ")
		else 
			return e.id
		end
	end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end

function M.struc(f)-- Отладочная функция, будет перенесена в отдельный модуль
    --Структуру см. [[mw:Extension:WikibaseClient/Lua#Entity table and data structure]]
    local function try()
    	local i,e = 1,mw.wikibase.getEntityObject();
	    while f.args[i] do
	        e = e[ f.args[i] ] or e[ tonumber(f.args[i]) ];
	        i = i+1
	    end
		return tabletostr(e,f.args['f'],f.args['s'] or '; ','{','}')
	end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end

function M.label(f)--Комментарий к элементу Викиданных в 1-м параметре
    local function try()
	    local id = f.args[1];
	    if not id or id == '' then
	    	id = mw.wikibase.getEntityObject().id; -- error, если нет элемента
    	end
	    return mw.wikibase.label(id);
    end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end

function M.description(f)
    local function try()
	    local id = f.args[1];
	    if not id or id == '' then
	    	id = mw.wikibase.getEntityObject().id; -- error, если нет элемента
    	end
	    return mw.wikibase.description(id)
    end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для указанной страницы</strong>';
    end
end

function M.iwiki(f)-- Интервики для указанного языка (только с ВД)
    local function try()
	    if f.args[1] then
	        return mw.wikibase.getEntityObject().sitelinks[f.args[1]..'wiki'].title
	    else-- список интервик
	        local r={};
	        for k,v in pairs( mw.wikibase.getEntityObject().sitelinks ) do
	            table.insert( r, string.format(f.args['f'] or "* [[:%s:%s]]\n", v.language, v.title) )
	        end
	        return table.concat(r)
	    end
	end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end

function M.iwikiall(f)-- Все ссылки, привязанные к элементу на ВД, в т.ч. викигид и склад
    local function try()
	    if f.args[1] then
	        return mw.wikibase.getEntityObject().sitelinks[f.args[1]].title
	    else-- список интервик
	        local r={};
	        for k,v in pairs( mw.wikibase.getEntityObject().sitelinks ) do
	            table.insert( r, string.format(f.args['f'] or "* [[:%s:%s]]\n", v.language, v.title) )
	        end
	        return table.concat(r)
	    end
	end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '';
    end
end

function M.page(f)-- страница Рувики для данного элемента
    local function try()
		return mw.wikibase.sitelink(f.args[1])
	end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end

function M.wdprops(f)-- список всех свойств с ВД в человеко-читаемом виде
    local function try()
	    local e,r = mw.wikibase.getEntityObject(),{};
	    for p,a in pairs(e.claims) do
	        local label = mw.wikibase.label(p) or string.format([[d:%s]],p);
	        local vals = {};
	        for n,v in pairs(a) do
	            local w=v.mainsnak.datavalue;
	            vals[n]=(
	                w.type=='wikibase-entityid'
	                and '[['.. M.wbview(
	                    mw.wikibase.sitelink('Q'..w.value['numeric-id'])
	                    or 'd:Q'..w.value['numeric-id'],
	                    'Q'..w.value['numeric-id']
	                )..']]' or M.tabletostr(w.value)
	            )
	        end
	        table.insert(r, string.format(
	            f.args['f'] or '\n|-\n|rowspan=%i|%s\n|%s',
	            #vals,
	            label,
	            table.concat(vals,f.args['s'] or '\n|-\n|')
	            )
	        )
	    end--for
    	return table.concat(r)
    end
	local r, result = pcall(try);
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end

return M