模組:Families/data/hierarchy

維基詞典,自由的多語言詞典
local p = {}

local fam = mw.loadData("Module:families/data")

local function format(code)
	if code == "sgn" then
		return "<code>[[:Category:Sign languages|sign <span style=\"color:green;\">(sgn)</span>]]</code>"
	elseif code == "sgn-fsl" then
		return "<code>[[:Category:French Sign Languages|French Sign Languages <span style=\"color:green;\">(sgn)</span>]]</code>"
	elseif code == "sgn-gsl" then
		return "<code>[[:Category:German Sign Languages|German Sign Languages <span style=\"color:green;\">(sgn)</span>]]</code>"
	elseif code == "sgn-jsl" then
		return "<code>[[:Category:Japanese Sign Languages|Japanese Sign Languages <span style=\"color:green;\">(sgn)</span>]]</code>"
	else
		return "<code>[[:Category:" .. fam[code].canonicalName .. "|" .. fam[code].canonicalName .. " <span style=\"color:green;\">(" .. code .. ")</span>]]</code>"
	end
end

local function dump(data, prefix)
	if type(data) == "string" then
		return format(data)
	else
		local result = ""
		local branch = "├───"
		local next_level = prefix .. "│    "
		local current = ""
		for i,val in ipairs(data) do
			if i == #data then
				branch = "└───"
				next_level = prefix .. "     "
			end
			if #val == 0 then
				result = result .. prefix .. branch .. dump(val.name) .. "<br/>"
			else
				result = result .. "{{(!}} class=mw-collapsible style=border-collapse:collapse\n{{!}}"
				result = result .. prefix .. branch .. dump(val.name)
				result = result .. "\n{{!-}}\n{{!}}"
				result = result .. dump(val, next_level)
				result = result .. "\n{{!)}}\n"
			end	
		end	
		return result
	end	
end

local function deep_sort(current)
	local result = {}
	local is_table = {}
	for key,val in pairs(current) do
		if type(key) == "number" then
			table.insert(result, val)
		else
			is_table[key] = true
			table.insert(result, key)
		end
	end
	
	table.sort(result, function(a,b)
		return (fam[a] or error(a)).canonicalName < (fam[b] or error(b)).canonicalName
	end)
	
	local i = 2
	while i<#result do
		while fam[result[i-1]] == fam[result[i]] do
			table.remove(result,i)
		end
		i = i + 1
	end
	
	for i=1,#result do
		if is_table[result[i]] then
			local name = result[i]
			result[i] = deep_sort(current[result[i]])
			result[i].name = name
		else
			result[i] = {name = result[i]}
		end
	end
	
	return result
end

function p.show(frame)
	local children = {}
	
	for key,val in pairs(fam) do
		if val.family and val.family ~= "qfa-not" and val.family ~= "qfa-und" then
			if children[val.family] then
				table.insert(children[val.family], key)
			else
				children[val.family] = {key}
			end
		end
	end
	
	local function make_nested(data)
		local make_nil = {}
		for key,val in pairs(data) do
			if type(key) == "number" then
				if children[val] then
					data[val] = make_nested(children[val])
					table.insert(make_nil, key)
					children[val] = nil
				end
			else
				data[key] = make_nested(val)
			end
		end
		for _,key in ipairs(make_nil) do
			data[key] = nil
		end
		return data
	end
	
	children = make_nested(children)
	
	children = deep_sort(children)
	
	local result = ""
	for i=1,#children do
		result = result .. "\n\n\n{| class=mw-collapsible style=border-collapse:collapse\n|" .. format(children[i].name) .. "\n|-\n|"
		result = result .. dump(children[i], "  ")
		result = result .. "\n|}"
	end
	return frame:preprocess(result)
end

return p