Module documentation[view] [edit] [history] [purge]
This module implements a metatemplate, and may be invoked by templates using its corresponding template Template:Numlinks, or used directly from other modules.

This module generates previous and next links for a numbered page.


Introspection summary for Module:Numlinks 
Functions provided (4)
Line Function Params
13 _numlinks (main) (args)
105 numlinks_2num (args)
130 numlinks (invokable) (frame)
155 tester none
Lua modules required (3)
Variable Module Functions used
getArgs Module:Arguments getArgs
ordinal Module:Ordinal _ordinal
yesno Module:Yesno yesno

No function descriptions were provided. The Lua code may have further information.


-- Page is following provisonal style guide: User:Ganaram_inukshuk/Provisional_style_guide_for_Lua
local getArgs = require("Module:Arguments").getArgs
local ordinal = require("Module:Ordinal"  )._ordinal
local yesno   = require("Module:Yesno"    )

local p = {}

-- TODO:
-- - Split into two modules: Numlinks and Numlinks-2D, since behaviors are too
--   dissimilar to keep within one module

-- Main function
function p._numlinks(args)
	local num_links  = args["Link Count"] or 1	-- Number of links to produce in each direction (left/prev and right/next)
	local curr_num   = args["Num"]				-- Current number
	local min_num    = args["Min"] or 1			-- Smallest allowed number
	local link_text  = args["Link Text"] or { "", "" }		-- Text for a link is "<pre-text><num><post-text>"
	local disp_text  = args["Displayed Text"] or nil		-- Option for if the text to display is different from the link (EG, "4L 5s <3/1>"" vs "4L 5s (3/1-equivalent)")
	local curr_text  = args["Current Page Text"] or nil		-- Option for if the text to display for the current page is different from the link text; by default, this is the same as the link text
	local is_ordinal = yesno(args["Is Ordinal"], false)		-- Option to convert numbers to ordinal (EG, 3rd-octave temperament)
	local is_table   = yesno(args["Is Table"  ], true )		-- Output is displayed in a 1-row 3-col table by default; setting this to false formats it as one line.
	
	-- Preprocess link text, displayed text, and current-page text
	if #link_text == 1 then
		link_text = { "", link_text[1] }
	end
	if disp_text ~= nil then
		if #disp_text == 1 then
			disp_text = { "", disp_text[1] }
		end
	end
	if curr_text ~= nil then
		if #curr_text == 1 then
			curr_text = { "", curr_text[1] }
		end
	end
	
	-- Prev lines; start with left arrow, if applicable
	-- After each link produced, add a bullet as a separator
	local prev_lines = {}
	if curr_num - num_links >= min_num then
		table.insert(prev_lines, "&larr;")
	end
	for i = num_links, 1, -1 do
		local num = is_ordinal and ordinal(curr_num - i) or string.format("%s", curr_num - i)
		
		-- Only add links if they're not less than the minimum
		if curr_num - i >= min_num then
			local link = (disp_text == nil
				and string.format("[[%s%s%s]]", link_text[1], num, link_text[2])											-- Link text is what's displayed
				or  string.format("[[%s%s%s|%s%s%s]]", link_text[1], num, link_text[2], disp_text[1], num, disp_text[2])	-- Displayed text is different from that of the link
			)
			
			table.insert(prev_lines, link)
			table.insert(prev_lines, "&bull;")
		end
	end
	
	-- Produce next links; before each link, add a bullet as a separator
	local next_lines = {}
	for i = 1, num_links do
		local num = is_ordinal and ordinal(curr_num + i) or string.format("%s", curr_num + i)
		
		local link = (disp_text == nil
			and string.format("[[%s%s%s]]", link_text[1], num, link_text[2])											-- Link text is what's displayed
			or  string.format("[[%s%s%s|%s%s%s]]", link_text[1], num, link_text[2], disp_text[1], num, disp_text[2])	-- Displayed text is different from that of the link
		)
		
		-- Insert to lines
		table.insert(next_lines, "&bull;")
		table.insert(next_lines, link)
	end

	-- Add right arrow
	table.insert(next_lines, "&rarr;")
	
	-- Produce current page text
	local curr_num_text = is_ordinal and ordinal(curr_num) or string.format("%s", curr_num)
	local curr_page_text = (disp_text == nil
		and string.format("'''%s%s%s'''", link_text[1], curr_num_text, link_text[2])	-- Current-page text is the same as that of its links
		or  string.format("'''%s%s%s'''", curr_text[1], curr_num_text, curr_text[2])	-- Displayed text is different from that of the link
	)
	
	if is_table then
		local lines = {}
		table.insert(lines, '{| style="width: 100%;"')
		table.insert(lines, '|-')
		table.insert(lines, '| style="font-size: 0.75em;" | ' .. table.concat(prev_lines, "&nbsp;"))
		table.insert(lines, '| style="width: 50%;" | ' .. curr_page_text)
		table.insert(lines, '| style="font-size: 0.75em;" | ' .. table.concat(next_lines, "&nbsp;"))
		table.insert(lines, '|}')
		
		return table.concat(lines, "\n")
	else
		local lines = {}
		table.insert(lines, table.concat(prev_lines, "&nbsp;"))
		table.insert(lines, curr_page_text)
		table.insert(lines, table.concat(next_lines, "&nbsp;"))
		
		return table.concat(lines, "&nbsp;")
	end
end

-- wip; to be placed in its own module
function p.numlinks_2num(args)
	local curr_num_1   = args["Num 1"]
	local min_num_1    = args["Min 1"] or 1
	local curr_num_2   = args["Num 2"]
	local min_num_2    = args["Min 2"] or 1
	local disp_text    = args["Page Text"] or { "PRE-TEXT", "MID-TEXT", "POST-TEXT" }
	local link_text    = args["Link Text"] or nil
	local is_ordinal_1 = args["Is Ordinal 1"] ~= nil and args["Is Ordinal 1"] or false
	local is_ordinal_2 = args["Is Ordinal 1"] ~= nil and args["Is Ordinal 2"] or false
	
	local x = curr_num_1
	local y = curr_num_2
	local link_nums = {
		{x-1, y-1}, {x  , y-1}, {x+1, y-1},
		{x-1, y  },             {x+1, y  },
		{x-1, y+1}, {x  , y+1}, {x+1, y+1}
	}
	
	local links = {}
	for i = 1, #link_nums do
		
	end
end

-- Main function (TODO: split functionality into two modules)
function p.numlinks(frame)
	local args = getArgs(frame)
	
	args["Num"] = tonumber(args["Num"]) or 123
	args["Min"] = tonumber(args["Min"]) or 1
	args["Link Count"] = tonumber(args["Link Count"]) or 1
	
	args["Link Text"] = {args["Link Pretext"], args["Link Posttext"]}
	args["Link Pretext"] = nil
	args["Link Posttext"] = nil
	
	args["Displayed Text"] = {args["Displayed Pretext"], args["Displayed Posttext"]}
	args["Displayed Pretext"] = nil
	args["Displayed Posttext"] = nil
	
	args["Current Page Text"] = {args["Current Page Pretext"], args["Current Page Posttext"]}
	args["Current Page Pretext"] = nil
	args["Current Page Posttext"] = nil
	
	-- Create numbered navigation links
	local result = p._numlinks(args)

	return result
end

function p.tester()
	local args = {
		["Link Count"] = 3,
		["Num"]        = 3,
		["Link Text"]  = {"-octave temperaments"},
		["Displayed Text"] = {""},
		["Current Page Text"] = {"-octave"},
		["Is Ordinal"] = 1,
		["Is Table"  ] = 1
	}
	
	return p._numlinks(args)
end

return p