Модуль:Wikibase/doc: различия между версиями
Буквица>Putnik м обновление |
Karaby (обсуждение | вклад) Новая страница: «-- Модуль для функционала Викиданных 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 = {}; | ||
=== | 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 | |||
Версия от 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