Modul:Vorlage:Literatur: Unterschied zwischen den Versionen

Modul:Vorlage:Literatur: Unterschied zwischen den Versionen

imported>PerfektesChaos
(2017-05-04)
 
imported>PerfektesChaos
(2019-06-11)
 
Zeile 1: Zeile 1:
local Serial = "2017-05-04"
local Serial = "2019-06-11"
--[=[
--[=[
Unterstützung für {{Literatur}}
Unterstützung für {{Literatur}}
Zeile 17: Zeile 17:
                   Temp3              = { s = "/Temp3" },
                   Temp3              = { s = "/Temp3" },
                   Temp4              = { s = "/Temp4" },
                   Temp4              = { s = "/Temp4" },
                  TitelP              = { s = "/Parameter Titel-P" }
                 }
                 }
local Fehler = false
local Fehler = false
Zeile 47: Zeile 46:
                   Temp2    = { k = "Temp2" },
                   Temp2    = { k = "Temp2" },
                   Temp3    = { k = "Temp3" },
                   Temp3    = { k = "Temp3" },
                   Temp4    = { k = "Temp4" },
                   Temp4    = { k = "Temp4" }
                  TitelP    = { k = "TitelP" }
                 }
                 }
     end
     end
     t = Fehler[ art ]
     t = Fehler[ art ]
     if t then
     if t then
        if t.s  and  not t.e then
            t.e = ""
        end
         if anzeige then
         if anzeige then
             local s = mw.text.nowiki( anzeige )
             local s = mw.text.nowiki( anzeige )
Zeile 86: Zeile 87:
     if Fehler then
     if Fehler then
         local sep = ""
         local sep = ""
        local suffix
         for k, v in pairs( Fehler ) do
         for k, v in pairs( Fehler ) do
             if v.e then
             if v.e then
                 Schrei = string.format( "%s%s*** %s: %s",
                if v.e:sub( 1, 1 ) == ";" then
                    suffix = v.s .. v.e
                elseif v.s then
                    suffix = string.format( "%s: %s", v.s, v.e )
                else
                    suffix = v.e
                end
                 Schrei = string.format( "%s%s*** %s",
                                         Schrei or "",
                                         Schrei or "",
                                         sep,
                                         sep,
                                         v.s or "",
                                         suffix )
                                        v.e )
                 sep    = " "
                 sep    = " "
             end
             end
Zeile 244: Zeile 252:
     return r
     return r
end -- Export.Datum()
end -- Export.Datum()
--  local Titel = function ( args )
--      --    OBSOLET  nach Bereinigung im ANR
--      if args[ "Titel-P" ] then
--          fehler( "TitelP" )
--      end
--  end -- Titel()






local Band = function ( args )
local Band = function ( args )
     --    OBSOLET  nach Bereinigung im ANR
     --    OBSOLET  nach Bereinigung in allen NR
     if args.Band  and
     if args.Band  and not args.Sammelwerk then
      not args.Sammelwerk  and  not args.BandReihe then
        if args.Reihe and  not args.BandReihe then
        if args.Reihe then
             args.BandReihe = args.Band
             args.BandReihe = args.Band
             args.Band      = nil
             args.Band      = nil
             fehler( "Temp4" )
             fehler( "Temp4" )
            fehler( "Parameter", "Band= meint BandReihe=" )
        elseif args.Titel  and
              args.Titel:find( " In: " ) then
            fehler( "Parameter", "Band= ohne Sammelwerk=" )
         end
         end
     end
     end
Zeile 271: Zeile 273:


local Nummer = function ( args )
local Nummer = function ( args )
     --    OBSOLET  nach Bereinigung im ANR
     --    OBSOLET  nach Bereinigung in allen NR
     if args.Nummer  and
     if args.Nummer  and not args.Sammelwerk then
      not args.Sammelwerk  and  not args.NummerReihe then
        if args.Reihe and  not args.NummerReihe then
        if args.Reihe then
             args.NummerReihe = args.Nummer
             args.NummerReihe = args.Nummer
             args.Nummer      = nil
             args.Nummer      = nil
             fehler( "Temp4" )
             fehler( "Temp4" )
--      else
            fehler( "Parameter", "Nummer= meint NummerReihe=" )
--          fehler( "Temp3" )
        elseif args.Titel  and
              args.Titel:find( " In: " ) then
            fehler( "Parameter", "Nummer= ohne Sammelwerk=" )
         end
         end
     end
     end
Zeile 287: Zeile 290:


