پودمان:NVR

از ویکی‌پدیا، دانشنامهٔ آزاد
توضیحات پودمان[ایجاد] [پاکسازی]
--[[  
 
This module generates links to ships in the Naval Vessel Register (nvr.navy.mil) database.  
It is used by Template:NVR_url and Template:NVR_SC_url
 
Please do not modify this code without applying the changes first at Module:NVR/sandbox and testing 
at Module:NVR/sandbox/testcases and Module talk:NVR/sandbox/testcases.
 
Authors and maintainers:
* User:RP88
 
]]

local p = {}

-- =======================================
-- === Dependencies ======================
-- =======================================

require('Module:No globals')
local rules = require('Module:NVR/rules') -- get rules for transforming NVR links

-- =======================================
-- === Private Functions =================
-- =======================================

--[[
Generate link to NVR database.
]]
local function nvr_link( url_str, title )
	local link = ''

	if (title == '') then
		link = url_str
	else
		link = '[' .. url_str .. ' ' .. title .. ']'
	end
	
    return link
end


--[[
Generate url to NVR database.
]]
local function nvr_url_using_rules( nvrid, rules )
	local url = ''
	
	-- apply transformation rules and determine base URL to use
	local i = 1
	local done = false
	repeat 
		local rule = rules.rules[i]
		i = i + 1
		if rule == nil then
			done = true
		else
			local method = rule.method
			if method == 'literal' then
				-- if nvirid is identical to a literal then set it to a replacement literal
				if ((rule.match == nil) or (nvrid == rule.match)) then
					if rule.replace ~= nil then
						nvrid = rule.replace
					end
					url = rules.urls[rule.url] or ''
					done = true
				end
			elseif method == 'pattern' then
				-- if nvrid meets matching pattern, replace occurrences of pattern in nvrid per rule
				if ((rule.match == nil) or (mw.ustring.find(nvrid, rule.match) ~= nil)) then
					if rule.replace ~= nil then
						if rule.pattern ~= nil then
							nvrid = mw.ustring.gsub(nvrid, rule.pattern, rule.replace);
						else
							nvrid = rule.replace
						end
					end
					url = rules.urls[rule.url] or ''
					done = true
				end
			elseif method == 'all' then
				-- don't alter nvrid at all
				url = rules.urls[rule.url] or ''
				done = true
			else
				-- skip unrecognized rule
			end
		end
	until done
	
	-- replace '****' in url with transformed nvrid
	url = mw.ustring.gsub(url, "%*%*%*%*", nvrid, 1);

    return url
end


-- =======================================
-- === Public Functions ==================
-- =======================================

--[[
MakeShipLink
 
This function returns a link to a ship in the Naval Vessel Register.
 
Usage:
{{#invoke:NVR|MakeShipLink|1=|title=}}
{{#invoke:NVR|MakeShipLink}} - uses the caller's parameters
 
Parameters
    1, id: The 'file name' portion of the url path (typically the ship's hull designation) without the .HTM/.HTML extension. 
    2, title: A title or label for the link.
]]
function p.MakeShipLink( frame )
	-- if no argument provided than check parent template/module args
	local args = frame.args
	if (args[1]==nil) and (args["id"]==nil) then
		args = frame:getParent().args 
	end
	
	local nvrid = args["id"] or args[1]; 
	local title = args["title"] or args[2];

	local output = p._MakeShipLink(nvrid, title)

	return output
end


--[[
MakeServiceCraftLink
 
This function returns a link to a service craft in the Naval Vessel Register.
 
Usage:
{{#invoke:NVR|MakeServiceCraftLink|1=|title=}}
{{#invoke:NVR|MakeServiceCraftLink}} - uses the caller's parameters
 
Parameters
    1, id: The 'file name' portion of the url path (typically the craft's hull designation) without the .HTM/.HTML extension. 
    2, title: A title or label for the link.
]]
function p.MakeServiceCraftLink( frame )
	-- if no argument provided than check parent template/module args
	local args = frame.args
	if (args[1]==nil) and (args["id"]==nil) then
		args = frame:getParent().args 
	end
	
	local nvrid = args["id"] or args[1]; 
	local title = args["title"] or args[2];

	local output = p._MakeServiceCraftLink(nvrid, title)

	return output
end


--[[
This function returns a link to a ship in the Naval Vessel Register. 

Parameters
	nvrid: The 'file name' portion of the url path (typically the ship's hull designation) without the .HTM/.HTML extension, as a string.
	title: Title for link, set to '' for a bare link without a title.
]]
function p._MakeShipLink( nvrid, title )	
	local output = ''
	local url = ''
	
	-- normalize parameters
	nvrid = mw.text.trim(mw.ustring.upper(nvrid or ''))
	title = mw.text.trim(title or '')
	
	-- create url from nvrid
	url = nvr_url_using_rules(nvrid, rules.ShipRules)
	
	-- create link from url
	output = nvr_link(url, title)
		
	return output
end


--[[
This function returns a link to a service craft in the Naval Vessel Register. 

Parameters
	nvrid: The 'file name' portion of the url path (typically the craft's hull designation) without the .HTM/.HTML extension, as a string.
	title: Title for link, set to '' for a bare link without a title.
]]
function p._MakeServiceCraftLink( nvrid, title )	
	local output = ''
	local url = ''
	
	-- normalize parameters
	nvrid = mw.text.trim(mw.ustring.upper(nvrid or ''))
	title = mw.text.trim(title or '')
	
	-- create url from nvrid
	url = nvr_url_using_rules(nvrid, rules.ServiceCraftRules)
	
	-- create link from url
	output = nvr_link(url, title)
		
	return output
end

return p