<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>https://www.enviwiki.cz/w/index.php?action=history&amp;feed=atom&amp;title=Modul%3AWikidata%2FFormatters</id>
	<title>Modul:Wikidata/Formatters - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="https://www.enviwiki.cz/w/index.php?action=history&amp;feed=atom&amp;title=Modul%3AWikidata%2FFormatters"/>
	<link rel="alternate" type="text/html" href="https://www.enviwiki.cz/w/index.php?title=Modul:Wikidata/Formatters&amp;action=history"/>
	<updated>2026-05-07T08:05:11Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://www.enviwiki.cz/w/index.php?title=Modul:Wikidata/Formatters&amp;diff=17485&amp;oldid=prev</id>
		<title>Admin: naimportována 1 revize: Z cswiki</title>
		<link rel="alternate" type="text/html" href="https://www.enviwiki.cz/w/index.php?title=Modul:Wikidata/Formatters&amp;diff=17485&amp;oldid=prev"/>
		<updated>2016-05-23T05:33:10Z</updated>

		<summary type="html">&lt;p&gt;naimportována 1 revize: Z cswiki&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;cs&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Starší verze&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Verze z 23. 5. 2016, 07:33&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;cs&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Žádný rozdíl)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiking007:diff:1.41:old-17484:rev-17485 --&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://www.enviwiki.cz/w/index.php?title=Modul:Wikidata/Formatters&amp;diff=17484&amp;oldid=prev</id>
		<title>*&gt;Matěj Suchánek: pryč zapomenuté ladění</title>
		<link rel="alternate" type="text/html" href="https://www.enviwiki.cz/w/index.php?title=Modul:Wikidata/Formatters&amp;diff=17484&amp;oldid=prev"/>
		<updated>2016-04-21T17:40:06Z</updated>

		<summary type="html">&lt;p&gt;pryč zapomenuté ladění&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require &amp;quot;Modul:No globals&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local lib = require &amp;#039;Modul:Wikidata/lib&amp;#039;&lt;br /&gt;
