Modul:ExtId
Vzhled
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