Mô đun:Category series navigation

require('strict')
local p = {}
local horizontal = require('Module:List').horizontal
--======================================================================**
--                                Globals                                   
--======================================================================**
local currtitle = mw.title.getCurrentTitle()
local nexistingcats = 0
local errors = 
local testcasecolon = 
local testcases = string.match(currtitle.subpageText, '^testcases')
if    testcases then testcasecolon = ':' end
local navborder = true
local followRs = true
local skipgaps = false
local skipgaps_limit = 50
local term_limit = 10
local hgap_limit = 6
local ygap_limit = 5
local listall = false
local tlistall = {}
local tlistallbwd = {}
local tlistallfwd = {}
local ttrackingcats = { --when reindexing, Ctrl+H 'trackcat(13,' & 'ttrackingcats16'
	, -- 1 placeholder for Thể loại:Category series navigation using cat parameter
	, -- 2 placeholder for Thể loại:Category series navigation using testcase parameter
	, -- 3 placeholder for Thể loại:Category series navigation using unknown parameter
	, -- 4 placeholder for Thể loại:Category series navigation range not using en dash
	, -- 5 placeholder for Thể loại:Category series navigation range abbreviated (CNBS)
	, -- 6 placeholder for Thể loại:Category series navigation range redirected (base change)
	, -- 7 placeholder for Thể loại:Category series navigation range redirected (var change)
	, -- 8 placeholder for Thể loại:Category series navigation range redirected (end)
	, -- 9 placeholder for Thể loại:Category series navigation range redirected (CNBS)
	, --10 placeholder for Thể loại:Category series navigation range redirected (other)
	, --11 placeholder for Thể loại:Category series navigation range gaps
	, --12 placeholder for Thể loại:Category series navigation range irregular
	, --13 placeholder for Thể loại:Category series navigation range irregular, 0-length
	, --14 placeholder for Thể loại:Category series navigation range ends (present)
	, --15 placeholder for Thể loại:Category series navigation range ends (blank, CNBS)
	, --16 placeholder for Thể loại:Category series navigation isolated
	, --17 placeholder for Thể loại:Category series navigation default season gap size
	, --18 placeholder for Thể loại:Category series navigation decade redirected
	, --19 placeholder for Thể loại:Category series navigation year redirected (base change)
	, --20 placeholder for Thể loại:Category series navigation year redirected (var change)
	, --21 placeholder for Thể loại:Category series navigation year redirected (other)
	, --22 placeholder for Thể loại:Category series navigation roman numeral redirected
	, --23 placeholder for Thể loại:Category series navigation nordinal redirected
	, --24 placeholder for Thể loại:Category series navigation wordinal redirected
	, --25 placeholder for Thể loại:Category series navigation TV season redirected
	, --26 placeholder for Thể loại:Category series navigation using skip-gaps parameter
	, --27 placeholder for Thể loại:Category series navigation year and range
	, --28 placeholder for Thể loại:Category series navigation year and decade
	, --29 placeholder for Thể loại:Category series navigation decade and century
	, --30 placeholder for Thể loại:Category series navigation in mainspace
	, --31 placeholder for Thể loại:Category series navigation redirection error
}
local avoidself =  (not string.match(currtitle.text, 'Category series navigation with') and
					not string.match(currtitle.text, 'Category series navigation.*/doc') and
					not string.match(currtitle.text, 'Category series navigation.*/sandbox') and
					currtitle.text ~= 'Category series navigation' and
					currtitle.nsText:gsub('_', ' ') ~= 'Thảo luận Thành viên' and -- phab:T369784
					currtitle.nsText:gsub('_', ' ') ~= 'Thảo luận Bản mẫu' and
					(currtitle.nsText ~= 'Bản_mẫu' or testcases)) --avoid nested transclusion errors (i.e. )
--======================================================================**
--                      Utility & category functions                        
--======================================================================**
--Determine if a category exists (in a function for easier localization).
local function catexists( title )
	return mw.title.new( title, 'Thể_loại' ).exists
end
--Error message handling.
function p.errorclass( msg )
	return mw.text.tag( 'span', {class='error mw-ext-cite-error'}, 'Lỗi! '..string.gsub(msg, '&#', '&#') )
end
--Failure handling.
function p.failedcat( errors, sortkey )
	if avoidself then
		return (errors or )..'***Category series navigation tạo navbox không thành công***'..
			   ..(sortkey or 'O')..'\n'
	end
	return 
end
--Tracking cat handling.
--	key: 15 (when reindexing ttrackingcats{}, Ctrl+H 'trackcat(13,' & 'ttrackingcats16')
--	cat: 'Category series navigation isolated';  to remove
--Used by main, all nav_*(), & several utility functions.
local function trackcat( key, cat )
	if avoidself and key and cat then
		if cat ~=  then
			ttrackingcatskey = ..testcasecolon..'Thể loại:'..cat..
		else
			ttrackingcatskey = 
		end
	end
	return
end
--Check for unknown parameters.
--Used by main only.
local function checkforunknownparams( tbl )
	local knownparams = { --parameter whitelist
		'min' = 'min',
		'max' = 'max',
		'cat' = 'cat',
		'show' = 'show',
		'testcase' = 'testcase',
		'testcasegap' = 'testcasegap',
		'skip-gaps' = 'skip-gaps',
		'list-all-links' = 'list-all-links',
		'follow-redirects' = 'follow-redirects',
	}
	for k, _ in pairs (tbl) do
		if knownparamsk == nil then
			trackcat(3, 'Category series navigation sử dụng tham số không rõ')
			break
		end
	end
end
--Check for nav_*() navigational isolation (not necessarily an error).
--Used by all nav_*().
local function isolatedcat()
	if nexistingcats == 0 then
		trackcat(16, 'Category series navigation cô lập')
	end
end
--Returns the target of , if it exists, else returns the original cat.
--, etc., if found, are evaluated.
--Used by catlinkfollowr(), and so indirectly by all nav_*().
local function rtarget( frame, cat )
	local catcontent = mw.title.new( cat or , 'Thể_loại' ):getContent()
	if string.match( catcontent or , '