&lt;br /&gt;
local function formatCoordinateValue(value, typeOfValue, field)&lt;br /&gt;
	local function fastConvertDdToDms(ddValue)&lt;br /&gt;
		local dmsArr = {&lt;br /&gt;
			degrees = 0,&lt;br /&gt;
			minutes = 0,&lt;br /&gt;
			seconds = 0.0&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ddValue then&lt;br /&gt;
			dmsArr.degrees = math.floor(tonumber(ddValue))&lt;br /&gt;
			dmsArr.minutes = math.floor((tonumber(ddValue) - dmsArr[&amp;quot;degrees&amp;quot;]) * 60)&lt;br /&gt;
			dmsArr.seconds = (tonumber(ddValue) - dmsArr[&amp;quot;degrees&amp;quot;] - dmsArr[&amp;quot;minutes&amp;quot;]/60) * 3600&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return dmsArr&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- type bude nepovinny - tj. &amp;quot;nil&amp;quot;&lt;br /&gt;
	-- priklad pouze -- je tam asi X chyb (mimo jine N vs S a podobne)&lt;br /&gt;
	local result = &amp;quot;&amp;quot;&lt;br /&gt;
	local latdmsText, londmsText&lt;br /&gt;
	if typeOfValue == &amp;#039;dms&amp;#039; then&lt;br /&gt;
		local latDms = fastConvertDdToDms(value.latitude)&lt;br /&gt;
		local lonDms = fastConvertDdToDms(value.longitude)&lt;br /&gt;
		latdmsText = mw.ustring.format(&amp;#039;N %s° %s\&amp;#039; %s&amp;quot;&amp;#039;, latDms[&amp;quot;degrees&amp;quot;], latDms[&amp;quot;minutes&amp;quot;], latDms[&amp;quot;seconds&amp;quot;])&lt;br /&gt;
		londmsText = mw.ustring.format(&amp;#039;E %s° %s\&amp;#039; %s&amp;quot;&amp;#039;, lonDms[&amp;quot;degrees&amp;quot;], lonDms[&amp;quot;minutes&amp;quot;], lonDms[&amp;quot;seconds&amp;quot;])&lt;br /&gt;
		if field then&lt;br /&gt;
			if field == &amp;#039;latitude&amp;#039; then&lt;br /&gt;
				result = latdmsText&lt;br /&gt;
			elseif field == &amp;#039;longitude&amp;#039; then&lt;br /&gt;
				result = londmsText&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			result = latdmsText .. &amp;quot; &amp;quot; .. londmsText&lt;br /&gt;
		end&lt;br /&gt;
	elseif typeOfValue == &amp;#039;dd&amp;#039; then&lt;br /&gt;
		latdmsText = tonumber(value.latitude)&lt;br /&gt;
		londmsText = tonumber(value.longitude)&lt;br /&gt;
		if field then&lt;br /&gt;
			if field == &amp;#039;latitude&amp;#039; then&lt;br /&gt;
				result = latdmsText&lt;br /&gt;
			elseif field == &amp;#039;longitude&amp;#039; then&lt;br /&gt;
				result = londmsText&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			result = latdmsText .. &amp;quot; &amp;quot; .. londmsText&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		result = value.latitude .. &amp;#039; / &amp;#039; .. value.longitude .. &amp;#039; (přesnost: &amp;#039; .. value.precision .. &amp;#039;)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function findPattern(property)&lt;br /&gt;
	local entity = mw.wikibase.getEntity(property:upper())&lt;br /&gt;
	if entity then&lt;br /&gt;
		local Statements = entity:getBestStatements(&amp;#039;P1630&amp;#039;)&lt;br /&gt;
		for _, statement in pairs(Statements) do&lt;br /&gt;
			if lib.IsSnakValue(statement.mainsnak) then&lt;br /&gt;
				return p.getRawValue(statement.mainsnak)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatQuantity(value, options)&lt;br /&gt;
	local amount = tonumber(value.amount)&lt;br /&gt;
	local margin&lt;br /&gt;
	if lib.IsOptionTrue(options, &amp;#039;showmargin&amp;#039;) then&lt;br /&gt;
		margin = tonumber(value.upperBound) - amount&lt;br /&gt;
		if margin == 0 then&lt;br /&gt;
			margin = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local prefix&lt;br /&gt;
	if amount &amp;lt; 0 then&lt;br /&gt;
		amount = tonumber(mw.ustring.sub(amount, 2))&lt;br /&gt;
		prefix = &amp;#039;-&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if lib.IsOptionTrue(options, &amp;#039;formatted&amp;#039;) then&lt;br /&gt;
		local function formatNumber(number)&lt;br /&gt;
			local integer, decimal&lt;br /&gt;
			if mw.ustring.find(number, &amp;#039;%.&amp;#039;) then&lt;br /&gt;
				integer, decimal = mw.ustring.match(number, &amp;#039;^(.+)%.(.+)$&amp;#039;)&lt;br /&gt;
			else&lt;br /&gt;
				integer = number&lt;br /&gt;
			end&lt;br /&gt;
			local length = mw.ustring.len(integer)&lt;br /&gt;
			local i = length % 3&lt;br /&gt;
			if i == 0 then&lt;br /&gt;
				i = 3&lt;br /&gt;
			end&lt;br /&gt;
			local formatted_num = mw.ustring.sub(integer, 1, i)&lt;br /&gt;
			while i &amp;lt; length do&lt;br /&gt;
				formatted_num = formatted_num .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. mw.ustring.sub(integer, i + 1, i + 3)&lt;br /&gt;
				i = i + 3&lt;br /&gt;
			end&lt;br /&gt;
			if decimal then&lt;br /&gt;
				local length = mw.ustring.len(decimal)&lt;br /&gt;
				local i = 3&lt;br /&gt;
				formatted_num = formatted_num .. &amp;#039;,&amp;#039; .. mw.ustring.sub(decimal, 1, 3)&lt;br /&gt;
				while i &amp;lt; length do&lt;br /&gt;
					formatted_num = formatted_num .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. mw.ustring.sub(decimal, i + 1, i + 3)&lt;br /&gt;
					i = i + 3&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return formatted_num&lt;br /&gt;
		end&lt;br /&gt;
		amount = formatNumber(amount)&lt;br /&gt;
		if margin then&lt;br /&gt;
			margin = formatNumber(margin)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if margin then&lt;br /&gt;
		amount = amount .. &amp;#039;±&amp;#039; .. margin&lt;br /&gt;
	end&lt;br /&gt;
	if prefix then&lt;br /&gt;
		amount = prefix .. amount&lt;br /&gt;
	end&lt;br /&gt;
	local unit = value.unit&lt;br /&gt;
	if unit ~= &amp;#039;1&amp;#039; and tostring(options.showunit) ~= &amp;#039;false&amp;#039; then&lt;br /&gt;
		local unit_id = mw.ustring.match(unit, &amp;#039;(Q%d+)&amp;#039;) -- separate handler&lt;br /&gt;
		if unit_id then&lt;br /&gt;
			local module = require &amp;#039;Modul:Wikidata&amp;#039;&lt;br /&gt;
			local unit = module.formatStatementsFromLua{&lt;br /&gt;
				id = unit_id,&lt;br /&gt;
				limit = 1,&lt;br /&gt;
				property = &amp;#039;P558&amp;#039;,&lt;br /&gt;
				rank = &amp;#039;best&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
			if not unit then&lt;br /&gt;
				local ItemFormatter = require &amp;#039;Modul:Wikidata/item&amp;#039;&lt;br /&gt;
				unit = ItemFormatter.formatEntityId(unit_id, {})&lt;br /&gt;
			end&lt;br /&gt;
			amount = amount .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. unit&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return amount&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function executeFormatter(formatters, value, options)&lt;br /&gt;
	if formatters.module or formatters.withmodule then&lt;br /&gt;
		if not formatters.module or not formatters.func then&lt;br /&gt;
			return formatError(&amp;#039;unknown-value-module&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local formatter = require (&amp;#039;Modul:&amp;#039; .. formatters.module)&lt;br /&gt;
		if not formatter then&lt;br /&gt;
			return formatError(&amp;#039;value-module-not-found&amp;#039;, formatters.module)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local fun = formatter[formatters.func]&lt;br /&gt;
		if not fun then&lt;br /&gt;
			return formatError(&amp;#039;value-function-not-found&amp;#039;, formatters.func)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return fun(value, options)&lt;br /&gt;
	else&lt;br /&gt;
		return formatters.func(value, options)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getFormatter(datavalue, aspect, options)&lt;br /&gt;
	local FormattersMap = {&lt;br /&gt;
		globecoordinate = {&lt;br /&gt;
			formatted = {&lt;br /&gt;
				func = function(value, options)&lt;br /&gt;
					if not options.field or options.field == &amp;#039;&amp;#039; then&lt;br /&gt;
					--	return error(lib.formatError(&amp;#039;param-not-provided&amp;#039;, &amp;#039;field&amp;#039;))&lt;br /&gt;
						return formatCoordinateValue(value, &amp;#039;dms&amp;#039;)&lt;br /&gt;
					elseif options.field == &amp;quot;latitude&amp;quot; or options.field == &amp;quot;longitude&amp;quot; then&lt;br /&gt;
						return formatCoordinateValue(value, options.typeOfCoordinates, options.field)&lt;br /&gt;
					elseif options.field == &amp;quot;precision&amp;quot; or options.field == &amp;quot;globe&amp;quot; then&lt;br /&gt;
						return value[options.field]&lt;br /&gt;
					else&lt;br /&gt;
						return error(lib.formatError(&amp;#039;invalid-field&amp;#039;, options.field))&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		monolingualtext = {&lt;br /&gt;
			formatted = {&lt;br /&gt;
				func = function(value)&lt;br /&gt;
					return &amp;#039;&amp;lt;span lang=&amp;quot;&amp;#039; .. value.language .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. value.text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
			},&lt;br /&gt;
			raw = {&lt;br /&gt;
				func = function(value)&lt;br /&gt;
					return value.text&lt;br /&gt;
				end&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		quantity = {&lt;br /&gt;
			formatted = {&lt;br /&gt;
				func = formatQuantity&lt;br /&gt;
			},&lt;br /&gt;
			raw = {&lt;br /&gt;
				func = function(value)&lt;br /&gt;
					return tonumber(value.amount)&lt;br /&gt;
				end&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		string = {&lt;br /&gt;
			formatted = {&lt;br /&gt;
				func = function(value, options)&lt;br /&gt;
					if options.pattern and options.pattern ~= &amp;#039;&amp;#039; then&lt;br /&gt;
						return lib.formatFromPattern(value, options.pattern)&lt;br /&gt;
					elseif lib.IsOptionTrue(options, &amp;#039;autoformat&amp;#039;) then&lt;br /&gt;
						local pattern = findPattern(options.property)&lt;br /&gt;
						if pattern then&lt;br /&gt;
							return lib.formatFromPattern(value, &amp;#039;[&amp;#039; .. pattern .. &amp;#039; $1]&amp;#039;)&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						return value&lt;br /&gt;
					end&lt;br /&gt;
				end,&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		time = {&lt;br /&gt;
			formatted = {&lt;br /&gt;
				func = &amp;#039;formatDateFromWikidataValue&amp;#039;,&lt;br /&gt;
				module = &amp;#039;Wikidata/datum&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			raw = {&lt;br /&gt;
				func = &amp;#039;newFromWikidataValue&amp;#039;,&lt;br /&gt;
				module = &amp;#039;Time&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;wikibase-entityid&amp;quot;] = {&lt;br /&gt;
			convert = {&lt;br /&gt;
				func = &amp;#039;&amp;#039;,&lt;br /&gt;
				module = &amp;#039;Wikidata/item&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			formatted = {&lt;br /&gt;
				func = function(value, options)&lt;br /&gt;
					local module = require &amp;#039;Modul:Wikidata/item&amp;#039;&lt;br /&gt;
					return module.formatEntityId(lib.getEntityIdFromValue(value), options)&lt;br /&gt;
				end&lt;br /&gt;
			},&lt;br /&gt;
			raw = {&lt;br /&gt;
				func = function(...)&lt;br /&gt;
					return lib.getEntityIdFromValue(...)&lt;br /&gt;
				end&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if not FormattersMap[datavalue.type] then&lt;br /&gt;
		return error(lib.formatError(&amp;#039;unknown-datavalue-type&amp;#039;, datavalue.type))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not FormattersMap[datavalue.type][aspect] then&lt;br /&gt;
		if aspect == &amp;#039;raw&amp;#039; then&lt;br /&gt;
			return datavalue.value&lt;br /&gt;
		else&lt;br /&gt;
			return error() -- TODO&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return executeFormatter(FormattersMap[datavalue.type][aspect], datavalue.value, options)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getRawValue(snak, options)&lt;br /&gt;
	if snak.snaktype == &amp;#039;value&amp;#039; then&lt;br /&gt;
		return getFormatter(snak.datavalue, &amp;#039;raw&amp;#039;, options)&lt;br /&gt;
	elseif snak.snaktype == &amp;#039;somevalue&amp;#039; or snak.snaktype == &amp;#039;novalue&amp;#039; then&lt;br /&gt;
		return snak.snaktype&lt;br /&gt;
	else&lt;br /&gt;
		return error(lib.formatError(&amp;#039;unknown-snak-type&amp;#039;, snak.snaktype))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getFormattedValue(snak, options)&lt;br /&gt;
	if snak.snaktype == &amp;#039;somevalue&amp;#039; or snak.snaktype == &amp;#039;novalue&amp;#039; then&lt;br /&gt;
		return snak.snaktype&lt;br /&gt;
	elseif snak.snaktype ~= &amp;#039;value&amp;#039; then&lt;br /&gt;
		return error(lib.formatError(&amp;#039;unknown-snak-type&amp;#039;, snak.snaktype))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if options[&amp;#039;value-module&amp;#039;] or options[&amp;#039;value-function&amp;#039;] then&lt;br /&gt;
		local formatterMap = {&lt;br /&gt;
			func = options[&amp;#039;value-function&amp;#039;],&lt;br /&gt;
			module = options[&amp;#039;value-module&amp;#039;],&lt;br /&gt;
			withmodule = true -- force throwing error&lt;br /&gt;
		}&lt;br /&gt;
		return executeFormatter(formatterMap, snak.datavalue.value, options)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return getFormatter(snak.datavalue, &amp;#039;formatted&amp;#039;, options)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>*&gt;Matěj Suchánek</name></author>
	</entry>
</feed>