Modul:Blogoverview
Erscheinungsbild
Beschreibung
Das Modul Blogoverview rendert das Blogkarten-Grid auf Blog Übersicht direkt via mw.smw.getQueryResult().
Es umgeht damit das Problem dass Die Abfrage enthält eine leere Bedingung. Page-type-Properties automatisch als Wikilinks ausliefert, was zu doppelter Verlinkung führt.
Warum kein #ask + Vorlage?
Die Abfrage enthält eine leere Bedingung. übergibt Seitennamen an Templates bereits als fertigen Wikilink-String Text. Wenn die Vorlage diesen dann nochmal in ... einwickelt, entstehen kaputte verschachtelte Links. mw.smw.getQueryResult() liefert stattdessen Rohdaten — result.fulltext ist der plain Seitenname.
Verwendung
Auf Blog Übersicht:
{{#invoke:Blogoverview|render}}
Gelesene SMW-Properties
| Property | Typ | Verwendung |
|---|---|---|
Blog-Datum |
Text (YYYY-MM-DD) | Anzeige als „j. F Y", Sortierung |
Blog-Kategorie |
Text | Meta-Zeile |
Blog-Intro |
Text | Vorschautext, auf 160 Zeichen gekürzt |
Blog-Titelbild |
Text | Hero-Bild der Karte (optional) |
Abhängigkeiten
- Semantic MediaWiki (
mw.smw) - Vorlage:Blogpost/styles.css
- Vorlage:Blogpost — setzt die Properties via
-- Module:Blogoverview
-- Rendert die Blogübersichtsseite direkt via mw.smw.getQueryResult().
-- Umgeht das Problem dass #ask Seitennamen automatisch als Wikilinks ausliefert.
local p = {}
local function truncate(text, laenge)
laenge = laenge or 160
if not text or text == '' then return '' end
text = text:gsub('%s+', ' '):match('^%s*(.-)%s*$')
if mw.ustring.len(text) <= laenge then return text end
local gekuerzt = mw.ustring.sub(text, 1, laenge)
local letztes = mw.ustring.find(gekuerzt, '%s[^%s]*$')
if letztes then gekuerzt = mw.ustring.sub(gekuerzt, 1, letztes - 1) end
return gekuerzt .. '…'
end
local function getWert(printout)
if not printout or not printout[1] then return '' end
local v = printout[1]
if type(v) == 'table' then
return v.fulltext or ''
end
return tostring(v)
end
local function formatDatum(frame, roh)
if roh == '' then return '' end
if roh:match('%d%d%d%d%-%d%d%-%d%d') then
return frame:preprocess('{{#time:j. F Y|' .. roh .. '}}')
end
local ts = tonumber(roh)
if ts then
return frame:preprocess('{{#time:j. F Y|@' .. ts .. '}}')
end
return roh
end
function p.render(frame)
if not mw.smw then
return '<p class="error">Semantic MediaWiki nicht gefunden.</p>'
end
local query = '[[Kategorie:Blogpost]]'
.. '|?Blog-Datum'
.. '|?Blog-Kategorie'
.. '|?Blog-Intro'
.. '|?Blog-Titelbild'
.. '|sort=Blog-Datum'
.. '|order=desc'
.. '|limit=12'
local ergebnis = mw.smw.getQueryResult(query)
if not ergebnis or not ergebnis.results or #ergebnis.results == 0 then
return '<p>Keine Blogbeiträge gefunden.</p>'
end
local karten = {}
for _, result in ipairs(ergebnis.results) do
local seite = result.fulltext or ''
local titel = seite:match(':(.+)$') or seite
local datum = formatDatum(frame, getWert(result.printouts['Blog-Datum']))
local kategorie = getWert(result.printouts['Blog-Kategorie'])
local intro = truncate(getWert(result.printouts['Blog-Intro']), 160)
local titelbild = getWert(result.printouts['Blog-Titelbild'])
local teile = {}
if titelbild ~= '' then
table.insert(teile, '<div class="blogkarte-bild">')
table.insert(teile, frame:preprocess(
'[[Datei:' .. titelbild .. '|400px|rahmenlos|link=' .. seite .. '|' .. titel .. ']]'
))
table.insert(teile, '</div>')
else
table.insert(teile, '<div class="blogkarte-bild blogkarte-bild--leer"></div>')
end
table.insert(teile, '<div class="blogkarte-inhalt">')
local meta = '<div class="blogkarte-meta">'
if datum ~= '' then
meta = meta .. '<span class="blogkarte-datum">' .. datum .. '</span>'
end
if kategorie ~= '' then
meta = meta
.. '<span class="blogpost-trenner">·</span>'
.. '<span class="blogkarte-kategorie">' .. kategorie .. '</span>'
end
meta = meta .. '</div>'
table.insert(teile, meta)
table.insert(teile, '<div class="blogkarte-titel">')
table.insert(teile, frame:preprocess('[[' .. seite .. '|' .. titel .. ']]'))
table.insert(teile, '</div>')
if intro ~= '' then
table.insert(teile, '<p class="blogkarte-intro">' .. intro .. '</p>')
end
table.insert(teile, '<div class="blogkarte-link">')
table.insert(teile, frame:preprocess('[[' .. seite .. '|Weiterlesen →]]'))
table.insert(teile, '</div>')
table.insert(teile, '</div>')
table.insert(karten, '<div class="blogkarte">' .. table.concat(teile, '') .. '</div>')
end
return '<div class="blog-uebersicht">' .. table.concat(karten, '') .. '</div>'
end
return p