وحدة:Name
توثيق الوحدة [أنشئ] [محو الاختزان][استخدامات] [قوالب]
--[[
__ __ _ _ _ _
| \/ | ___ __| |_ _| | ___ _| \ | | __ _ _ __ ___ ___
| |\/| |/ _ \ / _` | | | | |/ _ (_) \| |/ _` | '_ ` _ \ / _ \
| | | | (_) | (_| | |_| | | __/_| |\ | (_| | | | | | | __/
|_| |_|\___/ \__,_|\__,_|_|\___(_)_| \_|\__,_|_| |_| |_|\___|
This module is intended for processing of people names.
Please do not modify this code without applying the changes first at Module:Name/sandbox and testing
at Module:Name/sandbox/testcases
Authors and maintainers:
* User:Zolo - original version
* User:Jarekt - rewrite
]]
-- =======================================
-- === Dependencies ======================
-- =======================================
local i18n = require('Module:I18n/name')
local core = require('Module:Core')
local p = {}
-- lazy loading (load only if needed)
local function lang_of(name, lang)
return require('Module:Linguistic').of(name, lang)
end
-- ===========================================================================
-- === Version of the function to be called from other LUA codes
-- ===========================================================================
function p._name(operation, base_name, lang)
-- Error checking on "operation" parameter
if operation == '' or base_name == '' then -- no operation provided -> return the name
return base_name
end
operation = mw.ustring.lower(operation) -- convert operation to lower case
if not i18n[operation] then -- if operation is not recognized than maybe it is an alias
operation = i18n.Aliases[operation]
end
if not i18n[operation] then -- operation is still not recognized
return "name not supported"
end
local colon = tostring(mw.message.new('colon'):inLanguage(lang))
-- translation through Wikidata q-code
if type(i18n[operation])=='string' then
-- usually operation is a translation table, but if it is a string than that is
-- a wikidata q-code, so look up the label stored in wikidata
return core.getLabel(i18n[operation], lang) .. colon .. base_name
end
-- translation through local LangSwitch which return language specific function or string
local command = core.langSwitch(i18n[operation], lang)
local full_name, part
if type(command)=='function' then
full_name = command(base_name)
elseif type(command)=='string' then
--command = mw.getLanguage(lang):ucfirst(command)
command = mw.getCurrentFrame():callParserFunction( "ucfirst", { command } )
if mw.ustring.find(command, '$of_name') then -- forms like Master of X
base_name = lang_of(base_name, lang)
part = mw.text.split(' '..command..' ', '$of_name', true )
full_name = mw.text.trim(part[1] .. base_name .. part[2])
elseif mw.ustring.find(command, '$name') then -- forms like Master X
-- replace parts of the string '$name' with base_name strings
part = mw.text.split(' '..command..' ', '$name', true )
full_name = mw.text.trim(part[1] .. base_name .. part[2])
else -- forms like Pseudonym: base_name, with a colon
full_name = command .. colon .. base_name
end
end
return full_name
end
-- ===========================================================================
-- === Functions to be called from template namespace
-- ===========================================================================
function p.name(frame)
local args = core.getArgs(frame)
local base_name = args.name or ''
-- handle case where there is no "name" parameter but chinese names
if base_name=='' and (args.trad or args.simp or args.PY) then
local Func = core.langSwitch(i18n.Chinese_name, args.lang)
base_name = Func(args.trad or '', args.simp or '', args.PY or '')
end
return p._name(args.operation or '', base_name, args.lang)
end
return p