Модуль:Wikibase/doc: различия между версиями

Материал из Буквицы
Перейти к навигации Перейти к поиску
Буквица>Putnik
м обновление
 
Новая страница: «-- Модуль для функционала Викиданных 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...»
Строка 1: Строка 1:
Этот модуль содержит некоторые вспомогательные функции для работы с [[ВП:Викиданные|Викиданными]].
-- Модуль для функционала Викиданных
== Вызываемые функции ==
local M = {};
=== id ===
Возвращает элемент текущей страницы на Викиданных (Qnnn). Если вызван с параметром Pnnn, достаёт id значения данного свойства, если оно имеет тип «элемент», иначе — его строковое значение (можно указать специальный формат его вывода третьим параметром, по умолчанию это %s). Если значений несколько, параметром <code>n</code> можно указать номер нужного; если этого параметра нет, они будут выведены через разделитель (по умолчанию это «;», можно переопределить вторым параметром).


=== label ===
local function tabletostr( t, fmt, s, o, c ) -- не для использования на страницах
Комментарий к элементу Викиданных, id которого передан первым параметром. Если такого нет, возвращает пустую строку, а если и быть не может (не соотв. формату Qnnn) — возникает ошибка.
    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


=== iwiki ===
function M.wbview( ref, id ) -- вспом. функция для подписи из Викиданных
Интервики для языка, указанного кодом (например, <code>en</code>), без квадратных скобок и префикса. Если вызвана без параметров, все интервики выводятся в виде маркированного списка ссылок.
    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


=== page ===
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


=== wdprops ===
function M.struc( frame ) -- Отладочная функция, будет перенесена в отдельный модуль
Автоматически формирует из всех свойств Викиданных для определённой страницы человеко-читаемую таблицу. Используется, например, следующим образом:
    --Структуру см. [[mw:Extension:WikibaseClient/Lua#Entity table and data structure]]
<pre>
    local function try()
{| class=wikitable
    local i, e = 1, mw.wikibase.getEntity();
{{#invoke:wikibase|wdprops}}
    while frame.args[i] do
|}
        e = e[ frame.args[ i ] ] or e[ tonumber( frame.args[ i ] ) ];
</pre>
        i = i + 1
В левом столбце отображаются русские метки свойств, в правом — ссылки на статьи русской Википедии, соответствующие их значению, или само это значение (для изображений с Викисклада — название файла). Использовать в статьях рекомендуется '''только в предпросмотре''', пользуйтесь вместо него [[ВП:Шаблоны-карточки|шаблонами-карточками]].
    end
=== struc ===
return tabletostr( e, frame.args[ 'f' ], frame.args[ 's' ] or '; ', '{', '}' )
Отладочная функция, возвращает структуру, передаваемую в Lua с Викиданных, в текстовом виде. Нумерованные параметры могут содержать путь до конкретной части этой структуры (например, чтобы посмотреть, что собой представляет <code>mw.wikibase.getEntity().claims.P107[1].references[1]</code>, пишем <code><nowiki>{{#invoke:wikibase|struc|claims|P107|1|references|1}}</nowiki></code>). Параметры <code>f</code> и <code>s</code> задают формат вывода объекта (по умолчанию <code>%s = %s</code>) и разделитель (по умолчанию «;»). Если такого объекта нет, возникает ошибка; попробуйте вызвать функцию без параметров и уточнить структуру. Посмотреть структуру можно в [[d:Special:EntityData/Q42.json|Special:EntityData]] или в [https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q42 Wikidata API].
end
local r, result = pcall( try );
    if r then
    return result;
    else
    return '<strong class="error">В Викиданных нет записей для текущей страницы</strong>';
    end
end


== См. также ==
function M.label( frame ) -- Комментарий к элементу Викиданных в 1-м параметре
* [[:mw:Extension:WikibaseClient/Lua]]
    local function try()
<includeonly>[[Категория:Модули:Викиданные]]</includeonly>
    local id = frame.args[1];
<noinclude>
    if not id or id == '' then
[[Категория:Модули:Документация]]</noinclude>
    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

Версия от 15:28, 27 июля 2025

-- Модуль для функционала Викиданных 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 '*' ) ) 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 'В Викиданных нет записей для текущей страницы';
   end

end

function M.struc( frame ) -- Отладочная функция, будет перенесена в отдельный модуль

   --Структуру см. mw:Extension:WikibaseClient/Lua
   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 'В Викиданных нет записей для текущей страницы';
   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 'В Викиданных нет записей для текущей страницы';
   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 'В Викиданных нет записей для указанной страницы';
   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 'В Викиданных нет записей для текущей страницы';
   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 'В Викиданных нет записей для текущей страницы';
   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 'В Викиданных нет записей для текущей страницы';
   end

end

return M