Mô đun:ParameterAliasNormalizer
![]() | Mô đun này được đánh giá là trong giai đoạn beta, và đã sẵn sàng để sử dụng rộng rãi. Nó vẫn còn mới và nên được sử dụng một cách thận trọng để đảm bảo đạt được kết quả như mong đợi. |
Cách sử dụng
[sửa mã nguồn]Mô đun ParameterAliasNormalizer được sử dụng để làm trung gian ánh xạ các tham số tiếng Việt, hoặc tham số cũ, đến các tham số tiếng Anh (tham số bản mẫu gốc), hoặc tham số hiện hành của bản mẫu được khai báo ban đầu. Mô đun này sẽ được chứa trong một bản mẫu (thường là bản mẫu chính).
Khi gọi một bản mẫu được nhúng mô đun này, toàn bộ tham số (gồm tên tham số và giá trị tham số) được cung cấp sẽ truyền về mô đun. Mô đun sẽ kiểm tra, nếu tên tham số nằm trong từ điển cho trước, thì sẽ tiến hành lấy giá trị của tham số đó gán cho tham số tương ứng với nó (là tham số gốc); nếu tên tham số không nằm trong từ điển, thì bỏ qua. Sau cùng, toàn bộ tham số đã được xử lý ánh xạ sẽ được truyền về bản mẫu gốc (như nằm trong trang con /main) để bung bản mẫu này hiển thị ra ngoài, tại trang đang nhúng bản mẫu chính.
Mã ví dụ của mô đun khi nhúng trong Bản mẫu:Thông tin chiến tranh:
<!-- Bản mẫu trung gian này nhằm mục đích ánh xạ tên tham số Tiếng Việt về tên tham số Tiếng Anh -->
{{#invoke: ParameterAliasNormalizer | main
| __template = Thông tin chiến tranh/main
<!-- param aliases -->
| conflict = tên
| partof = một phần của
| image = hình
| image_size = cỡ hình
| caption = ghi chú hình
| date = thời gian
| place = địa điểm
| coordinates = tọa độ
| action = hành động
| casus = nguyên nhân
| result = kết quả
| status = tình trạng
| territory = thay đổi lãnh thổ
| combatant${1,3} = bên $
| commander${1,3} = chỉ huy $
| units${1,3} = thành phần $
| strength${1,3} = lực lượng $
| casualties${1,4} = thương vong $
| notes = ghi chú
<!-- old params -->
<!-- viwiki only params -->
}}
Mã ví dụ của mô đun khi nhúng trong Bản mẫu:Thông tin sông:
<!-- Bản mẫu trung gian này nhằm mục đích ánh xạ tên tham số Tiếng Việt về tên tham số Tiếng Anh -->
{{#invoke: ParameterAliasNormalizer | main
| __template = Thông tin sông/main
<!-- param aliases -->
| name = tên\\river_name\\tên sông
| name_native = tên địa phương
| map = image_map
| image = hình\\tên ảnh\\tên hình\\image_name
| image_size = cỡ hình
| image_caption = chú thích hình\\tiêu đề\\caption
| length = độ dài\\dài
| discharge1 = lưu lượng\\discharge
| mouth = cửa sông
| mouth_elevation = cao độ cửa sông
| source1 = origin\\thượng nguồn
| source1_elevation = elevation\\cao độ thượng nguồn\\cao độ
| source1_coordinates = tọa độ thượng nguồn
| mouth_coordinates = tọa độ cửa sông
| basin_size = watershed\\lưu vực
| width_avg = độ rộng\\rộng
| tributaries_left = left_tribs
| tributaries_right = right_tribs
<!-- old params -->
| _countries = quốc gia\\các quốc gia lưu vực\\basin_countries
| _provinces = các tỉnh lưu vực\\tỉnh
<!-- viwiki only params -->
| vi_branch = nhánh
| vi_mouth_width = chiều rộng cửa sông
| vi_distributaries = các chi lưu
}}
local ModuleObj = {}
local getArgs = require("Module:Arguments").getArgs
--[[
Hàm dùng để chuẩn bị dữ liệu
--]]
function ModuleObj.main(frame)
local moduleArgs = getArgs(frame, {frameOnly = true})
local callerArgs = getArgs(frame, {parentOnly = true})
return ModuleObj._main(frame, moduleArgs, callerArgs)
end
--[[
Chuẩn hóa tên của tham số về tên gốc
--]]
function ModuleObj._main(frame, moduleArgs, callerArgs)
-- Replace dấu dollar thành số nếu có
replaceDollar(moduleArgs)
-- Lowercase hóa key của bảng callerArgs
callerArgs = lowerKey(callerArgs)
-- Hàm kiểm tra chuỗi có rỗng không
local function isEmpty(s)
return s == nil or mw.text.trim(s) == ''
end
-- Lấy tên bản mẫu gốc
local templateName = moduleArgs.__template
moduleArgs.__template = nil;
-- Lấy giá trị của đối số ánh xạ gán cho đối số gốc
for baseParam, aliasesStr in pairs(moduleArgs) do
for alias in mw.text.gsplit(aliasesStr, '\\', true) do
alias = mw.ustring.lower(mw.text.trim(alias))
if callerArgs[alias] ~= nil then
local value = callerArgs[alias]
if isEmpty(value) == false then
callerArgs[baseParam] = value
end
callerArgs[alias] = nil
end
end
end
-- Tạo bản mẫu với bảng đối số callerArgs
local content = frame:expandTemplate{ title = templateName, args = callerArgs }
return content
end
--[[
Hàm lowercase hóa key của các pair trong một table
--]]
function lowerKey(table)
local lowercased = {}
for key, value in pairs(table) do
lowercased[mw.ustring.lower(key)] = value
end
return lowercased
end
--[[
Hàm thay dấu dollar thành số
Ví dụ: "combatant${1,3} = bên $" sẽ sinh ra 3 đối số:
"combatant1 = bên 1", "combatant2 = bên 2", "combatant3 = bên 3"
--]]
function replaceDollar(table)
local temp = {}
-- Tìm các key có pattern phù hợp, sinh các cặp key-value tương ứng
-- và xóa cặp key-value ban đầu
for key, value in pairs(table) do
if (mw.ustring.match(key, "${(%d+,%d+)}")) then
local points = mw.text.split(mw.ustring.match(key, "${(%d+,%d+)}"), ",", true)
for i = points[1], points[2], 1 do
local k = mw.ustring.gsub(key, "(${%d+,%d+})", i)
local v = mw.ustring.gsub(value, "%$", i)
temp[k] = v
end
table[key] = nil
end
end
for key, value in pairs(temp) do
table[key] = value
end
end
return ModuleObj