モジュール:Biglist

-- This module provides some functions to help avoid problems with templates
-- that might exceed expand size or time and which might put the page in
-- :Category:Pages where template include size is exceeded or
-- :Category:Pages with script errors (time exceeding 10 seconds).
local function collection()
	-- Return a table to hold items.
	return {
		n = 0,
		add = function (self, item)
			self.n = self.n + 1
			selfself.n = item
		end,
		join = function (self, sep)
			return table.concat(self, sep)
		end,
	}
end
local function strip_to_nil(text)
	-- If text is a string, return its trimmed content, or nil if empty.
	-- Otherwise return text (which may, for example, be nil).
	if type(text) == 'string' then
		text = text:match('(%S.-)%s*$')
	end
	return text
end
local function message(msg, nocat)
	-- Return formatted message text for an error.
	-- Can append "#FormattingError" to URL of a page with a problem to find it.
	-- This should not be called because there is no validity checking.
	local anchor = 
	local category = nocat and  or 
	return anchor ..
		'Error: ' ..
		msg ..
		 ..
		category .. '\n'
end
local function urlencode(text)
	-- Return equivalent of .
	local function byte(char)
		return string.format('%%%02X', string.byte(char))
	end
	return text:gsub('^ %w%-._', byte):gsub(' ', '+')
end
local function replace2(text, template)
	-- Return template after substituting text and urlencoded text.
	local plain = text:gsub('%%', '%%%%')  -- for gsub, '%' has a special meaning in replacement
	local plainp = plain:gsub(' ', '+')    -- plain and space replaced with plus
	local encoded = urlencode(text):gsub('%%', '%%%%')
	return template:gsub(, plain):gsub(, plainp):gsub(, encoded)
end
local function clean(text, default)
	-- Return text, if not empty, after trimming leading/trailing whitespace.
	-- Otherwise return default which may be nil.
	if text then
		text = text:match("^%s*(.-)%s*$")
		if text ~=  then
			return text
		end
	end
	return default
end
local function make_list(args, formatter, template)
	-- Return a list of formatted items.
	-- Input is a string of multiple lines, one item per line.
	local text = args.list or args1 or 
	local prefix = clean(args.prefix) or 
	local comment = clean(args.comment)
	local results = collection()
	for line in string.gmatch(text .. '\n', '\t *(.-)\t\r *\n') do
		-- Skip line if empty or a comment.
		if line ~=  then
			if not (comment and line:sub(1, #comment) == comment) then
				results:add(prefix .. formatter(line, template))
			end
		end
	end
	return results:join('\n')
end
local templates = {
	-- Equivalent of text.
	userlinks = =
(talk · contribs · deleted contribs · //en.wikipedia.org/w/index.php?title=Special:Log&user= logs · //en.wikipedia.org/w/index.php?title=Special:AbuseLog&wpSearchUser= edit filter log · block user · //en.wikipedia.org/w/index.php?title=Special:Log&type=block&page=User: block log)=,
	-- Equivalent of how topic is used.
	topicsearch = =
– (//en.wikipedia.org/w/index.php?title=Special:Search&search= wp  gwp  g  bwp  b |  eb  1911  co  gct  sw  arc  ht)=,
}
local function main(formatter, tname)
	local template = templatestname
	if template then
		return function (frame)
			local args = frame.args
			local success, result = pcall(make_list, args, formatter, template)
			if success then
				return result
			end
			return message(result, clean(args.nocat))
		end
	else
		return function (frame)
			local args = frame.args
			return message('Unknown template name "' .. tname .. '"', clean(args.nocat))
		end
	end
end
local function columnslist(frame)
	-- List of least concern fishes has problem exceeding template expansion size.
	-- Will possibly be other articles with similar problems.
	-- Following are equivalent:
	--   xxx
	--   xxx
	-- Output is:
	--   xxx
	-- This assumes colwidth is wanted and does not emulate other features of the template.
	local args = frame.args
	local content = strip_to_nil(args1) or 
	local colwidth = strip_to_nil(args.colwidth) or '30em'
	return
		'\n' ..
		content ..
		
end
local function weatherboxcols(frame)
	-- List of cities by sunshine duration has problem exceeding time available.
	-- Examples:
	--   123.4         → style="background:#B9B94C; font-size:85%;"|123.4
	--   1,823.0 → style="background:#B9B94C; font-size:85%;"|1,823.0
	local args = frame.args
	local display = strip_to_nil(args1) or 
	local value = tonumber((display:gsub(',', )))
	local function show(bg, fg)
		local text = strip_to_nil(args2) or display
		if not fg and (value and value < 62) then
			fg = 'FFFFFF'
		end
		if fg then
			fg = 'color:#' .. fg .. ';'
		else
			fg = 
		end
		return 'style="background:#' .. bg .. ';' .. fg .. ' font-size:85%;"' .. '|' .. text
	end
	if not value then
		return show('FFFFFF', '000000')
	end
	local redgreen, blue
	if value <= 0 then
		redgreen = 0
	elseif value <= 90 then
		redgreen = 1.889 * value
	elseif value <= 180 then
		redgreen = 0.472 * (270.169 + value)
	elseif value < 360 then
		redgreen = 0.236 * (720.424 + value)
	else
		redgreen = 255
	end
	if value <= 0 then
		blue = 0
	elseif value <= 90 then
		blue = 1.889 * value
	elseif value < 150 then
		blue = 2.883 * (150 - value)
	elseif value <= 270 then
		blue = 0
	elseif value < 719.735 then
		blue = 0.567 * (value - 270)
	else
		blue = 255
	end
	return show(string.format('%02X%02X%02X', redgreen, redgreen, blue))
end
return {
	'columns-list' = columnslist,
	userlinks = main(replace2, 'userlinks'),
	topicsearch = main(replace2, 'topicsearch'),
	weatherboxcols = weatherboxcols,
}