Module:Numlinks

From Xenharmonic Wiki
Jump to navigation Jump to search

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

-- Page is following provisonal style guide: User:Ganaram_inukshuk/Provisional_style_guide_for_Lua

local ordinal = require("Module:Ordinal")._ordinal

local p = {}

function p.side_numlinks(num_links, curr_num, min_num, page_text, link_text, is_ordinal)
	local num_links  = num_links or 3
	local curr_num   = curr_num or 2
	local min_num    = min_num or 1
	local page_text  = page_text or { "PRE-TEXT", "POST-TEXT" }
	local link_text  = link_text or nil
	local is_ordinal = is_ordinal ~= nil and is_ordinal or false
	
	-- Preprocess page and link text
	if #page_text == 1 then
		page_text = { "", page_text[1] }
	end
	if link_text ~= nil then
		if #link_text == 1 then
			link_text = { "", link_text[1] }
		end
	end
	
	-- Produce next links
	local next_links = ""
	for i = 1, num_links do
		local link = ""
		local num = is_ordinal and ordinal(curr_num + i) or string.format("%s", curr_num + i)
		if link_text == nil then
			-- Link text is the same as the page text
			link = string.format("[[%s%s%s]]", page_text[1], num, page_text[2])
		else
			-- Link and page text are different
			link = string.format("[[%s%s%s|%s%s%s]]", page_text[1], num, page_text[2], link_text[1], num, link_text[2])
		end
		next_links = next_links .. link .. (i == num_links and "" or " ")
	end
	
	-- Produce prev links
	local prev_links = ""
	for i = 1, num_links do
		local link = ""
		local num = is_ordinal and ordinal(curr_num - i) or string.format("%s", curr_num - i)
		if curr_num - i >= min_num then
			if link_text == nil then
				-- Link text is the same as the page text
				link = string.format("[[%s%s%s]]", page_text[1], num, page_text[2])
			else
				-- Link and page text are different
				link = string.format("[[%s%s%s|%s%s%s]]", page_text[1], num, page_text[2], link_text[1], num, link_text[2])
			end
			prev_links = (curr_num - i <= min_num and "" or "&nbsp;") .. link .. prev_links
		end
	end
	
	return { prev_links, next_links }
end

function p.eight_numlinks(curr_num_1, curr_num_2, min_num, page_text, link_text)
	
end

-- Generate a table of previous and next links for numbered pages, with support
-- for up to two numbers. Args are as follows:
-- - Is ordinal: should the values be cardinal numbers (eg, 12edo) or ordinal
--   numbers (eg, 12th-octave)?
-- - Page text: Text is formatted as [pre-text][n][post-text], stored in a table
--   { pre } or { pre, post }. If the link config is for 8 links, then text is
--   formatted as [pre-text][n][mid-text][m][post-text], stored in a table
--   { mid, post } or { pre, mid, post }. Pre-text can be omitted since most
--   pages don't have pre-text (12edo, 5L 2s). 
-- - Link text: Same as page text, except this changes the text of the link. If
--   this is not specified, then the page and link text are the same.
-- - Min: The smallest allowed value for a numbered link. Default is 1. There
--   isn't a maximum since these numbers are assumed to be either natural or
--   whole numbers.
function p._numlinks(args)
	local num_links  = args["Num Links"]
	local is_ordinal = args["Is Ordinal"] ~= nil and args["Is Ordinal"] or false
	local page_text  = args["Page Text"]
	local link_text  = args["Link Text"]
	local min_num    = args["Min Num"] ~= nil and args["Min Num"] or 1
	local curr_num_1 = args["Num 1"]
	local curr_num_2 = args["Num 2"]
	
	-- Create numbered navigation links
	local navigation_links = {}
	if curr_num_2 == nil then
		navigation_links = p.side_numlinks(num_links, curr_num[1], min_num, page_text, link_text, is_ordinal)
	end

	return navigation_links
end

return p