local p = {}

local function getArgNums
 -- Returns a table containing the numbers of the arguments that exist for the specified prefix. For example, if the
 -- prefix was 'data', and 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
 local nums = {}
 for k, v in pairs(args) do
 local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
 if num then table.insert(nums, tonumber(num)) end
 end
 table.sort(nums)
 return nums
end

local function makeHorizontalRule
 local row = mw.html.create('tr')
 row
 return tostring(row)
end

local function makeItem
 local root = mw.html.create('li')
 root
 return tostring(root)
end

local function makeRow
 if #items < 1 then return end
 local swapHeadingSize = type(options) == 'table' and options.swapHeadingSize or false
 local row = mw.html.create('tr')
 row
 local list = row:tag('td'):css:tag('ul')
 for i, item in ipairs(items) do
 local image = item[1]
 local text = item[2]
 list
 end
 return tostring(row)
end

local function makeNumberedRow
 if args[prefix] then
 args[prefix .. '1'] = args[prefix]
 end
 local argNums = getArgNums
 local items = {}
 for i, argNum in ipairs(argNums) do
 local image, text = getItemValsFunc(args[prefix .. tostring(argNum)])
 table.insert
 end
 return makeRow
end

local function checkPortalExists(portal)
	return not (mw.title.makeTitle.id == 0)
end

local trackingEnabled = true

-- Check whether to do tracking in this namespace
-- Returns true unless the page is one of the banned namespaces
local function checkTrackingNamespace
	local thisPage = mw.title.getCurrentTitle
	if (thisPage.namespace == 1) -- Talk
		or (thisPage.namespace == 2) -- User
		or (thisPage.namespace == 3) -- User talk
		or (thisPage.namespace == 5) -- Wikipedia talk
		or (thisPage.namespace == 7) -- File talk
		or (thisPage.namespace == 11) -- Template talk
		or (thisPage.namespace == 15) -- Category talk
		or (thisPage.namespace == 101) -- Portal talk
		or (thisPage.namespace == 118) -- Draft
		or (thisPage.namespace == 119) -- Draft talk
		or (thisPage.namespace == 829) -- Module talk
		then
		return false
	end
	return true
end

-- Check whether to do tracking on this pagename
-- Returns false if the page title matches one of the banned strings
-- Otherwise returns true
local function checkTrackingPagename
	local thisPage = mw.title.getCurrentTitle
	local thisPageLC = mw.ustring.lower(thisPage.text)
	if (string.match ~= nil) then
		return false
	end
	if (string.match ~= nil) then
		return false
	end
	if (string.match ~= nil) then
		return false
	end
	return true
end

local redlinkedportal = ""

function p._main(args)
	-- Tracking is on by default.
	-- It is disabled if any of the following is true
	-- 1/ the parameter "tracking" is set to 'no, 'n', or 'false'
	-- 2/ the current page fails the namespace tests in checkTrackingNamespace
	-- 3/ the current page fails the pagename tests in checkTrackingPagename
	if (args.tracking == 'no') or (args.tracking == 'n') or (args.tracking == 'false') then
		trackingEnabled = false
	end
	if (checkTrackingNamespace == false) then
		trackingEnabled = false
	end
	if (checkTrackingPagename == false) then
		trackingEnabled = false
	end

 local rows = {}
 --[=[ disabled per Wikipedia:Village pump (technical)/Archive 176#Suppress rendering of Template:Wikipedia books
 -- Get the book row text.
 local bookHeading = "**Books**"
 local bookSubheading = 'View or order collections of articles'
 local function getBookItemVals(book)
 local image = '30px|alt=|link='
 local text = mw.ustring.format
 return image, text
 end
 local bookRow = makeNumberedRow
 table.insert
 ]=]
 -- Get the portal row text
 local portalHeading = "**Portals**"
 local portalSubheading = 'Access related topics'
 local function getPortalItemVals(portal)
 local image = mw.ustring.format
 local text = mw.ustring.format
		if not pcall or not checkPortalExists(portal) then
			-- Getting here means a redlinked portal has been found
				if trackingEnabled then
					redlinkedportal = 'Category:Subject bar templates with redlinked portals'
				end
		end
 return image, text
 end
 local portalRow = makeNumberedRow
 table.insert

 -- Get the sister projects row text.
 local sisters = {
 local sisterItems = {}
 for i, t in ipairs(sisters) do
 if args[t.arg] then
 -- Get the image value.
 local image = mw.ustring.format
 -- Get the text value.
 local prefix = t.prefix
 local search = args[t.arg .. '-search'] or mw.title.getCurrentTitle.text
 local postfix = t.postfix
 postfix = postfix and ('#' .. postfix) or ''
 local display = t.display
 local from = t.from
 local text = mw.ustring.format
 if t.arg == 'spoken' then
 	 text = mw.ustring.format		
 end
 -- Add the values to the items table.
 table.insert
 end
 end
 local sisterHeading = "Find out more onWikipedia's"
 local sisterSubheading = "**Sister projects**"
 local sisterRow = makeRow
 table.insert

 -- Make the table.
 local root = mw.html.create('table')
 root

 return tostring(root)
end

function p.main(frame)
 -- If called via #invoke, use the args passed into the invoking template, or the args passed to #invoke if any exist. Otherwise
 -- assume args are being passed directly in from the debug console or from another Lua module.
 local origArgs
 if frame == mw.getCurrentFrame then
 origArgs = frame:getParent.args
 for k, v in pairs(frame.args) do
 origArgs = frame.args
 break
 end
 else
 origArgs = frame
 end
 -- Remove blank arguments.
 local args = {}
 for k, v in pairs(origArgs) do
 if v ~= '' then
 args[k] = v
 end
 end
 return frame:extensionTag{ name = 'templatestyles', args = { src = 'Subject bar/styles.css'} } .. p._main(args) .. redlinkedportal
end