local p = {}
local getArgs = require('Module:Arguments').getArgs
local toggle_id = 0
local momo_id = 0
local switch_id = 0
local branch_id = -1
local talkers = {}
local talkers_avatar = {}
local arg_i = 1 -- 全局迭代索引,記錄當前處理到的參數位置
local function increase_i(amount) -- 增加索引值,數量為消息參數的數量
arg_i = arg_i + amount
end
local function is_nil_or_empty(string)
if string == nil then
return true
end
if mw.text.trim(string) == "" then
return true
end
return false
end
local function handle_talkers(args)
local i = 1
while args["talker_" .. i] ~= nil do
talkers[i] = args["talker_" .. i]
talkers_avatar[i] = args["talker_avatar_" .. i]
i = i + 1
end
end
local function handle_header(args, toggle_id)
local output = ""
local toggle_str = "mw-collapsible"
local width = args["width"] or "min(600px, 95%)"
local main_style = args["main_style"] or ""
local inner_style = args["inner_style"] or ""
if not is_nil_or_empty(args["no-header"]) then
toggle_str = ""
end
output = output .. mw.ustring.format("<div id=\"mw-customcollapsible-%d\" class=\"momo-container %s\" style=\"width: %s;\">", toggle_id, toggle_str, width) -- 最外層div
output = output .. mw.ustring.format("<div class=\"momo-main\" style=\"box-shadow: 0 2px 3px #0002; %s\">", main_style) -- 主框架div
if not is_nil_or_empty(args["no-header"]) then -- 優化no-header顯示效果
output = output .. "<div style=\"height:5px;\"></div>"
return output
end
output = output .. mw.ustring.format("<div class=\"momo-header\"><div class=\"momo-header-img\">[[File:MomoTalkLogo.png|link=|150px]]</div><div class=\"momo-header-cross mw-customtoggle-%d\">×</div></div>", toggle_id)
output = output .. mw.ustring.format("<div style=\"%s\">", inner_style) -- 內層自定義樣式div
return output
end
local function handle_activity(args) -- 參數格式:|a|到此已讀
increase_i(1)
return mw.ustring.format("<div class=\"momo-banner\">%s</div>", args[arg_i])
end
local function check_continue(args, talker) -- 輔助函數,檢查下一個消息類型是否為學生消息且說話人是否是同一個人
if (args[arg_i + 1] == "s" or args[arg_i + 1] == "student") and tonumber(args[arg_i + 2]) == talker then
return true
end
return false
end
local function handle_student_message(args) -- 參數格式:|s|1|在嗎?
local output = "<div class=\"momo-msg-student\">"
local talker_id = tonumber(args[arg_i + 1])
local talker_name = talkers[talker_id] or ""
local talker_avatar = talkers_avatar[talker_id] or ""
output = output .. mw.ustring.format("<div class=\"momo-avatar\">%s</div>", talker_avatar) -- 頭像
output = output .. mw.ustring.format("<div class=\"momo-msg-main\"><div class=\"momo-name\">%s</div><div class=\"momo-msg-pack\">", talker_name) -- 名字
output = output .. mw.ustring.format("<div class=\"momo-msg\" style=\"width: fit-content;\">%s</div>", args[arg_i + 2]) -- 消息
increase_i(2)
while check_continue(args, talker_id) do
increase_i(1)
output = output .. mw.ustring.format("<div class=\"momo-msg\" style=\"width: fit-content;\">%s</div>", args[arg_i + 2]) -- 同一說話人的下一條消息
increase_i(2)
end
output = output .. "</div></div></div>"
return output
end
local function handle_student_image_message(args) -- 參數格式:|i|1|BA_Shiroko_Ridingsuit.png|300px
local output = "<div class=\"momo-msg-student\">"
local talker_id = tonumber(args[arg_i + 1])
local talker_name = talkers[talker_id] or ""
local talker_avatar = talkers_avatar[talker_id] or ""
local width = args[arg_i + 3]
if is_nil_or_empty(width) then
width = "300px"
end
output = output .. mw.ustring.format("<div class=\"momo-avatar\">%s</div>", talker_avatar) -- 頭像
output = output .. mw.ustring.format("<div class=\"momo-msg-main\"><div class=\"momo-name\">%s</div>", talker_name) -- 名字
output = output .. mw.ustring.format("<div class=\"momo-msg-img\">[[File:%s|%s]]</div>", args[arg_i + 2], width) -- 消息
output = output .. "</div></div>"
increase_i(3)
return output
end
local function check_continue_teacher(args) -- 輔助函數,檢查下一個消息類型是否仍為老師消息
end
local function handle_teacher_message(args) -- 參數格式:|t|在哦
local output = "<div class=\"momo-msg-sensei\">"
output = output .. "<div class=\"momo-msg-pack\">"
output = output .. mw.ustring.format("<div class=\"momo-msg\" style=\"width: fit-content;\">%s</div>", args[arg_i + 1]) -- 消息
increase_i(1)
while check_continue_teacher(args) do
output = output .. mw.ustring.format("<div class=\"momo-msg\" style=\"width: fit-content;\">%s</div>", args[arg_i + 1]) -- 消息
increase_i(1)
end
output = output .. "</div></div>"
return output
end
local function handle_teacher_image_message(args) -- todo
return ""
end
local function handle_choose(args, momo_id) -- 參數格式:|c|回覆|回覆1|回覆2|end
local output = "<div class=\"momo-msg-sensei\">"
local branch = 0
local title = args[arg_i + 1]
if is_nil_or_empty(title) then
title = "回覆"
end
output = output .. "<div class=\"momo-box momo-box-reply\" style=\"width: min(480px, 90%);\">"
output = output .. mw.ustring.format("<div class=\"momo-title\">%s</div><hr />", title)
output = output .. mw.ustring.format("<div class=\"textToggleDisplayButtons\" data-key-0=\"@radio\" data-value-0=\"1\" data-key-1=\"@default\" data-value-1=\"momotalk-%d-%d-%d\">", momo_id, switch_id, branch)
branch_id = -1
local increase = 2
while true do
local message = args[arg_i + increase]
output = output .. mw.ustring.format("<span data-order=\"%d\" data-key=\"momotalk-%d-%d-%d\"><span class=\"textToggleDisplayButtonLabelText on\"><span class=\"momo-choose-item\" style=\"box-shadow: 0 2px 3px #0002;\">%s</span></span><span class=\"textToggleDisplayButtonLabelText off\"><span class=\"momo-choose-item\" style=\"box-shadow: 0 2px 3px #0002;\">%s</span></span></span>", branch, momo_id, switch_id, branch, message, message)
branch = branch + 1
increase = increase + 1
if args[arg_i + increase] == "end" then
break
end
end
switch_id = switch_id + 1
increase_i(increase)
output = output .. "</div></div></div>"
return output
end
local function handle_branch(args, momo_id) -- 參數格式:|b
branch_id = branch_id + 1
return mw.ustring.format("<div class=\"textToggleDisplay hidden\" data-id=\"momotalk-%d-%d-%d\">", momo_id, switch_id - 1, branch_id)
end
local function handle_branch_end(args) -- 參數格式:|e
return "</div>"
end
local function handle_kizuna(args) -- 參數格式:|k|羈絆劇情|前往羈絆劇情
local output = "<div class=\"momo-msg-sensei\">"
local title = args[arg_i + 1]
if is_nil_or_empty(title) then
title = "羈絆劇情"
end
output = output .. "<div class=\"momo-box momo-box-love\" style=\"width: min(480px, 90%);\">"
output = output .. mw.ustring.format("<div class=\"momo-title\">%s</div><hr />", title)
output = output .. mw.ustring.format("<div class=\"momo-choose-item\" style=\"box-shadow: 0 2px 3px #0002;\">%s</div>", args[arg_i + 2])
output = output .. "</div></div>"
increase_i(2)
return output
end
-- 新增momo_id參數,傳遞給需要的處理函數
local function handle_message(args, momo_id)
local output = ""
while args[arg_i] ~= nil do
local type = args[arg_i]
if type == "a" or type == "activity" then -- 處理橫欄提示
output = output .. handle_activity(args)
elseif type == "s" or type == "student" or type == "n" or type == "new" then -- 處理學生信息
output = output .. handle_student_message(args)
elseif type == "i" or type == "image" then -- 處理學生圖片信息
output = output .. handle_student_image_message(args)
elseif type == "t" or type == "teacher" or type == "nt" or type == "new_teacher" then -- 處理老師信息
output = output .. handle_teacher_message(args)
elseif type == "ti" or type == "teacher_image" then -- 處理老師圖片信息
output = output .. handle_teacher_image_message(args)
elseif type == "c" or type == "choose" then -- 處理對話選項
output = output .. handle_choose(args, momo_id)
elseif type == "b" or type == "branch" then -- 處理對話分支
output = output .. handle_branch(args, momo_id)
elseif type == "e" or type == "end" then -- 處理分支結束
output = output .. handle_branch_end(args)
elseif type == "k" or type == "kizuna" then -- 處理羈絆劇情
output = output .. handle_kizuna(args)
else
mw.log(mw.ustring.format("[Warning] 位於%d處的匿名參數【%s】無法被解析!", arg_i, type))
end
-- 如果參數種類無法被識別,則跳過此參數
increase_i(1)
end
return output
end
function p.main(_frame)
local args = getArgs(_frame, { removeBlanks = false, parentOnly = true })
-- 記錄當前ID並自增
local current_toggle_id = toggle_id
local current_momo_id = momo_id
toggle_id = toggle_id + 1
momo_id = momo_id + 1
-- 傳遞當前ID給內部處理函數
return p._main(args, current_toggle_id, current_momo_id)
end
-- 新增參數接收當前調用的toggle_id和momo_id
function p._main(args, toggle_id, momo_id)
-- 重置單次調用的狀態變量
arg_i = 1
switch_id = 0
branch_id = -1
talkers = {}
talkers_avatar = {}
handle_talkers(args)
local output = handle_header(args, toggle_id)
output = output .. handle_message(args, momo_id)
output = output .. "</div></div></div>" -- 關閉handle_header中的三個div
return output
end
return p