รายชื่อมอดูลย่อยทั้งหมด เทียบกับวิกิพจนานุกรมภาษาอังกฤษ ซึ่งสัมพันธ์กันแบบโครงสร้างต้นไม้ (บางหน้ายังไม่ถูกสร้างเพราะยังไม่มีการใช้งานหรือคำแปลที่เหมาะสม)


local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}

-- "เฉพาะภาษา" (lang-specific) now handled directly in Module:category tree/poscatboiler
local subpages = {
	"หน่วยคำเติมและคำประสม", --affixes and compounds
	"อักขระ", --characters; ในหมวดหมู่จะใช้คำว่า ตัวอักษร
	"การบำรุงรักษาข้อมูล", --entry maintenance
	"กลุ่มภาษา", --families; ตามนโยบาย
	"ภาพพจน์", --figures of speech
	--"lang-specific-raw",
	"ภาษา", --languages
	"ภาษณ์", --"lects",
	"คำหลัก", --lemmas
	"เบ็ดเตล็ด", --miscellaneous
	"มอดูล", --modules
	"ชื่อ", --names
	"รูปผัน", --non-lemma forms
	"วลี", --phrases
	"สัมผัส", --rhymes
	"อักษร", --scripts
	"การย่อ", --shortenings
	--"speech acts",
	"สัญลักษณ์", --symbols
	"แม่แบบ", --templates
	"ศัพท์แบ่งตามรากศัพท์", --terms by etymology
	"ศัพท์แบ่งตามประเภทไวยากรณ์", --terms by grammatical category
	"ศัพท์แบ่งตามสมบัติ", --terms by lexical property
	"ศัพท์แบ่งตามหน้าที่เชิงความหมาย", --terms by semantic function
	"ศัพท์แบ่งตามอักษร", --terms by script
	"ศัพท์แบ่งตามการใช้", --terms by usage
	"การถอดอักษร", --transliterations
	"ยูนิโคด", --unicode
	--"วิกิพจนานุกรม", --wiktionary
	--"การบำรุงรักษาวิกิพจนานุกรม", --wiktionary maintenance
	--"ศัพท์ประจำวัน", --word of the day โครงการนี้ไม่ใช้
}

-- Import subpages
for _, subpage in ipairs(subpages) do
	local datamodule = "Module:category tree/poscatboiler/data/" .. subpage
	local retval = require(datamodule)
	if retval["LABELS"] then
		for label, data in pairs(retval["LABELS"]) do
			if labels[label] and not retval["IGNOREDUP"] then
				error("Label " .. label .. " defined in both [["
					.. datamodule .. "]] and [[" .. labels[label].module .. "]].")
			end
			data.module = datamodule
			labels[label] = data
		end
	end
	if retval["RAW_CATEGORIES"] then
		for category, data in pairs(retval["RAW_CATEGORIES"]) do
			if raw_categories[category] and not retval["IGNOREDUP"] then
				error("Raw category " .. category .. " defined in both [["
					.. datamodule .. "]] and [[" .. raw_categories[category].module .. "]].")
			end
			data.module = datamodule
			raw_categories[category] = data
		end
	end
	if retval["HANDLERS"] then
		for _, handler in ipairs(retval["HANDLERS"]) do
			table.insert(handlers, { module = datamodule, handler = handler })
		end
	end
	if retval["RAW_HANDLERS"] then
		for _, handler in ipairs(retval["RAW_HANDLERS"]) do
			table.insert(raw_handlers, { module = datamodule, handler = handler })
		end
	end
end

-- Add child categories to their parents
local function add_children_to_parents(hierarchy, raw)
	for key, data in pairs(hierarchy) do
		local parents = data.parents
		if parents then
			if type(parents) ~= "table" then
				parents = {parents}
			end
			if parents.name or parents.module then
				parents = {parents}
			end
			for _, parent in ipairs(parents) do
				if type(parent) ~= "table" or not parent.name and not parent.module then
					parent = {name = parent}
				end
				if parent.name and not parent.module and type(parent.name) == "string" and not parent.name:find("^หมวดหมู่:") then
					local parent_is_raw
					if raw then
						parent_is_raw = not parent.is_label
					else
						parent_is_raw = parent.raw
					end
					-- Don't do anything if the child is raw and the parent is lang-specific,
					-- otherwise e.g. "Lemmas subcategories by language" will be listed as a
					-- child of every "LANG lemmas" category.
					-- FIXME: We need to rethink this mechanism.
					if not raw or parent_is_raw then
						local child_hierarchy = parent_is_raw and raw_categories or labels
						if child_hierarchy[parent.name] then
							local child = {name = key, sort = parent.sort, raw = raw}
							if child_hierarchy[parent.name].children then
								table.insert(child_hierarchy[parent.name].children, child)
							else
								child_hierarchy[parent.name].children = {child}
							end
						end
					end
				end
			end
		end
	end
end

add_children_to_parents(labels)
add_children_to_parents(raw_categories, true)

return {
	LABELS = labels, RAW_CATEGORIES = raw_categories,
	HANDLERS = handlers, RAW_HANDLERS = raw_handlers
}