Přeskočit na obsah

Modul:Wikidata/Formatters

Z Wikicest


Interní modul, který zprostředkovává převod strukturovaných dat do wikitextu. Každému typu hodnoty je vytvořen základní formátovací submodul, pro účely specifického formátování lze naprogramovat vlastní formátovací submodul.

Struktura submodulu

[editovat]
-- vzorový submodul, viz [[Modul:Wikidata/Formatters/empty]]

require 'Modul:No globals'

local p = {}

function p.getRawValue(value, options)
	-- extract a human readable value or just call a native module for this type
	return mw.dumpObject(value)
end

function p.formatRawValue(value, options)
	-- do formatting here
	return value
end

function p.formatValue(value, options)
	local raw = p.getRawValue(value, options)
	return p.formatRawValue(raw, options)
end

return p

Doporučeno je implementovat a exportovat tyto tři metody:

getRawValue
Převede strukturovaná data do raw hodnoty, kterou lze dále zpracovávat (např. šablonami nebo parserovými funkcemi ve wikitextu). Návratovou hodnotou může být řetězec nebo objekt (tabulka) implementující metametodu __tostring.
formatRawValue
Převede raw hodnotu (typicky takovou, kterou vrací getRawValue) do wikitextu, který bude zobrazen čtenáři.
formatValue
Zformátuje strukturovaná data do wikitextu, který bude zobrazen čtenáři. Lze implementovat jako ve vzorovém modulu kombinací getRawValue a formatRawValue nebo samostatně, zvlášť pokud by se takto ztrácely informace.

Dostupné submoduly

[editovat]

Základní:

Vlastní:


require 'Modul:No globals'

local p = {}

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

local lib = require 'Modul:Wikidata/lib'

local function formatSpecial(snaktype, options)
	local i18n = mw.loadData('Modul:Wikidata/i18n')
	return options[snaktype] or i18n[snaktype] -- todo: přeložit pomocí hlášení
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)
	options = options or {}
	if value == 'somevalue' or value == 'novalue' then
		return formatSpecial(value, options)
	else
		return p.Formatters[formatter].formatRawValue(value, options)
	end
end

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

	local formatter = options['value-formatter'] or snak.datavalue.type
	if formatter == 'built-in' then
		return mw.wikibase.formatValue(snak)
	else
		return p.Formatters[formatter].formatValue(snak.datavalue.value, options)
	end
end

return p