User:DarthPhallus/GGSTCharNavTable/doc

From Dustloop Wiki

local p = {}

function p.drawTierList(frame)

local wikitext = "

" -- initialize the wikitext with the container for the list
 local GAME = frame.args[1]:gsub("%s+", "") -- capture the target game from the first arg
 local character = "default"
 local numberOfTiers = tablelength(frame.args)
 local colors = {'b8ff89', 'fdff89', 'ffdf7f', 'ffbf7f', 'e98d87', 'ff7ff0', 'd17fff', '7fbfff', '7feeff', '7fffc3' } -- an array of pre-defined colors
 for index=2,numberOfTiers do
   local currentTier = trim(frame.args[index]) -- use the argument at the current index as current tier data
   local tierLabel = string.match(currentTier, '(.*);') -- capture tier label from all characters before first ';'
   currentTier = string.match(currentTier, ";(.*)") -- remove the tier label from the current tier data
   --Inject tier label
   if index == 2 then -- first tier should have a rounded top corner
wikitext = wikitext .. "
" .. tierLabel .. "
"
   elseif index == numberOfTiers then -- middle tiers are normal
wikitext = wikitext .. "
" .. tierLabel .. "
"
   else -- final tier has a roudned bottom corner
wikitext = wikitext .. "
" .. tierLabel .. "
"
   end
   
   -- open a new tier container
   if index ~= numberOfTiers then 
wikitext = wikitext .. "
"
   else -- final tier does not have an underline
wikitext = wikitext .. "
"
   end
   -- iterate over tokens in current tier, sperrated by ',' character
   for token in string.gmatch(currentTier, '([^,]+)') do
     character = token
     -- inject character label
     local characterLabel = frame:expandTemplate{ title = 'Character Label', args = { GAME, character, '32px' } }
wikitext = wikitext .. "
" .. characterLabel .. "
"
   end
 
   -- close the current tier container
wikitext = wikitext .. "
"
 end
 -- close the entire tier list
wikitext = wikitext .. "
"
 return wikitext

end

-- Return the size of a table by iterating over it and counting function tablelength(T)

 local count = 0
 for _ in pairs(T) do count = count + 1 end
 return count

end

function trim(s)

 return (string.gsub(s, "^%s*(.-)%s*$", "%1"))

end

return p

 
local p = {}

function p.drawTierList(frame)
  local wikitext = "<div class=\"tierList\">" -- initialize the wikitext with the container for the list
  local GAME = frame.args[1]:gsub("%s+", "") -- capture the target game from the first arg
  local character = "default"
  local numberOfTiers = tablelength(frame.args)
  local colors = {'b8ff89', 'fdff89', 'ffdf7f', 'ffbf7f', 'e98d87', 'ff7ff0', 'd17fff', '7fbfff', '7feeff', '7fffc3' } -- an array of pre-defined colors

  for index=2,numberOfTiers do
    local currentTier = trim(frame.args[index]) -- use the argument at the current index as current tier data
    local tierLabel = string.match(currentTier, '(.*);') -- capture tier label from all characters before first ';'
    currentTier = string.match(currentTier, ";(.*)") -- remove the tier label from the current tier data

    --Inject tier label
    if index == 2 then -- first tier should have a rounded top corner
      wikitext = wikitext .. "<div class=\"tierHeader\" style=\"background-color: #" .. colors[1] .. "; border-top-left-radius: 4px;\">" .. tierLabel .. "</div>"
    elseif index == numberOfTiers then -- middle tiers are normal
      wikitext = wikitext .. "<div class=\"tierHeader\" style=\"background-color: #" .. colors[index-1] .. "; border-bottom-left-radius: 4px;\">" .. tierLabel .. "</div>"
    else -- final tier has a roudned bottom corner
      wikitext = wikitext .. "<div class=\"tierHeader\" style=\"background-color: #" .. colors[index-1] .. ";\">" .. tierLabel .. "</div>"
    end
    
    -- open a new tier container
    if index ~= numberOfTiers then 
      wikitext = wikitext .. "<div class=\"tierGroup tierUnderline\">"
    else -- final tier does not have an underline
      wikitext = wikitext .. "<div class=\"tierGroup\">"
    end

    -- iterate over tokens in current tier, sperrated by ',' character
    for token in string.gmatch(currentTier, '([^,]+)') do
      character = token
      -- inject character label
      local characterLabel = frame:expandTemplate{ title = 'Character Label', args = { GAME, character, '32px' } }
      wikitext = wikitext .. "<div>" .. characterLabel .. "</div>"
    end
  
    -- close the current tier container
    wikitext = wikitext .. "</div>"

  end

  -- close the entire tier list
  wikitext = wikitext .. "</div>"

  return wikitext
end

-- Return the size of a table by iterating over it and counting
function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

function trim(s)
  return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end

return p

Understanding This Lua Script:

  • Index starts at 1 not 0.


  • Line 1 - Generic Script setup?
  • Line 3 - Creating a function called drawTierList, frame is the arguments. can be multiple. Returns a big wikitext chunk which contains everything actually being put on the page.
  • Line 4 - Setting up the wikitext that is getting returned when drawTierList is called. The div is the first chunk of the wikitext, more gets appended.
  • Line 5 - finding the name of the game by pulling the first argument from args. gsub is being used to delete all whitespace.
  • Line 6 - Init and declaration for character variable used latter to create character labels.
  • Line 7 - finding the total number of tiers, pulled from the number of arguments passed into drawTierList. Is actually 1+ the number of tiers but since Lua indexes at 1 this just works?
  • Line 8 - Just colors. Probably not useful for my purposes.


  • 10 - Setting up a loop, starts at 2 which is the first (top) tier. Iterates to the last (bottom) tier which is equal to the number of arguments.
  • 11 - Calls a trim function. Not 100% what it does? just clears out all extra characters besides the tier and characters maybe? I believe this is just the cleaned argument at each tier level.
  • 13 - Uses String.Match to return the matched text, in this instance it's looking for the tier label which is before the characters from "currentTier".
  • 14 - Using string.match again to set currentTier equal to itself with the tierlabel removed.
  • 17-23 : First checks index to find if on the first tier, if so we append to the wikitext. The append is some HTML / CSS needed to construct the tier minus characters. There's a condition for the middle and final tier, which have slightly differing wikitext to append.


  • 26-30: Appending wikitext, exactly what depends on if it's the final tier or not. The div appended is for the tiergroup as in group of characters?


  • 33-38: For loop that iterates through characters in the tier. Pattern matching is beyond me but I think it's separating them by commas? expandTemplate is the equivalent of a mediawiki template call. So this is calling the "Character Label" template and passing it the game, character, and size of the character icon as arguments. This template call is saved as characterLabel and appended to the wikitext.
  • Rest of the lines in the main fuction are just closing the loops and appending closing div tags.

I can probably reuse a large chunk of this for my idea, the character-nav-toc-whatever I want to construct is very similar, just needs to be formatted differently and the