Modul:NewsArtikel: Unterschied zwischen den Versionen
Erscheinungsbild
schlüssel-Trennzeichen: | → , (Pipe ist MediaWiki-Parametertrennzeichen) (via update-page on MediaWiki MCP Server) |
Brotkrümelnavigation hinzugefügt: News > YYYY > Monat YYYY > Artikelname (auto aus datum) (via update-page on MediaWiki MCP Server) |
||
| Zeile 9: | Zeile 9: | ||
-- ----------------------------------------------------------------------- | -- ----------------------------------------------------------------------- | ||
-- | -- Monatsnamen (DE) | ||
-- ----------------------------------------------------------------------- | -- ----------------------------------------------------------------------- | ||
local monate = { | local monate = { | ||
| Zeile 16: | Zeile 16: | ||
} | } | ||
-- ----------------------------------------------------------------------- | |||
-- Hilfsfunktion: Datum YYYY-MM-DD → lesbares deutsches Datum | |||
-- ----------------------------------------------------------------------- | |||
local function formatDatum(datum) | local function formatDatum(datum) | ||
if not datum or datum == '' then return '' end | if not datum or datum == '' then return '' end | ||
| Zeile 23: | Zeile 26: | ||
local mname = monate[mi] or m | local mname = monate[mi] or m | ||
return string.format('%d. %s %s', tonumber(d), mname, y) | 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 | |||
-- Archivpfad: News:Archiv/2023/01 | |||
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-bottom:0.4em;">', | |||
'[[News:|News]]', | |||
' › ', | |||
'[[' .. archivJahr .. '|' .. y .. ']]', | |||
' › ', | |||
'[[' .. archivMonat .. '|' .. monatLabel .. ']]', | |||
' › ', | |||
pageName, | |||
'</span>', | |||
} | |||
return table.concat(parts, '') | |||
end | end | ||
| Zeile 91: | Zeile 123: | ||
local siteName = mw.site.siteName | local siteName = mw.site.siteName | ||
-- Revisionsdatum via preprocess | -- Revisionsdatum via preprocess | ||
local revDate = pframe:preprocess('{{REVISIONYEAR}}-{{REVISIONMONTH}}-{{REVISIONDAY2}}') | local revDate = pframe:preprocess('{{REVISIONYEAR}}-{{REVISIONMONTH}}-{{REVISIONDAY2}}') | ||
| Zeile 98: | Zeile 130: | ||
local out = {} | 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 | -- 1. Status-Banner + Kategorien | ||
| Zeile 133: | Zeile 171: | ||
end | end | ||
local seoArgs = { [1] = '' } | local seoArgs = { [1] = '' } | ||
seoArgs['title'] = pageName .. ' - ' .. siteName | seoArgs['title'] = pageName .. ' - ' .. siteName | ||
Version vom 2. April 2026, 23:51 Uhr
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
-- Archivpfad: News:Archiv/2023/01
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-bottom:0.4em;">',
'[[News:|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 ''
local beschreibung = trim(args['beschreibung'] or '')
-- 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
table.insert(out, '[[Kategorie:Archiv-News/' .. monat .. ']]')
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