Zum Inhalt springen

Modul:AufEinWortLeserschaftziel

aus AufEinWort, der freien Forschung

-- Module:Leserschaft (mit Kategorie-Erzeugung)
local p = {}

local function trim(s)
  if not s then return "" end
  return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
end

local function split_on_separators(s)
  local parts = {}
  if not s or s == "" then return parts end
  -- Komma, Semikolon oder Zeilenumbruch als Trenner akzeptieren
  for part in mw.ustring.gmatch(s, "[^,;\n]+") do
    local t = trim(part)
    if t ~= "" then table.insert(parts, t) end
  end
  return parts
end

-- sanitize category part (vermeidet z.B. doppelte / unnötige whitespace)
local function normalize_name_for_cat(name)
  if not name then return "" end
  -- mehrfachen Leerraum reduzieren
  local n = mw.ustring.gsub(name, "%s+", " ")
  -- führende/trailing whitespace entfernen
  n = trim(n)
  -- einfache Sicherheitsreinigung: ']]' entfernen, falls vorhanden
  n = mw.ustring.gsub(n, "%]%]", "")
  return n
end

function p.leserschaft(frame)
  -- 1. Input (positional oder Named 'Leserschaft')
  local input = frame.args[1] or frame:getParent().args.Leserschaft or ""
  input = tostring(input)

  -- 2. Optional: named args für Verhalten
  local createCats = frame.args.createCats or frame:getParent().args.createCats or "yes"
  local catPrefix = frame.args.catPrefix or frame:getParent().args.catPrefix or "AufEinWort Leserschaft"

  createCats = mw.ustring.lower(tostring(createCats))
  if createCats ~= "yes" and createCats ~= "y" and createCats ~= "true" then
    createCats = "no"
  else
    createCats = "yes"
  end

  local names = split_on_separators(input)
  if #names == 0 then return "" end

  local seen = {}
  local sema = {}
  local links = {}
  local cats = {}

  for _, name in ipairs(names) do
    local page = normalize_name_for_cat(name)
    if page ~= "" and not seen[page] then
      seen[page] = true
      -- Property-Zuweisungen (für SMW), unsichtbar verpackt
      table.insert(sema, "[[hat Leserschaftziel::" .. page .. "]]")
      -- Sichtbarer Link
      table.insert(links, "[[" .. page .. "]]")
      -- Kategorie erzeugen, falls aktiviert
      if createCats == "yes" then
        -- Kategorie-Name: <catPrefix> <Name>
        local catname = catPrefix .. " " .. page
        -- Safety: entferne ']]' aus Kategorie-Teil, falls vorhanden
        catname = mw.ustring.gsub(catname, "%]%]", "")
        table.insert(cats, "[[Kategorie:" .. catname .. " ungelesen]]")
      end
    end
  end

  -- Hidden wrappers: Properties und Category-Tags bleiben unsichtbar im Inhalt,
  -- aber werden vom Parser verarbeitet (SMW & Kategorien).
  local hidden = ""
  if #sema > 0 then
    hidden = hidden .. '<span class="smw-leserschaft-hidden" style="display:none">' .. table.concat(sema, "") .. '</span>'
  end
  if #cats > 0 then
    hidden = hidden .. '<span class="smw-leserschaft-cats" style="display:none">' .. table.concat(cats, "") .. '</span>'
  end

  local visible = ""
  if #links > 0 then
    visible = table.concat(links, ", ")
  end

  return hidden .. visible
end

return p