Documentation for this module may be created at Module:documentation/doc

local export = {}

-- it is either here, or in [[Module:ugly hacks]], and it is not in ugly hacks.
function export.CONTENTMODEL()
	return mw.title.getCurrentTitle().contentModel	
end

local skins = {
	["common"     ] = "";
	["vector"     ] = "Vector";
	["monobook"   ] = "Monobook";
	["cologneblue"] = "Cologne Blue";
	["modern"     ] = "Modern";
}

-- this is to automatically categorize data modules and prevent cluttering [[Cat:Uncategorized modules]]
local data_modules_regex_cats = {
	["^Module:data tables/data..?.?.?$"] = "Reference module sharded data tables",
	["^Module:Quotations/...?.?.?.?.?.?$"] = "Quotation data modules",
	["^Module:zh/data/.+[a-zA-z0-9]$"] = "ម៉ូឌុលទិន្នន័យភាសាចិន", -- capture submodules of zh/data that do not end with a hanzi in the title
	["^Module:zh/data/dial%-pron/"] = "Chinese dialectal pronunciation data modules",
	["^Module:zh/data/dial%-syn/"] = "Chinese dialectal synonyms data modules",
	["^Module:zh/data/glyph%-data/"] = "Chinese historical character forms data modules",
	["^Module:zh/data/ltc%-pron/"] = "ម៉ូឌុលទិន្នន័យរបៀបបន្លឺសូរភាសាចិនកណ្ដាល",
	["^Module:zh/data/och%-pron%-BS/"] = "ម៉ូឌុលទិន្នន័យរបៀបបន្លឺសូរភាសាចិនបុរាណ (Baxter-Sagart)",
	["^Module:zh/data/och%-pron%-ZS/"] = "ម៉ូឌុលទិន្នន័យរបៀបបន្លឺសូរភាសាចិនបុរាណ (Zhengzhang)",
	["^Module:Unicode data"] = "ម៉ូឌុលទិន្នន័យយូនីកូដ",
	["^Module:number list/data/"] = "Number data modules",
	["^Module:es%-conj/data/"] = "Spanish data modules"
}

