Module:HonorUtils

From Pathfinder Wiki
Revision as of 14:23, 2 August 2021 by DesignerThan (talk | contribs) (get the latest revision back to find the bug that causes AnswerKey and Requirement tab's to not be displayed for honors without variants)

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

local p = {}
local utilities = require ( "Module:Utilities" )
local notUseLUAPattern = true

-- retruns a table with the type and the number of the variant of the act. page
function p.getActVariantInfo( frame )
	local pageTitle = frame:expandTemplate{ title = 'PAGENAMEwithoutLang' }
	mw.log('HonorUtils.getActVariantInfo (pageTitle): '..pageTitle)
	local tPageTitle = mw.text.split(pageTitle, '/', notUseLUAPattern)
	
	local subPageString = tPageTitle[3]
	if (subPageString == nil) then
		mw.log('HonorUtils.getActVariantInfo: It is not a valid Subpage (nil)!')
		return nil
	end
	
	local variantNumber = utilities.getNumber(subPageString)
	if (variantNumber == nil) then
		-- if the page has no number then it is mostlikely number one
		-- and if it is an invalid subpage then the number won't be used anyway's
		variantNumber = 1
	end
	local tReturn = {
		variantNumber = variantNumber
	}
	-- check for valid subpages
	if ( mw.ustring.find(subPageString, 'Requirements', 0, notUseLUAPattern) ~= nil ) then
		mw.log('HonorUtils.getActVariantInfo: It is the Requirements Variant '..variantNumber)
		tReturn['variantType'] = 'requirements'
		tReturn['subPage'] = 'Requirements'
	elseif (mw.ustring.find(subPageString, 'Answer Key', 0, notUseLUAPattern) ~= nil ) then
		mw.log('HonorUtils.getActVariantInfo: It is the Answer Key Variant '..variantNumber)
		tReturn['variantType'] = 'answerKey'
		tReturn['subPage'] = 'Answer Key'
	else
		mw.log('HonorUtils.getActVariantInfo: It is a Subpage with no possibility for variants')
		return nil
	end
	return tReturn
end

function p.getVariantsData( frame, landingPage, variantType, variantNumber )
	if ( frame == nil ) then
		frame = mw.getCurrentFrame()
		mw.log( 'HonorUtils.getVariantsData (frame): '..frame:getTitle() )
	end
	if ( landingPage == nil or landingPage == "" ) then
		landingPage = frame:expandTemplate{ title='GetHonorLandingPage' }
	end
	local srcIsHonor = false
	local getAnswerVariants = true
	local tAnswerVariants = nil
	local getRequirementVariants = true
	local tRequirementVariants = nil
	
	-- check if only one variant is needed
	if ( variantType ~= nil and variantType ~= '' ) then
		if (variantType == 'requirements') then
			getAnswerVariants = false
		elseif (variantType == 'answerKey') then
			getRequirementVariants = false
		else
			mw.log( 'HonorUtils.getVariantData: Invalid variantType!' )
			return nil;
		end
	end

	if ( getAnswerVariants == true ) then
		tAnswerVariants = getHonorVariants( 'answerKey', landingPage, srcIsHonor, variantNumber )
		if ( tAnswerVariants == nil ) then
			mw.log("HonorUtils.getVariantsData: It isn't possible to get any answer variant's data!")
		end
	end
	
	if ( getRequirementVariants == true ) then
		tRequirementVariants = getHonorVariants( 'requirements', landingPage, srcIsHonor, variantNumber )
		if ( tRequirementVariants == nil ) then
			mw.log("HonorUtils.getVariantsData: It isn't possible to get any requirement variant's data!")
		end
	end
	
	local tVariants = {
		answers = tAnswerVariants,
		requirements = tRequirementVariants
	}
	
	tVariants = expandHonorVariants( frame, tVariants )
	
	tVariants = translateHonorVariants( frame, tVariants )
	return tVariants
end

function expandHonorVariants( frame, tVariants )
	local tRetVariants = tVariants
	if ( tVariants == nil ) then
		mw.log('HonorUtils.expandHonorVariants: No Variants to Expand (nil)!')
		return {}
	end
	if ( tVariants['answers'] == nil ) then
		mw.log('HonorUtils.expandHonorVariants: No Answer Variants to Expand!')
	else
		-- expand the answer Variants
		local tAnswers = tVariants['answers']
		mw.log('HonorUtils.expandHonorVariants: There are '..#tAnswers..' Answer Variants to Expand!')
		for key, variant in pairs(tAnswers) do
			mw.log('HonorUtils.expandHonorVariants (key, variant): '..key..', '..variant)
			local tActVariant = {
				orig = variant,
				countries = {}
			}
			
			-- seperate the source language suffix
			local tSplitAnsVariant = mw.text.split(variant, '/', notUseLUAPattern)
			if (tSplitAnsVariant[2] ~= nil and tSplitAnsVariant[2] ~= '') then
				tActVariant['srcLangSuffix'] = '/'..tSplitAnsVariant[2]
				mw.log('HonorUtils.expandHonorVariants (srcLangSuffix): '..tActVariant['srcLangSuffix'])
			else
				mw.log('HonorUtils.expandHonorVariants: There is no source language set, default to english, which is an empty string ;)')
				tActVariant['srcLangSuffix'] = ''
			end
			
			-- seperate Countries and Authority
			tSplitAnsVariant = mw.text.split(tSplitAnsVariant[1], ';;', notUseLUAPattern)
			if ( tSplitAnsVariant[1] ~= '') then
				tActVariant['countries']['orig'] = tSplitAnsVariant[1]
				-- seperate the Countries
				tActVariant['countries']['split'] = mw.text.split(tActVariant['countries']['orig'], ';', notUseLUAPattern)
				mw.log('HonorUtils.expandHonorVariants (Countries - Orig): '..tActVariant['countries']['orig'])
			else
				mw.log('HonorUtils.expandHonorVariants: There are no countries for that variant!')
			end
			-- set the authority
			if ( tSplitAnsVariant[2] == nil ) then
				tActVariant['authority'] = nil
				mw.log('HonorUtils.expandHonorVariants (Authority): nil')
			else
				tActVariant['authority'] = tSplitAnsVariant[2]
				mw.log('HonorUtils.expandHonorVariants (Authority): '..tActVariant['authority'])
			end
			-- save act. Variant into the table
			tAnswers[key] = tActVariant
		end
		tVariants['answers'] = tAnswers
		mw.log('HonorUtils.expandHonorVariants: '..#tVariants['answers']..' Answer Variants expanded!')
	end
	if ( tVariants['requirements'] == nil ) then
		mw.log('HonorUtils.expandHonorVariants: No Requirement Variants to Expand!')
	else
		-- expand the requirement Variants
		local tRequirements = tVariants['requirements']
		mw.log('HonorUtils.expandHonorVariants: There are '..#tRequirements..' Requirement Variants to Expand!')
		for key, variant in pairs(tRequirements) do
			mw.log('HonorUtils.expandHonorVariants (key, variant): '..key..', '..variant)
			-- seperate Authorities
			local tSplitReqVariant = mw.text.split(variant, ';', notUseLUAPattern)
			local tActReqVariant = {
				orig = variant,
				authorities = tSplitReqVariant
			}
			tRequirements[key] = tActReqVariant
		end
		tVariants['requirements'] = tRequirements
		mw.log('HonorUtils.expandHonorVariants: '..#tVariants['requirements']..' Requirement Variants expanded!')
	end
	return tRetVariants
end

function translateHonorVariants( frame, tVariants )
	local tRetVariants = tVariants
	if ( tRetVariants == nil ) then
		mw.log('HonorUtils.translateHonorVariants: There are no Variants (nil)!')
	end
	if ( tRetVariants['answers'] == nil ) then
		mw.log('HonorUtils.translateHonorVariants: There are no Answer Variants!')
	else
		mw.log('HonorUtils.translateHonorVariants: There are '..#tRetVariants['answers']..' Answer Variants to translate!')
		for varKey, variant in pairs(tRetVariants['answers']) do
			if ( variant == nil or variant['countries'] == nil or variant['countries']['split'] == nil ) then
				mw.log('HonorUtils.translateHonorVariants: Answer Variant is invalid!')
			else
				mw.log('HonorUtils.translateHonorVariants: There are '..#variant['countries']['split']..' Answer Variant Countries to translate!')
				for countryKey, country in pairs(variant['countries']['split']) do
					local trans = utilities.localize( country, 'Countries' )
					-- check if Localization returned something, if not set the original string
					mw.log('HonorUtils.translateHonorVariants (country, trans): '..country..', '..trans)
					if ( trans == '' ) then
						trans = country
					end
					tRetVariants['answers'][varKey]['countries']['split'][countryKey] = {
						orig = country,
						translated = trans
					}
				end
				mw.log('HonorUtils.translateHonorVariants: '..#tRetVariants['answers'][varKey]['countries']['split']..' Answer Variant Countries were translated!')
			end
		end
		mw.log('HonorUtils.translateHonorVariants: '..#tRetVariants['answers']..' Answer Variants were translated!')
	end
	if ( tRetVariants['requirements'] == nil ) then
		mw.log('HonorUtils.translateHonorVariants: There are no Requirement Variants!')
	else
		mw.log('HonorUtils.translateHonorVariants: There are '..#tRetVariants['requirements']..' Requriement Variants to translate!')
		for varKey, variant in pairs(tRetVariants['requirements']) do
			if ( variant == nil or variant['authorities'] == nil ) then
				mw.log('HonorUtils.translateHonorVariants: Requriement Variant is invalid!')
			else
				mw.log('HonorUtils.translateHonorVariants: There are '..#variant['authorities']..' Requriement Variant Authorities to translate!')
				for authorityKey, authority in pairs(variant['authorities']) do
					local trans = utilities.localize( authority, 'Authorities' )
					-- check if Localization returned something, if not set the original string
					if ( trans == '' ) then
						trans = authority
					end
					tRetVariants['requirements'][varKey]['authorities'][authorityKey] = {
						orig = authority,
						translated = trans
					}
				end
				mw.log('HonorUtils.translateHonorVariants: '..#tRetVariants['requirements'][varKey]['authorities']..' Requriement Variant Authorities were translated!')
			end
		end
		mw.log('HonorUtils.translateHonorVariants: '..#tRetVariants['requirements']..' Requriement Variants were translated!')
	end
	return tRetVariants
end

function getHonorVariants( variantType, src, srcIsHonor, variantNumber )
	local frame = mw.getCurrentFrame()
	local parentFrame = frame:getParent()
	mw.log('HonorUtils.getHonorVariants (frame): '..frame:getTitle())
	local variantSrcMode = 'dpl' -- it can be 'vardefine', 'parentFrame' or 'dpl' (default)
	if (variantType == nil or variantType == '') then
		variantType = 'requirement'
		mw.log('HonorUtils.getHonorVariants: No variant Type set, default to requirements!')
	end
	local cntOfVariantsArgString = 'cnt_'..variantType..'_variants'
	local cntOfVariants = tonumber(p.getHonorMetadata(src, cntOfVariantsArgString, srcIsHonor))
	if (cntOfVariants == nil or cntOfVariants == 0) then
		-- check if we are on the honor landing page, if so check the template's argument's
		if ( parentFrame ~= nil and
			 parentFrame:getTitle() == 'Template:HonorLanding' and
			 parentFrame.args[cntOfVariantsArgString] ~= nil and 
			 parentFrame.args[cntOfVariantsArgString] ~= '' 
			) then
			mw.log('HonorUtils.getHonorVariants: We variants data from parent Frame!')
			variantSrcMode = 'parentFrame'
			cntOfVariants = parentFrame.args[cntOfVariantsArgString]
		else
			mw.log('HonorUtils.getHonorVariants: We variants data from vardefine!')
			variantSrcMode = 'vardefine'
			cntOfVariants = utilities.getVar(cntOfVariantsArgString)
		end
	end
	if (cntOfVariants == nil or cntOfVariants == '' or cntOfVariants == 0) then
		mw.log('HonorUtils.getHonorVariants: There are no '..variantType..' variants!')
		return nil
	end
	mw.log('HonorUtils.getHonorVariants (cntOfVariants): '..cntOfVariants)
	local actVariant = 0
	local tVariantArguments = {}
	variantNumber = tonumber(variantNumber)
	if ( variantNumber ~= nil ) then
		-- only get the defined Variant
		if ( variantNumber <= cntOfVariants ) then
			tVariantArguments[1] = variantType..'_'..variantNumber
		else
			mw.log('HonorUtils.getHonorVariants: invalid variantNumber ('..variantNumber..')!')
			return nil
		end
	else
		-- get all variants
		for actVariant = 1, cntOfVariants, 1 do
			mw.log('HonorUtils.getHonorVariants (actVariant): '..actVariant)
			tVariantArguments[actVariant] = variantType .. '_' .. actVariant
		end
	end
	
	local tVariants = {}
	if ( variantSrcMode == 'vardefine' ) then
		for key, variantArg in pairs(tVariantArguments) do
			tVariants[key] = utilities.getVar(variantArg)
		end
	elseif ( variantSrcMode == 'parentFrame' ) then
		for key, variantArg in pairs(tVariantArguments) do
			tVariants[key] = parentFrame.args[variantArg]
		end
	else
		local strVariantArguments = mw.text.listToText(tVariantArguments, ':', ':')
		mw.log('HonorUtils.getHonorVariants (strVariantArguments): '..strVariantArguments)
		local strVariant = p.getHonorMetadata(src, strVariantArguments, srcIsHonor)
		strVariant = mw.ustring.gsub(strVariant,"[\n\r]", "")
		mw.log('HonorUtils.getHonorVariants (strVariant): '..strVariant)
		tVariants = mw.text.split(strVariant, '|', notUseLUAPattern)
	end
	mw.log('HonorUtils.getHonorVariants (#tVariants): '..#tVariants)
	return tVariants
end

function p.getHonorMetadata(src, metadata, srcIsHonor)
	local frame = mw.getCurrentFrame()
	local lPage = ''
	if (src ~= '' and src ~= nil) then
		if (srcIsHonor == true) then
			lPage = 'AY Honors/' .. src
		else
			lPage = src
		end
	end
	lPage = frame:expandTemplate{ title = 'GetHonorLandingPage', args = {page = lPage}}
	return frame:preprocess( '{{#dpl:|debug=0|title=' .. lPage .. '|include={HonorLanding}:' .. metadata ..'}}' )
end

return p