Module:VolDiff

From JoJo's Bizarre Encyclopedia - JoJo Wiki
Revision as of 07:27, 31 July 2024 by Vish (talk | contribs)
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