Модуль:Wikidata/media: различия между версиями

Материал из ChronoWiki
Перейти к навигацииПерейти к поиску
м (1 версия импортирована)
(Фикс отображения отформатированной подписи)
Строка 1: Строка 1:
 
local p = {}
 
local p = {}
 +
 +
-- Константы
 +
local contentLanguageCode = mw.getContentLanguage():getCode();
  
 
function p.formatCommonsCategory( context, options, value )
 
function p.formatCommonsCategory( context, options, value )
Строка 35: Строка 38:
 
end
 
end
  
function p.formatImage( context, options, value )
+
--[[
local image = '[[File:' .. value
+
Временный хак, нужно добавить config, getConfig и getCategoryByCode
if options['border'] and options['border'] ~= '' then
+
в options, чтобы они были доступны в любом месте кода.
    image = image .. '|border'
+
]]
    end
+
local config;
    if options['size'] and options['size'] ~= '' then
+
local function getCategoryByCode( code, sortkey )
    image = image .. '|' .. options['size']
+
if config == nil then
    end
+
config = require( 'Module:Wikidata/config' );
    if options['alt'] and options['alt'] ~= '' then
+
end;
    image = image .. '|' .. options['alt']
+
 
    end
+
local value = config[ 'categories' ][ code ];
image = image .. ']]'
+
if not value or value == '' then
 +
return '';
 +
end
 
 
    return image
+
return '[[Category:' .. value .. ']]';
 
end
 
end
  
--[[  
+
local function getCaption( context, options )
  Функция для оформления одного утверждения (statement) для изображения
+
local caption = ''
 +
if options.qualifiers and options.qualifiers.P2096 then
 +
for i, qualifier in pairs( options.qualifiers.P2096 ) do
 +
if ( qualifier
 +
and qualifier.datavalue
 +
and qualifier.datavalue.type == 'monolingualtext'
 +
and qualifier.datavalue.value
 +
and qualifier.datavalue.value.language == contentLanguageCode ) then
 +
caption = qualifier.datavalue.value.text
 +
break
 +
end
 +
end
 +
end
 +
if options['appendTimestamp'] and options.qualifiers and options.qualifiers.P585 and options.qualifiers.P585[1] then
 +
local moment = context.formatValueDefault( context, options, options.qualifiers.P585[1].datavalue )
 +
if not caption or caption == ''  then
 +
caption = moment
 +
else
 +
caption = caption .. ', ' .. moment
 +
end
 +
end
 +
 
 +
local localValue = '';
 +
if options[ 'value' ] and options[ 'value' ] ~= '' then
 +
localValue = options[ 'value' ];
 +
end
 +
 +
local localCaption = '';
 +
if options[ 'caption' ] and options[ 'caption' ] ~= '' then
 +
localCaption = options[ 'caption' ];
 +
end
 +
 +
if localValue ~= '' then
 +
caption = localCaption;
 +
end
 +
 +
local formattedCaption = ''
 +
if caption ~= '' then
 +
formattedCaption = context.wrapQualifier( caption, 'P2096', { class = 'media-caption', style = 'display:block' } );
 +
end
  
  Принимает: объект-таблицу утверждение, таблицу параметров,
+
if localValue == '' and localCaption ~= '' then
  объект-функцию оформления внутренних структур утверждения (snak) и
+
formattedCaption = formattedCaption .. getCategoryByCode( 'media-contains-local-caption' )
  объект-функцию оформления ссылки на источники (reference)
+
if options.frame:preprocess('{{REVISIONID}}') == '' then
  Возвращает: строку оформленного текста с заявлением (claim)
+
formattedCaption = formattedCaption .. '<span class="error" style="font-size:94%;">Локальная подпись не используется, потому что изображение берётся из Викиданных, см. [[Википедия:Шаблоны-карточки#Описание изображения в Викиданных|здесь]]</span>'
]]
+
end
function p.formatImageClaim( context, options, statement )
 
local snak = statement.mainsnak
 
local hash = ''
 
local mainSnakClass = ''
 
if ( snak.hash ) then
 
hash = ' data-wikidata-hash="' .. snak.hash .. '"'
 
else
 
mainSnakClass = ' wikidata-main-snak';
 
 
end
 
end
  
local before = '<span class="wikidata-snak ' .. mainSnakClass .. '"' .. hash .. '>'
+
return caption, formattedCaption
local after = '</span>'
+
end
  
    if snak.snaktype ~= 'value' then
+
function p.formatCommonsMediaValue( context, options, value )
    return ''
