Module:InfoboxExtractor
Jump to navigation
Jump to search
Documentation for this module may be created at Module:InfoboxExtractor/doc
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, imageTab)
local images = {}
local function processTabber(content)
local startPattern = "{{Tabber%s*\n?"
local endPattern = "}}"
local startPos, endPos, tabberContent = string.find(content, startPattern .. "(.-)" .. endPattern)
if startPos and endPos then
local tabPattern = "|%s*([^|}]+)%s*|%s*%[%[File:([^|%]]+)"
for tab, image in string.gmatch(tabberContent, tabPattern) do
local trimmedTab = mw.text.trim(tab)
if not imageTab or mw.ustring.lower(trimmedTab) == mw.ustring.lower(imageTab) then
table.insert(images, { tab = trimmedTab, image = image })
mw.log("Tab: " .. trimmedTab .. " Image: " .. image) -- Debugging statement
end
end
else
local pattern = "%[%[File:([^|%]]+)"
local image = string.match(content, pattern)
if image then
table.insert(images, { tab = "", image = image })
mw.log("Tab: " .. "" .. " Image: " .. image) -- Debugging statement
end
end
end
processTabber(value)
return images
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
if label:lower() == "image" then
local imageTab = frame.args.imageTab or ""
local images = getImages(value, imageTab)
local selectedImage
for _, image in ipairs(images) do
if image.tab == imageTab then
selectedImage = image.image
break
end
end
if not selectedImage then
return "Error: Invalid image tab selection."
end
local size = frame.args.size or ""
local link = frame.args.link or ""
if link ~= "" then
return string.format('[[File:%s|%s|link=%s]]', selectedImage, size, link)
else
return string.format('[[File:%s|%s]]', selectedImage, size)
end
end
end
return p