Module:VolDiff
Jump to navigation
Jump to search
Documentation for this module may be created at Module:VolDiff/doc
local p = {}
-- Helper function to parse chapter number from the chapter link
local function getChapterNumber(chapterLink)
local fullMatch = mw.ustring.match(chapterLink, "%[%[(.-)%]%]")
if fullMatch then
local splitMatch = mw.text.split(fullMatch, "|")
return splitMatch[1]
end
return nil
end
-- Helper function to extract content under a specific section header
local function extractSection(content, header)
-- Define the pattern to find the section header
local startPattern = mw.ustring.gsub(header, "=", "%%=")
-- Find the start of the specified header
local sectionStart, sectionEnd = mw.ustring.find(content, startPattern)
-- If the section is not found, return nil
if not sectionStart then
return nil
end
-- Find the next section header (either === or higher)
local nextHeaderPattern = "\n==+%s*[^=]"
local nextHeaderStart, nextHeaderEnd = mw.ustring.find(content, nextHeaderPattern, sectionEnd + 1)
-- Extract the content until the next section header or the end of the content
if nextHeaderStart then
return mw.ustring.sub(content, sectionEnd + 1, nextHeaderStart - 1)
else
return mw.ustring.sub(content, sectionEnd + 1)
end
end
-- Helper function to capture the entire Desc parameter
local function captureDescParameter(diff)
local descStart, descEnd = mw.ustring.find(diff, "Desc%s*=%s*")
if not descStart then
return nil
end
local finalDesc = mw.ustring.sub(diff, descEnd + 1)
local labelStart = mw.ustring.find(finalDesc, "\n|Label")
if labelStart then
finalDesc = mw.ustring.sub(finalDesc, 1, labelStart - 1)
else
finalDesc = mw.ustring.gsub(finalDesc, "}}%s*$", "") -- Ensure it stops at the end of the template
end
finalDesc = mw.ustring.gsub(finalDesc, "}}%s*$", "") -- Remove any remaining closing braces
return mw.text.trim(finalDesc)
end
-- Function to find all Diff positions
local function findDiffPositions(content)
local positions = {}
local startPos = 1
while true do
local diffStart, diffEnd = mw.ustring.find(content, "{{%s*Diff%s*[|\n]", startPos)
if not diffStart then
break
end
positions[#positions + 1] = {diffStart, diffEnd}
startPos = diffEnd + 1
end
return positions
end
-- Main function to process the VolDiffs template
function p.main(frame)
local args = frame:getParent().args
local currentTitle = mw.title.getCurrentTitle().text
local sourcePage = args[1]
local sectionType = args[2] or "magazine"
local sectionHeader = sectionType == "reprint" and "===Reprint Differences===" or "===Magazine Differences==="
local result = {}
if not sourcePage then
return "Error: No source page specified."
end
-- Fetch the content from the specified source page
local content = mw.title.new(sourcePage):getContent()
if not content then
return "Error: Could not fetch content from the specified source page."
end
-- Extract the section content
local volDiffsContent = extractSection(content, sectionHeader)
if not volDiffsContent then
return "Error: No section found with header " .. sectionHeader
end
-- Extract VolDiffs parameters
local part = mw.ustring.match(volDiffsContent, "Part%s*=%s*([^|]+)") or ""
local title = mw.ustring.match(volDiffsContent, "Title%s*=%s*([^|]+)") or ""
local label1 = mw.ustring.match(volDiffsContent, "Label1%s*=%s*([^|]*)") or ""
local label2 = mw.ustring.match(volDiffsContent, "Label2%s*=%s*([^|]*)") or ""
-- Start the VolDiffs template
result[#result + 1] = string.format('{{VolDiffs|Part=%s|Title=%s', part, title)
if label1 ~= "" then result[#result + 1] = string.format('|Label1=%s', label1) end
if label2 ~= "" then result[#result + 1] = string.format('|Label2=%s', label2) end
result[#result + 1] = '|\n'
-- Find all Diff positions
local diffPositions = findDiffPositions(volDiffsContent)
-- Process each Diff entry
local hasDiffs = false
for i, pos in ipairs(diffPositions) do
local diffStart = pos[1]
local diffEnd = i < #diffPositions and diffPositions[i + 1][1] - 1 or mw.ustring.len(volDiffsContent)
local diffContent = mw.ustring.sub(volDiffsContent, diffStart, diffEnd)
if diffContent then
local diffPart = mw.ustring.match(diffContent, "Part%s*=%s*([^|]+)")
local diffChapter = mw.ustring.match(diffContent, "Chapter%s*=%s*(%[%[.-%]%])")
local diffPage = mw.ustring.match(diffContent, "Page%s*=%s*([^|]+)")
local diffImage1 = mw.ustring.match(diffContent, "Image1%s*=%s*([^|]+)")
local diffImage2 = mw.ustring.match(diffContent, "Image2%s*=%s*([^|]+)")
local diffDesc = captureDescParameter(diffContent)
local diffLabel1 = mw.ustring.match(diffContent, "Label1%s*=%s*([^|]*)") or ""
local diffLabel2 = mw.ustring.match(diffContent, "Label2%s*=%s*([^|]*)") or ""
if diffPart and diffChapter and diffPage and diffImage1 and diffImage2 and diffDesc then
local chapterNumber = getChapterNumber(diffChapter)
-- Check if the current page title matches the chapter number
if chapterNumber and mw.ustring.match(currentTitle, chapterNumber) then
hasDiffs = true
result[#result + 1] = string.format('{{Diff|Part=%s|Chapter=%s|Page=%s|Image1=%s|Image2=%s|Desc=%s',
diffPart, diffChapter, diffPage, diffImage1, diffImage2, mw.text.trim(diffDesc))
-- Add optional labels if they are present
if diffLabel1 ~= "" then result[#result + 1] = string.format('|Label1=%s', diffLabel1) end
if diffLabel2 ~= "" then result[#result + 1] = string.format('|Label2=%s', diffLabel2) end
result[#result + 1] = '}}\n' -- Ensure only one closing brace is added
end
end
end
end
-- Concatenate all diff entries at once
if hasDiffs then
result[#result + 1] = '}}'
else
return "No differences found for this chapter."
end
return frame:preprocess(table.concat(result))
end
return p