Module:InfoboxExtractor

local p = {}

local function extractInfobox(wikitext) local startInfobox = string.find(wikitext, "{{[^}]*Infobox") if not startInfobox then return nil end

local braceCount = 0 local endInfobox = startInfobox

for i = startInfobox, #wikitext do       local char = wikitext:sub(i, i)        if char == '{' then braceCount = braceCount + 1 elseif char == '}' then braceCount = braceCount - 1 end

if braceCount == 0 then endInfobox = i           break end end

return wikitext:sub(startInfobox, endInfobox) end

local function getLabelValue(infobox, label) local pattern = "|" .. label .. " *= *"   local matchStart, matchEnd = string.find(infobox, pattern) if not matchStart then return nil end

local value = "" local braceCount = 0 local i = matchEnd + 1 local isNewLine = false

-- need to do - 2 so it ignores the }} at the end of the infobox while i <= #infobox - 2 do       local char = infobox:sub(i, i)

if char == '{' then braceCount = braceCount + 1 elseif char == '}' then braceCount = braceCount - 1 end

if braceCount == 0 and char == '\n' then isNewLine = true elseif isNewLine and char == '|' then break else isNewLine = false value = value .. char end

i = i + 1 end

return value end

local function getImages(value) local images = {} local pattern = "%[%[File:([^|%]]+)" for image in string.gmatch(value, pattern) do       table.insert(images, image) end return images end

local function getTab(value, label) local pattern = label .. "|"   local pattern2 = label .. " *= *"   local matchStart, matchEnd = string.find(value, pattern) if not matchStart then matchStart, matchEnd = string.find(value, pattern2) if not matchStart then return nil end end

local tab = "" local braceCount = 0 local i = matchEnd + 1 local isNewLine = false

while i <= #value do       local char = value:sub(i, i)

if char == '{' then braceCount = braceCount + 1 elseif char == '}' then braceCount = braceCount - 1 end

if braceCount == 0 and char == '\n' then isNewLine = true elseif isNewLine and char == '|' then break else isNewLine = false tab = tab .. char end

i = i + 1 end

return tab end

function p.extract(frame) local preprocess = frame.args.template == "true" local pageTitle = frame.args[1] if preprocess then pageTitle = frame:preprocess(pageTitle) end if not pageTitle then return "Error: Please provide a page title." end

local page = mw.title.new(pageTitle) if not page or not page.exists then return "Error: Page not found." end

local wikitext = page:getContent local infobox = extractInfobox(wikitext)

if not infobox then return "Error: Infobox not found." end

local label = frame.args[2] if not label then return "Error: Please provide a label." end

local value = getLabelValue(infobox, label)

if not value then return "Error: Label not found in infobox." end

local tab = frame.args.tab if tab then value = getTab(value, tab) end

if not value then return "Error: Tab not found in infobox." end

if label:lower == "image" then local images = getImages(value) local imageIndex = tonumber(frame.args.imageIndex) or 1 local size = frame.args.size or "" local link = frame.args.link or ""

if imageIndex < 1 or imageIndex > #images then return "Error: Invalid image index." end

local selectedImage = images[imageIndex] if link ~= "" then return string.format('', selectedImage, size, link) else return string.format('', selectedImage, size) end else local processedValue = frame:preprocess(value) return processedValue end end

return p