+
local image = value;
    end
+
local caption, formattedCaption = getCaption( context, options )
 +
 +
if not string.find( value, '[%[%]%{%}]' ) and not string.find( value, 'UNIQ%-%-imagemap' ) then
 +
-- если в value не содержится викикод или imagemap, то викифицируем имя файла
 +
-- ищем слово imagemap в строке, потому что вставляется плейсхолдер: [[PHAB:T28213]]
 +
image = '[[File:' .. value .. '|frameless';
 +
if options[ 'border' ] and options[ 'border' ] ~= '' then
 +
image = image .. '|border';
 +
end
  
--Image legend
+
local size = options[ 'size' ];
local legend = ''
+
if size and size ~= '' then
    if ( statement.qualifiers and statement.qualifiers.P2096 ) then
+
if not string.match( size, 'px$' )
local langCode = mw.language.getContentLanguage():getCode()
+
and not string.match( size, 'пкс$' ) -- TODO: использовать перевод для языка вики
mw.logObject( statement.qualifiers.P2096 )
 
mw.logObject( langCode )
 
    for k, qualifier in pairs ( statement.qualifiers.P2096 ) do
 
    if qualifier.snaktype == 'value'
 
    and qualifier.datavalue.value.language == langCode
 
 
then
 
then
legend = '<br>' .. qualifier.datavalue.value.text
+
size = size .. 'px'
break
+
end
 +
 +
-- временно
 +
if string.match( size, 'pxpx' ) then
 +
image = '[[Категория:Википедия:Изображение с pxpx в размере]]' .. image
 +
end
 +
else
 +
size = fileDefaultSize;
 +
end
 +
image = image .. '|' .. size;
 +
 
 +
if options[ 'alt' ] and options[ 'alt' ] ~= '' then
 +
image = image .. '|alt=' .. options[ 'alt' ];
 +
end
 +
 +
if caption ~= '' then
 +
image = image .. '|' .. caption
 +
end
 +
image = image .. ']]';
 +
 
 +
if formattedCaption ~= '' then
 +
image = image .. '<br>' .. formattedCaption;
 +
end
 +
else
 +
image = image .. formattedCaption .. getCategoryByCode( 'media-contains-markup' );
 +
end
 +
 +
if options.entity and options.fixdouble then
 +
local page = mw.title.getCurrentTitle()
 +
local txt = page:getContent()
 +
if txt and txt:match(':' .. value) and mw.title.getCurrentTitle():inNamespace(0) then
 +
if options.frame:preprocess('{{REVISIONID}}') == '' then
 +
image = image .. '<span class="error">Это изображение встречается ниже по тексту статьи; пожалуйста, уберите одну из копий (не потеряв при этом подпись)</span>'
 
end
 
end
 +
image = image .. getCategoryByCode( 'media-contains-local-double' )
 
end
 
end
 
end
 
end
 
+
    return p.formatImage( context, options, snak.datavalue.value ) .. legend
+
return image
 
end
 
end
  
 
return p
 
return p

Версия 11:12, 30 января 2021

Функция formatCommonsCategory для вывода Ошибка Lua в Модуль:WD на строке 452: свойство P373 не найдено., использующегося в {{карточка/Викисклад}}.

Ранее планировалось перенести вывод типа commonsMedia из Модуль:Wikidata сюда.


local p = {}

-- Константы
local contentLanguageCode = mw.getContentLanguage():getCode();

function p.formatCommonsCategory( context, options, value )
    local link = 'commons:Category:' .. value
    local title = value .. ' на Викискладе'
    if ( options['text'] and options['text'] ~= '' ) then
    	title = options['text']
    end

	commons = '[[' .. link .. '|' .. title .. ']]'

	--Commons icon
    if ( not options['icon'] or options['icon'] ~= '-' ) then
    	local icon_size = '15px'
    	if ( options['icon_size'] and options['icon_size'] ~= '' ) then
    		icon_size = options['icon_size']
    	end
    	commons = '[[File:Commons-logo.svg|' .. icon_size .. '|link=' .. link .. ']] ' .. commons
    end

	--Text before and after link
    if ( options['text_before'] and options['text_before'] ~= '' ) then
    	if ( options['text_before'] ~= '-' ) then
	    	commons = options['text_before'] .. ' ' .. commons
	    end
    end

    if ( options['text_after'] and options['text_after'] ~= '' ) then
    	if ( options['text_after'] ~= '-' ) then
	    	commons =  commons .. ' ' .. options['text_after']
	    end
    end
	
    return commons
