Zum Inhalt springen

Modul:NewsArtikel

Aus skandinavien-wiki.net
Version vom 2. April 2026, 22:11 Uhr von Xineohp1506 (Diskussion | Beiträge) (schlüssel-Trennzeichen: | → , (Pipe ist MediaWiki-Parametertrennzeichen) (via update-page on MediaWiki MCP Server))

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

-- -----------------------------------------------------------------------
-- Hilfsfunktion: Datum YYYY-MM-DD → lesbares deutsches Datum
-- -----------------------------------------------------------------------
local monate = {
	'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
	'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
}

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

-- -----------------------------------------------------------------------
-- 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 (Magic Words brauchen keinen callParserFunction)
	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 = {}

	-- 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

		-- Argumente für #seo: Index 1 = leerer unnamed param (Pflicht), rest named
		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