Jump to content

Module:Naval Vessel Register URL

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by RP88 (talk | contribs) at 22:28, 28 September 2016 (use rules table). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

--[[  
 
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[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
					nvrid = rule.replace or ''
					url = rules.urls[rule.url] or ''
					done = true
				end
			elseif method == 'pattern' then
				-- if nvrid meets matching pattern, replace first occurrence of pattern in nvrid per rule
				if ((rule.match == nil) or (mw.ustring.find(nvrid, rule.match) ~= nil)) then
					nvrid = mw.ustring.gsub(nvrid, (rule.pattern or ''), (rule.replace or ''), 1);
					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] or ''; 
	local title = args["title"] or args[2] or '';

	local output = p._MakeShipLink(nvrid, title)

	return output
end


--[[
MakeServiceShipLink
 
This function returns a link to a service ship in the Naval Vessel Register.
 
Usage:
{{#invoke:NVR|MakeServiceShipLink|1=|title=}}
{{#invoke:NVR|MakeServiceShipLink}} - 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.MakeServiceShipLink( 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] or ''; 
	local title = args["title"] or args[2] or '';

	local output = p._MakeServiceShipLink(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))
	title = mw.text.trim(title)
	
	-- 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 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._MakeServiceShipLink( nvrid, title )	
	local output = ''
	local url = ''
	
	-- normalize parameters
	nvrid = mw.text.trim(mw.ustring.upper(nvrid))
	title = mw.text.trim(title)
	
	-- create url from nvrid
	url = nvr_url_using_rules(nvrid, rules.ServiceShipRules)
	
	-- create link from url
	output = nvr_link(nvr_link, title)
		
	return output
end

return p