Zum Inhalt springen

Modul:Blogoverview

Aus Matrix of Time

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


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