Module:IfUtil

From wiki
Revision as of 12:31, 22 January 2024 by 1>Shizhao (自Module:IfUtil/sandbox合并A2569875版本80251733)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

local p={} local lib_arg={} local yesno = require('Module:Yesno')

function p.noTrim(frame)--{{#invoke:IfUtil|noTrim|expr|5>3|Yes|No}} local args, working_frame

   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. The args are passed through to the module
       -- from the template page, so use the args that were passed into the template.
       if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
       args = lib_arg.getArgs(frame, {
       	parentFirst=true,
       	trim = false,

removeBlanks = false

       })
       working_frame = frame
   else
       -- We're being called from another module or from the debug console, so assume
       -- the args are passed in directly.
       args = frame
       working_frame = mw.getCurrentFrame()
       if type(args) ~= type({}) then args = {frame} end
   end
   local command = mw.ustring.lower(mw.text.trim(args['1'] or args[1] or ))
   local if_table = require('Module:Var')._seek_arg(args,1)
   if command == 'if' or command ==  or command == '#if' then
   	return p.ifnoTrim(if_table)
   elseif command == 'ifexpr' or command == 'expr' or command == '#ifexpr' then
   	return p.ifexprnoTrim(if_table)
   elseif command == 'ifeq' or command == 'eq' or command == '#ifeq' then
   	local strcmpi, unstrip, preprocess = yesno(mw.text.trim(args.i or 'no')), yesno(mw.text.trim(args.unstrip or 'no')), yesno(mw.text.trim(args.preprocess or 'no'))
   	local pre_str = function(in_str)
   		local result = in_str
   		if preprocess == true then result = working_frame:preprocess(result) end
   		if unstrip == true then result = mw.text.unstrip(result) end
   		if strcmpi == true then result = mw.ustring.lower(result) end
   		return result 
   	end
   	if yesno(mw.text.trim(args.trim or 'yes')) then
   		if mw.text.trim(pre_str(args['2'] or args[2] or )) == mw.text.trim(pre_str(args['3'] or args[3] or )) then return args['4'] or args[4] or 
   		else return args['5'] or args[5] or  end
   	else
   		if pre_str(args['2'] or args[2] or ) == pre_str(args['3'] or args[3] or ) then return args['4'] or args[4] or 
   		else return args['5'] or args[5] or  end
   	end
   elseif command == 'iferror' or command == 'error' or command == '#iferror' then

local output_error = args['3'] or args[3] or local output_success = args['4'] or args[4]

   	if not output_success then output_success = args['2'] or args[2] or  end
   	local result = working_frame:callParserFunction{ name = '#iferror:' .. mw.text.trim(args['2'] or args[2] or ), args = {'error', 'success'} }
   	result = mw.ustring.lower(result)
   	if result == 'success' then return output_success end
   	return output_error
   elseif command == 'ifexist' or command == 'exist' or command == '#ifexist' then

local output_exist = args['3'] or args[3] local output_no = args['4'] or args[4] or

   	if not output_exist then output_exist = args['2'] or args[2] or  end
   	local result = working_frame:callParserFunction{ name = '#ifexist:' .. mw.text.trim(args['2'] or args[2] or ), args = {'1', '0'} }
   	result = mw.ustring.lower(result)
   	if result == '1' then return output_exist end
   	return output_no
   elseif command == 'yesno' then
   	--1=yesno | 2=test | 3=yes | 4=no | 5=blank | 6=def | 7=¬
   	local checker = mw.ustring.lower(mw.text.trim(args['2'] or args[2]or))
   	if (not (args['2'] or args[2])) or checker == '¬' then return args['¬'] or args['7'] or args[7] or end
   	if checker== then return (args.blank or args['5'] or args[5]) or (args.no or args['4'] or args[4]) or  end

checker = yesno(checker)

   	if checker == true then
   		return args.yes or args['3'] or args[3] or 'yes'
   	elseif checker == false then
   		return args.no or args['4'] or args[4] or 
   	end
   	return args.def or args['6'] or args[6] or 
   else 
   	local yes_arg, no_arg = args['yes arg'] or args.yes_arg or '2', args['no arg'] or args.no_arg or '3'
   	local if_check_table_input = require('Module:Var')._seek_arg(args,1)
   	if_check_table_input[yes_arg], if_check_table_input.yes = "yes", "yes"
   	if_check_table_input[no_arg], if_check_table_input.no = "no", "no"
   	local if_check_table = {}
   	for key, value in pairs(if_check_table_input) do
   		local num_key = tonumber(key)
   		if type(num_key) ~= type(nil) then --是數字參數 (匿名參數)
   			if_check_table[num_key] = value --避免數字參數重複以清理Category:调用重复模板参数的页面
   		else
   			if_check_table[key] = value
   		end
   	end
   	local tester = mw.ustring.gsub(mw.text.unstrip(mw.ustring.lower(mw.text.trim(working_frame:preprocess(require('Module:Template invocation').invocation( 'safesubst:' .. (args['1'] or args[1] or 'void'), if_check_table))))), "<[^>]+>", )
   	local checker = yesno(mw.ustring.sub(tester, mw.ustring.find(tester,'%a+')))
   	if checker == true then return args['3'] or args[3] or 
   	elseif checker == false then return args['4'] or args[4] or end
   	return working_frame:preprocess(require('Module:Template invocation').invocation( 'safesubst:' .. (args['1'] or args[1] or 'void'), if_table))
   end
   return 

end

function p.ifexprnoTrim(frame)--{{#invoke:IfUtil|ifexprnoTrim|5>3|Yes|No}} local args, working_frame

   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. The args are passed through to the module
       -- from the template page, so use the args that were passed into the template.
       if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
       args = lib_arg.getArgs(frame, {
       	parentFirst=true,
       	trim = false,

removeBlanks = false

       })
       working_frame = frame
   else
       -- We're being called from another module or from the debug console, so assume
       -- the args are passed in directly.
       args = frame
       working_frame = mw.getCurrentFrame()
       if type(args) ~= type({}) then args = {frame} end
   end
   local input_str = args['1'] or args[1] or '0'
   local output_if = args['2'] or args[2] or 
   local check_max_arg = 2
   local ifexpr_table = {}
   for k,v in pairs(args) do
   	local check_num = tonumber(mw.text.trim(k))
   	if check_num and check_num > check_max_arg then
   		check_max_arg = check_num
   	end
   	ifexpr_table[k] = v
   end
   ifexpr_table['1'] = input_str
   ifexpr_table['2'] = output_if
   local tail = check_max_arg - check_max_arg % 2
   local output_else = (check_max_arg % 2 == 1) and (args[tostring(check_max_arg)] or args[check_max_arg]) or 
   for i=1,tail,2 do
   	local expr = ifexpr_table[tostring(i)] or ifexpr_table[i] or '0'
   	local true_result = args[tostring(i+1)] or args[i+1] or 
   	local flag,ifexpr = xpcall(function() return mw.ext.ParserFunctions.expr(expr)end,function()end)
   	--use original #ifexpr: to print original error
   	if flag~=true then return working_frame:preprocess("{{safesubst:#ifexpr:" .. expr .. '|' .. true_result .. '|' .. output_else .."}}") end
   	if (tonumber(ifexpr or'0') or 0) ~= 0 then return true_result end
   end
   return output_else

end

function p.ifnoTrim(frame) local args, working_frame

   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. The args are passed through to the module
       -- from the template page, so use the args that were passed into the template.
       if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
       args = lib_arg.getArgs(frame, {
       	parentFirst=true,
       	trim = false,

removeBlanks = false

       })
       working_frame = frame
   else
       -- We're being called from another module or from the debug console, so assume
       -- the args are passed in directly.
       args = frame
       working_frame = mw.getCurrentFrame()
       if type(args) ~= type({}) then args = {frame} end
   end
   local input_str = args['1'] or args[1] or 
   local output_if = args['2'] or args[2] or 
   local output_else = args['3'] or args[3] or 
   if mw.text.trim(input_str) ~=  then
   	return output_if
   end
   return output_else

end

function p.ifnewhtmlline(frame) local args, working_frame

   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. The args are passed through to the module
       -- from the template page, so use the args that were passed into the template.
       if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
       args = lib_arg.getArgs(frame, {
       	parentFirst=true,
       	trim = false,

removeBlanks = false

       })
       working_frame = frame
   else
       -- We're being called from another module or from the debug console, so assume
       -- the args are passed in directly.
       args = frame
       working_frame = mw.getCurrentFrame()
       if type(args) ~= type({}) then args = {frame} end
   end
   local input_str = args['1'] or args[1] or 
   local output_if = args['2'] or args[2] or 
   local output_else = args['3'] or args[3] or 
   if mw.ustring.find(input_str, '<%s*/?%s*[Bb][Rr]%s*/?%s*>') then
   	return output_if
   end
   return output_else

end

function p.ifnoAddTail(frame) --{{#invoke:IfUtil|ifnoAddTail|text|unit|pattern}} local args, working_frame

   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. The args are passed through to the module
       -- from the template page, so use the args that were passed into the template.
       if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
       args = lib_arg.getArgs(frame, {
       	trim = false,

removeBlanks = false

       })
       working_frame = frame
   else
       -- We're being called from another module or from the debug console, so assume
       -- the args are passed in directly.
       args = frame
       working_frame = mw.getCurrentFrame()
       if type(args) ~= type({}) then args = {frame} end
   end
   local input_str = args['1'] or args[1] or 
   local uint = args['2'] or args[2] or 

local uint_pattern = args['3'] or args[3] or if mw.text.trim(uint_pattern) == then uint_pattern = mw.ustring.gsub(mw.text.trim(uint), '([%\\%^%$%(%)%%%.%{%}%[%]%*%+%-%?])','%%%1')end

   if mw.ustring.find(input_str, uint_pattern) then
   	return input_str
   end
   return input_str .. uint

end

function p.if2number(frame) local args, working_frame

   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. The args are passed through to the module
       -- from the template page, so use the args that were passed into the template.
       if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
       args = lib_arg.getArgs(frame, {
       	parentFirst=true,
       	trim = false,

removeBlanks = false

       })
       working_frame = frame
   else
       -- We're being called from another module or from the debug console, so assume
       -- the args are passed in directly.
       args = frame
       working_frame = mw.getCurrentFrame()
       if type(args) ~= type({}) then args = {frame} end
   end
   local input_str = args['1'] or args[1] or 
   local output_hasTwo = args['2'] or args[2] or '1'
   local output_otherwise = args['3'] or args[3] or 
   local check_split = args['4'] or args[4] or '~'
   local local_check = mw.text.trim(require('Module:TemplateParameters').containsNumber({input_str}))
   if local_check ~=  then
   	local split_end, split2_first = mw.ustring.find(input_str,check_split)
   	local first_num_str, second_num_str = , 
   	if split_end then first_num_str = mw.ustring.sub(input_str,1,split_end-1) end
   	if split2_first then second_num_str = mw.ustring.sub(input_str,split2_first+1,-1) end
   	local first_num_check, second_num_check = mw.text.trim(require('Module:TemplateParameters').containsNumber({first_num_str})),
   		mw.text.trim(require('Module:TemplateParameters').containsNumber({second_num_str}))
   	if first_num_check ~=  and second_num_check ~=  then
   		first_num_check, second_num_check = require('Module:TemplateParameters').getNumberValue({first_num_str}),
   			require('Module:TemplateParameters').getNumberValue({second_num_str})
   		local first_num, second_num = tonumber(first_num_check), tonumber(second_num_check)
   		if first_num and second_num then
   			if first_num ~= second_num then
   				return output_hasTwo

else return output_otherwise end else return output_otherwise end

   	else return output_otherwise end
   else return output_otherwise end

end

function p.findArgs(frame) -- For calling from #invoke.

   local args
   --是否存在有效的frame可供呼叫
   local can_call_parse = false
   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. The args are passed through to the module
       -- from the template page, so use the args that were passed into the template.
       args = frame.args
       can_call_parse = true
   else
       -- We're being called from another module or from the debug console, so assume
       -- the args are passed in directly.
       args = frame
   end
   local out_frame = mw.getCurrentFrame():getParent() --模板外層
   local out_args = {} --紀錄來自模板外層提供的參數
   local body = 
   local to_find={}
   local default=
   
   if out_frame then out_args = out_frame.args or out_args end
   for key,val in pairs(args) do
   	local parse_name=tonumber(key)
   	if parse_name then to_find[#to_find+1]=val end
   end
   default = args.default or default
   local find_result={}
   local is_find=false
   for key,val in pairs(out_args) do
   	for i=1,#to_find do

if mw.ustring.lower(mw.text.trim(val)) == mw.ustring.lower(mw.text.trim(to_find[i])) then is_find=true find_result[mw.text.trim(key)]=is_find; end

   	end
   end
   if is_find then
   	local body = 
   	for key,val in pairs(find_result) do 
   		if body~= then body=body..','end
   		body=body..key
   	end
   	return body
   else
   	return default
   end

end

return p