Модуль:Wikibase

Из Википедии, бесплатной энциклопедии

Документация

Этот модуль содержит некоторые вспомогательные функции для работы с Викиданными.

Вызываемые функции

id

Возвращает элемент текущей страницы на Викиданных (Qnnn). Если вызван с параметром Pnnn, достаёт id значения данного свойства, если оно имеет тип «элемент», иначе — его строковое значение (можно указать специальный формат его вывода третьим параметром, по умолчанию это %s). Если значений несколько, параметром n можно указать номер нужного; если этого параметра нет, они будут выведены через разделитель (по умолчанию это «;», можно переопределить вторым параметром).

label

Комментарий к элементу Викиданных, id которого передан первым параметром. Если такого нет, возвращает пустую строку, а если и быть не может (не соотв. формату Qnnn) — возникает ошибка.

iwiki

Интервики для языка, указанного кодом (например, en), без квадратных скобок и префикса. Если вызвана без параметров, все интервики выводятся в виде маркированного списка ссылок.

page

Для заданного элемента Викиданных возвращает название статьи русской Википедии, которая в нём прописана.

wdprops

Автоматически формирует из всех свойств Викиданных для определённой страницы человеко-читаемую таблицу. Используется, например, следующим образом:

{| class=wikitable {{#invoke:wikibase|wdprops}} |} 

В левом столбце отображаются русские метки свойств, в правом — ссылки на статьи русской Википедии, соответствующие их значению, или само это значение (для изображений с Викисклада — название файла). Использовать в статьях рекомендуется только в предпросмотре, пользуйтесь вместо него шаблонами-карточками.

struc

Отладочная функция, возвращает структуру, передаваемую в Lua с Викиданных, в текстовом виде. Нумерованные параметры могут содержать путь до конкретной части этой структуры (например, чтобы посмотреть, что собой представляет mw.wikibase.getEntity().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