Modul:Information

Aus Steel Beasts Wiki
Version vom 9. Januar 2022, 21:58 Uhr von imported>FoXFTW
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Die Dokumentation für dieses Modul kann unter Modul:Information/Doku erstellt werden

local Information = {}

local metatable = {}
local methodtable = {}

metatable.__index = methodtable

--- Settings
local minDescriptionLength = 10
local authorRsi = 'Roberts Space Industries International Ltd.'
local warnings = {
    dateM = {
        text = 'Das Erstelldatum dieser Datei fehlt',
        type = 'info',
    },
    author = {
        text = 'Für diese Datei wurde kein Autor angegeben. Falls du den Autor der Quelle kennst, füge diesen der Seite gerne hinzu!',
        type = 'info',
    },
    source = {
        text = 'Dieser Datei fehlt die Quellenangabe. Falls du den Link der Quelle kennst, füge diesen der Seite gerne hinzu!',
        type = 'info',
    },
    sourceTooFew = {
        text = 'Dieser Datei scheint der Direktlink, oder der Link zur Quellseite, die die Datei verwendet, zu fehlen.',
        type = 'info',
    },
    description = {
        text = 'Diese Datei besitzt keine Beschreibung. Füge gerne eine kurze Beschriebung der Seite hinzu!',
        type = 'info',
    },
    descriptionTooShort = {
        text = 'Die Beschreibung der Datei ist zu kurz. Sie sollte mindestens 10 Zeichen enthalten.',
        type = 'info',
    },
}


--- Helper function checking if a string contains 'robertsspaceindustries'
--- Used to detect whether a source url is from an official site
---
--- @param source string - URL
---
--- @return boolean - True if string matches
local function checkSourceRsi( source )
    source = source or ''

    return string.match( source, 'robertsspaceindustries' )
end


--- Helper function checking if a string is handled as an official author
---
--- @param author string - Author
---
--- @return boolean - True if string matches
local function checkAuthorRsi( author )
    author = author or ''

    return string.match( author, authorRsi ) or author == authorRsi or string.match( author, 'RSI' )
end


--- Initializes the instance
---
--- @param frame table MW Frame
function methodtable.init( self, frame )
    self.frame = frame
    self.args = require('Module:Arguments').getArgs( frame )

    if type(self.args.source) ~= 'string' then
        self.args.source = ''
    end
end


--- Processes the date argument if present
--- Adds a maintenance category otherwise
function methodtable.processDate( self )
    if type( self.args.date ) == 'string' then
        self.smwData['Erstelldatum'] = self.args.date
    else
        self.showWarnings.date = true
        table.insert( self.categories, '[[Kategorie:Datei mit fehlendem Datum]]' )
    end
end


--- Processes the source argument if present
--- Adds a maintenance category otherwise
function methodtable.processSource( self )
    if type( self.args.source ) ~= 'string' then
        self.showWarnings.source = true
        table.insert( self.categories, '[[Kategorie:Datei mit fehlender Quelle]]' )
        return
    end

    local sources = mw.text.split( mw.text.trim( self.args.source ), ',')
    if type( sources ) == 'string' then
    	sources = mw.text.split( mw.text.trim( self.args.source ), ' ' )
    end

    local linkSources = {}

    for _, source in pairs( sources ) do
        source = self.frame:preprocess( source )

        -- If Source is RSI, hardcode Author
        -- But only add hardcoded author once
        if checkSourceRsi( source ) and self.authorAddedThroughSource == false then
            table.insert( self.smwData['Autor'], authorRsi )
            self.authorAddedThroughSource = true
        end

        -- Only add Links to SMW
        if string.match( source, 'http' ) then
            table.insert( linkSources, source )
        end
    end

    -- Files from RSI should have at least two sources
    -- 1. The direct link to the file
    -- 2. One ore more links to pages where this file is used
    if #linkSources < 2 and ( self.authorAddedThroughSource or self.args.sources == 'RSI' ) then
        self.showWarnings.sourceTooFew = true
        table.insert( self.categories, '[[Kategorie:Datei mit fehlender Quelle]]' )
    end

    self.smwData['Quelle'] = linkSources
end


