米斯特利亚Wiki正在建设中,本WIKI编辑权限开放!欢迎参与~!

全站通知:

模块:Utils

来自米斯特利亚WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:Utils/doc创建

local p = {}
-- 是否有中文
function p.hasChinese(str)
    return type(str) == 'string' and string.match(str, "[\228-\233][\128-\191][\128-\191]") ~= nil
end

-- 清理标点符号后的空格
function p.cleanPunctuation(str)
    if not str then return str end
    str = string.gsub(str, ", ", ",")
    str = string.gsub(str, "。 ", "。")
    str = string.gsub(str, ": ", ":")
    str = string.gsub(str, "! ", "!")
    str = string.gsub(str, "? ", "?")
    str = string.gsub(str, "... ", "……")
    return str
end

-- 内部辅助函数:将逗号分隔的字符串转为列表,并清理空白
function p.splitStringToList(str)
    local list = {}
    if type(str) ~= "string" or str == "" then return list end
    -- 同时支持英文逗号和中文逗号
    for part in str:gmatch("[^,,]+") do
        local trimmed_part = part:gsub("^%s+", ""):gsub("%s+$", "")
        if trimmed_part ~= "" then
            table.insert(list, trimmed_part)
        end
    end
    return list
end

-- 判断 table 是否为数组(仅 1..#t 连续整数键)
function p.isArray(t)
    if type(t) ~= "table" then return false end
    local n = 0
    for k, _ in pairs(t) do
        if type(k) ~= "number" or k <= 0 or k % 1 ~= 0 then
            return false
        end
        n = n + 1
    end
    return n == #t
end

-- 查找元素在数组中的索引(从1开始)
-- 参数:arr - 要查询的数组,value - 要查找的元素
-- 返回:元素所在索引(存在)或 -1(不存在)
function p.indexOfArray(arr, value)
    -- 遍历数组(ipairs适合连续数字索引的数组)
    for i, v in ipairs(arr) do
        -- 比较元素是否相等
        if v == value then
            return i  -- 找到则返回当前索引
        end
    end
    -- 遍历结束仍未找到,返回-1
    return nil
end

--去字符串的前后空格
function p.trim(s)
    if type(s) ~= 'string' then return s end
    return s:gsub('^%s+', ''):gsub('%s+$', '')
end

-- 按指定分隔符切分字符为数组,并为每个元素去掉前后空格
function p.split(s, delimiter)
	-- 处理空值或非字符串输入
    if not s or type(s) ~= "string" then
        return {}  -- 返回空数组
    end
    
    -- 处理空字符串
    if s:gsub("%s+", "") == "" then
        return {}  -- 全是空格也视为空输入
    end
    
    -- 默认使用逗号作为分隔符
    delimiter = delimiter or ","
	
	-- 对于点号等特殊字符,需要转义
	-- 创建一个更可靠的字符串分割实现
	local result = {}
	local start = 1
	
	-- 遍历字符串,查找分隔符并分割
	while true do
		local pos = string.find(s, delimiter, start, true)
		if not pos then
			-- 没有找到更多分隔符,添加最后一个部分
			local part = string.sub(s, start)
			part = p.trim(part)
			if part ~= "" then
				table.insert(result, part)
			end
			break
		else
			-- 找到分隔符,添加当前部分
			local part = string.sub(s, start, pos - 1)
			part = p.trim(part)
			if part ~= "" then
				table.insert(result, part)
			end
			start = pos + #delimiter
		end
	end
	
	return result
end

-- 根据arg在t查找映射,返回映射组成的字符串
function p.mapST2table(t,arg)
    if arg ~= "" and type(arg) == "string" then
        return t[arg] or arg
    end

    if type(arg) == 'table' then
        local out = {}
        for i, v in ipairs(arg) do
        	local mapStr = t[v] or v
            if mapStr ~= "" then
        		out[i] = mapStr
        	end
        end
        return table.concat(out, ",")
    end

    return nil
end

function p.hours(hourTable)
	local begin = hourTable[1] .. ":00"
	local finish = hourTable[2]
	if finish > 24 then
		finish = finish - 24
		finish = "次日"..finish
	end
	finish = finish..":00"
	return begin.."-"..finish
end


-- 自测代码:测试split函数功能
-- 1. 测试默认逗号分隔
-- mw.log("测试1: 默认逗号分隔")
-- local result1 = p.split("apple,banana,orange")
-- mw.logObject(result1)

-- -- 2. 测试自定义分隔符(点号)
-- mw.log("测试2: 自定义分隔符(点号)")
-- local result2 = p.split("apple.banana.orange", ".")
-- mw.logObject(result2)

-- -- 3. 测试带空格的输入
-- mw.log("测试3: 带空格的输入")
-- local result3 = p.split("  apple  ,  banana  ,  orange  ")
-- mw.logObject(result3)

-- -- 4. 测试点号分隔带空格
-- mw.log("测试4: 点号分隔带空格")
-- local result4 = p.split("  value  .  bin  ", ".")
-- mw.logObject(result4)

-- -- 5. 测试空输入
-- mw.log("测试5: 空输入")
-- local result5 = p.split("")
-- mw.logObject(result5)

-- -- 6. 测试只有空格的输入
-- mw.log("测试6: 只有空格的输入")
-- local result6 = p.split("   ")
-- mw.logObject(result6)

return p