ru>Putnik
(корректная работа в случае пустого id элемента)
 
м (1 версия импортирована)
 
(не показаны 2 промежуточные версии 2 участников)
Строка 1: Строка 1:
-- Модуль для функционала Викиданных
-- Модуль для функционала Викиданных
local M={};
local M = {};


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


function M.wbview(ref,id)--вспом. функция для подписи из Викиданных
function M.wbview( ref, id ) -- вспом. функция для подписи из Викиданных
     local l=mw.wikibase.label(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
     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
end


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


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


function M.label(f)--Комментарий к элементу Викиданных в 1-м параметре
function M.label( frame ) -- Комментарий к элементу Викиданных в 1-м параметре
     local function try()
     local function try()
    local id = f.args[1];
    local id = frame.args[1];
    if not id or id == '' then
    if not id or id == '' then
    id = mw.wikibase.getEntityObject().id; -- error, если нет элемента
    id = mw.wikibase.getEntityIdForCurrentPage(); -- error, если нет элемента
     end
     end
    return mw.wikibase.label(id);
    return mw.wikibase.label( id );
     end
     end
local r, result = pcall(try);
local r, result = pcall( try );
     if r then
     if r then
     return result;
     return result;
Строка 89: Строка 90:
end
end


function M.description(f)
function M.description( frame )
     local function try()
     local function try()
    local id = f.args[1];
    local entityId = frame.args[1];
    if not id or id == '' then
    if not entityId or entityId == '' then
    id = mw.wikibase.getEntityObject().id; -- error, если нет элемента
    entityId = mw.wikibase.getEntityIdForCurrentPage(); -- error, если нет элемента
     end
     end
    return mw.wikibase.description(id)
    return mw.wikibase.description( entityId )
     end
     end
local r, result = pcall(try);
local r, result = pcall( try );
     if r then
     if r then
     return result;
     return result;
Строка 105: Строка 106:
end
end


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


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


function M.page(f)-- страница Рувики для данного элемента
function M.page( frame ) -- страница Рувики для данного элемента
     local function try()
     local function try()
return mw.wikibase.sitelink(f.args[1])
return mw.wikibase.sitelink( frame.args[ 1 ] )
end
end
local r, result = pcall(try);
local r, result = pcall( try );
     if r then
     if r then
     return result;
     return result;
Строка 157: Строка 158:
end
end


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

Текущая версия от 18:47, 21 июня 2023

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

Вызываемые функцииПравить

idПравить

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

labelПравить

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

iwikiПравить

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

pageПравить

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

wdpropsПравить

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

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

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

strucПравить

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

См. такжеПравить


-- Модуль для функционала Викиданных
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( frame ) -- Элемент текущей страницы в Викиданных
    --Если вызван с параметром, достаёт id значения данного свойства, иначе возвращает id страницы
    --Второй параметр - разделитель, если значений несколько ("; " по умолчанию),
    -- либо можно указать номер параметром n. Третий параметр - формат для строкового свойства,
    -- по умолчанию "%s"
    local function try()
	    local e = mw.wikibase.getEntity();        
	    if frame.args[ 1 ] then
			local function gv( i )
				local z = e.claims[ frame.args[ 1 ] ][ i ].mainsnak.datavalue;
				if z.type == 'wikibase-entityid' then
					return z.value.id
				else
					return string.format( frame.args[ 3 ] or '%s', tabletostr( z.value, "%s", '; ', '{', '}' ) )
				end
			end
			if frame.args[ 'n' ] then
				return gv( tonumber( frame.args[ 'n' ] ) )
			end
			local p, h = e.claims[ frame.args[ 1 ] ], {}
	        for n, v in pairs( p ) do
				h[ n ] = gv( n )
			end
			return table.concat( h, frame.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( frame ) -- Отладочная функция, будет перенесена в отдельный модуль
    --Структуру см. [[mw:Extension:WikibaseClient/Lua#Entity table and data structure]]
    local function try()
    	local i, e = 1, mw.wikibase.getEntity();
	    while frame.args[i] do
	        e = e[ frame.args[ i ] ] or e[ tonumber( frame.args[ i ] ) ];
	        i = i + 1
	    end
		return tabletostr( e, frame.args[ 'f' ], frame.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( frame ) -- Комментарий к элементу Викиданных в 1-м параметре
    local function try()
	    local id = frame.args[1];
	    if not id or id == '' then
	    	id = mw.wikibase.getEntityIdForCurrentPage(); -- 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( frame )
    local function try()
	    local entityId = frame.args[1];
	    if not entityId or entityId == '' then
	    	entityId = mw.wikibase.getEntityIdForCurrentPage(); -- error, если нет элемента
    	end
	    return mw.wikibase.description( entityId )
    end
	local r, result = pcall( try );
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для указанной страницы</strong>';
    end
end

function M.iwiki( frame ) -- Интервики для указанного языка (только с ВД)
    local function try()
	    if frame.args[ 1 ] then
	        return mw.wikibase.getEntity().sitelinks[ frame.args[ 1 ] .. 'wiki' ].title
	    else-- список интервик
	        local r = {};
	        for k, v in pairs( mw.wikibase.getEntity().sitelinks ) do
	            table.insert( r, string.format( frame.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( frame ) -- Все ссылки, привязанные к элементу на ВД, в т.ч. викигид и склад
    local function try()
	    if frame.args[ 1 ] then
	        return mw.wikibase.getEntity().sitelinks[ frame.args[ 1 ] ].title
	    else-- список интервик
	        local r = {};
	        for k, v in pairs( mw.wikibase.getEntity().sitelinks ) do
	            table.insert( r, string.format( frame.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( frame ) -- страница Рувики для данного элемента
    local function try()
		return mw.wikibase.sitelink( frame.args[ 1 ] )
	end
	local r, result = pcall( try );
    if r then
    	return result;
    else
    	return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end

function M.wdprops( frame ) -- список всех свойств с ВД в человеко-читаемом виде
    local function try()
	    local e, r = mw.wikibase.getEntity(), {};
	    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( w.value.id )
	                    or 'd:' .. w.value.id,
	                    w.value.id
	                ) .. ']]' or M.tabletostr( w.value )
	            )
	        end
	        table.insert( r, string.format(
	            frame.args[ 'f' ] or '\n|-\n|rowspan=%i|%s\n|%s',
	            #vals,
	            label,
	            table.concat( vals, frame.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