Module:Cite RSI

Revision as of 23:11, 19 April 2023 by sctools>Alistair3149 (Move templatestyles into Lua module)
Module documentation[view][edit][history][purge]
This documentation is transcluded from Module:Cite RSI/doc. Changes can be proposed in the talk page.
Function list
L 10 — stringContains
L 19 — formatTitle
L 34 — sanitizeURL
L 53 — getType
L 77 — getSubtype
L 86 — getTitle
L 118 — p.main

Module:Cite RSI implements the {{Cite RSI}} template.


local p = {}
local args

--- Helper function checking if a substring is in a string
--
-- @param needle string - Value to search for
-- @param haystack string - String to search in
--
-- @return bool - True if found
local function stringContains( needle, haystack )
    return string.find( mw.ustring.lower( haystack ), needle, 1, true )
end

--- Remove hyphen and format string into title case
--
-- @param title string
--
-- @return string
local function formatTitle( title )
	local titleCase = require( 'Module:String2' ).title
	if title and title ~= '' then
		-- Replace hyphens with space
		title = string.gsub( title, '-', ' ' )
		-- Format into title case
		title = titleCase{ args={ title } }
	end
	
	return title
end

-- @param url string
--
-- @return string
local function sanitizeURL( url )
	local santizedURL

	if stringContains('robertsspaceindustries.com', url) then
		-- Remove 'www.' from the link
		santizedURL = mw.ustring.gsub( url, 'www%.', '' )
	else
		-- Add "https://robertsspaceindustries.com/" to url if it is not present
		santizedURL = 'https://robertsspaceindustries.com/' .. url
	end

	return santizedURL
end

--- Determine which type of RSI website it is
--
-- @param url string - RSI website URL
--
-- @return string - Site type or nil if unknown
local function getType( url )
	local type

	if stringContains( '/comm-link/', url ) then
		type = 'Comm-Link'
    elseif stringContains( '/galactapedia/', url ) then
		type = 'Galactapedia'
    elseif stringContains( '/spectrum/', url ) then
		type = 'Spectrum'
    elseif stringContains( '/pledge/', url ) then
		type = 'Pledge Store'
    elseif stringContains( '/starmap', url ) then
		type = 'Starmap'
    elseif stringContains( '/issue-council', url ) then
		type = 'Issue Council'
	elseif stringContains( 'support.robertsspaceindustries', url ) then
		type = 'Knowledge Base'
    else
        type = nil
	end

	return type
end

local function getSubtype( url, type )
	local subtype = nil
	if type == 'Comm-Link' then
		subtype = string.match( url, '/comm%-link/([%w-]+)/%d+-[%w-]+' )
	end

	return formatTitle( subtype )
end

local function getTitle( url, type )
	local titleText
	local throwError = function()
		return error( 'Title can not be generated, please fill in the text parameter.' )
	end

	-- Auto title generation, might not be accurate since special characters
	-- are escaped in the URL
	--
	-- e.g. /comm-link/transmission/14710-Starfarer-Q-A-Part-1
	if type == 'Comm-Link' then
		titleText = string.match( url, '/comm%-link/[%w-]+/%d+-([%w-]+)' )
	-- e.g. /article/0j46Lzl8xm-torral-aggregate
	elseif type == 'Galactapedia' then
		titleText = 'Galactapedia: ' .. string.match( url, '/article/%w+-([%w-]+)' )
	-- NOTE: Only support threads at the moment
	-- e.g. /thread/star-citizen-alpha-3-13-0-live-7319707-patch-notes
	elseif type == 'Spectrum' then
		titleText = string.match( url, '/thread/%w+-([%w-]+)' )
	-- e.g. /hc/en-us/categories/360000295274-Updates-and-Info
	elseif type == 'Knowledge Base' then
		titleText = string.match( url, '/hc/.+/.+/%d+-([%w-]+)' )
	-- Will still try its best to extact a title
	else
		local urlParts = mw.text.split(url, '[/]')
		titleText = urlParts[ #urlParts ]
	end

	return formatTitle( titleText )
end

-- NOTE: Don't have internal link support yet
function p.main( frame )
	if args == nil then
        args = require( 'Module:Arguments' ).getArgs( frame )
	end

	local url = sanitizeURL( args.url )
	local type = getType( url )
	local date = args.accessdate
	local title
	local output
	
	if args.text then
		title = args.text
	else
		title = getTitle( url, type )
	end
	
	-- Maybe there is a smarter way?
	-- This needs to be redone with mw.html
	output = '<cite class="citation rsi_site">' ..
		'<span class="metadata citation-icon" title="RSI site">[[File:RSIsite.svg|x11px|link=]]</span>' ..
		'[' .. url .. ' ' .. title .. ']'
	
	if type then
		local subtype = getSubtype( url, type )
		
		output = output .. '. '
		if subtype then
			output = output .. '<i>' .. subtype .. '</i> - '
		end
		output = output .. '<i>' .. type .. '</i>' 
	end
	
	if date then
		output = output .. '. Retrieved ' .. date
	end
	
	output = output .. '</cite>'

	return mw.getCurrentFrame():extensionTag{
		name = 'templatestyles', args = { src = 'Module:Cite/styles.css' }
	} .. output
end
return p