Editing
Module:IfUtil
Jump to navigation
Jump to search
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
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
Summary:
Please note that all contributions to wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Wiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Navigation menu
Personal tools
Not logged in
Talk
Contributions
Create account
Log in
Namespaces
Page
Discussion
English
Views
Read
Edit
View history
More
Search
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Tools
What links here
Related changes
Special pages
Page information