Module:HonorTabs
From Pathfinder Wiki
Revision as of 20:29, 14 July 2021 by DesignerThan (talk | contribs)
Documentation for this module may be created at Module:HonorTabs/doc
local p = {}
local honorUtils = require ( "Module:HonorUtils" )
local notUseLUAPattern = true
function p.generateHonorTabs( frame )
local parentFrame = frame:getParent()
mw.log('HonorTabs.generateHonorTabs (frame:getTitle): '..frame:getTitle())
mw.log('HonorTabs.generateHonorTabs (parentFrame:getTitle): '..parentFrame:getTitle())
local landingPage = parentFrame.args['landingPage']
if landingPage == nil or landingPage == '' then
landingPage = frame:expandTemplate{ title='GetHonorLandingPage' }
landingPage = mw.ustring.gsub(landingPage,"[\n\r]", "")
end
local objTitle = mw.title.getCurrentTitle()
mw.log('HonorTabs.generateHonorTabs (objTitle.text): '..objTitle.text)
local isRequirementsPage = false
local isAnswerKeyPage = false
if ( string.find( objTitle.text, '/Requirements' ) ~= nil ) then
isRequirementsPage = true
elseif ( string.find( objTitle.text, '/Answer Key' ) ~= nil ) then
isAnswerKeyPage = true
end
local langSuffix = frame:expandTemplate{ title='GetLangSuffix' }
tVariants = honorUtils.getExpandedHonorVariantsV2( frame, landingPage )
tAnsReqTabs = convertVariantsToTabs( frame, tVariants, landingPage, langSuffix)
local HTMLCodeString = ""
-- create the overview tab
HTMLCodeString = HTMLCodeString .. createSimpleTab(generateTabURL( frame, landingPage, langSuffix, 'Overview'))
-- create requirement tab
HTMLCodeString = HTMLCodeString .. createDropdownTab( frame, tAnsReqTabs['requirements'], 'Requirements', 'Req', isRequirementsPage)
-- create answer variants tab
HTMLCodeString = HTMLCodeString .. createDropdownTab( frame, tAnsReqTabs['answers'], 'Answer Key', 'Ans', isAnswerKeyPage)
-- create lesson plans tab
HTMLCodeString = HTMLCodeString .. createSimpleTab(generateTabURL( frame, landingPage..'/Lesson_Plans', langSuffix, 'Lesson Plans'))
-- create worksheets tab
HTMLCodeString = HTMLCodeString .. createSimpleTab(generateTabURL( frame, landingPage..'/Worksheet', langSuffix, 'Worksheet'))
local tabContainer = mw.html.create( 'ul' )
tabContainer
:attr( 'id', 'honor-nav' )
:attr( 'class', 'noprint')
:wikitext( HTMLCodeString )
return tostring( tabContainer )
end
function convertVariantsToTabs( frame, tVariants, landingPage, langSuffix )
mw.log('HonorTabs.convertVariantsToTabs: Start converting!')
tTabs = {
answers = {},
requirements = {}
}
if ( tVariants == nil ) then
mw.log('HonorTabs.convertVariantsToTabs: invalid Variants table (nil)!')
return nil;
end
if ( tVariants['answers'] == nil ) then
mw.log('HonorTabs.convertVariantsToTabs: No Answer Variants! Create default Tab.')
local linkTitle = frame:expandTemplate{ title = 'Localize', args = {'Answer Key'} }
local pageTitle = landingPage..'/Answer_Key'..langSuffix
tTabs['answers'][1] = {
pageTitle = pageTitle,
linkTitle = linkTitle,
wikilink = '[['..pageTitle..'|'..linkTitle..']]'
}
else
mw.log('HonorTabs.convertVariantsToTabs: '..#tVariants['answers']..' Answer Variants to convert!')
for varKey, variant in pairs(tVariants['answers']) do
local linkTitle = ""
if ( variant['countries'] == nil or variant['countries']['split'] == nil) then
mw.log('HonorTabs.convertVariantsToTabs: Invalid Answer Variant (Countries)!')
else
for countryKey, country in pairs(variant['countries']['split']) do
if ( #linkTitle > 0 ) then
linkTitle = linkTitle..' & '..country['translated']
else
linkTitle = country['translated']
end
end
end
if ( variant['authority'] == nil ) then
mw.log('HonorTabs.convertVariantsToTabs: No Authority for this variant!')
else
mw.log('HonorTabs.convertVariantsToTabs (variant["authority"]): '..variant['authority'])
-- get the authority
local authority = tVariants['requirements'][tonumber(variant['authority'])]['authorities'][1]['translated']
linkTitle = linkTitle..' ('..authority..')'
end
local strVariantNumber = ''
-- add number only for variants bigger than 1
if varKey > 1 then
strVariantNumber = '_'..varKey
end
local pageTitle = landingPage..'/Answer_Key'..strVariantNumber..langSuffix
tTabs['answers'][varKey] = {
pageTitle = pageTitle,
linkTitle = linkTitle,
wikilink = '[['..pageTitle..'|'..linkTitle..']]'
}
mw.log('HonorTabs.convertVariantsToTabs (Tab URL '..varKey..': '..tTabs['answers'][varKey]['url'])
end
mw.log('HonorTabs.convertVariantsToTabs: '..#tTabs['answers']..' Answer Variants were converted to Tabs!')
end
if ( tVariants['requirements'] == nil ) then
mw.log('HonorTabs.convertVariantsToTabs: No Requirement Variants! Create default Tab.')
local pageTitle = landingPage..'/Requirements'..langSuffix
local linkTitle = frame:expandTemplate{ title = 'Localize', args = {'Requirements'} }
tTabs['requirements'][1] = {
pageTitle = pageTitle,
linkTitle = linkTitle,
wikilink = '[['..pageTitle..'|'..linkTitle..']]'
}
else
mw.log('HonorTabs.convertVariantsToTabs: '..#tVariants['requirements']..' Requriement Variants to convert!')
for varKey, variant in pairs(tVariants['requirements']) do
local linkTitle = ""
if ( variant['authorities'] == nil ) then
mw.log('HonorTabs.convertVariantsToTabs: Invalid Requirement Variant (Authorities)!')
else
for authorityKey, authority in pairs(variant['authorities']) do
if ( #linkTitle > 0 ) then
linkTitle = linkTitle..' & '..authority['translated']
else
linkTitle = authority['translated']
end
end
end
local strVariantNumber = ''
-- add number only for variants bigger than 1
if varKey > 1 then
strVariantNumber = '_'..varKey
end
local pageTitle = landingPage..'/Requirement'..strVariantNumber..langSuffix
tTabs['requirements'][varKey] = {
pageTitle = pageTitle,
linkTitle = linkTitle,
wikilink = '[['..pageTitle..'|'..linkTitle..']]'
}
mw.log('HonorTabs.convertVariantsToTabs (Tab URL '..varKey..': '..tTabs['requirements'][varKey]['url'])
end
mw.log('HonorTabs.convertVariantsToTabs: '..#tTabs['requirements']..' Requirement Variants were converted to Tabs!')
end
return tTabs
end
function p.createAnswerTab( frame )
local ansVariants = ""
if frame.args.answerVariants then ansVariants = frame.args.answerVariants end
local landingPage = frame.args.landingPage
local t_answerVariants = honorUtils.getExpandedHonorVariants(frame, ansVariants, landingPage, "Answer Key")
result_string = outputVariantsTab(frame, t_answerVariants)
return result_string
end
function outputVariantsTab( frame, variants )
local HTMLCode = ""
local HTMLCodeString = ""
if (variants == nil) then
-- should not happen!
HTMLCodeString = "no variants?! = nil"
elseif (#variants < 1) then
-- should not happen!
HTMLCodeString = "no variants?! < 1"
elseif (#variants == 1) then
HTMLCodeString = createSimpleTab( variants[1].url )
else
-- now there should be more then 1 variants
local HTMLTabParent = mw.html.create( 'li' )
local buttonArgs = {}
buttonArgs['tagname'] = 'button'
local explodedPageName = mw.text.split( frame:expandTemplate{title='PAGENAMEwithoutLang'}, '/', true)
buttonArgs['class'] = 'dropdown-toggle' .. ' ' .. explodedPageName[#explodedPageName]
if (explodedPageName[#explodedPageName] == 'Answer Key') then
buttonArgs['class'] = buttonArgs['class'] .. ' selflink'
end
buttonArgs['type'] = 'button'
buttonArgs['id'] = 'dropdownAnswerKeys'
buttonArgs['data-toggle'] = 'dropdown'
buttonArgs['aria-haspopup'] = 'true'
buttonArgs['aria-expanded'] = 'false'
buttonText = frame:expandTemplate{title = 'Localize', args = {'Answer Key'} }
local dropdownButton = frame:extensionTag('htmltag', buttonText, buttonArgs)
HTMLTabParent
:addClass( 'honor-nav-item' )
:addClass( 'dropdown' )
:wikitext( dropdownButton )
HTMLVariantsContainer = mw.html.create( 'div' )
HTMLVariantsContainer
:addClass( 'dropdown-menu' )
:attr( 'aria-labelledby', 'dropdownAnswerKeys')
for key, variant in pairs(variants) do
HTMLVariantLink = mw.html.create( 'span' )
HTMLVariantLink
:addClass( 'dropdown-item' )
:wikitext( variant.url )
:done()
HTMLVariantsContainer:node( HTMLVariantLink )
end
HTMLVariantsContainer:done()
HTMLTabParent:node( HTMLVariantsContainer )
HTMLCodeString = tostring( HTMLTabParent )
end
return HTMLCodeString
end
function createSimpleTab( wikiLink )
local HTMLCode = mw.html.create( 'li' )
HTMLCode
:addClass( 'honor-nav-item' )
:wikitext( wikiLink )
return tostring( HTMLCode )
end
function createDropdownTab ( frame, tConfig, text, id, isSelflink )
local HTMLCode = ""
local HTMLCodeString = ""
if ( tConfig == nil ) then
mw.log('HonorTabs.createDropdownTab: Invalid Tab Config (nil)!')
elseif ( #tConfig < 1 ) then
mw.log('HonorTabs.createDropdownTab: Invalid Tab Config (< 1)!')
elseif ( #tConfig == 1 ) then
mw.log('HonorTabs.createDropdownTab (num, text, id, isSelflink): 1 Option, '..text..', '..id..', '..tostring(isSelflink))
HTMLCodeString = createSimpleTab( '[['..tConfig[1].pageTitle..'|'..frame:expandTemplate{ title='Localize', args = { text } }..']]' )
else
mw.log('HonorTabs.createDropdownTab (num, text, id, isSelflink): '..#tConfig..' Options, '..text..', '..id..', '..tostring(isSelflink))
-- now there should be more then 1 variants
local HTMLTabParent = mw.html.create( 'li' )
local buttonArgs = {}
buttonArgs['tagname'] = 'button'
buttonArgs['class'] = 'dropdown-toggle'
if (isSelflink == true) then
buttonArgs['class'] = buttonArgs['class'] .. ' selflink'
end
buttonArgs['type'] = 'button'
buttonArgs['id'] = 'dropdown'..id..'Keys'
buttonArgs['data-toggle'] = 'dropdown'
buttonArgs['aria-haspopup'] = 'true'
buttonArgs['aria-expanded'] = 'false'
buttonText = frame:expandTemplate{ title='Localize', args = { text } }
local dropdownButton = frame:extensionTag('htmltag', buttonText, buttonArgs)
HTMLTabParent
:addClass( 'honor-nav-item' )
:addClass( 'dropdown' )
:wikitext( dropdownButton )
HTMLVariantsContainer = mw.html.create( 'div' )
HTMLVariantsContainer
:addClass( 'dropdown-menu' )
:attr( 'aria-labelledby', 'dropdown'..id..'Keys')
for key, tab in pairs(tConfig) do
HTMLVariantLink = mw.html.create( 'span' )
HTMLVariantLink
:addClass( 'dropdown-item' )
:wikitext( tab.wikilink )
:done()
HTMLVariantsContainer:node( HTMLVariantLink )
end
HTMLVariantsContainer:done()
HTMLTabParent:node( HTMLVariantsContainer )
HTMLCodeString = tostring( HTMLTabParent )
end
return HTMLCodeString
end
function generateTabURL( frame, page, langSuffix, text )
-- check inputs
if ( page == nil or page == "" ) then return 'fatal error' end
return '[[' .. page .. langSuffix .. '|' .. frame:expandTemplate{ title='Localize', args = { text } } .. ']]'
end
return p