Module:Cite RSI

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

-- This is from Module:String2 -- FIXME: Figure out how to call in from Lua properly local function titlecase( text ) local alwayslower = {['a'] = 1, ['an'] = 1, ['the'] = 1, ['and'] = 1, ['but'] = 1, ['or'] = 1, ['for'] = 1, ['nor'] = 1, ['on'] = 1, ['in'] = 1, ['at'] = 1, ['to'] = 1, ['from'] = 1, ['by'] = 1, ['of'] = 1, ['up'] = 1 } local res = '' local s = mw.text.trim( text or "" ) local words = mw.text.split( s, " ") for i, s in ipairs(words) do -- is strip-marker safe, string.lower is not. s = mw.getCurrentFrame:callParserFunction('lc', s)		if i == 1 or alwayslower[s] ~= 1 then s = mw.getContentLanguage:ucfirst(s) end words[i] = s	end return table.concat(words, " ") end

--- Remove hyphen and format string into title case -- -- @param title string -- -- @return string local function formatTitle( title ) if title == nil or title == '' then return title end

-- Replace hyphens with space title = string.gsub( title, '-', ' ' ) -- Format into title case title = titlecase( title )

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 or args[1] ) 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 = '' .. ' ' ..		'[' .. url .. ' ' .. title .. ']'	if type then local subtype = getSubtype( url, type ) output = output .. '. '		if subtype then output = output ..  .. subtype .. ''' - '		end output = output ..  .. type ..  	end if date then output = output .. '. Retrieved ' .. date end output = output .. ' '

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