Zum Inhalt springen

„Modul:WikibaseLink“ – Versionsunterschied

aus AufEinWort, der freien Forschung
KKeine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
Zeile 126: Zeile 126:
   local q = resolveQForContext()
   local q = resolveQForContext()
   if not isQ(q) then return '' end
   if not isQ(q) then return '' end
   return entityLink(q, 'Qwasi: ' .. q)
   return entityLink(q, '' .. q)
end
end


Zeile 136: Zeile 136:
   local links = {}
   local links = {}
   for _, lid in ipairs(ls) do
   for _, lid in ipairs(ls) do
     table.insert(links, entityLink(lid, 'Laut: ' .. lid))
     table.insert(links, entityLink(lid, '' .. lid))
   end
   end
   return table.concat(links, ' · ')
   return table.concat(links, ' · ')

Version vom 28. November 2025, 10:17 Uhr

Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


local p = {}

-- === KONFIG ===
local P_ITEM2LEX = 'P9'  -- Item (Q) -> Lexem (L)  „hat Wort“
local P_LEX2ITEM = 'P8'  -- Lexem (L) -> Item (Q)  „hat Eintrag“
local NS_CATEGORY_ID = 14  -- Einordnung aliasiert Kategorie (numerisch 14)

-- == Hilfsfunktionen ==
local function entityLink(id, label)
  if not id then return nil end
  return string.format('[[Special:EntityPage/%s|%s]]', id, label or id)
end

local function isQ(id) return type(id)=='string' and id:match('^Q%d+$') end
local function isL(id) return type(id)=='string' and id:match('^L%d+$') end

local function getCurrentTitleParts()
  local t = mw.title.getCurrentTitle()
  return {
    nsId = t.namespace,
    nsText = t.nsText,           -- z. B. "Einordnung"
    text = t.text,               -- Seitentitel ohne Präfix (z. B. "Dingwort")
    prefixed = t.prefixedText,   -- mit Präfix
  }
end

-- Beste Statements einer Property (vom Item)
local function getBestValues(qid, pid)
  if not (qid and isQ(qid) and pid) then return {} end
  local vals = mw.wikibase.getBestStatements(qid, pid) or {}
  local out = {}
  for _, s in ipairs(vals) do
    local snak = s.mainsnak
    if snak and snak.datavalue and snak.datavalue.value then
      local v = snak.datavalue.value
      if type(v) == 'table' and v['id'] then
        table.insert(out, v.id)              -- Wikibase-EntityId (für entity-typed props)
      else
        table.insert(out, tostring(v))       -- sonst String/Identifier
      end
    end
  end
  return out
end

-- Q im aktuellen Kontext ermitteln:
-- 1) Direkter Sitelink (auf Artikelseiten etc.)
-- 2) Auf Einordnung:-Seiten: versuche Sitelink für den zugrunde liegenden Artikelnamen
-- 3) Fallback: exakte Labelsuche (de)
local function resolveQForContext()
  local parts = getCurrentTitleParts()

  -- 1) Direkter Sitelink (nur wenn aktuelle Seite Sitelink-Ziel ist)
  local q = mw.wikibase.getEntityIdForCurrentPage()
  if isQ(q) then return q end

  -- 2) Kategorie/Einordnung → nutze Artikeltitel ohne Präfix
  if parts.nsId == NS_CATEGORY_ID and parts.text and parts.text ~= '' then
    local q2 = mw.wikibase.getEntityIdForTitle(parts.text)
    if isQ(q2) then return q2 end
  end

  -- 3) Fallback exakte Labelsuche in de (nur wenn ein klarer Kandidat)
  local title = parts.text or parts.prefixed
  if not title or title == '' then return nil end
  local ok, results = pcall(mw.wikibase.searchEntities, title, 'de')
  if ok and type(results) == 'table' then
    local candidate
    for _, r in ipairs(results) do
      if r and r.id and isQ(r.id) and r.display and r.display.label
         and r.display.label.value == title then
        if candidate then
          candidate = nil; break  -- Mehrdeutig → kein eindeutiger Treffer
        end
        candidate = r.id
      end
    end
    if isQ(candidate) then return candidate end
  end
  return nil
end

-- L im aktuellen Kontext ermitteln:
-- (a) expliziter Parameter |L=, sonst
-- (b) über Item->Lexem (P_ITEM2LEX),
-- (c) Fallback exakte Labelsuche (de)
local function resolveLsForContext(frame, qForContext)
  -- (a) Override
  local args = frame and frame.args or {}
  local lexArg = args.L or args.lexeme or args[1]
  if lexArg and isL(tostring(lexArg)) then
    return { tostring(lexArg) }
  end

  -- (b) über Item-Property
  if isQ(qForContext) then
    local ls = getBestValues(qForContext, P_ITEM2LEX)
    local out = {}
    for _, id in ipairs(ls) do
      if isL(id) then table.insert(out, id) end
    end
    if #out > 0 then return out end
  end

  -- (c) Fallback exakte Labelsuche
  local parts = getCurrentTitleParts()
  local title = parts.text or parts.prefixed
  if not title or title == '' then return {} end
  local ok, results = pcall(mw.wikibase.searchEntities, title, 'de')
  if ok and type(results) == 'table' then
    local out = {}
    for _, r in ipairs(results) do
      if r and isL(r.id) and r.display and r.display.label
         and r.display.label.value == title then
        table.insert(out, r.id)
      end
    end
    return out
  end
  return {}
end

-- === Öffentliche Ausgaben ===

function p.itemLink(frame)
  local q = resolveQForContext()
  if not isQ(q) then return '' end
  return entityLink(q, '' .. q)
end

function p.lexemeLink(frame)
  local q = resolveQForContext() -- ermöglicht (b)
  local ls = resolveLsForContext(frame, q)
  if not ls or #ls == 0 then return '' end
  -- mehrere Lexeme ggf. joinen
  local links = {}
  for _, lid in ipairs(ls) do
    table.insert(links, entityLink(lid, '' .. lid))
  end
  return table.concat(links, ' · ')
end

function p.both(frame)
  local qOut = p.itemLink(frame)
  local lOut = p.lexemeLink(frame)
  if (qOut == '' or not qOut) and (lOut == '' or not lOut) then
    return 'kein WikibaseLink'
  elseif qOut ~= '' and lOut ~= '' then
    return qOut .. ' · ' .. lOut
  else
    return (qOut ~= '' and qOut) or lOut
  end
end

return p