local Herausgeber = function ( args )
local Herausgeber = function ( args )
     --    OBSOLET  nach Bereinigung im ANR
     --    OBSOLET  nach Übernahme in Zentralmodul
     if args.Hrsg and
     if args.Autor and args.Autor:find( "(Hrsg.)", 1, true ) then
      not args.Sammelwerk  and  not args.HrsgReihe then
         fehler( "Wert",
         if args.Reihe then
                "Autor= mit Klammer (Hrsg.); dafür Hrsg= verwenden" )
            args.HrsgReihe = args.Hrsg
            args.Hrsg     = nil
--          fehler( "Temp4" )
        end
     end
     end
end -- Herausgeber()
end -- Herausgeber()
Zeile 301: Zeile 300:


local Sprache = function ( args )
local Sprache = function ( args )
     --    OBSOLET  nach Bereinigung im ANR
     --    OBSOLET  nach Bereinigung im Benutzerbereich
     if args.Originalsprache  and
     if args.Originalsprache  and
       not args.Originaltitel  and
       not args.Originaltitel  and
       not args["Übersetzer"]  and
       not args["Übersetzer"]  and
       not args.Sprache then
       not args.Sprache then
         args.Sprache        = args.Originalsprache
         local t = mw.title.getCurrentTitle()
        args.Originalsprache = nil
        if t.namespace == 2  or  t.namespace == 3 then
        fehler( "Temp1" )
            args.Sprache        = args.Originalsprache
            args.Originalsprache = nil
            fehler( "Parameter",
                    "Sprache= nutzen statt Originalsprache="
                                                        .. args.Sprache )
            fehler( "Temp1" )
        end
     end
     end
end -- Sprache()
end -- Sprache()
Zeile 321: Zeile 326:
     local pars = Zitation.filter( args, Export.params.valid )
     local pars = Zitation.filter( args, Export.params.valid )
     local r, schrott
     local r, schrott
--  Titel( pars )    -- OBSOLET
     Export.Datum( pars )
     Export.Datum( pars )
    Herausgeber( pars )
     Band( pars )
     Band( pars )
     Nummer( pars )
     Nummer( pars )

Aktuelle Version vom 11. Juni 2019, 11:55 Uhr

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

local Serial = "2019-06-11"
--[=[
Unterstützung für {{Literatur}}
]=]


-- Global
local Zitation
local Selbst = "Vorlage:Literatur"
local KategorieBeginn  =  "Wikipedia:Vorlagenfehler"
local Kategorien       =
                 { Intern              = { s = "/Interner Fehler" },
                   Parameter           = { s = "/Parameterfehler" },
                   MonatTag            = { s = "/Parameter Monat, Tag" },
                   Temp1               = { s = "/Temp1" },
                   Temp2               = { s = "/Temp2" },
                   Temp3               = { s = "/Temp3" },
                   Temp4               = { s = "/Temp4" },
                 }
local Fehler = false
local Schrei
local Export = { }



local function fehler( art, anzeige )
    -- Ein Fehler ist aufgetreten
    -- Parameter:
    --     art      -- string mit Schlüsselwort zum Typ
    --     anzeige  -- string mit Einzelheiten, oder nil
    local t
    if not Fehler then
        Fehler = { Intern    = { s = "Interner Fehler",
                                 k = "Intern" },
                   Modul     = { s = "Modul-Seite fehlt",
                                 k = "Intern" },
                   Format    = { s = "Parameterformat" },
                   Konflikt  = { s = "Parameterkonflikt",
                                 k = "Parameter" },
                   Parameter = { s = "Parameterfehler",
                                 k = "Parameter" },
                   Wert      = { s = "Werte ungültig",
                                 k = "Parameter" },
                   MonatTag  = { k = "MonatTag" },
                   Temp1     = { k = "Temp1" },
                   Temp2     = { k = "Temp2" },
                   Temp3     = { k = "Temp3" },
                   Temp4     = { k = "Temp4" }
                 }
    end
    t = Fehler[ art ]
    if t then
        if t.s  and  not t.e then
            t.e = ""
        end
        if anzeige then
            local s = mw.text.nowiki( anzeige )
            if t.e then
                t.e = string.format( "%s; %s", t.e, s )
            else
                t.e = s
            end
        end
        if t.k then
            local wk = Kategorien[ t.k ]
            if wk then
                wk.e = true
            else
                Fehler.Intern.e     = "Wartungskat " .. wk
                Kategorien.Intern.e = true
            end
        end
    else
        Fehler.Intern.e     = string.format( "fehler(%s) %s",
                                             art, anzeige or "???" )
        Kategorien.Intern.e = true
    end
