Modul:Quelle

Aus Star Citizen Wiki

Diese Vorlage dient der einheitlichen Darstellung von Quellen im Fußbereich.

Kopiervorlage[Quelltext bearbeiten]

Hinzufügen einer einfachen Quelle:

<ref>
{{Quelle
|url=
|title=
|date=
|access_date=
|url_internal=
}}
</ref>

Beispiele[Quelltext bearbeiten]

Quelle mit Datum, Abrufdatum und Wiki Link[Quelltext bearbeiten]

<ref group="RSI">
{{Quelle
|url=https://robertsspaceindustries.com/comm-link/transmission/12663-Welcome-To-The-Comm-Link
|title=Welcome to the Comm-Link
|date=04.09.2012
|url_internal=Comm-Link:12663
|access_date=22.10.2020
}}
</ref>

Ausgabe[Quelltext bearbeiten]

Roberts Space Industries.svg "Welcome to the Comm-Link" (Im Wiki) vom 04.09.2012. Roberts Space Industries Comm-Links. Abgerufen am 22.10.2020.

Hinzufügen einer Quelle in der Gruppe "RSI"[Quelltext bearbeiten]

<ref group="RSI">
{{Quelle
|url=https://robertsspaceindustries.com/pledge/ships/terrapin/Terrapin
|title=Schiffsdaten der Tarrapin
|access_date=22.10.2020
}}
</ref>

Ausgabe[Quelltext bearbeiten]

Roberts Space Industries.svg "Schiffsdaten auf RSI". Roberts Space Industries Pledge Store. Abgerufen am 22.10.2020.

Das Attribut group aus <ref group="RSI"> erlaubt Quellen zu gruppieren. So können viele Quellen übersichtlich zu Gruppen zusammengefasst werden.

Der Gruppenname ist frei wählbar. Das Auslassen des Namens fügt Quellen automatisch einer namenlosen Gruppe hinzu. Quellen von Roberts Space Industries sollten der Gruppe RSI hinzugefügt werden.

Quelle mit Autor, Datum, Abrufdatum und Wiki Link[Quelltext bearbeiten]

<ref group="RSI">{{Quelle
|url=https://robertsspaceindustries.com/comm-link/serialized-fiction/17794-Drifters-Part-One
|title=Drifters Part One
|date=23.09.2020
|url_internal=Comm-Link:17794
|access_date=22.10.2020
|author=Dave Haddock
}}</ref>

Ausgabe[Quelltext bearbeiten]

Roberts Space Industries.svg Dave Haddock. "Drifters Part One" (Im Wiki) vom 23.09.2020. Roberts Space Industries Comm-Links. Abgerufen am 22.10.2020.

Hinzufügen einer Quelle ohne Angabe einer Gruppe[Quelltext bearbeiten]

<ref>
{{Quelle
|url=https://star-citizen.wiki
|title=Das Star Citizen Wiki
}}
</ref>

Ausgabe der Vorlage mit <ref> tags[Quelltext bearbeiten]

Der Parameter |ref=true erzeugt automatisch <ref> Tags. Somit muss nur noch die Vorlage selbst eingebunden werden.

{{Quelle
|url=https://robertsspaceindustries.com/pledge/ships/terrapin/Terrapin
|title=Schiffsdaten der Tarrapin
|access_date=22.10.2020
|ref=true
}}

Ausgabe[Quelltext bearbeiten]

<ref>Roberts Space Industries.svg "Schiffsdaten der Tarrapin". Roberts Space Industries Pledge Store. Abgerufen am 22.10.2020.</ref>

Ausgabe der Vorlage mit <ref> tags und Attributen[Quelltext bearbeiten]

Zusätzlich können die Paramter |ref_name= und |ref_group= angegeben werden.

{{Quelle
|url=https://robertsspaceindustries.com/pledge/ships/terrapin/Terrapin
|title=Schiffsdaten der Tarrapin
|access_date=22.10.2020
|ref=true
|ref_name=Terrapin
|ref_group=RSI
}}

Ausgabe[Quelltext bearbeiten]

<ref name="Terrapin" group="RSI">Roberts Space Industries.svg "Schiffsdaten der Tarrapin". Roberts Space Industries Pledge Store. Abgerufen am 22.10.2020.</ref>

Hinzufügen eines Archive.org Links[Quelltext bearbeiten]

Ist die Originalseite der Quelle nicht mehr erreichbar, kann unter Umständen eine Kopie auf Archive.org verfügbar sein.

Falls eine solche Kopie existiert verlinke diese bitte wie in dem folgenden Beispiel in der Vorlage.

{{Quelle
|url=http://citizencon.de/2016/07/19/brian-chambers-confirmed/
|title=Brian Chambers, Studioleiter von Foundry 42.
|date=19.07.2016
|access_date=27.10.2020
|website=CitizenCon
|archive_url=http://web.archive.org/web/20170201162657/http://citizencon.de/2016/07/19/brian-chambers-confirmed/
|archive_date=01.02.2017
}}

Ausgabe[Quelltext bearbeiten]

"Brian Chambers, Studioleiter von Foundry 42." vom 19.07.2016. Archiviert vom Original am 01.02.2017. CitizenCon. Abgerufen am 27.10.2020.

Für zusätzliche Informationen siehe auch unsere Hilfeseite zu Bearbeiten von Seiten.


local Quelle = {}

local args
local categories = {}

local parts = {}

local website

