सामग्री पर जाएँ

मॉड्यूल:Arguments

From वर्ल्डपीडिया, the free encyclopedia
enwiki>Mr. Stradivarius द्वारा परिवर्तित २२:०१, ७ दिसम्बर २०१३ का अवतरण (create argument-processing module)
(अंतर) ← पुराना अवतरण | वर्तमान अवतरण (अंतर) | नया अवतरण → (अंतर)

लुआ त्रुटि मॉड्यूल:High-use में पंक्ति 2 पर: attempt to index a function value। {{#ifeq:|yes|लुआ त्रुटि मॉड्यूल:Message_box में पंक्ति 635 पर: attempt to index a function value।लुआ त्रुटि मॉड्यूल:Category_handler में पंक्ति 256 पर: attempt to index a function value।|{{#switch:{{{type}}}

|tiny = <templatestyles src="Template:Template for discussion/styles.css" />‹See TfM›
|inline = <templatestyles src="Template:Template for discussion/styles.css" />‹The template Module rating is being considered for merging.› 

|infobox|box|sidebar = <templatestyles src="Template:Template for discussion/styles.css" />

|disabled = 

|#default = <templatestyles src="Template:Template for discussion/styles.css" />

}}}} {{#ifeq:Arguments|doc|{{#if:|लुआ त्रुटि मॉड्यूल:Protection_banner में पंक्ति 888 पर: attempt to index a function value।}}|{{#switch:

 {{#if:
 |     
 | {{#ifeq:मॉड्यूल|मॉड्यूल
   | module
   | other
   }}
 }}

| module = लुआ त्रुटि मॉड्यूल:Message_box में पंक्ति 635 पर: attempt to index a function value।{{#ifeq: Arguments | Sandbox

    | 
    | {{#switch: Arguments
        | doc | sandbox =
        | {{#ifeq:  | true 
            |  
            | {{#switch: p
                | pre-alpha | prealpha | pa | experimental = 
                | alpha | a = 
                | beta | b = 
                | release | r | general | g | stable = 
                | broken | br | unstable = 
                | protected | protect | p = 
                | semiprotected | semiprotect | semi = 
              }}
          }}
      }}
   }}

| other | #default = साँचा:Error }}}} लुआ त्रुटि मॉड्यूल:Message_box में पंक्ति 635 पर: attempt to index a function value।

This module provides easy processing of arguments passed from #invoke. It is a meta-module, meant for use by other modules, and should not be called from #invoke directly (for a module directly invocable by templates you might want to have a look at साँचा:Ml). Its features include:

  • Easy trimming of arguments and removal of blank arguments.
  • Arguments can be passed by both the current frame and by the parent frame at the same time. (More details below.)
  • Arguments can be passed in directly from another Lua module or from the debug console.
  • Most features can be customized.

-- This module provides easy processing of arguments passed to Scribunto from #invoke.

local function getArguments(frame, options)
	options = type(options) == 'table' and options or {}

	local fargs, pargs
	if frame == mw.getCurrentFrame() then
		fargs = frame.args
		pargs = frame:getParent().args
	else
		fargs = type(frame) == 'table' and frame or {}
		pargs = {}
	end

	local args, metaArgs, metatable = {}, {}, {}
	setmetatable(args, metatable)

	local function tidyVal(key, val)
		-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
		-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
		if type(val) == 'string' then
			if options.trim ~= false then
				val = mw.text.trim(val)
			end
			if options.removeBlanks == false or mw.ustring.find(val, '%S') then
				return val
			end
		else
			return val
		end
	end

	local valueFunc = options.valueFunc
	if valueFunc then
		local valueFuncType = type(valueFunc)
		if valueFuncType == 'function' then
			tidyVal = valueFunc
		else
			error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
		end
	end

	local function mergeArgs(iterator, ...)
		-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
		-- If a value is already present it is not overwritten; tables listed earlier have precendence.
		local tables = {...}
		for _, t in ipairs(tables) do
			for key, val in iterator(t) do
				if metaArgs[key] == nil then
					metaArgs[key] = tidyVal(key, val)
				end
			end
		end
	end

	local firstArgs, secondArgs = fargs, pargs
	if options.parentFirst then
		firstArgs, secondArgs = pargs, fargs
	end

	metatable.__index = function (t, key)
		local val = metaArgs[key]
		if val ~= nil then
			return val
		else
			local firstVal = tidyVal(key, firstArgs[key])
			if firstVal ~= nil then
				return firstVal
			else
				return tidyVal(key, secondArgs[key])
			end
		end
	end

	metatable.__newindex = function (t, key, val)
		if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then
			metaArgs[key] = val
		end
	end

	metatable.__pairs = function ()
		if not metatable.donePairs then
			mergeArgs(pairs, firstArgs, secondArgs)
			metatable.donePairs = true
			metatable.doneIpairs = true
		end
		return pairs(metaArgs)
	end

	metatable.__ipairs = function ()
		if not metatable.doneIpairs then
			mergeArgs(ipairs, firstArgs, secondArgs)
			metatable.doneIpairs = true
		end
		return ipairs(metaArgs)
	end
	
	return args
end

return getArguments