Модуль:Wikibase: различия между версиями
Admin (обсуждение | вклад) м (1 версия импортирована) |
ru>Putnik м (getEntityObject() → getEntity()) |
||
Строка 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( | function M.id( frame ) -- Элемент текущей страницы в Викиданных | ||
--Если вызван с параметром, достаёт id значения данного свойства, иначе возвращает id страницы | --Если вызван с параметром, достаёт id значения данного свойства, иначе возвращает id страницы | ||
--Второй параметр - разделитель, если значений несколько ("; " по умолчанию), | --Второй параметр - разделитель, если значений несколько ("; " по умолчанию), | ||
Строка 25: | Строка 26: | ||
-- по умолчанию "%s" | -- по умолчанию "%s" | ||
local function try() | local function try() | ||
local e = mw.wikibase. | local e = mw.wikibase.getEntity(); | ||
if | if frame.args[ 1 ] then | ||
local function gv(i) | local function gv( i ) | ||
local z=e.claims[ | local z = e.claims[ frame.args[ 1 ] ][ i ].mainsnak.datavalue; | ||
if z.type == 'wikibase-entityid' then | if z.type == 'wikibase-entityid' then | ||
return | return z.value.id | ||
else | else | ||
return string.format( | return string.format( frame.args[ 3 ] or '%s', tabletostr( z.value, "%s", '; ', '{', '}' ) ) | ||
end | end | ||
end | end | ||
if | if frame.args[ 'n' ] then | ||
return gv(tonumber( | return gv( tonumber( frame.args[ 'n' ] ) ) | ||
end | end | ||
local p,h = e.claims[ | 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, | 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( | 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. | local i, e = 1, mw.wikibase.getEntity(); | ||
while | while frame.args[i] do | ||
e = e[ | e = e[ frame.args[ i ] ] or e[ tonumber( frame.args[ i ] ) ]; | ||
i = i+1 | i = i + 1 | ||
end | end | ||
return tabletostr(e, | 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( | function M.label( frame ) -- Комментарий к элементу Викиданных в 1-м параметре | ||
local function try() | local function try() | ||
local id = | local id = frame.args[1]; | ||
if not id or id == '' then | if not id or id == '' then | ||
id = mw.wikibase. | 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( | function M.description( frame ) | ||
local function try() | local function try() | ||
local | local entityId = frame.args[1]; | ||
if not | if not entityId or entityId == '' then | ||
entityId = mw.wikibase.getEntityIdForCurrentPage(); -- error, если нет элемента | |||
end | end | ||
return mw.wikibase.description( | 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( | function M.iwiki( frame ) -- Интервики для указанного языка (только с ВД) | ||
local function try() | local function try() | ||
if | if frame.args[ 1 ] then | ||
return mw.wikibase. | return mw.wikibase.getEntity().sitelinks[ frame.args[ 1 ] .. 'wiki' ].title | ||
else-- список интервик | else-- список интервик | ||
local r={}; | local r = {}; | ||
for k,v in pairs( mw.wikibase. | for k, v in pairs( mw.wikibase.getEntity().sitelinks ) do | ||
table.insert( r, string.format( | 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( | function M.iwikiall( frame ) -- Все ссылки, привязанные к элементу на ВД, в т.ч. викигид и склад | ||
local function try() | local function try() | ||
if | if frame.args[ 1 ] then | ||
return mw.wikibase. | return mw.wikibase.getEntity().sitelinks[ frame.args[ 1 ] ].title | ||
else-- список интервик | else-- список интервик | ||
local r={}; | local r = {}; | ||
for k,v in pairs( mw.wikibase. | for k, v in pairs( mw.wikibase.getEntity().sitelinks ) do | ||
table.insert( r, string.format( | 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( | function M.page( frame ) -- страница Рувики для данного элемента | ||
local function try() | local function try() | ||
return mw.wikibase.sitelink( | 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( | function M.wdprops( frame ) -- список всех свойств с ВД в человеко-читаемом виде | ||
local function try() | local function try() | ||
local e,r = mw.wikibase. | 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( | mw.wikibase.sitelink( w.value.id ) | ||
or 'd: | or 'd:' .. w.value.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( | ||
frame.args[ 'f' ] or '\n|-\n|rowspan=%i|%s\n|%s', | |||
#vals, | #vals, | ||
label, | label, | ||
table.concat(vals, | 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; |
Версия от 01:41, 10 мая 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