end -- fehler()



local function fehlerliste()
    -- Auflistung aller Fehlermeldungen und Kategorien
    -- Rückgabewert: string mit formatiertem Ergebnis
    local r = ""
    local s
    if Fehler then
        local sep = ""
        local suffix
        for k, v in pairs( Fehler ) do
             if v.e then
                if v.e:sub( 1, 1 ) == ";" then
                    suffix = v.s .. v.e
                elseif v.s then
                    suffix = string.format( "%s: %s", v.s, v.e )
                else
                    suffix = v.e
                end
                Schrei = string.format( "%s%s*** %s",
                                        Schrei or "",
                                        sep,
                                        suffix )
                sep    = " "
            end
        end -- for k, v
    end
    for k, v in pairs( Kategorien ) do
        if v.e then
            if v.s:sub( 1, 1 ) == "/" then
                s = Selbst
            else
                s = ""
            end
            r = string.format( "%s[[Kategorie:%s/%s%s]]",
                               r, KategorieBeginn, s, v.s )
        end
    end -- for k, v
    return r
end -- fehlerliste()



local folder = function ()
    -- Parameter-Konfiguration laden
    local s = string.format( "Module:%s/params", Selbst )
    local lucky, params = pcall( mw.loadData, s )
    if type( params ) == "table" then
        Export.params = Export.flat( params )
    else
        error( string.format( "[[%s]] fehlt", s ) )
    end
end -- folder()



-------------------------------------------------------------------------



Export.flat = function ( adapt )
    -- Deep copy
    -- Parameter:
    --     adapt  -- something
    -- Returns atomic value, or deep copy of a table with no metatable
    local r
    if type( adapt ) == "table" then
        r = { }
        for k, v in pairs( adapt ) do
            r[ k ] = Export.flat( v )
        end -- for k, v
    else
        r = adapt
    end
    return r
end -- Export.flat()



Export.Datum = function ( args )
    local r = args.Jahr
    local shit
    if r then
        if r:match( "^%d+$" ) then
            local DateTime = Zitation.fetch( "DateTime" )
            local o = DateTime( r )
            if args.Woche and o then
                o.week = tonumber( args.Woche )
                if tostring( o.week ) ~= args.Woche then
                    fehler( "Wert", "'Woche'=" .. args.Woche )
                    r = false
                end
            elseif args.Monat then
                local s
                if args.Monat:match( "%l" ) then
                    local dm = DateTime( args.Monat )
                    if dm and o and dm.month then
                        o.month = dm.month
                    else
                        shit = "'Monat'=" .. args.Monat
                        if args.Nummer then
                            args.Nummer = string.format( "%s, %s",
                                                         args.Nummer,
                                                         args.Monat )
                        else
                            args.Nummer = args.Monat
                        end
                        if not args.Datum then
                            args.Datum = r
                        end
                        r = false
                    end
                else
                    s = args.Monat:match( "^0?(1?%d)%.?$" )
                    if s and o then
                        o.month = tonumber( s )
                    end
                    if o and tostring( o.month ) ~= s then
                        fehler( "MonatTag",  "'Monat'=" .. args.Monat )
                        r = false
                    elseif s ~= args.Monat  and
                           "0" .. s ~= args.Monat then
                        fehler( "MonatTag",  "'Monat'=" .. args.Monat )
                    end
                end
                if o and o.month  and  args.Tag then
                    s = args.Tag:match( "^0?([123]?%d)%.?$" )
                    if s then
                        o.dom = tonumber( s )
                    end
                    if tostring( o.dom ) ~= s then
                        shit = "'Tag'=" .. args.Tag
                        r = false
                    elseif s ~= args.Tag  and
                           "0" .. s ~= args.Tag  and
                           s .. "." ~= args.Tag then
                        fehler( "MonatTag",  "'Tag'=" .. args.Tag )
                    end
                end
            elseif args.Tag then
                shit = "'Tag' ohne 'Monat'"
                r = false
            end
            if r and o then
                r = o
                args.Datum = o
            end
        elseif r:match( "^%[%d%d%d%d%]$" ) then
            args.Datum = r:match( "^%[(%d+)%]$" )
            if args.Kommentar then
                args.Kommentar = ", " .. args.Kommentar
            else
                args.Kommentar = ""
            end
            args.Kommentar  = string.format( "o. J. %s%s",
                                             args.Jahr, args.Kommentar )
            fehler( "Wert", "'Datum'=o.J." )
        else
            if args.Datum then
                fehler( "Wert",  "'Jahr'=" .. args.Jahr )
            else
                args.Datum = args.Jahr
            end
        end
    elseif args.Monat or args.Woche or args.Tag then
        fehler( "Konflikt", "'Jahr' fehlt bei spezifischem Datum" )
    else
        r = args.Datum
    end
    if shit then
       fehler( "MonatTag", shit )
    end
    return r
