(Created blank page) |
No edit summary |
||
Line 1: | Line 1: | ||
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 output | |||
end | |||
return p |
Revision as of 00:22, 28 January 2023
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 output
end
return p