Module:Row numbers: Difference between revisions
Jump to navigation
Jump to search
en>Pppery (Match name with template) |
m (21 revisions imported) |
||
(10 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
require('Module:No globals'); | require('Module:No globals'); | ||
local count | local count; | ||
local hcount | 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 _ | --[[--------------------------< 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 33: | Line 37: | ||
]] | ]] | ||
function | local function row_numbers (frame) | ||
local args = frame.args[1] and frame.args or frame:getParent().args; | |||
-- Only use if |index is a number; |index= may be omitted (nil), or empty string, or non-digit | |||
-- We subtract one because the get_count function increments this before use. | |||
count = (tonumber(args.index) or 1) - 1; | |||
local tbl_str | local tbl_str; | ||
-- Find out if what we got for input has been wrapped in <nowiki>...</nowiki> tags | |||
if args[1]:match ('^%s*\127[^\127]*UNIQ%-%-nowiki%-%x%x%x%x%x%x%x%x%-QINU[^\127]*\127%s*$') then | |||
-- BUG. The <nowiki> trick does not work in VisualEditor, mobile app, or Special:ExpandTemplates. | |||
-- get the table from the nowiki tags passed as arguments | |||
tbl_str = mw.text.unstripNoWiki (args[1]); | |||
-- undo <nowiki>'s escaping of the wikitext (mw.text.decode (tbl_str); is too aggressive) | |||
tbl_str = tbl_str:gsub('<', '<'):gsub('>', '>'); | |||
else | |||
-- No MediaWiki bugs here (hopefully), but you need to escape = signs with {{=}} like normal. | |||
-- It is not possible to circumvent this because named parameters are not passed to Lua in a | |||
-- defined order, always have whitespace trimmed, etc. | |||
local parts = {} | |||
for _, str in ipairs(args) do | |||
table.insert(parts, str) | |||
end | |||
tbl_str = table.concat(parts, '|'); | |||
end | |||
-- 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)); | |||
end | |||
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ | |||
]] | |||
return | return { | ||
row_numbers = row_numbers | |||
} |
Latest revision as of 19:08, 15 June 2022
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) local args = frame.args[1] and frame.args or frame:getParent().args; -- Only use if |index is a number; |index= may be omitted (nil), or empty string, or non-digit -- We subtract one because the get_count function increments this before use. count = (tonumber(args.index) or 1) - 1; local tbl_str; -- Find out if what we got for input has been wrapped in <nowiki>...</nowiki> tags if args[1]:match ('^%s*\127[^\127]*UNIQ%-%-nowiki%-%x%x%x%x%x%x%x%x%-QINU[^\127]*\127%s*$') then -- BUG. The <nowiki> trick does not work in VisualEditor, mobile app, or Special:ExpandTemplates. -- get the table from the nowiki tags passed as arguments tbl_str = mw.text.unstripNoWiki (args[1]); -- undo <nowiki>'s escaping of the wikitext (mw.text.decode (tbl_str); is too aggressive) tbl_str = tbl_str:gsub('<', '<'):gsub('>', '>'); else -- No MediaWiki bugs here (hopefully), but you need to escape = signs with {{=}} like normal. -- It is not possible to circumvent this because named parameters are not passed to Lua in a -- defined order, always have whitespace trimmed, etc. local parts = {} for _, str in ipairs(args) do table.insert(parts, str) end tbl_str = table.concat(parts, '|'); end -- 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)); end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { row_numbers = row_numbers }