Module:InterviewNavbox: Difference between revisions

From JoJo's Bizarre Encyclopedia - JoJo Wiki
Jump to navigation Jump to search
Content deleted Content added
No edit summary
No edit summary
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}
local dateParser = require('Module:InterviewUtils')


-- Initialize caches
local function getDateRange(dateString)
local dateRangeCache = {}
local year = tonumber(dateString:sub(1, 4))
local parsedDateCache = {}

if year >= 1981 and year <= 1995 then
local function getDateRange(year)
return 1
elseif year >= 1996 and year <= 2005 then
-- Check if the year's range is cached
if not dateRangeCache[year] then
return 2
elseif year >= 2006 and year <= 2015 then
local ranges = {
return 3
{1981, 1995, 1},
elseif year >= 2016 and year <= 2020 then
{1996, 2005, 2},
return 4
{2006, 2015, 3},
elseif year >= 2021 and year <= 2025 then
{2016, 2020, 4},
return 5
{2021, 2025, 5},
elseif year >= 2026 and year <= 2030 then
{2026, 2030, 6},
return 6
}
for _, range in ipairs(ranges) do
if year >= range[1] and year <= range[2] then
dateRangeCache[year] = range[3] -- Cache the result
break
end
end
end
end
return dateRangeCache[year] or nil
return nil
end
end


function p.generateList(frame)
function p.main(frame)
local dateRangeInput = tonumber(frame.args[1]) or 1
local dateRangeInput = tonumber(frame.args[1]) or 1
local content = mw.loadJsonData('JoJo Wiki:Interviews')
local content = mw.loadJsonData('JoJo Wiki:Interviews')
local interviews_table = content.interviews
local interviews_table = content.interviews
local list = {}
local list = {}
local titleGroup = {}

-- Group interviews by title without date
-- Use caching for date parsing
for _, interview in ipairs(interviews_table) do
local date = interview.date
-- Check if the parsed date is cached
if not parsedDateCache[date] then
parsedDateCache[date] = dateParser.parse(date) -- Cache the parsed date
end
local year = parsedDateCache[date]
local titleWithoutDate = string.match(interview.title, '^(.-)%s*%(.-%)$') or interview.title
titleGroup[titleWithoutDate] = titleGroup[titleWithoutDate] or {}
table.insert(titleGroup[titleWithoutDate], {interview = interview, year = year})
end

-- Generate list
for _, interview in ipairs(interviews_table) do
for _, interview in ipairs(interviews_table) do
local dateRange = getDateRange(interview.date)
local year = dateParser.parse(interview.date)
local dateRange = getDateRange(year)

if dateRange == dateRangeInput then
if dateRange == dateRangeInput then
table.insert(list, '*{{INT|' .. interview.title .. '}}')
local titleWithoutDate = string.match(interview.title, '^(.-)%s*%(.-%)$') or interview.title
local interviews = titleGroup[titleWithoutDate]
local hasMultipleInterviews = #interviews > 1
local itemTitle = hasMultipleInterviews and interview.title or titleWithoutDate
local item = frame:expandTemplate{title = 'INT', args = {interview.title, itemTitle}}
table.insert(list, '*' .. item)
end
end
end
end

return table.concat(list, '\n')
return table.concat(list, '\n')
end
end



return p
return p

Latest revision as of 06:42, 28 February 2024

Documentation for this module may be created at Module:InterviewNavbox/doc

local p = {}
local dateParser = require('Module:InterviewUtils')

-- Initialize caches
local dateRangeCache = {}
local parsedDateCache = {}

local function getDateRange(year)
    -- Check if the year's range is cached
    if not dateRangeCache[year] then
        local ranges = {
            {1981, 1995, 1},
            {1996, 2005, 2},
            {2006, 2015, 3},
            {2016, 2020, 4},
            {2021, 2025, 5},
            {2026, 2030, 6},
        }
        for _, range in ipairs(ranges) do
            if year >= range[1] and year <= range[2] then
                dateRangeCache[year] = range[3] -- Cache the result
                break
            end
        end
    end
    return dateRangeCache[year] or nil
end

function p.main(frame)
    local dateRangeInput = tonumber(frame.args[1]) or 1
    local content = mw.loadJsonData('JoJo Wiki:Interviews')
    local interviews_table = content.interviews
    local list = {}
    local titleGroup = {}

    -- Group interviews by title without date
	-- Use caching for date parsing
	for _, interview in ipairs(interviews_table) do
	    local date = interview.date
	    -- Check if the parsed date is cached
	    if not parsedDateCache[date] then
	        parsedDateCache[date] = dateParser.parse(date) -- Cache the parsed date
	    end
	    local year = parsedDateCache[date]
	
	    local titleWithoutDate = string.match(interview.title, '^(.-)%s*%(.-%)$') or interview.title
	    titleGroup[titleWithoutDate] = titleGroup[titleWithoutDate] or {}
	    table.insert(titleGroup[titleWithoutDate], {interview = interview, year = year})
	end

    -- Generate list
    for _, interview in ipairs(interviews_table) do
        local year = dateParser.parse(interview.date)
        local dateRange = getDateRange(year)

        if dateRange == dateRangeInput then
            local titleWithoutDate = string.match(interview.title, '^(.-)%s*%(.-%)$') or interview.title
            local interviews = titleGroup[titleWithoutDate]
            local hasMultipleInterviews = #interviews > 1
            local itemTitle = hasMultipleInterviews and interview.title or titleWithoutDate
            local item = frame:expandTemplate{title = 'INT', args = {interview.title, itemTitle}}
            table.insert(list, '*' .. item)
        end
    end

    return table.concat(list, '\n')
end


return p