Difference between revisions of "Module:Language/data/ISO 639 name to code/make"

From blackwiki
Jump to navigation Jump to search
blackwiki>Trappist the monk
blackwiki>Trappist the monk
Line 5: Line 5:
 
--[[--------------------------< A D D _ L A N G >--------------------------------------------------------------
 
--[[--------------------------< A D D _ L A N G >--------------------------------------------------------------
  
temp table is a table of tables where the key is the language name and the value is a 3-element table listing
+
temp table is a table of tables where the key is the language name and the value is a table listing the ISO 639
the ISO 639 codes associated with that language name.
+
codes associated with that language name.
  
This function adds language name (as index) and its code (as a table element) to the appropriate place in the temp table.
+
This function adds language name (as index) and its code (as a table element) using an appropriate index number.
  
lang is the language name from the source data
+
<lang> is the language name from the source data
code is the associated ISO 639 code from the source data
+
<code> is the associated ISO 639 code from the source data
part is 1 for ISO 639-1 language names and codes, 2 ..., 3 ..., 5 ..Note that part 5 codes go in index [4]
+
<part> is 1 for ISO 639-1 language names and codes, 2, 2B, 3, 5.  <part> for the override data is prefixed with 'O'
 
 
This function does not create alias entries in temp table for those language names that use characters with diacritics.
 
To do so risks conflict between names that do not use diacritics (Bari, code bfa) and names that do (Barí, code mot).
 
  
 
]]
 
]]
  
 
local function lang_add (lang, code, part)
 
local function lang_add (lang, code, part)
part = ({['1']=1, ['2']=2, ['2B']=3, ['3']=4, ['5']=5, })[part];
+
part = ({ -- convert string <part> to a numeric index
 +
['1']=1, ['2']=2, ['2B']=3, ['3']=4, ['5']=5, -- for the base ISO 639 parts
 +
['O1']=6, ['O2']=7, ['O2B']=8, ['O3']=9, ['O5']=10, -- for the override tables
 +
})[part];
  
 
lang = mw.ustring.lower (lang); -- convert to lowercase for use as table index
 
lang = mw.ustring.lower (lang); -- convert to lowercase for use as table index
+
 
 
if not temp[lang] then -- when no entry for this language
 
if not temp[lang] then -- when no entry for this language
temp[lang] = {}; -- make a blank entry: 1, 2, 2B, 3, 5
+
temp[lang] = {}; -- make a blank entry
 
end
 
end
  
Line 31: Line 31:
 
'[', -- open the key
 
'[', -- open the key
 
part, -- add the index
 
part, -- add the index
']=\"', -- close key, add assignment operator and open quote beause these are strings
+
']=\"', -- close key, add assignment operator and open quote because <code> is a string
code, -- add the code
+
code, -- add <code>
'\"' -- close the string quote
+
'\"' -- close the quote
 
}));
 
}));
 
end
 
end
Line 60: Line 60:
 
end
 
end
 
end
 
end
+
 
 
part_data = mw.loadData ('Module:Language/data/ISO 639-2'); -- ISO 639-2 language codes / names
 
part_data = mw.loadData ('Module:Language/data/ISO 639-2'); -- ISO 639-2 language codes / names
 
for code, v in pairs (part_data) do -- now part 2
 
for code, v in pairs (part_data) do -- now part 2
Line 67: Line 67:
 
end
 
end
 
end
 
end
+
 
 
part_data = mw.loadData ('Module:Language/data/ISO 639-2B'); -- ISO 639-2B language codes / names
 
part_data = mw.loadData ('Module:Language/data/ISO 639-2B'); -- ISO 639-2B language codes / names
 
for code, v in pairs (part_data) do -- now part 2B
 
for code, v in pairs (part_data) do -- now part 2B
Line 74: Line 74:
 
end
 
end
 
end
 
end
+
 
 
part_data = mw.loadData ('Module:Language/data/iana languages'); -- used only for ISO 639-1 language codes / names');
 
part_data = mw.loadData ('Module:Language/data/iana languages'); -- used only for ISO 639-1 language codes / names');
 
