Модуль:Wikibase: различия между версиями
Admin (обсуждение | вклад) м (Перемещение 2 интервики на Викиданные, d:q5832612) |
Oles (обсуждение | вклад) м (1 версия импортирована: Шаблоны Цвет Википедия) |
||
Строка 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(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 |
Версия от 01:11, 27 апреля 2021
Этот модуль содержит некоторые вспомогательные функции для работы с Викиданными.
Вызываемые функции
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(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