end

--[[
	Временный хак, нужно добавить config, getConfig и getCategoryByCode
	в options, чтобы они были доступны в любом месте кода.
]]
local config;
local function getCategoryByCode( code, sortkey )
	if config == nil then
		config = require( 'Module:Wikidata/config' );
	end;

	local value = config[ 'categories' ][ code ];
	if not value or value == '' then
		return '';
	end
	
	return '[[Category:' .. value .. ']]';
end

local function getCaption( context, options )
	local caption = ''
	if options.qualifiers and options.qualifiers.P2096 then
		for i, qualifier in pairs( options.qualifiers.P2096 ) do
			if ( qualifier
					and qualifier.datavalue
					and qualifier.datavalue.type == 'monolingualtext'
					and qualifier.datavalue.value
					and qualifier.datavalue.value.language == contentLanguageCode ) then
				caption = qualifier.datavalue.value.text
				break
			end
		end
	end
	if options['appendTimestamp'] and options.qualifiers and options.qualifiers.P585 and options.qualifiers.P585[1] then
		local moment = context.formatValueDefault( context, options, options.qualifiers.P585[1].datavalue )
		if not caption or caption == ''  then 
			caption = moment
		else
			caption = caption .. ', ' .. moment
		end
	end

	local localValue = '';
	if options[ 'value' ] and options[ 'value' ] ~= '' then
		localValue = options[ 'value' ];
	end
	
	local localCaption = '';
	if options[ 'caption' ] and options[ 'caption' ] ~= '' then
		localCaption = options[ 'caption' ];
	end
	
	if localValue ~= '' then
		caption = localCaption;
	end
	
	local formattedCaption = ''
	if caption ~= '' then
		formattedCaption = context.wrapQualifier( caption, 'P2096', { class = 'media-caption', style = 'display:block' } );
	end

	if localValue == '' and localCaption ~= '' then
		formattedCaption = formattedCaption .. getCategoryByCode( 'media-contains-local-caption' )
		if options.frame:preprocess('{{REVISIONID}}') == '' then
			formattedCaption = formattedCaption .. '<span class="error" style="font-size:94%;">Локальная подпись не используется, потому что изображение берётся из Викиданных, см. [[Википедия:Шаблоны-карточки#Описание изображения в Викиданных|здесь]]</span>'
		end
	end

	return caption, formattedCaption
end

function p.formatCommonsMediaValue( context, options, value )
	local image = value;
	local caption, formattedCaption = getCaption( context, options )
	
	if not string.find( value, '[%[%]%{%}]' ) and not string.find( value, 'UNIQ%-%-imagemap' ) then
		-- если в value не содержится викикод или imagemap, то викифицируем имя файла
		-- ищем слово imagemap в строке, потому что вставляется плейсхолдер: [[PHAB:T28213]]
		image = '[[File:' .. value .. '|frameless';
		if options[ 'border' ] and options[ 'border' ] ~= '' then
			image = image .. '|border';
		end

		local size = options[ 'size' ];
		if size and size ~= '' then
			if not string.match( size, 'px$' )
				and not string.match( size, 'пкс$' ) -- TODO: использовать перевод для языка вики
			then
				size = size .. 'px'
			end
			
			-- временно
			if string.match( size, 'pxpx' ) then
				image = '[[Категория:Википедия:Изображение с pxpx в размере]]' .. image
			end
		else
			size = fileDefaultSize;
		end
		image = image .. '|' .. size;

		if options[ 'alt' ] and options[ 'alt' ] ~= '' then
			image = image .. '|alt=' .. options[ 'alt' ];
		end
		
		if caption ~= '' then
			image = image .. '|' .. caption
		end
		image = image .. ']]';

		if formattedCaption ~= '' then
			image = image .. '<br>' .. formattedCaption;
		end
	else
		image = image .. formattedCaption .. getCategoryByCode( 'media-contains-markup' );
	end
	
	if options.entity and options.fixdouble then
		local page = mw.title.getCurrentTitle()
		local txt = page:getContent()
		if txt and txt:match(':' .. value) and mw.title.getCurrentTitle():inNamespace(0) then
			if options.frame:preprocess('{{REVISIONID}}') == '' then
				image = image .. '<span class="error">Это изображение встречается ниже по тексту статьи; пожалуйста, уберите одну из копий (не потеряв при этом подпись)</span>'
			end
			image = image .. getCategoryByCode( 'media-contains-local-double' )
		end
	end
	
	return image
end

return p