Modul:Wikidata/lib

Z Wikizdrojů, volně dostupné knihovny
Skočit na navigaci Skočit na vyhledávání

Dokumentaci tohoto modulu lze vytvořit na stránce Nápověda:Modul:Wikidata/lib

require "Modul:No globals"

local p = {
	common = require "Modul:Functions",
	props = {
		begin = { 'P569', 'P580' },
		ending = { 'P570', 'P582' },
		lang = { 'P364', 'P407' },
		point = { 'P571', 'P577', 'P585' },
	},
	datatypeToValueType = {
		['commonsMedia'] = 'string',
		['external-id'] = 'string',
		['geo-shape'] = 'string',
		['globe-coordinate'] = 'globecoordinate',
		['math'] = 'string',
		['monolingualtext'] = 'monolingualtext',
		['musical-notation'] = 'string',
		['quantity'] = 'quantity',
		['score'] = 'string',
		['string'] = 'string',
		['tabular-data'] = 'string',
		['time'] = 'time',
		['url'] = 'string',
		['wikibase-item'] = 'wikibase-entityid',
		['wikibase-property'] = 'wikibase-entityid',
		['wikibase-lexeme'] = 'wikibase-entityid',
		['wikibase-form'] = 'wikibase-entityid',
		['wikibase-sense'] = 'wikibase-entityid',
	},
}

local i18n = mw.loadData("Modul:Wikidata/i18n")

function p.addWdClass(str)
	return '<span class="wd">' .. str .. '</span>'
end

function p.category(key, ...)
	local Category = require 'Modul:Kategorie'
	local title = mw.title.getCurrentTitle()
	if i18n.categories[key] ~= '-' then
		return Category.makeCategory(mw.ustring.format(i18n.categories[key], ...), '0,14', title.text)
	else
		return ''
	end
end

function p.getInterwikiPrefix(wiki)
	local prefixMap = {
		wiki = 'w:',
		wikibooks = 'b:',
		wikidata = 'd:',
		wikinews = 'n:',
		wikipedia = 'w:',
		wikiquote = 'q:',
		wikisource = 's:',
		wikiversity = 'v:',
		wikivoyage = 'voy:',
		wiktionary = 'wikt:',
	}
	if prefixMap[wiki] then
		return prefixMap[wiki]
	end
	local code, family = string.match(wiki, '^(.+)(wik.-)$')
	if prefixMap[code] and family == 'wiki' then
		return prefixMap[code]
	end
	if not code then
		code = wiki
	end
	local prefix = string.gsub(code, '_', '-') .. ':'
	return (prefixMap[family] or '') .. prefix
end

function p.formatDateRange(snaks, options)
	local options = mw.clone(options)
	local Y = require('Modul:Time').PRECISION.YEAR
	--if options.isQualifier == true then
		options.precision = options.precision or Y
	--end
	local Formatters = require 'Modul:Wikidata/Formatters'
	local begin, begin_raw, ending, ending_raw
	if snaks.begin then
		begin_raw = Formatters.getRawValue(snaks.begin, options)
	end
	if snaks.ending then
		ending_raw = Formatters.getRawValue(snaks.ending, options)
	end
	if begin_raw and begin_raw ~= 'novalue' then
		begin = Formatters.formatRawValue(begin_raw, 'time', options)
	end
	if ending_raw and ending_raw ~= 'novalue' then
		ending = Formatters.formatRawValue(ending_raw, 'time', options)
	end
	if not begin then
		if not ending then
			return ''
		end
		return mw.ustring.format(i18n.date['end'], ending)
	end
	if not ending then
		return mw.ustring.format(i18n.date['start'], begin)
	end

	local precision = options.precision or Y
	local begin_precision = math.min(precision, begin_raw.precision or Y)
	local ending_precision = math.min(precision, ending_raw.precision or Y)
	local top = math.min(begin_raw.precision or Y, ending_raw.precision or Y)
	while begin == ending and precision < top do
		precision = precision + 1
		options.precision = precision
		begin = Formatters.formatRawValue(begin_raw, 'time', options)
		begin_precision = precision
		ending = Formatters.formatRawValue(ending_raw, 'time', options)
		ending_precision = precision
	end
	if begin == ending then
		return begin
	end
	local connector = ' – '
	if begin_precision == Y and ending_precision == Y then
		connector = '–'
	end
	return table.concat( { begin, ending }, connector )
end

function p.formatError(key, ...)
	return mw.ustring.format(i18n.errors[key], ...)
end

function p.formatFromPattern(str, pattern)
	local escaped = mw.ustring.gsub(str, '%%', '%%%%')
	return mw.ustring.gsub(pattern, '$1', escaped) .. '' --Hack to get only the first result of the function
end

function p.formatTextInLanguage(text, language)
	return mw.text.tag('span', { lang = language }, text)
end

-- @deprecated
function p.getEntityIdFromValue(value)
	local entityType = value['entity-type']
	if entityType == 'item' then
		return 'Q' .. value['numeric-id']
	elseif entityType == 'property' then
		return 'P' .. value['numeric-id']
	else
		return error(p.formatError('unknown-entity-type', entityType))
	end
end

function p.getItemIdFromURI(uri)
	return mw.ustring.match(uri, '(Q%d+)')
end

function p.getLabelInLanguage(entityId, langs)
	langs = p.textToTable(langs)
	local label, lang = mw.wikibase.getLabelWithLang(entityId)
	if label then
		for _, lg in ipairs(langs) do
			if lg == lang then
				return label, lang
			end
		end
	end
	return nil, nil
end

function p.getLinkWhenNonexistingLabel(entityId)
	local ImageFormatter = require 'Modul:ImageFormatter'
	return ImageFormatter.makeImage('Wikidata-edit.svg', {
		description = i18n['missing-label'],
		link = 'd:' .. entityId,
		size = '27x17px'
	}) .. '<code>[[d:' .. entityId .. '|' .. entityId .. ']]</code>' .. p.category('missing-label')
end

function p.IsOptionTrue(options, key)
	if options[key] then
		if tostring(options[key]) == 'true' or tostring(options[key]) == 'yes' or tostring(options[key]) == '1' then
			return true
		end
	end
	return false
end

function p.isPropertyId(value)
	return mw.ustring.match(value, '^[Pp][1-9]%d-$') and true
end

function p.IsSnakValue(snak)
	return snak.snaktype == 'value'
end

function p.raiseInvalidDatatype(method, allowed, provided)
	if type(allowed) ~= 'table' then
		allowed = { allowed }
	end
	return p.formatError('invalid-datatype2', method, mw.text.listToText(allowed, '“, „', '“ nebo „'), provided)
end

function p.simpleCompare(first, second)
	if first == second then
		return 0
	end
	if first < second then
		return -1
	else
		return 1
	end
end

function p.textToTable(something, options)
	if type(something) ~= "table" then
		local options = options or {}
		local split_pattern = options.split_pattern or "%s*,%s*"
		something = mw.text.split(something, split_pattern)
	end

	return p.common.cleanArgs(something)
end

return p