Перейти к содержанию

ЛопаПарцун:Wikibase

Википедиясто материал - аорев содамкундосто

-- Модуль для функционала Викиданных 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(f)-- Элемент текущей страницы на Викиданных

   --Если вызван с параметром, достаёт id значения данного свойства, иначе возвращает id страницы
   --Второй параметр - разделитель, если значений несколько ("; " по умолчанию),
   -- либо можно указать номер параметром n. Третий параметр - формат для строкового свойства,
   -- по умолчанию "%s"
   local function try()

local e=mw.wikibase.getEntity(); 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+1] = 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 'В Викиданных нет записей для текущей страницы';
   end

end

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

   --Структуру см. mw:Extension:WikibaseClient/Lua#Entity table and data structure
   local function try()
   	local i,e = 1,mw.wikibase.getEntity();

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

end

function M.label(f)--Комментарий к элементу Викиданных в 1-м параметре

   local function try()

local id=f.args[1] or mw.wikibase.getEntity().id; -- error, если нет элемента return mw.wikibase.label(id)

   end

local r, result = pcall(try);

   if r then
   	return result;
   else
   	return 'В Викиданных нет записей для текущей страницы';
   end

end

function M.iwiki(f)-- Интервики для указанного языка (только с ВД)

   local function try()

if f.args[1] then return mw.wikibase.getEntity().sitelinks[f.args[1]..'wiki'].title else-- список интервик local r={}; 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) ) end return table.concat(r) end end local r, result = pcall(try);

   if r then
   	return result;
   else
   	return 'В Викиданных нет записей для текущей страницы';
   end

end

function M.iwikiall(f)-- Все ссылки, привязанные к элементу на ВД, в т.ч. викигид и склад

   local function try()

if f.args[1] then return mw.wikibase.getEntity().sitelinks[f.args[1]].title else-- список интервик local r={}; 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) ) 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 'В Викиданных нет записей для текущей страницы';
   end

end

function M.wdprops(f)-- список всех свойств с ВД в человеко-читаемом виде

   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+1]=( 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 'В Викиданных нет записей для текущей страницы';
   end

end

return M