Module:Lang/documentor tool
require('Module:No globals');
 local p = {};
 
 --[[-------------------------&lt; L A N G - X X _ S E T T I N G S &gt;-----------------------------------------------
 
 {{#invoke:Lang/documentor tool|lang_xx_settings|template={{ROOTPAGENAME}}}}
 
 reads the content of the template and extracts the parameters from {{#invoke:Lang|...}} for display on the template's
 documentation page
 
 ]]
 
 function p.lang_xx_settings (frame)
 	local page = mw.title.makeTitle ('Template', frame.args['template'] or frame.args[1]);	-- get a page object for this page in 'Template:' namespace
 	if not page then
 		return '';																-- TODO: error message?
 	end
 	
 	local content = page:getContent();											-- get unparsed content
 	if not page then
 		return '';																-- TODO: error message?
 	end
 
 	local out = {};
 	
 	local params;
 	local style;
 
 	if content:match ('{{%s*#invoke:%s*[Ll]ang%s*|[^|]+|[^}]+}}') or content:match ('{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+|[^}]+}}') then			-- if this template uses [[Module:Lang]]
 		params = content:match ('{{%s*#invoke:%s*[Ll]ang%s*|[^|]+(|[^}]+)}}') or content:match ('{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+(|[^}]+)}}')	-- extract the #invoke:'s parameters
 		if not params then 
 			return '';															-- there should be at least one or the template/module won't work TODO: error message?
 		end
 		table.insert (out, '{| class=&quot;wikitable&quot; style=&quot;text-align:right; float:right&quot;\n|+settings')	-- start a wikitable
 		for k, v in params:gmatch ('%s*|%s*([^%s=]+)%s*=%s*([^%s|]+)') do		-- get the parameter names (k) and values (v)
 			if 'label' == k then												-- special case for labels because spaces and pipes
 				v = params:match ('label%s*=%s*(%[%[[^%]]+%]%])') or params:match ('label%s*=%s*([^|\n]+)') or 'missing label';
 			end
 			table.insert (out, table.concat ({k, '\n|', v}));					-- make rudimentary wikitable entries
 		end
 
 		style = content:match ('lang_xx_([^|]+)');
 		return table.concat ({table.concat (out,'\n|-\n! scope=&quot;row&quot; | '), '\n|-\n|colspan=&quot;2&quot;|style: ', style, '\n|-\n|}'});	-- add inter-row markup and close the wikitable and done
 	else
 		return '';																-- does not use [[Module:Lang]] so abandon quietly
 	end
 end
 
 
 --[[-------------------------&lt; U S E S _ M O D U L E &gt;---------------------------------------------------------
 
 {{#invoke:Lang/documentor tool|uses_module|template={{ROOTPAGENAME}}}}
 
 reads the content of the template to determine if this {{lang-xx}} template uses Module:Lang.  Returns the index
 of the substring '{{#invoke|lang|' in the template page content if true; empty string if false
 
 Used in template documentation {{#if:}} parser functions.
 
 ]]
 
 function p.uses_module (frame)
 	local page = mw.title.makeTitle ('Template', frame.args['template'] or frame.args[1]);	-- get a page object for this page in 'Template:' namespace
 	if not page then
 		return '';																-- TODO: error message?
 	end
 	
 	local content = page:getContent();											-- get unparsed content
 	if not page then
 		return '';																-- TODO: error message?
 	end
 	
 	return content:find ('{{%s*#invoke:[Ll]ang%s*|') or '';						-- return index or empty string
 end
 
 
 --[[--------------------------&lt; N O N _ E N _ S R C _ C A T &gt;--------------------------------------------------
 
 this function implements most of {{Non-English-language source category}}
 
 {{#invoke:lang/documentor tool|non_en_src_cat|{{{1|}}}}} - where {{{1|}}} is language code
 
 ]]
 
 function p.non_en_src_cat (frame)
 	local lang_code = frame.args[1]:match ('%(([%a%-]+)%)');						-- frame.args[1] is category page name; extract language code from that
 	local lang_name = require ('Module:Lang')._name_from_tag ({lang_code});		-- get language name from language code in cat name via Module:lang
 	local out = {};																-- bits of the output go here
 
 	table.insert (out, 'This is a tracking category for articles that use ');	-- static text
 	table.insert (out, frame:preprocess ('{{tlx|in lang|' .. lang_code .. '}}'));	-- preprocess
 	table.insert (out, ' to identify ');										-- more static text
 
 	if lang_name:find ('மொழி') then										-- is a language collective?
 		table.insert (out, '[[' .. lang_name .. ']]' .. '-collective');			-- say so
 	else
 		table.insert (out, '[[' .. lang_name .. ' மொழி|' .. lang_name .. ']] மொழி');
 	end
 	table.insert (out, ' sources.');											-- last bit of static text
 
 	local cat_art = mw.title.new ('பகுப்பு:' .. lang_name .. ' வார்த்தைகளைக் கொண்ட கட்டுரைகள்').exists;
 	local cat_with = mw.title.new ('Category:Articles with ' .. lang_name .. '-language external links').exists;	-- TODO: delete this because the cat will go away when {{xx icon}} templates replaced
 	local cat_cs1 = mw.title.new ('Category:CS1 ' .. lang_name .. '-language sources (' .. lang_code .. ')').exists;
 
 	if cat_art or cat_with or cat_cs1 then
 		table.insert (out, '\n\n==மேலும் பார்க்க==');									-- start see also section
 		if cat_art then
 			table.insert (out, '\n*[[:பகுப்பு:' .. lang_name .. ' வார்த்தைகளைக் கொண்ட கட்டுரைகள்]]');
 		end
 		if cat_with then
 			table.insert (out, '\n*[[:Category:Articles with ' .. lang_name .. '-language external links]]');		-- TODO: delete this because the cat will go away
 		end
 		if cat_cs1 then
 			table.insert (out, '\n*[[:Category:CS1 ' .. lang_name .. '-language sources (' .. lang_code .. ')]]');
 		end
 	end
 	table.insert (out, '[[Category:Articles_with_non-English-language_sources|' .. lang_code .. ']]')				-- and categorize this category; language code sortkey
 	return table.concat (out);													-- string it all together and done
 end