end -- Export.Datum()



local Band = function ( args )
    --    OBSOLET   nach Bereinigung in allen NR
    if args.Band  and  not args.Sammelwerk then
        if args.Reihe  and  not args.BandReihe then
            args.BandReihe = args.Band
            args.Band      = nil
            fehler( "Temp4" )
            fehler( "Parameter", "Band= meint BandReihe=" )
        elseif args.Titel  and
               args.Titel:find( " In: " ) then
            fehler( "Parameter", "Band= ohne Sammelwerk=" )
        end
    end
end -- Band()



local Nummer = function ( args )
    --    OBSOLET   nach Bereinigung in allen NR
    if args.Nummer  and  not args.Sammelwerk then
        if args.Reihe  and  not args.NummerReihe then
            args.NummerReihe = args.Nummer
            args.Nummer      = nil
            fehler( "Temp4" )
            fehler( "Parameter", "Nummer= meint NummerReihe=" )
        elseif args.Titel  and
               args.Titel:find( " In: " ) then
            fehler( "Parameter", "Nummer= ohne Sammelwerk=" )
        end
    end
end -- Nummer()



local Herausgeber = function ( args )
    --    OBSOLET   nach Übernahme in Zentralmodul
    if args.Autor  and  args.Autor:find( "(Hrsg.)", 1, true ) then
        fehler( "Wert",
                "Autor= mit Klammer (Hrsg.); dafür Hrsg= verwenden" )
    end
end -- Herausgeber()



local Sprache = function ( args )
    --    OBSOLET   nach Bereinigung im Benutzerbereich
    if args.Originalsprache  and
       not args.Originaltitel  and
       not args["Übersetzer"]  and
       not args.Sprache then
        local t = mw.title.getCurrentTitle()
        if t.namespace == 2  or  t.namespace == 3 then
            args.Sprache         = args.Originalsprache
            args.Originalsprache = nil
            fehler( "Parameter",
                    "Sprache= nutzen statt Originalsprache="
                                                        .. args.Sprache )
            fehler( "Temp1" )
        end
    end
end -- Sprache()



local format = function ( args )
    -- Analysiere Argumente und bilde formatierte Zitation
    -- Parameter:
    --     args    -- table mit Vorlagenparametern
    -- Rückgabewert: string mit formatierter Zitation
    local pars = Zitation.filter( args, Export.params.valid )
    local r, schrott
    Export.Datum( pars )
    Herausgeber( pars )
    Band( pars )
    Nummer( pars )
    Sprache( pars )
    Zitation.filler( pars, Export.params.map )
    if Zitation.o then
        Zitation.fill( "leise",  "leiser",   true )
        Zitation.fill( "leise",  "Vorlage",  pars.Vorlage or Selbst )
        Zitation.o.coins = true
    end
    r, schrott = Zitation.format()
    if schrott then
        if Schrei then
            Schrei = string.format( "%s *** %s", Schrei, schrott )
        else
            Schrei = schrott
        end
    end
    return r
end -- format()



local function f( arglist, frame )
    -- Hauptfunktion zur Steuerung des Gesamtablaufs
    -- Parameter:
    --     arglist  -- table, mit Vorlagenparametern
    --     frame    -- object, oder nil
    -- Rückgabewert: string mit formatiertem Gesamtergebnis
    --                      einschließlich Fehlerliste und Kategorien
    local lucky, r = pcall( require, "Modul:Zitation" )
    if type( r ) == "table" then
        Zitation       = r.Zitation()
        Zitation.frame = frame
        folder()
        r = string.format( "%s%s%s",
                           format( arglist ),
                           fehlerliste(),
                           Zitation.failure( Schrei ) )
    else
        fehler( "Modul", r )
        r = fehlerliste()
    end
    return r
end -- f()



-- Export
local p = {}

function p.export()
    folder()
    return Export
end

function p.test( a )
    local lucky, r = pcall( f, a )
    return r
end

function p.f( frame )
    local lucky, r = pcall( f, frame:getParent().args, frame )
    if not lucky then
        mw.log( r )
        fehler( "Intern", r )
        r = fehlerliste()
    end
    return r
end

function p.failsafe()
    return Serial
end

return p