Module:InterviewNavigation: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
No edit summary |
Tag: Undo |
||
(17 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} |
local p = {} |
||
local JSON_PAGE = 'JoJo Wiki:Interviews' |
|||
function |
local function parse_date(date_string) |
||
local month_name, day, year = date_string:match("(%a+)%s*(%d*),%s*(%d+)") |
|||
if not a then return false end |
|||
if not b then return true end |
|||
if not year then |
|||
month_name, year = date_string:match("(%a+)%s*(%d+)") |
|||
local date1 = os.time{year = a.year, month = a.month, day = a.day or 1} |
|||
day = nil |
|||
local date2 = os.time{year = b.year, month = b.month, day = b.day or 1} |
|||
end |
|||
return date1 < date2 |
|||
end |
|||
function parse_date(date_str) |
|||
local month_name, day, year = date_str:match('(%a+)%s*(%d*)%s*,%s*(%d+)') |
|||
if not month_name then |
if not month_name then |
||
year = date_string:match("(%d+)") |
|||
month_name = nil |
|||
day = nil |
|||
end |
|||
local month_number |
|||
if month_name then |
|||
month_number = mw.language.getContentLanguage():formatDate("n", month_name .. " 1, " .. year) |
|||
end |
end |
||
return { |
|||
year = tonumber(year), |
|||
January = 1, February = 2, March = 3, April = 4, May = 5, June = 6, |
|||
month = tonumber(month_number), |
|||
July = 7, August = 8, September = 9, October = 10, November = 11, December = 12 |
|||
day = tonumber(day) |
|||
} |
} |
||
end |
|||
local function load_and_sort_interviews() |
|||
local month = months[month_name] |
|||
local content = mw.loadJsonData("JoJo Wiki:Interviews") |
|||
day = tonumber(day) or nil |
|||
local interviews_table = content.interviews |
|||
year = tonumber(year) |
|||
-- Convert the interviews table to an array |
|||
if not month or not year then |
|||
local interviews = {} |
|||
for _, interview in pairs(interviews_table) do |
|||
table.insert(interviews, interview) |
|||
end |
end |
||
-- Sort interviews by date |
|||
return {year = year, month = month, day = day} |
|||
table.sort(interviews, function(a, b) |
|||
local a_date = parse_date(a.date) |
|||
local b_date = parse_date(b.date) |
|||
if a_date.year ~= b_date.year then |
|||
return a_date.year < b_date.year |
|||
elseif a_date.month and b_date.month and a_date.month ~= b_date.month then |
|||
return a_date.month < b_date.month |
|||
elseif a_date.day and b_date.day and a_date.day ~= b_date.day then |
|||
return a_date.day < b_date.day |
|||
else |
|||
return false |
|||
end |
|||
end) |
|||
return interviews |
|||
end |
end |
||
local function find_prev_and_next_interviews(sorted_interviews, current_title) |
|||
function find_previous_next_interview(interviews, current_date, direction) |
|||
local |
local prev, next |
||
local formatted_title = current_title:gsub("Interview:", "") |
|||
local target_date_difference = nil |
|||
for |
for i, interview in ipairs(sorted_interviews) do |
||
if interview.title == formatted_title then |
|||
prev = i > 1 and sorted_interviews[i - 1] or nil |
|||
local date_difference = os.difftime(os.time(interview_date), os.time(current_date)) |
|||
next = i < #sorted_interviews and sorted_interviews[i + 1] or nil |
|||
break |
|||
if date_difference < 0 and (not target_date_difference or date_difference > target_date_difference) then |
|||
target_interview = interview |
|||
target_date_difference = date_difference |
|||
end |
|||
elseif direction == "next" then |
|||
if date_difference > 0 and (not target_date_difference or date_difference < target_date_difference) then |
|||
target_interview = interview |
|||
target_date_difference = date_difference |
|||
end |
|||
end |
end |
||
end |
end |
||
return |
return prev, next |
||
end |
end |
||
function p.main(frame) |
function p.main(frame) |
||
local current_title = frame.args[1] |
local current_title = frame.args[1] |
||
local |
local nav_type = frame.args[2] |
||
local original_interviews = mw.loadJsonData(JSON_PAGE) |
|||
local sorted_interviews = load_and_sort_interviews() |
|||
-- Debugging: output original JSON content |
|||
local prev_interview, next_interview = find_prev_and_next_interviews(sorted_interviews, current_title) |
|||
mw.log("Original JSON content:") |
|||
mw.logObject(original_interviews) |
|||
if nav_type == "prev" and prev_interview then |
|||
local interviews = {} |
|||
return prev_interview.title |
|||
elseif nav_type == "next" and next_interview then |
|||
for _, interview in ipairs(original_interviews) do |
|||
return next_interview.title |
|||
local parsed_date = parse_date(interview.date) |
|||
else |
|||
if parsed_date then |
|||
return "" |
|||
title = interview.title, |
|||
date = interview.date, |
|||
parsed_date = parsed_date |
|||
} |
|||
table.insert(interviews, interview_copy) |
|||
end |
|||
end |
end |
||
table.sort(interviews, function(a, b) return compare_dates(a.parsed_date, b.parsed_date) end) |
|||
-- Debugging: output sorted interviews |
|||
mw.log("Sorted Interviews:") |
|||
for _, interview in ipairs(interviews) do |
|||
mw.log(interview.title .. " - " .. interview.date) |
|||
end |
|||
local current_date = parse_date(mw.title.new(current_title).text) |
|||
if not current_date then |
|||
return nil |
|||
end |
|||
local target_interview = find_previous_next_interview(interviews, current_date, direction) |
|||
if not target_interview then |
|||
return nil |
|||
end |
|||
-- Debugging: output current title, current date, target title, and target date |
|||
mw.log("Current title: " .. current_title) |
|||
mw.log("Current date: " .. tostring(current_date.year) .. "-" .. tostring(current_date.month) .. "-" .. tostring(current_date.day or "nil")) |
|||
mw.log("Target title: " .. target_interview.title) |
|||
mw.log("Target date: " .. target_interview.date) |
|||
return "[[Interview:" .. target_interview.title .. "|" .. target_interview.date .. "]]" |
|||
end |
end |
||
Latest revision as of 15:41, 5 May 2023
Documentation for this module may be created at Module:InterviewNavigation/doc
local p = {}
local function parse_date(date_string)
local month_name, day, year = date_string:match("(%a+)%s*(%d*),%s*(%d+)")
if not year then
month_name, year = date_string:match("(%a+)%s*(%d+)")
day = nil
end
if not month_name then
year = date_string:match("(%d+)")
month_name = nil
day = nil
end
local month_number
if month_name then
month_number = mw.language.getContentLanguage():formatDate("n", month_name .. " 1, " .. year)
end
return {
year = tonumber(year),
month = tonumber(month_number),
day = tonumber(day)
}
end
local function load_and_sort_interviews()
local content = mw.loadJsonData("JoJo Wiki:Interviews")
local interviews_table = content.interviews
-- Convert the interviews table to an array
local interviews = {}
for _, interview in pairs(interviews_table) do
table.insert(interviews, interview)
end
-- Sort interviews by date
table.sort(interviews, function(a, b)
local a_date = parse_date(a.date)
local b_date = parse_date(b.date)
if a_date.year ~= b_date.year then
return a_date.year < b_date.year
elseif a_date.month and b_date.month and a_date.month ~= b_date.month then
return a_date.month < b_date.month
elseif a_date.day and b_date.day and a_date.day ~= b_date.day then
return a_date.day < b_date.day
else
return false
end
end)
return interviews
end
local function find_prev_and_next_interviews(sorted_interviews, current_title)
local prev, next
local formatted_title = current_title:gsub("Interview:", "")
for i, interview in ipairs(sorted_interviews) do
if interview.title == formatted_title then
prev = i > 1 and sorted_interviews[i - 1] or nil
next = i < #sorted_interviews and sorted_interviews[i + 1] or nil
break
end
end
return prev, next
end
function p.main(frame)
local current_title = frame.args[1]
local nav_type = frame.args[2]
local sorted_interviews = load_and_sort_interviews()
local prev_interview, next_interview = find_prev_and_next_interviews(sorted_interviews, current_title)
if nav_type == "prev" and prev_interview then
return prev_interview.title
elseif nav_type == "next" and next_interview then
return next_interview.title
else
return ""
end
end
return p