Tento modul je určen pro formátování šablon používaných v externích odkazech k odkazování do databází či na autoritní záznamy a případné přebírání údajů z Wikidat či jejich srovnávání vůči nim.

Použití

{{#invoke:ExtId|print
| pattern = <!-- vzor URL adresy, kde $1 nahrazuje hodnotu, např. "https://cs.wikipedia.org/wiki/$1" -->
| property = <!-- identifikátor vlastnosti na Wikidatech, např. "P345" -->
| value = <!-- hodnota předaná z parametrů šablony -->
| regex = <!-- regulární výraz (Lua syntaxe), pomocí něhož se bude validovat lokálně vyplněná hodnota (např. "%d+") -->
| text = <!-- volitelný vlastní popis odkazu (obvykle předaný z parametrů šablony) -->
| kurzíva = <!-- vyplňte "ano", pokud má být popis odkazu formátován kurzívou -->
| before = <!-- volitelný text zobrazený před odkazem (vlevo) -->
| after = <!-- volitelný text zobrazený za odkazem (vpravo) -->
| editovat na Wikidatech = <!-- vyplňte "ano", pokud se má na konec řádku doplnit {{Editovat na Wikidatech}} -->
| compare = <!-- true zapne u lokálně zadaných hodnot srovnávání s Wikidaty pomocí skrytých kategorií -->
| catbase = <!-- "identifikátor" šablony ve skrytých kategoriích, pokud se liší od názvu šablony, např. "ČSFD" -->
}}


require 'Modul:No globals'

local getArgs = (require 'Modul:Arguments').getArgs
local Wikidata = require 'Modul:Wikidata'
local lib = require 'Modul:Wikidata/lib'

local p = {}

local function getWikidataValue(property)
	return Wikidata.getRawValueFromLua{ property = property }
end

local function getFormatterUrl(prop)
	return Wikidata.getRawValueFromLua{ id = prop, property = 'P1630' }
end

function p.print(frame)
	local args = getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
		readOnly = true,
	})
	local parent = frame:getParent()
	local parent_args = getArgs(parent, {
		frameOnly = true,
		readOnly = true,
	})

	local template_name = mw.title.new(parent:getTitle()).text
	local title = mw.title.getCurrentTitle()
	local is_template_page = parent:getTitle() == title.fullText

	local is_local = (parent_args['lokální'] == 'ano')
	local property = args.property
	local formatterURL = args.pattern or (property and getFormatterUrl(property))
	if not formatterURL then
		error('Nebyla nalezena formátovací URL pro externí identifikátor „' .. template_name .. '“')
	end

	local regex = args.regex
	if regex and is_template_page then
		mw.ustring.find('', regex) -- dummy for error propagation
	end

	local categories = {}
	local good_format = true
	local fromWikidata = false
	local value = args.value
	if not value then
		if not is_local and property then
			value = getWikidataValue(property)
			if value then
				fromWikidata = true
			end
		end
		if not value then
			if not is_template_page then
				error('Nebyla zadána nebo nalezena hodnota pro externí identifikátor „' .. template_name .. '“')
			end

			value = ''
			if property and formatterURL ~= getFormatterUrl(property) then
				-- FIXME: table.insert(categories, lib.category('diff', 'Formátovací URL'))
				table.insert(categories, '[[Kategorie:Údržba:Formátovací URL se liší od Wikidat|' .. template_name .. ']]')
			end
		end
	else
		if not is_local and property and lib.IsOptionTrue(args, 'compare') then
			-- fixme: marked unused
			local marked, category = Wikidata._compareStatements{
				value = value,
				catbase = args.catbase or template_name,
				property = property
			}
			if category then
				table.insert(categories, category)
			end
		end
		if regex then
			local ok, arg, _ = pcall(mw.ustring.find, value, '^' .. regex .. '$')
			if not ok then
				mw.log(arg)
			elseif arg == nil then
				good_format = false
			end
		end
	end
	local text = args.text or mw.wikibase.getLabel() or title.text
	local link = '[' .. lib.formatFromPattern(value, formatterURL) .. ' ' .. text .. ']'
	if args['kurzíva'] == 'ano' then
		link = "''" .. link .. "''"
	end
	local before, after, fail = '', '', ''
	if args.before then
		before = args.before .. ' '
	end
	if args.after then
		after = ' ' .. args.after
	end
	if args['editovat na Wikidatech'] == 'ano' and fromWikidata then
		after = after .. frame:expandTemplate{
			title = 'Editovat na Wikidatech',
			args = { pid = property }
		}
	end
	if not good_format and title.namespace == 0 then
		-- fail = "<sup>''chybný odkaz''</sup>"
		table.insert(categories, mw.ustring.format('[[Kategorie:Údržba:Chybná hodnota %s|%s]]', template_name, title.fullText))
	end
	local ret = mw.ustring.format('%s%s%s%s%s', before, link, after, fail, table.concat(categories))
	if fromWikidata then
		return lib.addWdClass(ret)
	end
	return ret
end

return p