Module:Potion/PotionPageRow

local getArgs = require('Module:Arguments').getArgs local loader = require('Module:Loader') local string, table, yesno, uitext, inventoryslot, link = loader.require('String', 'Table', 'Yesno', 'UIText', 'Inventory slot', 'Link') local potionData, potionAliases = loader.loadData('Potion/Data', 'Potion/Aliases')

local p = {} local slot = inventoryslot.slot local levelsColumnLcm = 2520 -- smallest number evenly divisible by all number before / including 10 local LEVEL_ROMANS = { 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' } local potionPageRowLevelBoosters = { string.wrapHtml('+', 'span', { style={ opacity=0.5 } }), string.wrapHtml('+', 'span', { style={ opacity=0.5 } }), string.wrapHtml('+', 'span', { style={ opacity=0.5 } }), }

--- -- Generates multiple rows needed for a single potion on Potions page -- Invoked by Template:PotionPageRow --- function p.potionPageRow(frame) local args = getArgs(frame) local name = args['name'] local effect = args['effect'] local varnames = args['varnames'] local unlock = args['unlock'] local brews = args['brews'] return p._potionPageRow(name, effect, varnames, unlock, brews) end function p._potionPageRow(name, effect, varnames, unlock, brews) name = potionAliases[name:lower] local pd = potionData[name] if not pd then return string._error('Invalid potion name \"' .. name .. '\"') end local basePotion = pd.ingredients and pd.ingredients.basePotion local basePotionUsedForLevel = pd.ingredients and pd.ingredients.basePotionUsedForLevel local t = {} local BRDR_MID = { ['border-right-width']='3px' } local BRDR_BTM = { ['border-bottom-width']='5px' } local levelColSpan = levelsColumnLcm / (basePotion and pd.maxLevel+1 or pd.maxLevel) -- Basic Row Data local row1 = mw.html.create('tr'):attr{ id=name }:addClass('article-row-main') -- :tag('th'):attr{ rowspan=3 }:css{ ['max-width']=0 }:done :tag('th'):attr{ colspan=4 }:css{ ['text-align']='left !important' }:css(BRDR_MID) :tag('div'):css{ display='flex', gap='16px' } :wikitext( link.potionName{ name.." I Potion", format=true, bold=true } ) :tag('span'):css{ flex=1, ['text-align']='right' } :tag('b'):wikitext('Unlock: '):done :tag('span'):wikitext( unlock or 'Initially Available' ):css{ ['font-weight']='normal' }:done :done :done :done local row2 = mw.html.create('tr'):addClass('centertext'):addClass('article-row-bound'):css{ height='100%' }--100% height needed for cell contents to use 100% height :tag('th'):wikitext( slot{ name.." I Potion" } ):attr{ rowspan=2 }:css(BRDR_BTM):done :tag('td'):attr{ colspan=3, rowspan=2 }:css{ ['text-align']='left' }:css(BRDR_MID):css(BRDR_BTM):css{ height='100%' }--100% height needed for cell contents to use 100% height :tag('div'):css{ display='flex', ['flex-direction']='column' }:css{ height='100%' }--100% height needed for cell contents to use 100% height :tag('div'):css{ flex=1 } -- this flex pushes the varnames text down (if there is any) :wikitext(effect or 'Unknown effect') :wikitext(						brews and string.wrapHtml(table.concat{ brews and string.wrapHtml('Compatible Brews: \n'..brews, 'li') or '', }, 'ul') or ''					) :done :wikitext( varnames and string.wrapHtml(table.concat{ '(in ', varnames, ')' }, 'div', { style={ ['text-align']='right', ['font-style']='italic' } }) or '' ) :done :done local row3 = mw.html.create('tr'):addClass('centertext'):addClass('article-row-bound') if basePotion then row1:tag('th'):attr{ colspan=levelColSpan }:css{ ['line-height']=1.3 } :tag('abbr'):wikitext('Base Potion'):attr{ title='Some potions require a non-typical base to be used instead of an Awkward Potion' }:done row2:tag('td'):wikitext( slot{ basePotion } ):attr{ colspan=levelColSpan, rowspan=2 }:css(BRDR_BTM) if basePotionUsedForLevel then row2:tag('td'):wikitext( slot{ pd.ingredients[1] } ):attr{ colspan=levelColSpan }:css{ ['border-right']=0 } -- this dumb **** is because browsers have a max `colspan` of 1000 local columnsLeft = pd.maxLevel-1 row2:tag('td'):wikitext( '(level based on level' ):attr{ colspan=math.ceil(columnsLeft/2)*levelColSpan }:css{ ['text-align']='right', ['border-right']=0, ['border-left']=0, ['padding-right']= '2px !important', ['transform']= 'translateX(15px)' }			row2:tag('td'):wikitext( 'of base potion)' ):attr{ colspan=math.floor(columnsLeft/2)*levelColSpan }:css{ ['text-align']='left', ['border-left']=0, ['padding-left']= '2px !important', ['transform']= 'translateX(15px)' } end end -- Add level data to rows local lastLevelWithItem = 0 for i = 1, pd.maxLevel do		row1:tag('th'):wikitext( LEVEL_ROMANS[i] ):attr{ colspan=levelColSpan } -- potions can have ingredients, level-specific stats, or both! local singleDataRow = not (pd.ingredients and pd.vars) -- Don't draw ingredient column if base potion used for level, as we already added a colspan for here previously if pd.ingredients and not basePotionUsedForLevel then local ingredient = nil if pd.ingredients[i] then ingredient = slot{ pd.ingredients[i] } lastLevelWithItem = i			elseif pd.ingredients[i..'text'] then ingredient = pd.ingredients[i..'text'] lastLevelWithItem = i			else ingredient = potionPageRowLevelBoosters[i-lastLevelWithItem] end local cell = row2:tag('td'):wikitext( ingredient or '?' ):attr{ colspan=levelColSpan } if singleDataRow then cell:attr{ rowspan=2 }:css(BRDR_BTM) end end -- If ingredients exist, show them; if not, then only list the stats if pd.vars then local levelVars = {} for j, varList in pairs(pd.vars) do				levelVars[#levelVars+1] = varList[i] end (singleDataRow and row2 or row3):tag('td') :wikitext( table.concat(levelVars, ' ') )				:attr{ colspan=levelColSpan } :css(BRDR_BTM):css{ ['line-height']=1.3 } end end return table.concat{ tostring(row1), tostring(row2), tostring(row3) } end

return p