Module:Sandbox/Fewfre

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 nameNote = args['nameNote'] local effect = args['effect'] local varnames = args['varnames'] local unlock = args['unlock'] local brews = args['brews'] return p._potionPageRow(name, nameNote, effect, varnames, unlock, brews) end function p._potionPageRow(name, nameNote, 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 numDataColumns = basePotion and pd.maxLevel+1 or pd.maxLevel; local levelColSpan = levelsColumnLcm / numDataColumns -- Basic Row Data local row1 = mw.html.create('tr') local temp = row1: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' } :tag('div') :wikitext( link.potionName{ name.." I Potion", format=true, bold=true } ) :wikitext( nameNote ) :done if unlock then -- note: parent div hasn't been `done` yet, so `temp` here is adding it to the parent div, not the row or cell - basically this just acts as a continuation temp:tag('span'):css{ flex=1, ['text-align']='right' } :tag('b'):wikitext('Unlock: '):done :tag('span'):wikitext( unlock ):css{ ['font-weight']='normal' }:done :done end temp: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') local dataCell = row1:tag('td'):attr{ rowspan=3 }:css{ padding='0 !important' }:css(BRDR_BTM) local dataTable = dataCell:tag('table'):addClass('wikitable'):css{ margin=0, border=0, width='100%', height='100%' } local dataRow1 = dataTable:tag('tr'):addClass('centertext') local dataRow2 = dataTable:tag('tr'):addClass('centertext') local dataRow3 = dataTable:tag('tr'):addClass('centertext') if basePotion then dataRow1:tag('th'):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 dataRow2:tag('td'):wikitext( slot{ basePotion } ):attr{ rowspan=2 } if basePotionUsedForLevel then dataRow2:tag('td'):wikitext( slot{ pd.ingredients[1] } ):css{ ['border-right']='0 !important' } dataRow2:tag('td'):wikitext( '(level based on level of base potion)' ):attr{ colspan=(pd.maxLevel-1) }:css{ ['border-left']='0 !important' } -- dataRow2:tag('td'):wikitext( slot{ pd.ingredients[1] } ):attr{ colspan=levelColSpan }:css{ ['border-right']=0 } -- -- this dumb ****ty workaround is because browsers have a max `colspan` of 1000 -- -- so this large colspan is split into two and styled to look like one -- local columnsLeft = pd.maxLevel-1 -- dataRow2:tag('td'):wikitext( '(level based on' ):attr{ colspan=math.ceil(columnsLeft/2)*levelColSpan }:css{ ['text-align']='right', ['border-right']=0, ['border-left']=0, ['padding-right']= '2px !important', ['transform']= 'translateX(-5px)' }			-- dataRow2:tag('td'):wikitext( 'level of base potion)' ):attr{ colspan=math.floor(columnsLeft/2)*levelColSpan }:css{ ['text-align']='left', ['border-left']=0, ['padding-left']= '2px !important', ['transform']= 'translateX(-5px)' } end end -- Add level data to rows local lastLevelWithItem = 0 for i = 1, pd.maxLevel do		dataRow1:tag('th'):wikitext( LEVEL_ROMANS[i] ):css{ width=(100/numDataColumns)..'%' } -- 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 = dataRow2:tag('td'):wikitext( ingredient or '?' ) if singleDataRow then cell:attr{ rowspan=2 } 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 dataRow2 or dataRow3):tag('td') :wikitext( table.concat(levelVars, ' ') )				:css{ ['line-height']=1.3 } end if not pd.ingredients and not pd.vars then dataRow2:tag('td') :wikitext( string.blankCell ) :attr{ rowspan=2 } end end return table.concat{ tostring(row1), tostring(row2), tostring(row3) } end

return p