Moduuli:Cs:Wikidata/Formatters

Wikipediasta
Siirry navigaatioon Siirry hakuun

require 'Module:No globals'

local p = {}

p.Formatters = {}
setmetatable(p.Formatters, {
	__index = function(t, key)
		t[key] = require('Module:cs:Wikidata/Formatters/' .. key)
		return t[key]
	end
})

local lib = require 'Module:cs:Wikidata/lib'

local function legacyFormatter(formatters, value, options)
	if not formatters.module or not formatters.func then
		return error(lib.formatError('unknown-value-module'))
	end

	local formatter = require ('Module:cs:' .. formatters.module)
	if not formatter then
		return error(lib.formatError('value-module-not-found', formatters.module))
	end

	local fun = formatter[formatters.func]
	if not fun then
		return error(lib.formatError('value-function-not-found', formatters.func))
	end

	return fun(value, options)
end

function p.getRawValue(snak, options)
	if snak.snaktype == 'somevalue' or snak.snaktype == 'novalue' then
		return snak.snaktype
	elseif snak.snaktype ~= 'value' then
		return error(lib.formatError('unknown-snak-type', snak.snaktype))
	end

	return p.Formatters[snak.datavalue.type].getRawValue(snak.datavalue.value, options or {})
end

function p.formatRawValue(value, formatter, options)
	return p.Formatters[formatter].formatRawValue(value, options or {})
end

function p.getFormattedValue(snak, options)
	if snak.snaktype == 'somevalue' or snak.snaktype == 'novalue' then
		return options[snak.snaktype] or snak.snaktype -- todo: přeložit pomocí hlášení
	elseif snak.snaktype ~= 'value' then
		return error(lib.formatError('unknown-snak-type', snak.snaktype))
	end

	-- legacy
	if options['value-module'] or options['value-function'] then
		local formatterMap = {
			func = options['value-function'],
			module = options['value-module'],
		}
		return legacyFormatter(formatterMap, snak.datavalue.value, options)
	end

	local formatter = options['value-formatter'] or snak.datavalue.type
	return p.Formatters[formatter].formatValue(snak.datavalue.value, options)
end

return p