Dieses Modul benötigt Modul:Arguments
Dieses Modul benötigt Modul:TNT
Diese Dokumentationsseite spiegelt den Inhalt der Seite Modul:Quelle/Doku wieder. |
Modulabhängigkeiten
Modulinfo
Dieses Modul setzt die Vorlage:Quelle um. Anweisungen zur Verwendung findest du auf der Vorlagenseite.
local Quelle = {}
local metatable = {}
local methodtable = {}
metatable.__index = methodtable
local TNT = require( 'Module:TNT' )
--[[
Generates references in the following format
"[url title]" vom date. _website_. Abgerufen am access_date.
"Comm-Link:12345 - Lorem Ipsum" vom 11.01.2020. _Roberts Space Industries_. Abgerufen am 12.01.2020.
"[url title]". _website_.
"Comm-Link:12345 - Lorem Ipsum". _Roberts Space Industries_.
"[url]". _website_.
"https://robertsspaceindustries.com/comm-links/12345-lorem-ipsum". _Roberts Space Industries_.
author. "[url title]" vom date. _website_. Abgerufen am access_date.
Dave Haddock. "Comm-Link:12345 - Lorem Ipsum" vom 11.01.2020. _Roberts Space Industries_. Abgerufen am 12.01.2020.
"[url title]" _([url_internal])_ vom date. _website_. Abgerufen am access_date.
"Comm-Link:12345 - Lorem Ipsum" _(Im Wiki)_ vom 11.01.2020. _Roberts Space Industries_. Abgerufen am 12.01.2020.
"[url title]" _([url_internal title_internal])_ vom date. _website_. Abgerufen am access_date.
"Comm-Link:12345 - Lorem Ipsum" _(Comm-Link:12345)_ vom 11.01.2020. _Roberts Space Industries_. Abgerufen am 12.01.2020.
"[url title]" vom date. _website_. Seite page.
"Broschüre der 300i" vom 11.01.2020. _Roberts Space Industries_. Seite 18, ff..
"[url title]" vom date. _website_. Abschnitt section. Abgerufen am access_date.
"10 for the Chairman: 24.12.2013" vom 11.01.2020. _YouTube_. Abschnitt 4:12 - 5:50. Abgerufen am 12.01.2020.
"[url]" vom date. _website_. Abschnitt ab section. Abgerufen am access_date.
"https://youtube.com/?v=th1Si54nUr7" vom 11.01.2020. _YouTube_. Abschnitt ab 5:50. Abgerufen am 12.01.2020.
]]
--- 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 mw.ustring.find( mw.ustring.lower( haystack ), needle, 1, true )
end
--- Returns wikitext linkparts for a link
---
--- @param link string -
---
--- @return table - Table containing 'linkStart', 'linkEnd', 'separator'
local function getWikiLinkParts( link )
if stringContains( 'http', link ) then
return {
linkStart = '[',
linkEnd = ']',
separator = ' ',
}
else
return {
linkStart = '[[',
linkEnd = ']]',
separator = '|',
}
end
end
--- Builds a wikitext link
---
--- @param link string - The link
--- @param text string - The text to show instead of the link
--- @param quote bool - True to wrap link in '"'
---
--- @return string
local function makeLinkText( link, text, quote )
local linkParts = getWikiLinkParts( link )
if quote == nil then
quote = false
end
if text == nil and quote == false then
text = ''
linkParts.separator = ''
elseif quote == true then
if text == nil then
text = link
end
text = string.format( '"%s"', text )
end
return linkParts.linkStart .. link .. linkParts.separator .. text .. linkParts.linkEnd
end
---
--- Parts
---
--- Source URL Part
--- "[url title]"
--- Tries to guess the website part based on the url
--- Adds a icon for known urls
---
--- Template arguments used in this method:
--- @arg url | link
--- @arg archive_url
--- @arg title | link_text | 1
--- @arg extra_text - DEPRECATED
---
--- @return string - Usable wikitext
local function buildSourceUrlPart( instance )
local websiteName
local logoFileName
local url = instance.args.url or instance.args.link
local title = instance.args.title or instance.args.link_text or instance.args[ 1 ] or instance.args.text
--- Add a maintenance category for sources without an url
if url == nil then
table.insert( instance.categories, '[[Kategorie:Seite mit fehlerhafter Quelle]]' )
return ''
end
--- If the url does not contain 'http' also add a maintenance url
if not stringContains( 'http', url ) then
table.insert( instance.categories, '[[Kategorie:Seite mit fehlerhafter Quelle]]' )
else
mw.smw.set({
Quelle = url
})
end
if stringContains( 'youtube', url ) or stringContains( 'youtu.be', url ) then
logoFileName = 'YouTube_Logo.svg'
websiteName = 'YouTube'
elseif stringContains( 'robertsspaceindustries', url ) then
logoFileName = 'Roberts Space Industries.svg'
websiteName = 'Roberts Space Industries'
if stringContains( '/comm-link', url ) then
websiteName = websiteName .. ' Comm-Links'
elseif stringContains( '/galactapedia', url ) then
websiteName = websiteName .. ' Galactapedia'
elseif stringContains( '/spectrum', url ) then
websiteName = websiteName .. ' Spectrum'
elseif stringContains( '/pledge', url ) then
websiteName = websiteName .. ' Pledge Store'
elseif stringContains( '/starmap', url ) then
websiteName = websiteName .. ' Starmap'
elseif stringContains( '/issue-council', url ) then
websiteName = websiteName .. ' Issue Council'
else
websiteName = websiteName .. ' Webseite'
end
elseif stringContains( 'starcitizenbase', url ) then
logoFileName = 'Star_Citizen_Base_Logo.svg'
websiteName = 'Star Citizen Base'
elseif stringContains( 'starcitizenblog', url ) then
websiteName = 'Star Citizen Blog'
elseif stringContains( 'star-citizen-news-radio', url ) then
logoFileName = 'Star_Citizen_News_Radio_Logo.png'
websiteName = 'Star Citizen News Radio'
elseif stringContains( 'star-citizen.wiki', url ) then
logoFileName = 'Star_Citizen_Wiki_Stern.png'
websiteName = 'Star Citizen Wiki'
end
instance.website = websiteName
if logoFileName then
table.insert( instance.parts, 1, string.format( '[[Datei:%s|x15px|link=|class=noviewer]]', logoFileName ) )
end
if instance.args.archive_url ~= nil then
return makeLinkText( instance.args.archive_url, title, true )
end
return makeLinkText( url, title, true )
end
--- Internal URL Part
--- ''([url_internal title_internal])''
---
--- Template arguments used in this method:
--- @arg url_internal
--- @arg title_internal
---
--- @return string - Usable wikitext
local function buildInternalUrlPart( instance )
if instance.args.url_internal == nil then
return ''
end
local linkText = instance.args.title_internal or TNT.format( 'I18n/Module:Quelle', 'txt_in_wiki' )
return string.format( " ''(%s)''", makeLinkText( instance.args.url_internal, linkText ) )
end
--- Source Date Part, the date the source was published
--- vom date
---
--- Template arguments used in this method:
--- @arg date
---
--- @return string - Date text
local function buildSourceDatePart( instance )
local date = instance.args.date
if date == nil then
return ''
end
--- TODO: Format date?
return ' ' .. TNT.format( 'I18n/Module:Quelle', 'txt_from', date )
end
--- Author Part
--- author.
---
--- Template arguments used in this method:
--- @arg author
---
--- @return string - Author text
local function buildAuthorPart( instance )
local author = instance.args.author
if author == nil then
return
end
table.insert( instance.parts, string.format( '%s.', author ) )
end
--- URL Part
--- "[url title]" ''([url_internal title_internal])'' vom date.
---
--- @return string - The url part
local function buildUrlPart( instance )
local sourceUrl = buildSourceUrlPart( instance )
local internalUrl = buildInternalUrlPart( instance )
local sourceUrlDate = buildSourceDatePart( instance )
table.insert( instance.parts, string.format( '%s%s%s.', sourceUrl, internalUrl, sourceUrlDate ) )
end
--- Archive URL Part
--- Adds an "Archiviert vom [Original] am [archive_date]." part
---
--- Template arguments used in this method:
--- @arg archive_url
--- @arg archive_date
---
--- @return string - Usable wikitext
local function buildArchiveUrlPart( instance )
--- adds the original url to the [Original] part
if instance.args.archive_url == nil or ( instance.args.archive_url ~= nil and (instance.args.url == nil or not stringContains( 'http', instance.args.url ))) then
return ''
end
local date = ''
if instance.args.archive_date ~= nil then
date = ' ' .. TNT.format( 'I18n/Module:Quelle', 'txt_on', instance.args.archive_date )
end
table.insert( instance.parts, TNT.format( 'I18n/Module:Quelle', 'txt_archived', makeLinkText( instance.args.url, 'Original' ), date ) )
end
--- Website Part
--- ''website.''
---
--- Template arguments used in this method:
--- @arg website
---
--- @return string - The website part
local function buildWebsitePart( instance )
local websiteName = instance.args.website or instance.website
if websiteName ~= nil then
table.insert( instance.parts, string.format( "''%s''.", websiteName ) )
end
end
--- Page Part, allow to specify a specific page e.g. in a pdf
--- Seite page.
---
--- Template arguments used in this method:
--- @arg page
---
--- @return string - The page part
local function buildPagePart( instance )
if instance.args.page == nil then
return
end
table.insert( instance.parts, TNT.format( 'I18n/Module:Quelle', 'txt_page', instance.args.page ) )
end
--- Section Part, allow to specify a specific section somewhere
--- Abschnitt section.
---
--- Template arguments used in this method:
--- @arg section
---
--- @return string - The section part
local function buildSectionPart( instance )
if instance.args.section == nil then
return
end
table.insert( instance.parts, TNT.format( 'I18n/Module:Quelle', 'txt_section', instance.args.section ) )
end
--- Accessed Date Part, the date the source was accessed
--- Abgerufen am access_date.
---
--- Template arguments used in this method:
--- @arg access_date
---
--- @return string - The accessed date part
local function buildAccessedDatePart( instance )
local date = instance.args.access_date or instance.args.accessdate
if date == nil then
return
end
date = mw.getCurrentFrame():preprocess( date )
table.insert( instance.parts, TNT.format( 'I18n/Module:Quelle', 'txt_retrieved', date ) )
end
--- Wraps the text in <ref> tags
---
--- @param text string The whole inner ref output
---
--- Template arguments used in this method:
--- @arg ref_name string - The optional reference name
--- @arg ref_group - The optional reference group
---
--- @return string The wrapped text
local function wrapInRef( instance, text )
local options = {}
if instance.args.ref_name ~= nil then
options.name = tostring( instance.args.ref_name )
end
if instance.args.ref_group ~= nil then
options.group = tostring( instance.args.ref_group )
end
return mw.getCurrentFrame():extensionTag( 'ref', text, options )
end
--- Build all parts of the reference
--- This defines the order of the outputted parts
---
--- @return string Ref output
local function buildParts( instance )
buildAuthorPart( instance )
buildUrlPart( instance )
buildArchiveUrlPart( instance )
buildWebsitePart( instance )
buildPagePart( instance )
buildSectionPart( instance )
buildAccessedDatePart( instance )
local text = table.concat( instance.parts, ' ' )
if instance.args.wrap or instance.args.ref then
return wrapInRef( instance, text )
end
return text
end
--- Checks if a deprecated template argument was used, sets a maintenance category
--- We'll only check 'extra_text' for now
local function checkOldArgumentNames( instance )
if instance.args.extra_text ~= nil then
table.insert( instance.categories, '[[Kategorie:Seite mit veraltetem Vorlagenparameter]]')
end
end
--- Set the current frame for this instance
--- Automatically parses args
--- @param frame table - The current frame
function methodtable.setFrame( self, frame )
self.args = require( 'Module:Arguments' ).getArgs( frame )
end
--- Format the arguments to text
---
--- @param arguments table|nil If param is set, overwrites the frame args
--- @return string
function methodtable.format( instance, arguments )
if type( arguments ) == 'table' then
instance.args = arguments
end
local text = buildParts( instance )
if #instance.categories > 1 then
return table.concat( instance.categories )
end
checkOldArgumentNames( instance )
return text .. table.concat( instance.categories )
end
--- DEPRECATED
function Quelle.setArgs()
end
--- Entry point for template calls
--- @return string
function Quelle.format( frame )
if frame == nil then
return '[[Kategorie:Seite mit veraltetem Vorlagenaufruf]]'
end
local instance = Quelle:new()
instance:setFrame( frame )
return instance:format()
end
--- New Instance
--- Library entrance
function Quelle.new( self )
local instance = {
args = nil,
categories = {},
parts = {},
website = nil,
}
setmetatable( instance, metatable )
return instance
end
return Quelle