for code, v in pairs (part_data) do -- now part 1
 
for code, v in pairs (part_data) do -- now part 1
Line 80: Line 80:
 
for _, lang in ipairs (v) do
 
for _, lang in ipairs (v) do
 
lang_add (lang, code, '1');
 
lang_add (lang, code, '1');
 +
end
 +
end
 +
end
 +
 +
part_data = mw.loadData ('Module:Language/data/ISO 639 override'); -- has override data for all parts
 +
for _, o_part in ipairs ({'1', '2', '2B', '3', '5'}) do -- for each of the override tables
 +
local o_part_data = part_data['override_' .. o_part]; -- point to override data
 +
o_part = 'O' .. o_part; -- prefix o_part
 +
for code, v in pairs (o_part_data) do -- for each code in the data table
 +
for _, lang in ipairs (v) do -- and for each language name associated with that code
 +
lang_add (lang, code, o_part); -- add
 
end
 
end
 
end
 
end
Line 89: Line 100:
 
end
 
end
  
table.sort (out);
+
table.sort (out); -- sort in language name order
local key_str = '--[[Key:<br />&#9;[1]=ISO 639-1<br />&#9;[2]=ISO 639-2<br />&#9;[3]=ISO 639-2B<br />&#9;[4]=ISO 639-3<br />&#9;[5]=ISO 639-5<br />]]<br /><br />'
+
 
 +
local key_str = table.concat ({
 +
'--[[--------------------------< I S O _ 6 3 9 _ N A M E _ T O _ C O D E >--------------------------------------<br /><br />',
 +
'Key:<br />&#9;',
 +
'[1]=ISO 639-1&#9;&#9;[6]=ISO 639-1 override<br />&#9;',
 +
'[2]=ISO 639-2&#9;&#9;[7]=ISO 639-2 override<br />&#9;',
 +
'[3]=ISO 639-2B&#9;&#9;[8]=ISO 639-2B override<br />&#9;',
 +
'[4]=ISO 639-3&#9;&#9;[9]=ISO 639-3 override<br />&#9;',
 +
'[5]=ISO 639-5&#9;&#9;[10]=ISO 639-5 override',
 +
'<br />]]<br /><br />'
 +
})
 +
 
return table.concat ({'<pre>', key_str, 'return {<br />&#9;', table.concat (out, ',<br />&#9;'), '<br />&#9;}<br /></pre>'}); -- render
 
return table.concat ({'<pre>', key_str, 'return {<br />&#9;', table.concat (out, ',<br />&#9;'), '<br />&#9;}<br /></pre>'}); -- render
 
 
end
 
end
 +
 +
--[[--------------------------< E X P O R T E D  F U N C T I O N S >------------------------------------------
 +
]]
  
 
return {iso_639_name_to_code = iso_639_name_to_code}
 
return {iso_639_name_to_code = iso_639_name_to_code}

Revision as of 22:21, 1 September 2020

require('Module:No globals');
local temp = {};


--[[--------------------------< A D D _ L A N G >--------------------------------------------------------------

temp table is a table of tables where the key is the language name and the value is a table listing the ISO 639
codes associated with that language name.

This function adds language name (as index) and its code (as a table element) using an appropriate index number.

<lang> is the language name from the source data
<code> is the associated ISO 639 code from the source data
<part> is 1 for ISO 639-1 language names and codes, 2, 2B, 3, 5.  <part> for the override data is prefixed with 'O'

]]

local function lang_add (lang, code, part)
	part = ({																	-- convert string <part> to a numeric index
		['1']=1, ['2']=2, ['2B']=3, ['3']=4, ['5']=5,							-- for the base ISO 639 parts
		['O1']=6, ['O2']=7, ['O2B']=8, ['O3']=9, ['O5']=10,						-- for the override tables
		})[part];

	lang = mw.ustring.lower (lang);												-- convert to lowercase for use as table index

	if not temp[lang] then														-- when no entry for this language
		temp[lang] = {};														-- make a blank entry
	end

	table.insert (temp[lang], table.concat ({									-- add the code; codes are added in the order that this function is called in iso_639_name_to_code()
		'[',																	-- open the key
		part,																	-- add the index
		']=\"',																	-- close key, add assignment operator and open quote because <code> is a string
		code,																	-- add <code>
		'\"'																	-- close the quote
	}));
