Module:Row numbers: Difference between revisions

From escforumwiki
Jump to navigation Jump to search
en>Manabimasu
No edit summary
en>Trappist the monk
No edit summary
Line 1: Line 1:
require('Module:No globals');
require('Module:No globals');


local count = 0; -- initial values
local count;
local hcount = count;
local hcount;




--[[--------------------------< G E T _ C O U N T >------------------------------------------------------------
--[[--------------------------< G E T _ C O U N T >------------------------------------------------------------


returns a counter value according to the keyword extracted from the table; maintains count and hcount  
returns a counter value according to the keyword extracted from the table; maintains count and hcount.  Inserts
a space character ahead of <count> or <hcount> so that, in the case of negative indexes, the negation operator
is not mistaken for part of the wikitable markup.  Returns:
| -<count> – a cell value
instead of:
|-<count> – row markup with extraneous text


The keywords have the meanings:
The keywords have the meanings:
Line 17: Line 22:
local function get_count (keyword)
local function get_count (keyword)
count = count + 1; -- always bump the count
count = count + 1; -- always bump the count
if '_row_count' == keyword then -- bump hcount, return new count value
if '_row_count' == keyword then -- bump hcount, return new count value
hcount = count;
hcount = count;
return count;
return ' ' .. count; -- insert a leading space ahead of count
elseif '_row_count_hold' == keyword then -- current hcount value without increment
elseif '_row_count_hold' == keyword then -- current hcount value without increment
return hcount;
return ' ' .. hcount; -- insert a leading space ahead of hcount
end
end
end
end




--[[--------------------------< R O W _ C O U N T E R >--------------------------------------------------------
--[[--------------------------< R O W _ N U M B E R S >--------------------------------------------------------


replaces keywords _row_count and _row_count_hold from the table in frame.args[1]
replaces keywords _row_count and _row_count_hold from the table in frame.args[1]
Line 37: Line 41:
return '<span style=\"font-size:100%; font-style:normal;\" class=\"error\">error: missing nowiki tags</span>';
return '<span style=\"font-size:100%; font-style:normal;\" class=\"error\">error: missing nowiki tags</span>';
end
end
    count = tonumber(frame.args["index"])- 1 or 0;                                           -- set count to the index parameter -1 the default is 0
 
   
count = (frame.args.index and frame.args.index:match ('^%d+$') or 1) - 1; -- only if a number; |index= may be omitted (nil), or empty string, or non-digit; initial value is 0
 
local tbl_str = mw.text.unstripNoWiki (frame.args[1]); -- get the table from the nowiki tags passed as arguments
local tbl_str = mw.text.unstripNoWiki (frame.args[1]); -- get the table from the nowiki tags passed as arguments


Line 44: Line 49:
tbl_str = tbl_str:gsub ('&gt;', '>'); -- (mw.text.decode (tbl_str); is too aggressive)
tbl_str = tbl_str:gsub ('&gt;', '>'); -- (mw.text.decode (tbl_str); is too aggressive)


return frame:preprocess (tbl_str:gsub('_row_count[_%w]*', get_count)); -- if there is at least one of our special reserved words, replace it with a count
return frame:preprocess (tbl_str:gsub('_row_count[_%w]*', get_count)); -- if there is at least one of our special reserved words, replace it with a count
end
end



Revision as of 22:56, 18 April 2021

Implements {{Row numbers}}


require('Module:No globals');

local count;
local hcount;


--[[--------------------------< G E T _ C O U N T >------------------------------------------------------------

returns a counter value according to the keyword extracted from the table; maintains count and hcount.  Inserts
a space character ahead of <count> or <hcount> so that, in the case of negative indexes, the negation operator 
is not mistaken for part of the wikitable markup.  Returns:
	| -<count> – a cell value
instead of:
	|-<count> – row markup with extraneous text

The keywords have the meanings:
	_row_count:			use row counter value (count); the hold counter (hcount) is same as count
	_row_count_hold:	use the value currently assigned to hcount; bump count but do not bump hcount

]]

local function get_count (keyword)
	count = count + 1;															-- always bump the count
	if '_row_count' == keyword then												-- bump hcount, return new count value
		hcount = count;
		return ' ' .. count;													-- insert a leading space ahead of count
	elseif '_row_count_hold' == keyword then									-- current hcount value without increment
		return ' ' .. hcount;													-- insert a leading space ahead of hcount
	end
end


--[[--------------------------< R O W _ N U M B E R S >--------------------------------------------------------

replaces keywords _row_count and _row_count_hold from the table in frame.args[1]

]]

local function row_numbers (frame)
	if not frame.args[1]:match ('^%s*\127[^\127]*UNIQ%-%-nowiki%-%x%x%x%x%x%x%x%x%-QINU[^\127]*\127%s*$') then	-- make sure that what we get for input has been wrapped in <nowiki>...</nowiki> tags
		return '<span style=\"font-size:100%; font-style:normal;\" class=\"error\">error: missing nowiki tags</span>';
	end

	count = (frame.args.index and frame.args.index:match ('^%d+$') or 1) - 1;	-- only if a number; |index= may be omitted (nil), or empty string, or non-digit; initial value is 0

	local tbl_str = mw.text.unstripNoWiki (frame.args[1]);						-- get the table from the nowiki tags passed as arguments

	tbl_str = tbl_str:gsub ('&lt;', '<');										-- undo <nowiki>'s escaping of the wikitext
	tbl_str = tbl_str:gsub ('&gt;', '>');										-- (mw.text.decode (tbl_str); is too aggressive)

	return frame:preprocess (tbl_str:gsub('_row_count[_%w]*', get_count));		-- if there is at least one of our special reserved words, replace it with a count
end


--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------
]]

return {
	row_numbers = row_numbers
	}