Module:WorldOrder2
Note: If you make changes to this module please also update Module:WorldOrder2 on bahai.media.
local module = {}
-- Define a list of volume numbers and map to the pdf page offset
-- [11] means volume 1 issue 1, so 114 is volume 1 issue 14
local pdfOffset_map = {}
-- Set default value for all combinations
for volume = 1, 38 do
for issue = 1, 4 do
local key = string.format("%02d%02d", volume, issue)
pdfOffset_map[key] = "2"
end
end
-- Specify exceptions
pdfOffset_map["0101"] = "0"
pdfOffset_map["0102"] = "0"
pdfOffset_map["0103"] = "0"
pdfOffset_map["0104"] = "0"
pdfOffset_map["0201"] = "0"
pdfOffset_map["0202"] = "0"
local publicationDate_map = {
["0101"] = "Fall, 1966",
["0102"] = "Winter, 1966",
["0103"] = "Spring, 1967",
["0104"] = "Summer, 1967",
["0201"] = "Fall, 1967",
["0202"] = "Winter, 1967",
["0203"] = "Spring, 1968",
["0204"] = "Summer, 1968",
["0301"] = "Fall, 1968",
["0302"] = "Winter, 1968-69",
["0303"] = "Spring, 1969",
["0304"] = "Summer, 1969",
["0401"] = "Fall, 1969",
["0402"] = "Winter, 1969-70",
["0403"] = "Spring, 1970",
["0404"] = "Summer, 1970",
["0501"] = "Fall, 1970",
["0502"] = "Winter, 1970-71",
["0503"] = "Spring, 1971",
["0504"] = "Summer, 1971",
["0601"] = "Fall, 1971",
["0602"] = "Winter, 1971-72",
["0603"] = "Spring, 1972",
["0604"] = "Summer, 1972",
["0701"] = "Fall, 1972",
["0702"] = "Winter, 1972-73",
["0703"] = "Spring, 1973",
["0704"] = "Summer, 1973",
["0801"] = "Fall, 1973",
["0802"] = "Winter, 1973-74",
["0803"] = "Spring, 1974",
["0804"] = "Summer, 1974",
["0901"] = "Fall, 1974",
["0902"] = "Winter, 1974-75",
["0903"] = "Spring, 1975",
["0904"] = "Summer, 1975",
["1001"] = "Fall, 1975",
["1002"] = "Winter, 1975-76",
["1003"] = "Spring, 1976",
["1004"] = "Summer, 1976",
["1101"] = "Fall, 1976",
["1102"] = "Winter, 1976-77",
["1103"] = "Spring, 1977",
["1104"] = "Summer, 1977",
["1201"] = "Fall, 1977",
["1202"] = "Winter, 1977-78",
["1203"] = "Spring, 1978",
["1204"] = "Summer, 1978",
["1301"] = "Fall, 1978",
["1302"] = "Winter, 1978-79",
["1303"] = "Spring, 1979",
["1304"] = "Summer, 1979",
["1401"] = "Fall, 1979",
["1402"] = "Winter, 1979",
["1403"] = "Spring/Summer, 1980",
["1404"] = "Spring/Summer, 1980",
["1501"] = "Fall 1980/Winter 1981",
["1502"] = "Fall 1980/Winter 1981",
["1503"] = "Spring/Summer, 1981",
["1504"] = "Spring/Summer, 1981",
["1601"] = "Fall, 1981",
["1602"] = "Winter, 1981-02",
["1603"] = "Spring, 1982",
["1604"] = "Summer, 1982",
["1701"] = "Fall, 1982",
["1702"] = "Winter, 1982-83",
["1703"] = "Spring, 1983",
["1704"] = "Summer, 1983",
["1801"] = "Fall, 1983",
["1802"] = "Winter, 1983-84",
["1803"] = "Spring, 1984",
["1804"] = "Summer, 1984",
["1901"] = "Fall 1984/Winter 1984-85",
["1902"] = "Fall 1984/Winter 1984-85",
["1903"] = "Spring/Summer, 1985",
["1904"] = "Spring/Summer, 1985",
["2001"] = "Fall, 1985",
["2002"] = "Winter, 1985-86",
["2003"] = "Spring/Summer, 1986",
["2004"] = "Spring/Summer, 1986",
["2101"] = "Fall 1986/Winter, 1986-87",
["2102"] = "Fall 1986/Winter, 1986-87",
["2103"] = "Spring/Summer, 1987",
["2104"] = "Spring/Summer, 1987",
["2201"] = "Fall 1987/Winter, 1987-88",
["2202"] = "Fall 1987/Winter, 1987-88",
["2203"] = "Spring/Summer, 1988",
["2204"] = "Spring/Summer, 1988",
["2301"] = "Fall 1988/Winter, 1988-89",
["2302"] = "Fall 1988/Winter, 1988-89",
["2303"] = "Spring/Summer, 1989",
["2304"] = "Spring/Summer, 1989",
["2401"] = "Fall 1989/Winter, 1989-90",
["2402"] = "Fall 1989/Winter, 1989-90",
["2403"] = "Spring/Summer, 1990",
["2404"] = "Spring/Summer, 1990",
["2501"] = "Fall, 1993",
["2502"] = "Winter, 1993-94",
["2503"] = "Spring, 1994",
["2504"] = "Summer, 1994",
["2601"] = "Fall, 1994",
["2602"] = "Winter, 1994-95",
["2603"] = "Spring, 1995",
["2604"] = "Summer, 1995",
["2701"] = "Fall, 1995",
["2702"] = "Winter, 1995-96",
["2703"] = "Spring, 1996",
["2704"] = "Summer, 1996",
["2801"] = "Fall, 1996",
["2802"] = "Winter, 1996-97",
["2803"] = "Spring, 1997",
["2804"] = "Summer, 1997",
["2901"] = "Fall, 1997",
["2902"] = "Winter, 1997-98",
["2903"] = "Spring, 1998",
["2904"] = "Summer, 1998",
["3001"] = "Fall, 1998",
["3002"] = "Winter, 1998-99",
["3003"] = "Spring, 1999",
["3004"] = "Summer, 1999",
["3101"] = "Fall, 1999",
["3102"] = "Winter, 1999-2000",
["3103"] = "Spring, 2000",
["3104"] = "Summer, 2000",
["3201"] = "Fall, 2000",
["3202"] = "Winter, 2000-01",
["3203"] = "Spring, 2001",
["3204"] = "Summer, 2001",
["3301"] = "Fall, 2001",
["3302"] = "Winter, 2001-02",
["3303"] = "Spring, 2002",
["3304"] = "Summer, 2002",
["3401"] = "Fall, 2002",
["3402"] = "Winter, 2002-03",
["3403"] = "Spring, 2003",
["3404"] = "Summer, 2003",
["3501"] = "Fall, 2003",
["3502"] = "Winter, 2003-04",
["3503"] = "Spring, 2004",
["3504"] = "Summer, 2004",
["3601"] = "Fall, 2004",
["3602"] = "Winter, 2004-05",
["3603"] = "Spring, 2005",
["3604"] = "Summer, 2005",
["3701"] = "Fall, 2005",
["3702"] = "Winter, 2005-06",
["3703"] = "Spring, 2006",
["3704"] = "Summer, 2006",
["3801"] = "Fall, 2006",
["3802"] = "Winter, 2006-07",
["3803"] = "Spring, 2007",
}
local itemNumber_map = {
["0101"] = "Q2354",
["0102"] = "Q2355",
["0103"] = "Q2356",
["0104"] = "Q2357",
["0201"] = "Q2359",
["0202"] = "Q2360",
["0203"] = "Q2361",
["0204"] = "Q2362",
["0301"] = "Q2364",
["0302"] = "Q2365",
["0303"] = "Q2366",
["0304"] = "Q2367",
["0401"] = "Q2509",
["0402"] = "Q2510",
["0403"] = "Q2511",
["0404"] = "Q2512",
["0501"] = "Q2618",
["0502"] = "Q2619",
["0503"] = "Q2620",
["0504"] = "Q2621",
["0601"] = "Q2623",
["0602"] = "Q2624",
["0603"] = "Q2625",
["0604"] = "Q2626",
["0701"] = "Q2628",
["0702"] = "Q2629",
["0703"] = "Q2630",
["0704"] = "Q2631",
["0801"] = "Q2633",
["0802"] = "Q2634",
["0803"] = "Q2635",
["0804"] = "Q2636",
["0901"] = "Q2638",
["0902"] = "Q2639",
["0903"] = "Q2640",
["0904"] = "Q2641",
["1001"] = "Q2643",
["1002"] = "Q2644",
["1003"] = "Q2645",
["1004"] = "Q2646",
["1101"] = "Q2648",
["1102"] = "Q2649",
["1103"] = "Q2650",
["1104"] = "Q2651",
["1201"] = "Q2653",
["1202"] = "Q2654",
["1203"] = "Q2655",
["1204"] = "Q2656",
["1301"] = "Q2658",
["1302"] = "Q2659",
["1303"] = "Q2660",
["1304"] = "Q2661",
["1401"] = "Q3072",
["1402"] = "Q3073",
["1403"] = "Q3074",
["1501"] = "Q3105",
["1503"] = "Q3106",
["1601"] = "Q3123",
["1602"] = "Q3124",
["1603"] = "Q3125",
["1604"] = "Q3126",
["1701"] = "Q3128",
["1702"] = "Q3129",
["1703"] = "Q3130",
["1704"] = "Q3131",
["1801"] = "Q3133",
["1802"] = "Q3134",
["1803"] = "Q3135",
["1804"] = "Q3136",
["1901"] = "Q3304",
["1903"] = "Q3305",
["2001"] = "Q3307",
["2002"] = "Q3308",
["2003"] = "Q3309",
["2101"] = "Q3311",
["2103"] = "Q3312",
["2201"] = "Q3314",
["2203"] = "Q3315",
["2301"] = "Q3317",
["2303"] = "Q3318",
["2401"] = "Q3320",
["2403"] = "Q3321",
["2501"] = "Q3476",
["2502"] = "Q3477",
["2503"] = "Q3478",
["2504"] = "Q3479",
["2601"] = "Q3481",
["2602"] = "Q3482",
["2603"] = "Q3483",
["2604"] = "Q3484",
["2701"] = "Q3486",
["2702"] = "Q3487",
["2703"] = "Q3488",
["2704"] = "Q3489",
["2801"] = "Q3491",
["2802"] = "Q3492",
["2803"] = "Q3493",
["2804"] = "Q3494",
["2901"] = "Q3496",
["2902"] = "Q3497",
["2903"] = "Q3498",
["2904"] = "Q3499",
["3001"] = "Q3501",
["3002"] = "Q3502",
["3003"] = "Q3503",
["3004"] = "Q3504",
["3101"] = "Q3506",
["3102"] = "Q3507",
["3103"] = "Q3508",
["3104"] = "Q3509",
["3201"] = "Q3511",
["3202"] = "Q3512",
["3203"] = "Q3513",
["3204"] = "Q3514",
["3301"] = "Q3516",
["3302"] = "Q3517",
["3303"] = "Q3518",
["3304"] = "Q3519",
["3401"] = "Q3521",
["3402"] = "Q3522",
["3403"] = "Q3523",
["3404"] = "Q3524",
["3501"] = "Q3526",
["3502"] = "Q3527",
["3503"] = "Q3528",
["3504"] = "Q3529",
["3601"] = "Q3531",
["3602"] = "Q3532",
["3603"] = "Q3533",
["3604"] = "Q3534",
["3701"] = "Q3536",
["3702"] = "Q3537",
["3703"] = "Q3538",
["3704"] = "Q3539",
["3801"] = "Q3541",
["3802"] = "Q3542",
["3803"] = "Q3543",
}
-- Function to generate padded keys
function getPaddedKey(vol, iss)
local volPadded = string.format("%02d", vol)
local issPadded = string.format("%02d", iss)
return volPadded .. issPadded
end
-- Accept the input as the volume/issue number, return date published
function module.publicationDate(frame)
local volNumber = tonumber(frame.args[1])
local issNumber = tonumber(frame.args[2])
local key = getPaddedKey(volNumber, issNumber)
return publicationDate_map[key]
end
-- Accept the input as volume number, return pdf page number offset
function module.pdfOffset(frame)
local volumeNumber = tonumber(frame.args[1])
local issueNumber = tonumber(frame.args[2])
local key = string.format("%02d%02d", volumeNumber, issueNumber)
return pdfOffset_map[key]
end
-- BEGIN SECTION WHICH RETURNS AN ARTICLE OR AUTHOR BY VOL/ISSUE/PAGE NUMBER --
-- Usage: [[Template:Citewo]]
-- Internal function to fetch article IDs from an issue item
function module.fetchArticleIDs(issueItemID)
local issueItem = mw.wikibase.getEntity(issueItemID)
local articleIDs = {}
if not issueItem or not issueItem.claims then
return articleIDs
end
local articlesPropertyID = 'P4'
local articles = issueItem.claims[articlesPropertyID]
if not articles then
return articleIDs
end
for _, articleSnak in ipairs(articles) do
if articleSnak.mainsnak and articleSnak.mainsnak.datavalue then
local articleID = articleSnak.mainsnak.datavalue.value.id
table.insert(articleIDs, articleID)
end
end
return articleIDs
end
-- Internal function to parse a page range string
function module.parsePageRange(pageRange)
local startPage, endPage = pageRange:match("(%d+)-?(%d*)")
startPage = tonumber(startPage)
endPage = (endPage ~= "" and tonumber(endPage)) or startPage
return startPage, endPage
end
-- Internal function to fetch article page ranges from a list of article IDs
function module.fetchArticlePageRanges(articleIDs)
local articlePageRanges = {}
for _, articleID in ipairs(articleIDs) do
local articleItem = mw.wikibase.getEntity(articleID)
if articleItem and articleItem.claims then
local pagesPropertyID = 'P6'
local pagesClaims = articleItem.claims[pagesPropertyID]
if pagesClaims then
for _, pagesSnak in ipairs(pagesClaims) do
if pagesSnak.mainsnak and pagesSnak.mainsnak.datavalue then
local pageRange = pagesSnak.mainsnak.datavalue.value
local startPage, endPage = module.parsePageRange(pageRange)
table.insert(articlePageRanges, {id = articleID, startPage = startPage, endPage = endPage})
end
end
end
end
end
return articlePageRanges
end
-- Function to find an article by page number
function module.findArticleByPageNumber(articlePageRanges, queriedPage)
local primaryMatch = nil
local secondaryMatch = nil
-- Check for Article Start
for _, article in ipairs(articlePageRanges) do
if article.startPage == queriedPage then
primaryMatch = article.id
break
elseif queriedPage >= article.startPage and queriedPage <= article.endPage then
secondaryMatch = article.id
end
end
-- Return primary match or secondary match
return primaryMatch or secondaryMatch
end
-- Internal function to get the article ID based on volume, issue, and page
function module.getArticleIDByPage(vol, iss, page)
local mapKey = string.format("%02d%02d", tonumber(vol), tonumber(iss))
local issueItemID = itemNumber_map[mapKey]
if not issueItemID then
return nil, "Issue item ID not found for the given volume and issue."
end
local articleIDs = module.fetchArticleIDs(issueItemID)
local articlePageRanges = module.fetchArticlePageRanges(articleIDs)
local articleID = module.findArticleByPageNumber(articlePageRanges, page)
return articleID
end
-- Function to fetch the author of an article item
function module.fetchArticleAuthor(articleID)
local articleItem = mw.wikibase.getEntity(articleID)
if articleItem and articleItem.claims then
local authorPropertyID = 'P10' -- Replace with the actual property ID for "author"
local authorClaims = articleItem.claims[authorPropertyID]
-- Check for author
if authorClaims then
for _, authorSnak in ipairs(authorClaims) do
if authorSnak.mainsnak and authorSnak.mainsnak.datavalue then
-- Assuming the author is stored as an item
local authorID = authorSnak.mainsnak.datavalue.value.id
local authorItem = mw.wikibase.getEntity(authorID)
if authorItem then
local authorName = authorItem.labels.en.value -- Assuming the name is in English
return authorName
end
end
end
end
-- Check for editorial (Q19)
local editorialPropertyID = 'P12'
local editorialClaims = articleItem.claims[editorialPropertyID]
if editorialClaims then
for _, editorialSnak in ipairs(editorialClaims) do
if editorialSnak.mainsnak and editorialSnak.mainsnak.datavalue then
local editorialID = editorialSnak.mainsnak.datavalue.value.id
if editorialID == "Q19" then -- Assuming Q19 is the ID for "editorial"
return "Editorial"
end
end
end
end
end
return 'Unknown Author'
end
-- External function to be invoked by templates to get article name by page number
function module.getArticleByPage(frame)
local vol = frame.args.vol
local iss = frame.args.iss
local page = tonumber(frame.args.page)
local articleID, errMsg = module.getArticleIDByPage(vol, iss, page)
if not articleID then
return errMsg or "No article found on page " .. tostring(page)
end
local articleItem = mw.wikibase.getEntity(articleID)
local articleName = articleItem and articleItem.labels and articleItem.labels.en and articleItem.labels.en.value or 'Unknown Article Name'
return articleName
end
-- External function to get article author by page number
function module.getAuthorByPage(frame)
local vol = frame.args.vol
local iss = frame.args.iss
local page = tonumber(frame.args.page)
local articleID, errMsg = module.getArticleIDByPage(vol, iss, page)
if not articleID then
return errMsg or "No article found on page " .. tostring(page)
end
return module.fetchArticleAuthor(articleID)
end
-- END SECTION WHICH RETURNS AN ARTICLE OR AUTHOR BY VOL/ISSUE/PAGE NUMBER --
--External function to check if itemNumber exists given vol/iss/page
function module.checkItemNumber(frame)
local vol = frame.args.vol
local iss = frame.args.iss
local mapKey = string.format("%02d%02d", tonumber(vol), tonumber(iss))
local itemNumber = itemNumber_map[mapKey]
if itemNumber then
return "true" -- itemNumber exists
else
return "false" -- itemNumber does not exist
end
end
-- External function to retrieve a list of article titles for a given volume and issue
function module.getArticleTitles(frame)
local vol = frame.args.vol
local iss = frame.args.iss
local mapKey = string.format("%02d%02d", tonumber(vol), tonumber(iss))
local issueItemID = itemNumber_map[mapKey]
if not issueItemID then
return "Issue item ID not found for the given volume and issue."
end
local articleIDs = module.fetchArticleIDs(issueItemID)
local articleTitles = {}
for _, articleID in ipairs(articleIDs) do
local articleItem = mw.wikibase.getEntity(articleID)
if articleItem and articleItem.labels and articleItem.labels.en then
local articleTitle = articleItem.labels.en.value or 'Unknown Article Title'
table.insert(articleTitles, articleTitle)
end
end
return table.concat(articleTitles, ", ")
end
return module