function export.show(frame)
	local params = {
		["hr"] = {},
		["for"] = {},
		["from"] = {},
		["notsubpage"] = { type = "boolean", default = false },
		["nodoc"] = { type = "boolean", default = false },
	}
	
	local args = require("Module:parameters").process(frame.args, params)
	
	local output = { '\n<div class="documentation" style="display:block; clear:both">\n' }
	local cats = {}
	
	if (not args.hr) or (args.hr == "above") then
		output[#output + 1] = "----\n"
	end
	
	local title = ((args['for'] ~= "") and args['for']) and mw.title.new(args['for']) or mw.title.getCurrentTitle()
	local doc_title = mw.title.new((args['from'] ~= "") and args['from'] or (title.fullText .. '/documentation'))
	
	local pagetype = "ទំព័រ" .. mw.getContentLanguage():lcfirst(title.nsText)
	local preload

	local user_name, skin_name

	if title.contentModel == "javascript" then
		pagetype = "ស្គ្រីប"
		preload  = 'ទំព័រគំរូ:documentation/preloadTemplate' -- XXX
		if title.nsText == 'អ្នកប្រើប្រាស់' then
			user_name = title.rootText	
		end
	elseif title.contentModel == "css" then
		pagetype = "ស្តែលស៊ីត"
		preload  = 'ទំព័រគំរូ:documentation/preloadTemplate' -- XXX
		if title.nsText == 'អ្នកប្រើប្រាស់' then
			user_name = title.rootText	
		end
	elseif title.contentModel == "Scribunto" then
		pagetype = "ម៉ូឌុល"
		user_name = title.rootText:match("^អ្នកប្រើប្រាស់:(.+)")
		if user_name then
			preload  = 'ទំព័រគំរូ:documentation/preloadModuleSandbox'
		else
			preload  = 'ទំព័រគំរូ:documentation/preloadModule'
		end
	elseif title.nsText == "ទំព័រគំរូ" then
		pagetype = "ទំព័រគំរូ"
		preload  = 'ទំព័រគំរូ:documentation/preloadTemplate'
	elseif title.nsText == "វិគីនានុក្រម" then
		pagetype = "ទំព័រគម្រោងការ"
		preload  = 'ទំព័រគំរូ:documentation/preloadTemplate' -- XXX
	end
	
	local old_title
	if doc_title.isRedirect then
		old_title = doc_title
		doc_title = mw.title.new(string.match(doc_title:getContent(), "^#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]]-)%]%]") or string.match(doc_title:getContent(), "^#ប្ដូរវិធី%s*:?%s*%[%[([^%[%]]-)%]%]"))
	end
	
	local fallback_docs

	output[#output + 1] = "<dl class=\"plainlinks\" style=\"font-size: smaller;\">"
	if doc_title.exists then
		output[#output + 1] =
			"<dd><i style=\"font-size: larger;\">[[Help:Documenting templates and modules|ឯកសារកម្ម]]តទៅនេះស្ថិតនៅ[[" .. doc_title.fullText .. "]]។ " ..
			"<sup>[[" .. doc_title:fullUrl { action = 'edit' } .. " កែប្រែ]]</sup> </i></dd>"
	else
		if title.contentModel == "Scribunto" then
			local automatic_cat = "ម៉ូឌុលដែលមិនទាន់ចាត់ថ្នាក់ក្រុម"
			if user_name then
				fallback_docs = 'documentation/fallback/user module'
				automatic_cat = "ម៉ូឌុលប្រអប់ខ្សាច់អ្នកប្រើប្រាស់"
			else
				local categorized = false
				for r, cat in pairs(data_modules_regex_cats) do 
					if mw.ustring.match(title.fullText, r) then
						automatic_cat = cat;
						break
					end
				end
			end
			cats[#cats + 1] = automatic_cat
			
			if automatic_cat == "ម៉ូឌុលដែលមិនទាន់ចាត់ថ្នាក់ក្រុម" and not fallback_docs then --meaning module is not in user's sandbox or on of many datamodule boring series
				cats[#cats + 1] = "ទំព័រគំរូ និងម៉ូឌុលត្រូវការឯកសារកម្ម"
			end
		elseif title.nsText == "ទំព័រគំរូ" then
			--cats[#cats + 1] = "ម៉ូឌុលដែលមិនទាន់ចាត់ថ្នាក់ក្រុម"

			if not ( fallback_docs or args.nodoc ) then
				cats[#cats + 1] = "ទំព័រគំរូ និងម៉ូឌុលត្រូវការឯកសារកម្ម"
			end
		elseif (title.contentModel == "css") or (title.contentModel == "javascript") then
			if user_name then
				skin_name = skins[title.text:sub(#title.rootText + 1):match("^/([a-z]+)%.[jc]ss?$")]
				if skin_name then
					fallback_docs = 'documentation/fallback/user ' .. title.contentModel
				end
			end
		end
		
		if not args.nodoc then
			output[#output + 1] =
				"<dd><i style=\"font-size: larger;\">" .. pagetype .. "នេះខ្វះនូវ[[Help:Documenting templates and modules|ទំព័ររងឯកសារកម្ម]]។ " ..
				(fallback_docs and "អ្នកអាចនឹង" or "សូម") ..
				"[" .. doc_title:fullUrl { action = 'edit', preload = preload } .. " បង្កើតវា]។</i></dd>\n"
		end
	end
	
	if title.fullText:match("^MediaWiki:Gadget%-") then
		local is_gadget = false
		local gadget_list = mw.title.new("MediaWiki:Gadgets-definition"):getContent()
		
		for line in mw.text.gsplit(gadget_list, "\n") do
			local gadget, opts, items = line:match("^%*%s*([A-Za-z][A-Za-z0-9_%-]*)%[(.-)%]|(.+)$")
			if not gadget then
				gadget, items = line:match("^%*%s*([A-Za-z][A-Za-z0-9_%-]*)|(.+)$")
			end
			
			if gadget then
				items = mw.text.split(items, "|")
				for i, item in ipairs(items) do
					if title.fullText == ("MediaWiki:Gadget-" .. item) then
						is_gadget = true

						output[#output + 1] = "<dd> '' ស្គ្រីបនេះជាផ្នែកមួយនៃ<code>"
						output[#output + 1] = gadget
						output[#output + 1] = "</code> (["
						output[#output + 1] = tostring(mw.uri.fullUrl('MediaWiki:Gadgets-definition', 'action=edit'))
						output[#output + 1] = " កែប្រែនិយមន័យ)'' <dl>"
						
						output[#output + 1] = "<dd> '' ពិពណ៌នា (["
						output[#output + 1] = tostring(mw.uri.fullUrl('MediaWiki:Gadget-' .. gadget, 'action=edit'))
						output[#output + 1] = " កែប្រែ])'': "
						output[#output + 1] = mw.message.new('Gadget-' .. gadget):plain()
						output[#output + 1] = " </dd>"

						table.remove(items, i)
						if #items > 0 then
							for j, item in ipairs(items) do
								items[j] = '[[MediaWiki:Gadget-' .. item .. '|' .. item .. ']]'
							end
							output[#output + 1] = "<dd> '' ផ្នែកផ្សេងៗ'': "
							output[#output + 1] = mw.text.listToText(items)
							output[#output + 1] = "</dd>"
						end

						output[#output + 1] = "</dl></dd>"

						break
					end
				end
			end
		end
		
		if not is_gadget then
			output[#output + 1] = "<dd> ''ស្គ្រីបនេះមិនមែនជាផ្នែកណាមួយនៃ["
			output[#output + 1] = tostring(mw.uri.fullUrl('ពិសេស:Gadgets', 'uselang=en'))
			output[#output + 1] = ' ឧបករណ៍បង្គ្រប់] (['
			output[#output + 1] = tostring(mw.uri.fullUrl('MediaWiki:Gadgets-definition', 'action=edit'))
			output[#output + 1] = ' កែប្រែនិយមន័យ])។</dd>'
		--else
		--	cats[#cats + 1] = "ឧបករណ៍បង្គ្រប់វិគីនានុក្រម"
		end
	end	
	
	if old_title then
		output[#output + 1] = "<dd> ''បញ្ជូនបន្តពី'' ["
		output[#output + 1] = old_title:fullUrl { redirect = 'no' }
		output[#output + 1] = " "
		output[#output + 1] = old_title.fullText
		output[#output + 1] = "] (["
		output[#output + 1] = old_title:fullUrl { action = 'edit' }
		output[#output + 1] = " កែប្រែ])</dd>\n"
	end
	
	local links = {}
	
	if title.isSubpage and not args.notsubpage then
		links[#links + 1] = "[[:" .. title.nsText .. ":" .. title.rootText .. "|ទំព័រឫសគល់]]"
		links[#links + 1] = "[[ពិសេស:PrefixIndex/" .. title.nsText .. ":" .. title.rootText .. "/|ទំព័ររងរបស់ទំព័រឫសគល់]]"
	else
		links[#links + 1] = "[[ពិសេស:PrefixIndex/" .. title.fullText .. "/|បញ្ជីទំព័ររង]]"
	end
	
	if (title.contentModel == "javascript") or (title.contentModel == "css") then
		links[#links + 1] = "[[ពិសេស:WhatLinksHere/" .. title.fullText .. "|អ្វីដែលតភ្ជាប់នៅទីនេះ]]"

		if user_name then
			links[#links + 1] = "[[ពិសេស:MyPage" .. title.text:sub(#title.rootText + 1) .. "|របស់អ្នកផ្ទាល់]]"
		end
	else
		links[#links + 1] =
			'[' .. tostring(mw.uri.fullUrl('ពិសេស:WhatLinksHere/' .. title.fullText, 'hidelinks=1&hideredirs=1')) ..
			' សម្រង់] '

		if title.contentModel ~= "Scribunto" then
			links[#links + 1] =
				'[' .. tostring(mw.uri.fullUrl('ពិសេស:WhatLinksHere/' .. title.fullText, 'hidelinks=1&hidetrans=1')) ..
				' ការបញ្ជូនបន្ត] '
		end
	end
	
	if title.contentModel == "Scribunto" then
		if title.isSubpage and (title.subpageText == "testcases") then
			links[#links + 1] = " [[:" .. title.nsText .. ":" .. title.baseText .. "|ម៉ូឌុលបានសាក]]"
		else
			links[#links + 1] = " [[" .. title.fullText .. "/testcases|សំណុំល្បង]]"
		end

		if user_name then
			links[#links + 1] = "[[អ្នកប្រើប្រាស់:" .. user_name .. "|ទំព័រអ្នកប្រើប្រាស់]]"
			links[#links + 1] = "[[សន្ទនាអ្នកប្រើប្រាស់:" .. user_name .. "|ទំព័រសន្ទនាអ្នកប្រើប្រាស់]]"
			links[#links + 1] = "[[ពិសេស:PrefixIndex/អ្នកប្រើប្រាស់:" .. user_name .. "/|លំហអ្នកប្រើប្រាស់]]"
		end
	end
	
	if #links > 0 then
		output[#output + 1] =
			"<dd> '' តំណភ្ជាប់មានប្រយោជន៍ '': " .. table.concat(links, " • ") .. "</dd>"
	end
	
	output[#output + 1] = "</dl>\n"

	if doc_title.exists then
		output[#output + 1] = frame:expandTemplate { title = doc_title.fullText }
	elseif fallback_docs then
		output[#output + 1] = frame:expandTemplate {
			title = fallback_docs;
			args = {
				['user'] = user_name;
				['page'] = title.fullText;
				['skin name'] = skin_name;
			}
		}
	end

	if args.hr == "below" then
		output[#output + 1] = '\n<hr style="clear: both;" />'
	else
		output[#output + 1] = '\n<br style="clear: both;" />'
	end
	
	for _, cat in ipairs(cats) do
		output[#output + 1] = "[[ចំណាត់ថ្នាក់ក្រុម:" .. cat .. "]]"
	end
	
	output[#output + 1] = "</div>\n"

	return table.concat(output)
end

function export.translitModuleLangList(frame)
	local output = {}
	
	local pagename, subpage
	
	if frame.args[1] then
		pagename = frame.args[1]
	else
		local title = mw.title.getCurrentTitle()
		subpage = title.subpageText
		pagename = title.text
		
		if subpage ~= pagename then
			pagename = title.rootText
		end
	end
	
	local translitModule = pagename
	
	local languageObjects = require("Module:languages/byTranslitModule")(translitModule)
	local codeInPagename = mw.ustring.match(pagename, "^(.-)%-translit")
	
	if not codeInPagename then
		return ""
	end
	
	local langs = {}
	local codeInPagenameInList = false
	local category = ""
	if #languageObjects ~= 0 and subpage ~= "documentation" then
		local agreement = #languageObjects == 1 and "" or "s"
		category = "[[ចំណាត់ថ្នាក់ក្រុម:Transliteration modules used by " .. #languageObjects .. " language" .. agreement .. "]]"
	end
	
	for i, lang in pairs(languageObjects) do
		if lang:getCode() == codeInPagename then
			table.remove(languageObjects, i)
			codeInPagenameInList = true
		end
	end
	
	if #languageObjects == 0 then
		return category or ""
	elseif #languageObjects > 2 then
		for i, lang in pairs(languageObjects) do
			table.insert(langs, "[[:ចំណាត់ថ្នាក់ក្រុម:" .. lang:getCategoryName() .. "|" .. lang:getCanonicalName() .. "]] (<code>" .. lang:getCode() .. "</code>)")
			if languageObjects[i + 2] then
				table.insert(langs, ", ")
			elseif languageObjects[i + 1] then
				table.insert(langs, '<span class="serial-comma">,</span> and ')
			end
		end
	else
		for i, lang in pairs(languageObjects) do
			table.insert(langs, "[[:ចំណាត់ថ្នាក់ក្រុម:" .. lang:getCategoryName() .. "|" .. lang:getCanonicalName() .. "]] (<code>" .. lang:getCode() .. "</code>)")
			
			if languageObjects[i + 1] then
				table.insert(langs, " និង ")
			end
		end
	end
	
	langs = table.concat(langs)
	
	return "It is " .. ( codeInPagenameInList and "also" or "" ) ..
		" used to transliterate " .. langs .. "." .. category
end

return export