Die Dokumentation für dieses Modul kann unter Modul:NewsArtikel/doc erstellt werden
local p = {}
-- -----------------------------------------------------------------------
-- Hilfsfunktion: String trimmen
-- -----------------------------------------------------------------------
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
-- -----------------------------------------------------------------------
-- Monatsnamen (DE)
-- -----------------------------------------------------------------------
local monate = {
'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
}
-- -----------------------------------------------------------------------
-- Hilfsfunktion: Datum YYYY-MM-DD → lesbares deutsches Datum
-- -----------------------------------------------------------------------
local function formatDatum(datum)
if not datum or datum == '' then return '' end
local y, m, d = datum:match('^(%d%d%d%d)%-(%d%d)%-(%d%d)')
if not y then return datum end
local mi = tonumber(m)
local mname = monate[mi] or m
return string.format('%d. %s %s', tonumber(d), mname, y)
end
-- -----------------------------------------------------------------------
-- Brotkrümelnavigation: News > YYYY > Monat YYYY > Artikelname
-- -----------------------------------------------------------------------
local function breadcrumb(datum, pageName)
if not datum or datum == '' then return '' end
local y, m = datum:match('^(%d%d%d%d)%-(%d%d)')
if not y then return '' end
local mi = tonumber(m)
local mname = monate[mi] or m
local monatLabel = mname .. ' ' .. y
local archivMonat = string.format('News:Archiv/%s/%s', y, m)
local archivJahr = 'News:Archiv/' .. y
local parts = {
'<span class="isin-breadcrumb" style="font-size:85%;color:#555;display:block;margin-top:-1em;margin-bottom:0.4em;">',
'[[News:Alle Artikel|News]]',
' › ',
'[[' .. archivJahr .. '|' .. y .. ']]',
' › ',
'[[' .. archivMonat .. '|' .. monatLabel .. ']]',
' › ',
pageName,
'</span>',
}
return table.concat(parts, '')
end
-- -----------------------------------------------------------------------
-- Entwurfs-Banner (gelb-orange, Wikinews-Stil)
-- -----------------------------------------------------------------------
local function entwurfBanner()
return table.concat({
'<div style="border:2px solid #f0a500;background:#fff8e6;',
'padding:10px 14px;margin:0.5em 0 1em 0;',
'display:flex;align-items:center;gap:14px;border-radius:3px;">',
'[[Datei:Under construction icon-yellow.svg|40px|link=]]',
'<div>',
'<b>Dieser Artikel befindet sich noch in Bearbeitung.</b><br>',
'<span style="font-size:90%;">Bitte keine größeren inhaltlichen ',
'Änderungen vornehmen, bis dieser Hinweis entfernt wurde.</span>',
'</div>',
'</div>',
}, '')
end
-- -----------------------------------------------------------------------
-- Veröffentlicht-Banner (analog {{News Veröffentlicht}})
-- -----------------------------------------------------------------------
local function veroeffentlichtBanner(datumFormatiert, presse)
local zeilen = {}
table.insert(zeilen,
'<div class="skanwiki-box-wrapper skanwiki-box-var skanwiki-box-centered"'
.. ' style="border:1px solid #004a7c;margin:0.5em 0 1em 0;">'
)
table.insert(zeilen,
'<div class="skanwiki-box-content"'
.. ' style="text-align:center;font-size:95%;line-height:16px;padding:6px 10px;">'
)
table.insert(zeilen, '<b>Veröffentlicht</b>: ' .. datumFormatiert .. '<br>')
table.insert(zeilen,
'<span style="font-size:smaller;">Bitte keine inhaltlichen Veränderungen vornehmen.'
)
if presse and presse ~= '' then
table.insert(zeilen,
' Bei dieser News handelt es sich um eine offizielle Pressemitteilung von '
.. presse .. '.<br>'
.. ' Diese ist urheberrechtlich geschützt, eine Weiterverbreitung ist nur'
.. ' unter den auf der Quellenseite angegebenen Bedingungen gestattet.'
)
end
table.insert(zeilen, '</span></div></div>')
return table.concat(zeilen, '')
end
-- -----------------------------------------------------------------------
-- Hauptfunktion: render
-- -----------------------------------------------------------------------
function p.render(frame)
local pframe = frame:getParent()
local args = pframe.args
local status = trim(args['status'] or 'entwurf'):lower()
local datum = trim(args['datum'] or '')
local presse = trim(args['presse'] or '')
local lead = trim(args['lead'] or '')
local bild = trim(args['bild'] or '')
local schluesselliste = args['schlüssel'] or args['schluessel'] or ''
-- beschreibung fällt auf lead zurück
local beschreibung = trim(args['beschreibung'] or '')
if beschreibung == '' then beschreibung = lead end
-- Seiteninfos
local title = mw.title.getCurrentTitle()
local pageName = title.text
local siteName = mw.site.siteName
-- Revisionsdatum via preprocess
local revDate = pframe:preprocess('{{REVISIONYEAR}}-{{REVISIONMONTH}}-{{REVISIONDAY2}}')
-- Monat für Archiv-Kategorie (YYYY-MM)
local monat = datum:match('^(%d%d%d%d%-%d%d)')
local out = {}
-- 0. Brotkrümelnavigation (immer, wenn datum vorhanden)
local bc = breadcrumb(datum, pageName)
if bc ~= '' then
table.insert(out, bc)
end
-- 1. Status-Banner + Kategorien
if status == 'veröffentlicht' or status == 'veroeffentlicht' then
local datumFormatiert = formatDatum(datum)
table.insert(out, veroeffentlichtBanner(datumFormatiert, presse))
table.insert(out, '[[Kategorie:News:Veröffentlicht]]')
if monat then
local sy, sm, sd = datum:match('^(%d%d%d%d)%-(%d%d)%-(%d%d)')
if sy then
local smi = tonumber(sm)
local smname = monate[smi] or sm
local sortKey = string.format('%s. %s %s', sd, smname, sy)
table.insert(out, '[[Kategorie:Archiv-News/' .. monat .. '|' .. sortKey .. ']]')
else
table.insert(out, '[[Kategorie:Archiv-News/' .. monat .. ']]')
end
end
else
table.insert(out, entwurfBanner())
table.insert(out, '[[Kategorie:News:Entwurf]]')
end
-- 2. Lead-Absatz
if lead ~= '' then
table.insert(out, '<p class="lead" style="font-weight:bold">' .. lead .. '</p>')
end
-- 3. Schlagwort-Kategorien (Trennzeichen: Komma)
for keyword in schluesselliste:gmatch('[^,]+') do
keyword = trim(keyword)
if keyword ~= '' then
table.insert(out, '[[Kategorie:News:' .. keyword .. ']]')
end
end
-- 4. SEO (nur bei veröffentlicht)
if (status == 'veröffentlicht' or status == 'veroeffentlicht') and datum ~= '' then
local kwList = {}
for keyword in schluesselliste:gmatch('[^,]+') do
keyword = trim(keyword)
if keyword ~= '' then table.insert(kwList, keyword) end
end
local seoArgs = { [1] = '' }
seoArgs['title'] = pageName .. ' - ' .. siteName
seoArgs['titlemode'] = 'replace'
seoArgs['published_time'] = datum
seoArgs['modified_time'] = revDate
if beschreibung ~= '' then seoArgs['description'] = beschreibung end
if bild ~= '' then seoArgs['image'] = bild end
if #kwList > 0 then seoArgs['keywords'] = table.concat(kwList, ', ') end
local ok, seoResult = pcall(function()
return frame:callParserFunction('#seo', seoArgs)
end)
if ok and seoResult and seoResult ~= '' then
table.insert(out, seoResult)
end
end
return table.concat(out, '\n')
end
return p