require('strict');
local getArgs = require ('Module:Arguments').getArgs;--local override_data = mw.loadData ('Module:ISO 639 name/ISO 639 override');local override_data = mw.loadData ('Module:ISO 639 name/ISO 639 override/sandbox');local deprecated_data = mw.loadData ('Module:ISO 639 name/ISO 639 deprecated');local parts =
----------------------------< E R R O R _ M E S S A G E S >--------------------------------------------------
local error_messages =
local error_cat = '';
----------------------------< S U B S T I T U T E >----------------------------------------------------------
Populates numbered arguments in a message string using an argument table.
local function substitute (msg, args) return args and mw.message.newRawMessage (msg, args):plain or msg;end
----------------------------< E R R O R _ M S G >------------------------------------------------------------
create an error message
local function error_msg (msg, arg, hide, nocat) local retval = ; if not hide then retval = substitute (error_messages.err_msg, substitute (error_messages.err_text[msg], arg)); retval = nocat and retval or (retval .. error_cat); end return retvalend
----------------------------< I S _ S E T >------------------------------------------------------------------
Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string.
local function is_set (var) return not (var
);end
--[=[-------------------------< W I K I L I N K _ M A K E >---------------------------------------------------- Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if onlylink is provided, returns a wikilink in the form L; if neither are provided or link is omitted, returns anempty string.
]=]
local function wikilink_make (link, display) if is_set (link) then if is_set (display) then return table.concat ; else return table.concat ; end else return ; endend
----------------------------< L A N G _ N A M E _ G E T >----------------------------------------------------
returns first listed language name for code from data table; strips parenthetical disambiguation; wikilinks tothe language article if link is true; returns nil else
local function lang_name_get (code, data, link, label, raw) local name; if data[code] then-- name = raw and data[code][1] or data[code][1]:gsub ('%s*%b', ); -- get the name; strip parenthetical disambiguators if any when
--hide-err=yes suppresses error message and category|cat=no supresses category
local function add_ietf_error_msg (text, ietf_err, hide, nocat) if hide then ietf_err = ; end
if not nocat then -- |cat= empty or omitted -> nocat=false nocat =
return table.concat ;end
----------------------------< G E T _ P A R T _ I N D E X >--------------------------------------------------
gets index suitable for parts table from ISO 639-
return valid index [1] - [5]; nil else 1 <- part ['1'] 2 <- part ['2'] -- this is part 2T 3 <- part ['2B'] 4 <- part ['3'] nil <- part ['4'] -- there is no part 4 5 <- part ['5']
local function get_part_index (part) return [part]end
--
local function name_from_code_common (args, source, part) local hide = 'yes'
args.cat; -- suppress error categorization (primarily for demo use) local raw = 'yes'
if not args[1] then -- if code not provided in the template call return error_msg ('required', '-' .. part, hide, nocat); -- abandon end
local code; -- used for error messaging local ietf_err; -- holds an error message when args[1] (language code) is in IETF tag form (may or may not be a valid IETF tag) code, ietf_err = args[1]:gsub('(.-)%-.*', '%1'); -- strip ietf subtags; ietf_err is non-zero when subtags are stripped ietf_err = (0 ~= ietf_err) and error_msg ('ietf', args[1], hide, nocat) or ; -- when tags are stripped create an error message; empty string for concatenation else
if not raw then -- when raw is true, fetch name as is from part data; ignore override data = override_data['override_' .. part]; -- get override data for this part name = lang_name_get (code:lower, data, args.link, args.label, raw); -- get override language name if there is one end if not name then data = mw.loadData (source); -- get the data for this ISO 639 part name = lang_name_get (code:lower, data, args.link, args.label, raw); -- get language name if there is one end
if not name then -- TODO: do something special to indicate when a name is fetched from deprecated data? data = deprecated_data['deprecated_' .. part]; -- get deprecated data for this part name = lang_name_get (code:lower, data, args.link, args.label, raw); -- get deprecated language name if there is one
if not name then return error_msg ('not_found',, hide, nocat); -- code not found, return error message end end return add_ietf_error_msg (name, ietf_err, hide, nocat), true; -- return language name with ietf error message if any; true because we found a codeend
----------------------------< _ N A M E _ F R O M _ C O D E >------------------------------------------------
searches through the ISO 639 language tables for a name that matches the supplied code. on success returns firstlanguage name that matches code from template frame perhaps with an error message and a second return value of true;on failure returns an error message and a second return value of nil. The second return value is a return valueused by is_code
looks first in the override data and then sequentially in the 639-1, -2, -3, and -5 data
local function _name_from_code (frame) local args = getArgs(frame); local hide = 'yes'
args.cat; -- suppress error categorization (primarily for demo use) if not args[1] then -- if code not provided in the template call return error_msg ('required', , hide, nocat); -- abandon end
local name; -- the retrieved language name and / or error message local found; -- set to true when language name is found
for _, part in ipairs (parts) do name, found = name_from_code_common (args, part[1], part[2]); if found then return name, true; -- second retval for is_name end end
return error_msg ('not_found',, hide, nocat); -- here when code (args[1]) is not found in the data tablesend
----------------------------< N A M E _ F R O M _ C O D E >--------------------------------------------------
template entry point; returns first language name that matches code from template frame or an error messagelooks first in the override data and then sequentially in the 639-1, -2, -3, and -5 data
local function name_from_code (frame) local ret_val = _name_from_code (frame); -- ignore second return value return ret_val; -- return language name and / or error messageend
--
local function is_code (frame) local _, exists; _, exists = _name_from_code (frame); -- ignore name/error message return;
----------------------------< N A M E _ F R O M _ C O D E _ 1 >----------------------------------------------
template entry point; returns first language name that matches ISO 639-1 code from template frame or an error message
local function name_from_code_1 (frame) local args = getArgs (frame); local retval = name_from_code_common (args, parts[1][1], parts[1][2]); -- suppress second return value return retval;end
----------------------------< N A M E _ F R O M _ C O D E _ 2 >----------------------------------------------
template entry point; returns first language name that matches ISO 639-2 code from template frame or an error message
local function name_from_code_2 (frame) local args = getArgs (frame); local retval = name_from_code_common (args, parts[2][1], parts[2][2]); -- suppress second return value return retval;end
----------------------------< N A M E _ F R O M _ C O D E _ 2 B >--------------------------------------------
template entry point; returns first language name that matches ISO 639-2 code from template frame or an error message
local function name_from_code_2B (frame) local args = getArgs (frame); local retval = name_from_code_common (args, parts[3][1], parts[3][2]); -- suppress second return value return retval;end
----------------------------< N A M E _ F R O M _ C O D E _ 3 >----------------------------------------------
template entry point; returns first language name that matches ISO 639-3 code from template frame or an error message
local function name_from_code_3 (frame) local args = getArgs (frame); local retval = name_from_code_common (args, parts[4][1], parts[4][2]); -- suppress second return value return retval;end
----------------------------< N A M E _ F R O M _ C O D E _ 5 >----------------------------------------------
template entry point; returns first language name that matches ISO 639-5 code from template frame or an error message
local function name_from_code_5 (frame) local args = getArgs (frame); local retval = name_from_code_common (args, parts[5][1], parts[5][2]); -- index [4] -> part 5 because there is no part 4; suppress second return value return retval;end
----------------------------< N A M E _ I N _ P A R T _ C O D E _ G E T >------------------------------------
indexes into the
local function name_in_part_code_get (name, part, part_idx, name_data) return name_data[name] and (name_data[name][part_idx+5] or -- see if the name exists in the part's override table name_data[name][part_idx] or -- see if the name exists in the part's main table name_data[name][part_idx+10] -- see if the name exists in the part's deprecated table );end
----------------------------< _ C O D E _ F R O M _ N A M E >------------------------------------------------
module entry point; returns ISO 639-1, -2, -2B, -3, or -5 code associated with language name according to part(1, 2, 2B, 3, 5) argument; when part is not provided scans 1, 2, 2B, 3, 5 and returns first code
override data are examined first
local function _code_from_name (args) local hide = 'yes'
args.cat; -- suppress error categorization (primarily for demo use)
if not args[1] then return error_msg ('name', , hide, nocat); -- abandon when language name missing end local name = args[1]; -- used in error messaging local lc_name = name:gsub(' +', ' '); -- strip extraneous space characters lc_name = mw.ustring.lower (lc_name); -- lowercase version of name for indexing into the data table
local part_idx; local part = args[2]; if part then part_idx = get_part_index (part); if not part_idx then return error_msg ('not_part', part, hide, nocat); -- abandon; args[2] is not a valid ISO 639 part end end
-- local name_data = mw.loadData ('Module:ISO 639 name/ISO 639 name to code'); -- ISO 639 language names to code table local name_data = mw.loadData ('Module:ISO 639 name/ISO 639 name to code/sandbox'); -- ISO 639 language names to code table
local code; if part then code = name_in_part_code_get (lc_name, part, part_idx, name_data); -- search the specified override table + part table else for part_idx, part_tag in ipairs do -- no part provided, spin through all parts override first and get the first available code code = name_in_part_code_get (lc_name, part_tag, part_idx, name_data); if code then -- nil when specified
----------------------------< C O D E _ F R O M _ N A M E >--------------------------------------------------
template entry point; returns ISO 639-1, -2, -2B, -3, or -5 code associated with language name according to part(1, 2, 2B, 3, 5) argument; when part is not provided scans 1, 2, 2B, 3, 5 and returns first code
override data are examined first
args[1] is language nameargs[2] is ISO 639 part
local function code_from_name (frame) local args = getArgs(frame); local result, _ = _code_from_name (args); -- suppress true/false return used by is_name return result;end
----------------------------< I S _ N A M E >----------------------------------------------------------------
template entry point; returns ISO 639-1, -2, -3, or -5 code associated with language name according to part (1, 2, 3, 5) argument;when part is not provided scans 1, 2, 3, 5 and returns first code
override data are examined first
args[1] is language nameargs[2] is ISO 639 part
local function is_name (frame) local args = getArgs(frame); local _, result = _code_from_name (args); -- suppress code return used by code_from_name return result and true or nil;end
--
local function iso_639 (frame) local args = getArgs (frame); local hide = 'yes'
args.cat; -- suppress error categorization (primarily for demo use) local result; local found; -- set to true when language name is found
if not args[1] then return error_msg ('code_name', , hide, nocat); end
local part = args[2]; if part then -- if ISO 639 part supplied local part_idx = get_part_index (part); -- map index from
if not part_idx then return error_msg ('not_part', part, hide, nocat); -- abandon; args[2] is not a valid ISO 639 part end
result, found = name_from_code_common (args, parts[part_idx][1], parts[part_idx][2]); -- attempt to find a code match if found then return result; -- found the code so return the language name end
result = _code_from_name (args); -- might be a language name; return code if it is; error message or empty string else return result; -- this way to suppress second return
else for _, part in ipairs (parts) do -- for each of the iso 639 parts result, found = name_from_code_common (args, part[1], part[2]); -- attempt to find a code match if found then return result; -- found the code so return the language name end end end
result = _code_from_name (args); -- might be a language name; return code if it is; error message or empty string else return result; -- this way to suppress second returnend
----------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
return ;