end


--[[--------------------------< I S O 6 3 9 _ N A M E _ T O _ C O D E >----------------------------------------

read code-to-name source tables and convert to a name-to-code table.

]]

local function iso_639_name_to_code ()
	local out = {};

	local part_data = mw.loadData ('Module:Language/data/ISO 639-3');			-- ISO 639-3 language codes / names
	for code, v in pairs (part_data) do											-- start with part 3 because it has the most codes
		for _, lang in ipairs (v) do											-- code can have multiple names so for each one
			lang_add (lang, code, '3');											-- create and / or add this name / code pair to the output
		end
	end

	part_data = mw.loadData ('Module:Language/data/ISO 639-5');					-- ISO 639-5 language codes / names
	for code, v in pairs (part_data) do											-- now part 5
		for _, lang in ipairs (v) do
			lang_add (lang, code, '5');
		end
	end

	part_data = mw.loadData ('Module:Language/data/ISO 639-2');					-- ISO 639-2 language codes / names
	for code, v in pairs (part_data) do											-- now part 2
		for _, lang in ipairs (v) do
			lang_add (lang, code, '2');
		end
	end

	part_data = mw.loadData ('Module:Language/data/ISO 639-2B');				-- ISO 639-2B language codes / names
	for code, v in pairs (part_data) do											-- now part 2B
		for _, lang in ipairs (v) do
			lang_add (lang, code, '2B');
		end
	end

	part_data = mw.loadData ('Module:Language/data/iana languages');			-- used only for ISO 639-1 language codes / names');
	for code, v in pairs (part_data) do											-- now part 1
		if 2 == #code then														-- IANA source data includes a mix of 2- and 3-character codes; ISO 639-1 is the 2-character variety
			for _, lang in ipairs (v) do
				lang_add (lang, code, '1');
			end
		end
	end

	part_data = mw.loadData ('Module:Language/data/ISO 639 override');			-- has override data for all parts
	for _, o_part in ipairs ({'1', '2', '2B', '3', '5'}) do						-- for each of the override tables
		local o_part_data = part_data['override_' .. o_part];					-- point to override data
		o_part = 'O' .. o_part;													-- prefix o_part
		for code, v in pairs (o_part_data) do									-- for each code in the data table
			for _, lang in ipairs (v) do										-- and for each language name associated with that code
				lang_add (lang, code, o_part);									-- add
			end
		end
	end

	for lang, codes in pairs (temp) do
		table.sort (codes);														-- codes are added in the order that lang_add() is called above; sort to make pretty
		table.insert (out, table.concat ({'["', lang, '"] = {', table.concat (codes, ', '), '}'}));	-- reformat
	end

	table.sort (out);															-- sort in language name order

	local key_str = table.concat ({
		'--[[--------------------------< I S O _ 6 3 9 _ N A M E _ T O _ C O D E >--------------------------------------<br /><br />',
		'Key:<br />&#9;',
		'[1]=ISO 639-1&#9;&#9;[6]=ISO 639-1 override<br />&#9;',
		'[2]=ISO 639-2&#9;&#9;[7]=ISO 639-2 override<br />&#9;',
		'[3]=ISO 639-2B&#9;&#9;[8]=ISO 639-2B override<br />&#9;',
		'[4]=ISO 639-3&#9;&#9;[9]=ISO 639-3 override<br />&#9;',
		'[5]=ISO 639-5&#9;&#9;[10]=ISO 639-5 override',
		'<br />]]<br /><br />'
		})
	
	return table.concat ({'<pre>', key_str, 'return {<br />&#9;', table.concat (out, ',<br />&#9;'), '<br />&#9;}<br /></pre>'});	-- render
end

--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------
]]

return {iso_639_name_to_code = iso_639_name_to_code}