Mô đun:ParameterAliasNormalizer

Tài liệu mô đun[xem] [sửa] [lịch sử] [làm mới]

Cách sử dụng sửa

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