首页
随机
登录
设置
关于中医百科
免责声明
中医百科
搜索
查看“︁Module:String”︁的源代码
←
Module:String
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
--[[ This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. Global options ignore_errors: If set to 'true' or 1, any error condition will result in an empty string being returned rather than an error message. error_category: If an error occurs, specifies the name of a category to include with the error message. The default category is [Category:Errors reported by Module String]. no_category: If set to 'true' or 1, no category will be added if an error is generated. Unit tests for this module are available at Module:String/tests. ]] local str = {} --[[ len ]] function str.len( frame ) local new_args = str._getParameters( frame.args, {'s'} ); local s = new_args['s'] or ''; return mw.ustring.len( s ) end --[[ sub ]] function str.sub( frame ) local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } ); local s = new_args['s'] or ''; local i = tonumber( new_args['i'] ) or 1; local j = tonumber( new_args['j'] ) or -1; local len = mw.ustring.len( s ); if i < 0 then i = len + i + 1; end if j < 0 then j = len + j + 1; end if i > len or j > len or i < 1 or j < 1 then return str._error( '截取字符串索引脱离区间' ); end if j < i then return str._error( '截取字符串指示脱离顺序' ); end return mw.ustring.sub( s, i, j ) end --[[ sublength ]] function str.sublength( frame ) local i = tonumber( frame.args.i ) or 0 local len = tonumber( frame.args.len ) return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) ) end --[[ match ]] function str.match( frame ) local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} ); local s = new_args['s'] or ''; local start = tonumber( new_args['start'] ) or 1; local plain_flag = str._getBoolean( new_args['plain'] or false ); local pattern = new_args['pattern'] or ''; local match_index = math.floor( tonumber(new_args['match']) or 1 ); local nomatch = new_args['nomatch']; if s == '' then return str._error( '目标字符串是空的' ); end if pattern == '' then return str._error( '模式字符串是空的' ); end if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then return str._error( '要求的起始点脱离区间' ); end if match_index == 0 then return str._error( '匹配索引脱离区间' ); end if plain_flag then pattern = str._escapePattern( pattern ); end local result if match_index == 1 then result = mw.ustring.match( s, pattern, start ) else if start > 1 then s = mw.ustring.sub( s, start ); end local iterator = mw.ustring.gmatch(s, pattern); if match_index > 0 then for w in iterator do match_index = match_index - 1; if match_index == 0 then result = w; break; end end else local result_table = {}; local count = 1; for w in iterator do result_table[count] = w; count = count + 1; end result = result_table[ count + match_index ]; end end if result == nil then if nomatch == nil then return str._error( '找不到匹配' ); else return nomatch; end else return result; end end --[[ pos ]] function str.pos( frame ) local new_args = str._getParameters( frame.args, {'target', 'pos'} ); local target_str = new_args['target'] or ''; local pos = tonumber( new_args['pos'] ) or 0; if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then return str._error( '字符串索引脱离区间' ); end return mw.ustring.sub( target_str, pos, pos ); end --[[ str_find ]] function str.str_find( frame ) local new_args = str._getParameters( frame.args, {'source', 'target'} ); local source_str = new_args['source'] or ''; local target_str = new_args['target'] or ''; if target_str == '' then return 1; end local start = mw.ustring.find( source_str, target_str, 1, true ) if start == nil then start = -1 end return start end --[[ find ]] function str.find( frame ) local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } ); local source_str = new_args['source'] or ''; local pattern = new_args['target'] or ''; local start_pos = tonumber(new_args['start']) or 1; local plain = new_args['plain'] or true; if source_str == '' or pattern == '' then return 0; end plain = str._getBoolean( plain ); local start = mw.ustring.find( source_str, pattern, start_pos, plain ) if start == nil then start = 0 end return start end --[[ replace ]] function str.replace( frame ) local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } ); local source_str = new_args['source'] or ''; local pattern = new_args['pattern'] or ''; local replace = new_args['replace'] or ''; local count = tonumber( new_args['count'] ); local plain = new_args['plain'] or true; if source_str == '' or pattern == '' then return source_str; end plain = str._getBoolean( plain ); if plain then pattern = str._escapePattern( pattern ); replace = mw.ustring.gsub( replace, "%%", "%%%%" ); end local result; if count ~= nil then result = mw.ustring.gsub( source_str, pattern, replace, count ); else result = mw.ustring.gsub( source_str, pattern, replace ); end return result; end --[[ rep ]] function str.rep( frame ) local repetitions = tonumber( frame.args[2] ) if not repetitions then return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' ) end return string.rep( frame.args[1] or '', repetitions ) end --[[ split ]] function str.split(inputstr, sep, no_pattern, ignore_null) if type(inputstr) == type({table}) then if not getArgs then getArgs = require('Module:Arguments').getArgs end args = getArgs(inputstr, {parentFirst=true}) for arg_name, arg_value in pairs( args ) do if arg_name == 1 or arg_name == '1' or arg_name == "str" or arg_name == "inputstr" or arg_name == "input" then input_str = arg_value elseif arg_name == 2 or arg_name == '2' or arg_name == "sep" or arg_name == "separator" then separ = arg_value elseif arg_name == 3 or arg_name == '3' or arg_name == "no_pattern" or arg_name == "no pattern" then no_pattern_flag = arg_value elseif arg_name == 4 or arg_name == '4' or arg_name == "ignore_null" or arg_name == "ignore null" then ignore_null_flag = arg_value elseif arg_name == 5 or arg_name == '5' or arg_name == "format" then format = arg_value or "*{{{1}}}\n"; end end if not yesno then yesno = require('Module:Yesno') end no_pattern_flag = yesno( no_pattern_flag or 'yes' ) ignore_null_flag = yesno( ignore_null_flag or 'no' ) is_invoke = true format = mw.ustring.gsub(format or "*{{{1}}}\n", "%{%{%{.-%}%}%}", "%%s" ); it = mw.ustring.find(format, "%%s", 1) if it == nil then format = format .. "%s" end format = mw.ustring.gsub(format, "\\n", "\n") else input_str = inputstr separ = sep no_pattern_flag = no_pattern ignore_null_flag = ignore_null is_invoke = false end input_str = input_str or '' separ = separ or "%s" if no_pattern_flag == nil then no_pattern_flag = true end if ignore_null_flag == nil then ignore_null_flag = false end length = mw.ustring.len(input_str) if no_pattern_flag then separ = mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(mw.ustring.gsub(separ, "%[", "%["), "%]", "%]"), "%{", "%{"), "%}", "%}"), "%%", "%%%%"), "%)", "%)"), "%-", "%-"), "%^", "%^"), "%$", "%$"), "%(", "%("), "%.", "%."), "%*", "%*"), "%+", "%+"), "%|", "%|"); end iterator = 1 ; i = 1 ; flag = true result = {} separ_str_begin, separ_str_end = mw.ustring.find(input_str, separ, iterator) debug1 = 1 while flag do debug1 = debug1 + 1 if separ_str_begin == nil or iterator > length or debug1 >= 100 then separ_str_begin = 0 separ_str_end = -2 flag = false end if separ_str_end < separ_str_begin then separ_str_end = separ_str_begin end finded_str = mw.ustring.sub(input_str, iterator, separ_str_begin - 1) if not(mw.text.trim(finded_str) == '' and ignore_null_flag) then result[i] = finded_str i = i + 1 end iterator = separ_str_end + 1 separ_str_begin, separ_str_end = mw.ustring.find(input_str, separ, iterator) end if is_invoke then body = '' for i, result_str in pairs( result ) do body = body .. mw.ustring.gsub(format, "%%s", result_str) end return body end return result; end --[[ join ]] function str.join(frame) local args = {} local sep for _, v in ipairs( frame.args ) do if sep then if v ~= '' then table.insert(args, v) end else sep = v end end return table.concat( args, sep or '' ) end -- Helper functions function str._getParameters( frame_args, arg_list ) local new_args = {}; local index = 1; local value; for i,arg in ipairs( arg_list ) do value = frame_args[arg] if value == nil then value = frame_args[index]; index = index + 1; end new_args[arg] = value; end return new_args; end function str._error( error_str ) local frame = mw.getCurrentFrame(); local error_category = frame.args.error_category or '字符串模块报告的错误'; local ignore_errors = frame.args.ignore_errors or false; local no_category = frame.args.no_category or false; if str._getBoolean(ignore_errors) then return ''; end local error_str = '<strong class="error">字符串模块出错:' .. error_str .. '</strong>'; if error_category ~= '' and not str._getBoolean( no_category ) then error_str = '[[Category:' .. error_category .. ']]' .. error_str; end return error_str; end function str._getBoolean( boolean_str ) local boolean_value; if type( boolean_str ) == 'string' then boolean_str = boolean_str:lower(); if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0' or boolean_str == '' then boolean_value = false; else boolean_value = true; end elseif type( boolean_str ) == 'boolean' then boolean_value = boolean_str; else error( '布尔值找不到' ); end return boolean_value end function str._escapePattern( pattern_str ) return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ); end return str
该页面使用的模板:
Module:Arguments
(
查看源代码
)
Module:Documentation
(
查看源代码
)
Module:Documentation/config
(
查看源代码
)
Module:Documentation/styles.css
(
查看源代码
)
Module:Message box
(
查看源代码
)
Module:Redirect
(
查看源代码
)
Module:String
(
查看源代码
)
Module:String/doc
(
查看源代码
)
Module:Yesno
(
查看源代码
)
返回
Module:String
。