--[[

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 string.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
--
-- @arg url | link
-- @arg archive_url
-- @arg title | link_text | 1
-- @arg extra_text - DEPRECATED
--
-- @return string - Usable wikitext
local function buildSourceUrlPart()
    local websiteName
    local logoFileName
    local url = args.url or args.link
    local title = args.title or args.link_text or args[ 1 ]

    if url == nil then
        table.insert( categories, '[[Kategorie:Seite mit fehlerhafter Quelle]]' )

        return ''
    end

    if not stringContains( 'http', url ) then
        table.insert( categories, '[[Kategorie:Seite mit fehlerhafter Quelle]]' )
    else
        mw.smw.set({
            Quelle = url
        })
    end

    if stringContains( 'youtube', url ) then
        logoFileName = 'YouTube_Logo.svg'
        websiteName = 'YouTube'
    elseif stringContains( 'robertsspaceindustries', url ) then
        logoFileName = 'Roberts Space Industries.svg'

        websiteName = 'Roberts Space Industries'

        if stringContains( '/starmap', url ) then
            websiteName = websiteName .. ' Starmap'
        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( '/comm-link', url ) then
            websiteName = websiteName .. ' Comm-Links'
        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_Logo.png'
        websiteName = 'Star Citizen Wiki'
    end

    website = websiteName

    if logoFileName then
        table.insert( parts, 1, string.format( '[[Datei:%s|x15px|link=|class=noviewer]]', logoFileName ) )
    end

    if args.archive_url ~= nil then
        return makeLinkText( args.archive_url, title, true )
    end

    return makeLinkText( url, title, true )
end

--- Internal URL Part
-- ''([url_internal title_internal])''
--
-- @arg url_internal
-- @arg title_internal
--
-- @return string - Usable wikitext
local function buildInternalUrlPart()
    if args.url_internal == nil then
        return ''
    end

    local linkText = args.title_internal or 'Im Wiki'

    return string.format( " ''(%s)''", makeLinkText( args.url_internal, linkText ) )
end

--- Source Date Part
-- vom date
--
-- @arg date
--
-- @return string - Date text
local function buildSourceDatePart()
    local date = args.date

    if date == nil then
        return ''
    end

    -- TODO Format date?
    return string.format( ' vom %s', date )
end

--- Author Part
-- author.
--
-- @arg author
--
-- @return string - Author text
local function buildAuthorPart()
    local author = args.author

    if author == nil then
        return
    end

    table.insert( parts, string.format( '%s.', author ) )
end

--- URL Part
-- "[url title]" ''([url_internal title_internal])'' vom date.
--
-- @return string - The url part
local function buildUrlPart()
    local sourceUrl = buildSourceUrlPart()
    local internalUrl = buildInternalUrlPart()
    local sourceUrlDate = buildSourceDatePart()

    table.insert( parts, string.format( '%s%s%s.', sourceUrl, internalUrl, sourceUrlDate ) )
end

--- Archive URL Part
-- Adds an "Archiviert vom [Original] am [archive_date]." part
--
-- @arg archive_url
-- @arg archive_date
--
-- @return string - Usable wikitext
local function buildArchiveUrlPart()
    -- adds the original url to the [Original] part
    if args.archive_url == nil or ( args.archive_url ~= nil and (args.url == nil or not stringContains( 'http', args.url ))) then
        return ''
    end

    local date = ''

    if args.archive_date ~= nil then
        date = string.format( ' am %s', args.archive_date )
    end

    table.insert( parts, string.format( 'Archiviert vom %s%s.', makeLinkText( args.url, 'Original' ), date ) )
end

--- Website Part
-- ''website.''
--
-- @arg website
--
-- @return string - The website part
local function buildWebsitePart()
    local websiteName = args.website or website

    if websiteName ~= nil then
        table.insert( parts, string.format( "''%s''.", websiteName ) )
    end
end

--- Page Part
-- Seite page.
--
-- @arg page
--
-- @return string - The page part
local function buildPagePart()
    if args.page == nil then
        return
    end

    table.insert( parts, string.format( 'Seite %s.', args.page ) )
end

--- Section Part
-- Abschnitt section.
--
-- @arg section
--
-- @return string - The section part
local function buildSectionPart()
    if args.section == nil then
        return
    end

    table.insert( parts, string.format( 'Abschnitt %s.', args.section ) )
end

--- Accessed Date Part
-- Abgerufen am access_date.
--
-- @arg access_date
--
-- @return string - The accessed date part
local function buildAccessedDatePart()
    local date = args.access_date

    if date == nil then
        return
    end

    -- TODO Format date?
    table.insert( parts, string.format( 'Abgerufen am %s.', date ) )
end

--- Wraps the text in <ref> tags
-- @arg ref_name string - The optional reference name
-- @arg ref_group - The optional reference group
--
-- @return The wrapped text
local function wrapInRef( text )
    local options = {}

    if args.ref_name ~= nil then
        options.name = tostring( args.ref_name )
    end

    if args.ref_group ~= nil then
        options.group = tostring( 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
local function buildParts()
    buildAuthorPart()
    buildUrlPart()
    buildArchiveUrlPart()
    buildWebsitePart()
    buildPagePart()
    buildSectionPart()
    buildAccessedDatePart()

    local text = table.concat( parts, ' ' )

    if args.wrap or args.ref then
        return wrapInRef( text )
    end

    return text
end

--- We'll only check 'extra_text' for now
local function checkOldArgumentNames()
    if args.extra_text ~= nil then
        table.insert( categories, '[[Kategorie:Seite mit veraltetem Vorlagenparameter]]')
    end
end

--- Set module arguments programmatically
--
-- @param moduleArgs table - The arguments to use
function Quelle.setArgs( moduleArgs )
    if type( moduleArgs ) == 'table' then
        args = moduleArgs
    end
end

--- Entry point
function Quelle.format( frame )
    if args == nil then
        args = require( 'Module:Arguments' ).getArgs( frame )
    end

    local text = buildParts()

    if #categories > 1 then
        return table.concat( categories )
    end

    checkOldArgumentNames()

    return text .. table.concat( categories )
end

return Quelle