Modul:Rezepte: Unterschied zwischen den Versionen

Aus Dreamlight Valley Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 61: Zeile 61:
local function current_is_template_namespace()
local function current_is_template_namespace()
   local t = mw.title.getCurrentTitle()
   local t = mw.title.getCurrentTitle()
   return t and (t.nsText == "Vorlage" or t.namespace == 10)
  -- ns 10 ist normalerweise "Vorlage"
   return t and (t.namespace == 10 or t.nsText == "Vorlage")
end
end


-- Debug: zeigt nur, welche Zutaten erkannt werden (setzt KEINE Kategorien)
-- Holt Rezeptname robust aus #invoke:
-- Unterstützt {{#invoke:Rezepte|debug|Auberginenrollen}}
-- und {{#invoke:Rezepte|debug|rezept=Auberginenrollen}}
local function get_rezeptname(frame)
  local args = frame.args or {}
  local name = trim(args.rezept or args[1] or "")
  return name
end
 
-- Rendert Vorlage:Rezept für ein Rezept und extrahiert Zutaten-Seitennamen
local function get_ingredients_from_rezept_template(frame, rezeptname)
  -- Namespace-sicher: exakt "Vorlage:Rezept"
  local rendered = frame:expandTemplate{
    title = "Vorlage:Rezept",
    args = { rezeptname }
  }
 
  return extract_links(rendered), rendered
end
 
-- DEBUG: zeigt nur, welche Zutaten erkannt werden (setzt KEINE Kategorien)
function p.debug(frame)
function p.debug(frame)
local args = frame.args
  local rezeptname = get_rezeptname(frame)
if not args.rezept and frame:getParent() then
  args = frame:getParent().args
end
  local rezeptname = args.rezept or args[1] or ""
   if rezeptname == "" then
   if rezeptname == "" then
     return "Kein rezept= übergeben."
     return "Kein rezept= übergeben."
   end
   end


   local rendered = frame:expandTemplate{ title = "rezept", args = { rezeptname } }
   local ingredients = get_ingredients_from_rezept_template(frame, rezeptname)
  local ingredients = extract_links(rendered)


   if #ingredients == 0 then
   if #ingredients == 0 then
Zeile 85: Zeile 101:
end
end


-- cats: setzt Kategorien anhand Zutatenseiten-Kategorien
-- CATS: setzt Kategorien anhand Zutatenseiten-Kategorien
function p.cats(frame)
function p.cats(frame)
  -- niemals die Vorlagenseite selbst kategorisieren
   if current_is_template_namespace() then
   if current_is_template_namespace() then
     return "" -- niemals die Vorlage selbst kategorisieren
     return ""
   end
   end


   local args = frame:getParent() and frame:getParent().args or frame.args
   local rezeptname = get_rezeptname(frame)
  local rezeptname = args.rezept or args[1] or ""
   if rezeptname == "" then
   if rezeptname == "" then
     return ""
     return ""
   end
   end


   local rendered = frame:expandTemplate{ title = "rezept", args = { rezeptname } }
   local ingredients = get_ingredients_from_rezept_template(frame, rezeptname)
  local ingredients = extract_links(rendered)


   local recipeCats = {}
   local recipeCats = {}

Aktuelle Version vom 28. Februar 2026, 23:58 Uhr

Die Dokumentation für dieses Modul kann unter Modul:Rezepte/Doku erstellt werden

local p = {}

-- Map: Zutat-Kategorie -> Rezept-Kategorie
local CAT_MAP = {
  ["Gemüse"] = "Gericht mit Gemüse",
  ["Fleisch"] = "Gericht mit Fleisch",
  ["Fisch"] = "Gericht mit Fisch",
  ["Meeresfrüchte"] = "Gericht mit Meeresfrüchten",
  ["Frucht"] = "Gericht mit Früchten",
  ["Getreide"] = "Gericht mit Getreide",
  ["Gewürz"] = "Gericht mit Gewürzen",
  ["Protein"] = "Gericht mit Protein",
  ["Süß"] = "Gericht mit süßen Zutaten",
  ["Gefroren"] = "Gericht mit gefrorenen Zutaten",
}

local function trim(s)
  return (s or ""):gsub("^%s+", ""):gsub("%s+$", "")
end

-- Extrahiert Link-Ziele aus gerendertem Wikitext: [[Aubergine]] / [[Aubergine|...]]
-- Filtert Datei:, Kategorie: usw. raus.
local function extract_links(wikitext)
  local seen, out = {}, {}
  if not wikitext then return out end

  for target in wikitext:gmatch("%[%[([^%]|#]+)") do
    target = trim(target)

    if target ~= ""
      and not target:match("^[Dd]atei:")
      and not target:match("^[Ff]ile:")
      and not target:match("^[Kk]ategorie:")
      and not target:match("^[Cc]ategory:")
    then
      if not seen[target] then
        seen[target] = true
        table.insert(out, target)
      end
    end
  end

  return out
end

-- Liest Kategorien aus dem Wikitext einer Seite (direkte [[Kategorie:...]] im Quelltext)
local function extract_categories(wikitext)
  local cats = {}
  if not wikitext then return cats end

  for cat in wikitext:gmatch("%[%[%s*[Kk]ategorie%s*:%s*([^%]|]+)") do
    cats[trim(cat)] = true
  end
  for cat in wikitext:gmatch("%[%[%s*[Cc]ategory%s*:%s*([^%]|]+)") do
    cats[trim(cat)] = true
  end

  return cats
end

local function current_is_template_namespace()
  local t = mw.title.getCurrentTitle()
  -- ns 10 ist normalerweise "Vorlage"
  return t and (t.namespace == 10 or t.nsText == "Vorlage")
end

-- Holt Rezeptname robust aus #invoke:
-- Unterstützt {{#invoke:Rezepte|debug|Auberginenrollen}}
-- und {{#invoke:Rezepte|debug|rezept=Auberginenrollen}}
local function get_rezeptname(frame)
  local args = frame.args or {}
  local name = trim(args.rezept or args[1] or "")
  return name
end

-- Rendert Vorlage:Rezept für ein Rezept und extrahiert Zutaten-Seitennamen
local function get_ingredients_from_rezept_template(frame, rezeptname)
  -- Namespace-sicher: exakt "Vorlage:Rezept"
  local rendered = frame:expandTemplate{
    title = "Vorlage:Rezept",
    args = { rezeptname }
  }

  return extract_links(rendered), rendered
end

-- DEBUG: zeigt nur, welche Zutaten erkannt werden (setzt KEINE Kategorien)
function p.debug(frame)
  local rezeptname = get_rezeptname(frame)
  if rezeptname == "" then
    return "Kein rezept= übergeben."
  end

  local ingredients = get_ingredients_from_rezept_template(frame, rezeptname)

  if #ingredients == 0 then
    return "Keine Zutaten-Links erkannt. Prüfe, ob {{name|...}} wirklich Wikilinks rendert."
  end

  return "Erkannte Zutaten: " .. table.concat(ingredients, ", ")
end

-- CATS: setzt Kategorien anhand Zutatenseiten-Kategorien
function p.cats(frame)
  -- niemals die Vorlagenseite selbst kategorisieren
  if current_is_template_namespace() then
    return ""
  end

  local rezeptname = get_rezeptname(frame)
  if rezeptname == "" then
    return ""
  end

  local ingredients = get_ingredients_from_rezept_template(frame, rezeptname)

  local recipeCats = {}
  for _, ing in ipairs(ingredients) do
    local title = mw.title.new(ing)
    if title and title.exists then
      local content = title:getContent()
      local ingCats = extract_categories(content)

      for ingCat, _ in pairs(ingCats) do
        local mapped = CAT_MAP[ingCat]
        if mapped then
          recipeCats[mapped] = true
        end
      end
    end
  end

  local out = {}
  for catName, _ in pairs(recipeCats) do
    table.insert(out, string.format("[[Kategorie:%s]]", catName))
  end

  return table.concat(out, "")
end

return p