본문으로 이동

모듈:list of languages

위키낱말사전, 말과 글의 누리

이 모듈에 대한 설명문서는 모듈:list of languages/설명문서에서 만들 수 있습니다

local m_fun = require("Module:fun")
local m_languages = require("Module:languages")
local m_families_data = require("Module:families/data")
local m_table = require("Module:table")

local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local pairs = pairs
local remove = table.remove
local size = m_table.size
local sort = table.sort
local sorted_pairs = m_table.sortedPairs

local export = {}
local filters = {}
local split = require("Module:string utilities").split

function export.count()
	return size(require("Module:languages/data/all"))
end

local function mergeExtra(langdata, extradata)
	for lkey, lvalue in pairs(extradata) do
		if langdata[lkey] then
			for key in pairs(lvalue) do
				langdata[lkey][key] = lvalue[key]
			end
		end
	end
end

function export.show(frame)
	local args = frame.args
	local filter_name = args[1]
	local filter = filters[filter_name]
	local arg2 = args[2]
	local ids = require("Module:yesno")(args["ids"])
	
	local m_languages_data
	local use_filter = false
	
	-- Choose a data module.
	if filter_name == "two-letter code" then
		m_languages_data = require("Module:languages/data/2")
		mergeExtra(m_languages_data, require("Module:languages/data/2/extra"))
		if arg2 then
			use_filter = true
		end
	elseif filter_name == "three-letter code" then
		if arg2 and arg2:find("^[a-z]$") then
			m_languages_data = require("Module:languages/data/3/" .. arg2)
			mergeExtra(m_languages_data, require("Module:languages/data/3/" .. arg2 .. "/extra"))
		else
			m_languages_data = require("Module:languages/data/all")
		end
	elseif filter_name == "exceptional" then
		m_languages_data = require("Module:languages/data/exceptional")
		mergeExtra(m_languages_data, require("Module:languages/data/exceptional/extra"))
	else
		m_languages_data = require("Module:languages/data/all")
		-- data/all already merges extradata
		use_filter = true
	end
	
	-- Select language codes to display.
	local data_tables = {}
	if use_filter then
		filter = filter(arg2)
		data_tables = m_fun.filter(filter, m_languages_data)
	else
		data_tables = m_languages_data
	end
	
	-- Now go over each code, and create table rows for those that are selected
	local rows = {}
	local row_i = 1
	
	local function link_script(script)
		return "[[위키낱말사전:문자 체계 목록#" .. script .. "|<code>" .. script .. "</code>]]"
	end	
	
	for code, data in sorted_pairs(data_tables) do
		local lang = m_languages.makeObject(code, data)
		local canonicalName = lang:getCanonicalName()
		local family = lang:getFamilyCode()
		local scripts = lang:getScriptCodes()
		local row = {
			"\n|-", (ids and " id=\"" .. code .. "\" |" or ""),
			"\n|", '<code class="language-code">', code, "</code>",
			"\n|", (ids and " id=\"" .. canonicalName .. "\" |" or ""),
			" [[:분류:", lang:getCategoryName(), "|", canonicalName, "]]",
			"\n|", (family and family ~= "qfa-und" and ("[[위키낱말사전:어족 목록#%s|%s]]"):format(family, m_families_data[family] and m_families_data[family][1] or ("<code>" .. family .. "</code>")) or ""),
			"\n|"
		}
		
		if type(scripts) == "string" then
			scripts = split(scripts, ",")
		end
		
		if scripts and scripts[1] ~= "None" then
			insert(row, concat(m_fun.map(link_script, scripts), ", "))
		end
		
		insert(row, "\n|")
		
		local names = lang:getAllNames()
		remove(names, 1) -- 정식 명칭 제거
		insert(row, concat(names, ", "))

		insert(row,
			"\n| " .. (data.sort_key and "예" or "") ..
			"\n| " .. (data.entry_name and "예" or "")
		)
		
		rows[row_i] = concat(row)
		row_i = row_i + 1
	end

	return concat {
[[
{| class="wikitable sortable mw-datatable"
! 코드
! 정식 명칭
! 어족
! style="width: 12em" | 문자 체계
! 다른 이름
! 정렬?
! 발음 구별?]], concat(rows), "\n|}"
	} .. require("Module:TemplateStyles")("Module:list of languages/styles.css")
end

-- 필터 함수
-- 이 함수들은 매개변수 2를 인수로 받아 새 함수를 생성합니다.
-- 이 함수는 주어진 코드가 테이블에 포함되어야 하는지에 따라 true 또는 false를 반환합니다.
-- 더 짧은 하위 목록을 만드는 데 사용됩니다.

filters["two-letter code"] = function (firstletter)
	local pattern = "^" .. (firstletter or "[a-z]") .. "[a-z]$"
	
	return function (data, code)
		return code:find(pattern) ~= nil
	end
end

filters["type"] = function (type)
	return function (data, code)
		return data.type == type
	end
end

filters["subst"] = function (arg2)
	return function (data, code)
		return data.sort_key or data.entry_name
	end
end

filters["special"] = function (arg2)
	return function (data, code)
		return data[3] == "qfa-not"
	end
end

--

function export.show_etym()
	local m_languages_data = require("Module:languages/data/all")
	local m_etym_data = require('Module:etymology_languages/data')
	local alias_codes = require("Module:languages/data").aliases
	local data_to_codes = {}
	local items = {}

	for code, data in sorted_pairs(m_etym_data) do
		local codes_list = data_to_codes[data]
		if not codes_list then
			codes_list = {}
			data_to_codes[data] = codes_list
			insert(items, data)
		end
		insert(codes_list, code)
		for alias_code, main_code in pairs(alias_codes) do
			if main_code == code then
				insert(codes_list, alias_code)
			end
		end
	end

	local function make_parent_link(code)
		if m_languages_data[code] then
			return ('[[위키낱말사전:언어 목록#%s|%s]]'):format(code, m_languages_data[code][1])
		elseif m_families_data[code] then
			return ('[[위키낱말사전:어족 목록#%s|%s 어족]]'):format(code, m_families_data[code][1])
		elseif m_etym_data[code] then
			return ('[[위키낱말사전:언어 목록/어원 전용#%s|%s]]'):format(code, m_etym_data[code][1])
		elseif code then
			return '<code>' .. code .. '</code>'
		else
			return '[누락]'
		end
	end

	local rows = {}
	for _, data in ipairs(items) do
		local codes = data_to_codes[data]
		local lang = m_languages.makeObject(codes[1], data)
		sort(codes)
		
		for i, code in ipairs(codes) do
			codes[i] = '<code class="language-code" id="' .. code .. '">' .. code .. '</code>'
		end
		
		-- finalizeData in [[Module:languages]] moves
		-- parent from field 3 to field 5: [[Special:Permalink/78289916#L-1659]]
		
		local names = lang:getAllNames()
		remove(names, 1) -- Remove the canonical name.
		
		insert(rows,
			' \n' ..
			'| ' .. concat(codes, ", ") .. '\n' ..
			'| [[:분류:언어별 ' .. lang:getDisplayForm() .. '에서 유래한 낱말|' .. lang:getCanonicalName() .. ']]\n' ..
			'| ' .. concat(names, ", ") .. '\n' ..
			'| ' .. make_parent_link(lang:getParentCode())
		)
	end

	return
		"{| class=\"wikitable sortable mw-datatable\"\n" ..
		"! 코드\n" ..
		"! 정식 명칭\n" ..
		"! 다른 이름\n" ..
		"! 상위\n" ..
		"|-" .. concat(rows, "\n|-") .. "\n|}" ..
		require("Module:TemplateStyles")("Module:list of languages/styles.css")
end

return export