释义 |
local p = {} function p.indent(frame) -- Trim whitespace from the arguments and remove blank values. local args = {} if type(frame.args) == 'table' then for k, v in pairs( frame.args ) do v = mw.text.trim(v) if v ~= '' then args[k] = v end end end -- Set variables. local indent = tonumber( args[1] ) local br = args[2] local ret = '' -- Insert line breaks to match the functionality of the original template. -- If "br" is set, we need two line breaks; if not, we just need one. if br then ret = ret .. ' ' end ret = ret .. ' ' -- Control for bad or zero input. If found, output the line breaks only, -- as this was the previous behaviour of the template. if not indent or indent <= 0 or math.floor(indent) ~= indent then return ret end -- Generate the indents. The first four cases are special. if indent == 1 then return ret .. ' ' elseif indent == 2 then return ret .. ' ' elseif indent == 3 then return ret .. ' ' elseif indent == 4 then return ret .. ' ' end -- Set variables for generating the output after indent == 5. local r = {} r.base = ' ' -- Common text to all output. r.rep = ' ' -- The text to repeat. r.mod1 = ' ' -- To return on modulo 1. r.mod2 = ' ' -- To return on modulo 2. r.mod3 = ' ' -- To return on modulo 3. -- New iteratorText values needed at 5, 9, 13, 17, etc., so repeat the -- text (indent - 1)/4 times and find the remainder. local reps = math.floor( (indent - 1) / 4 ) local remainder = math.fmod( indent - 1, 4 ) -- Generate the indent text. ret = ret .. r.base .. mw.ustring.rep( r.rep, reps ) if remainder >= 1 and remainder <= 3 then ret = ret .. r[ 'mod' .. remainder ] end return ret end return p |