--- Processes the author argument if present
--- Adds a maintenance category otherwise
function methodtable.processAuthor( self )
    if type( self.args.author ) ~= 'string' then
        self.showWarnings.author = true
        table.insert( self.categories, '[[Kategorie:Datei mit fehlendem Autor]]' )
        return
    end

    local authors = mw.text.split( self.args.author, ',' )

    for _, author in pairs( authors ) do
        if checkAuthorRsi( author ) then
            -- Check if Source is a link and not an own upload
            if string.match( self.args.source, 'http' ) == nil and not string.match( self.args.source, 'own' ) == nil then
                self.showWarnings.source = true
                table.insert( self.categories, '[[Kategorie:RSI Datei mit fehlender Quelle]]' )
            end

            if self.authorAddedThroughSource == false then
                -- Use Hardcoded RSI Author String
                table.insert( self.smwData['Autor'], authorRsi )
            end
        else
            table.insert( self.smwData['Autor'], self.frame:preprocess( author ) )
        end
    end
end


--- Processes the description argument if present
--- Adds a maintenance category otherwise
--- Also adds a maintenance category if description is too short
function methodtable.processDescription( self )
    if type( self.args.description ) ~= 'string' then
        self.showWarnings.description = true
        table.insert( self.categories, '[[Kategorie:Datei mit fehlender Beschreibung]]' )
        return
    end

    self.args.description = self.frame:preprocess( self.args.description )
    self.smwData['Beschreibung'] = self.args.description .. '@de'

    if mw.ustring.len( self.args.description ) < minDescriptionLength then
        self.showWarnings.descriptionTooShort = true
        table.insert( self.categories, '[[Kategorie:Datei mit zu kurzer Beschreibung]]' )
    end
end


--- Calls all processing methods and adds data to SMW
function methodtable.process( self )
    self:processDate()
    self:processSource()
    self:processAuthor()
    self:processDescription()

    mw.smw.set( self.smwData )
end


--- Creates a smw info tooltip if a warning should be displayed to the user
---
--- @param warningType string
---
--- @return string
function methodtable.getWarning( self, warningType )
    if self.showWarnings[ warningType ] == nil or self.showWarnings[ warningType ] == false then
        return ''
    end

    return mw.smw.info( warnings[ warningType ].text, warnings[ warningType ].type )
end


--- Outputs the info table
function methodtable.getOutput( self )
    local source = ''

    if #self.smwData['Quelle'] == 0 then
        source = self.args.source
    else
        source = table.concat( self.smwData['Quelle'], '<br>' )
    end

    local infoTable = mw.html.create('table')

    infoTable
            :addClass('wikitable')
            :addClass('fileinfotpl-type-information')
            :css('width', 'auto')
            -- Date
            :tag('tr')
                :tag('th')
                    :attr('id', 'fileinfotpl_date')
                    :wikitext( 'Erstelldatum:' )
                :done()
                :tag('td')
                    :wikitext( mw.getContentLanguage():formatDate( 'd.m.Y', self.smwData['Erstelldatum'] ) .. self:getWarning( 'date' ) )
                :done()
            :done()
            -- Source(s)
            :tag('tr')
                :tag('th')
                    :attr('id', 'fileinfotpl_src')
                    :wikitext( 'Quelle:' )
                :done()
                :tag('td')
                    :wikitext( ( source or 'FEHLEND' ) .. self:getWarning( 'source' ) .. self:getWarning( 'sourceTooFew' ) )
                :done()
            :done()
            -- Author(s)
            :tag('tr')
                :tag('th')
                    :attr('id', 'fileinfotpl_aut')
                    :wikitext('Autor:')
                :done()
                :tag('td')
                    :wikitext( table.concat( self.smwData['Autor'], '<br>' ) .. self:getWarning( 'author' ) )
                    :done()
            :done()
            -- Description
            :tag('tr')
                :tag('th')
                    :attr('id', 'fileinfotpl_desc')
                    :wikitext( 'Beschreibung:' )
                :done()
                :tag('td')
                    :wikitext( self.smwData['Beschreibung'] .. self:getWarning( 'description' ) .. self:getWarning( 'descriptionTooShort' ) )
                :done()
            :done()

    return tostring( infoTable:allDone() ) .. table.concat( self.categories, '' )
end


--- New Instance
function Information.new()
    local instance = {
        frame = {},
        args = {},
        smwData = {
            ['Erstelldatum'] = '',
            ['Quelle'] = {},
            ['Autor'] = {},
            ['Beschreibung'] = '',
        },
        showWarnings = {
            date = false,
            author = false,
            source = false,
            sourceTooFew = false,
            description = false,
            descriptionTooShort = false,
        },
        categories = {},
        authorAddedThroughSource = false
    }

    setmetatable( instance, metatable )

    return instance
end


--- Parser Call
function Information.output( frame )
    local instance = Information:new()
    instance:init( frame )
    instance:process()

    return instance:getOutput()
end

return Information