Module:CraftingTable

From Ylvapedia

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

local utils = require('Module:Utils')
local items = require('Module:Item')
local title = mw.title.getCurrentTitle()
local namespaceName = title.nsText
local p = {}

local function getArg(args, i18n, lang, key, suffix)
  return utils.nilCheck(args[i18n[lang][key] .. suffix])
end

local function splitAndSet(f, key, value, tableNum)
  local suffix = (tableNum > 1 and tostring(tableNum) or '')
  if namespaceName == 'Elin' then
    utils.setPropertyData(key .. suffix,value)
  end
  return value and mw.text.split(value, '%s*,%s*') or {}
end

function p.crafttable(f)
  local args = f:getParent().args
  local lang = f.args[1] or 'JA'
  local i18n = mw.loadData('Module:CraftingTable/i18n')
  local Craftingskill = getArg(args, i18n, lang, 'CraftSkill', '')
  local CraftingskillLv = getArg(args, i18n, lang, 'CraftSkillLv', '')
  local CraftBonus = getArg(args, i18n, lang, 'CraftBonus', '')
  local ObtainRecipe = getArg(args, i18n, lang, 'ObtainRecipe', '')
  local ElementNote = getArg(args, i18n, lang, 'ElementNote', '')
  local Note = getArg(args, i18n, lang, 'Note', '')
  local clear = args['clear']
  local ExcludedItems = getArg(args, i18n, lang, 'ExcludedItems', '')
  if not ExcludedItems and namespaceName == 'Elin' then
    utils.setPropertyData('CraftingExcludedItems',ExcludedItems)
  end

  local Recipe = {}
  for i = 1, 3 do
    local suffix = (i > 1 and tostring(i) or '')
    Recipe[i] = {
      CraftingStation = getArg(args, i18n, lang, 'CraftingStation', suffix),
      Ingredient = getArg(args, i18n, lang, 'Ingredient', suffix),
      IngredientNum = getArg(args, i18n, lang, 'IngredientNum', suffix),
      IngredientExtra = getArg(args, i18n, lang, 'IngredientExtra', suffix),
      CraftResult = getArg(args, i18n, lang, 'TitleResult', suffix),
      CraftResultRuby = getArg(args, i18n, lang, 'TitleResultRuby', suffix),
    }
  end

  local CSCategory = ''
  local CraftingStationResults = {}
  local IngredientResults = {}
  local CraftingResults = {}
  local CraftingResultStrings = {}
  local CraftResultRubyStrings = {}

  for tableNum = 1, 3, 1 do
    local recipe = Recipe[tableNum]
    CraftingStationResults[tableNum] = {}
    IngredientResults[tableNum] = {}
    CraftingResults[tableNum] = {}
    CraftingResultStrings[tableNum] = {}
    CraftResultRubyStrings[tableNum] = {}
    --====== CraftingStation ======
    local stations = splitAndSet(f, 'CraftingStation', recipe.CraftingStation, tableNum)
    if #stations > 0 then
      local result = {}
      for i, station in ipairs(stations) do
        if i > 1 then
          table.insert(result, '<br />')
        end
        if utils.nilCheck(station) then
          table.insert(result, items.generateItem({ lang = lang, name = station }))
          if namespaceName == 'Elin' then
            CSCategory = CSCategory .. '[[Category:Elin ' .. station .. ']]'
          end
        else
          table.insert(result, i18n[lang]['BlankValue'])
        end
      end
      CraftingStationResults[tableNum] = tostring(table.concat(result))
    elseif tableNum == 1 then
      local result = {}
      table.insert(result, i18n[lang]['ErrorCraftingStation'])
      CraftingStationResults[1] = tostring(table.concat(result))
    end
    --====== Ingredient ======
    local ingredients = splitAndSet(f, 'Ingredient', recipe.Ingredient, tableNum)
    local ingredientNums = recipe.IngredientNum and splitAndSet(f, 'IngredientNum', recipe.IngredientNum, tableNum) or {}
    local ingredientExtras = recipe.IngredientExtra and splitAndSet(f, 'IngredientExtra', recipe.IngredientExtra, tableNum) or {}
    if #ingredients > 0 then
      local result = {}
      for i, item in ipairs(ingredients) do
        if i > 1 then
          table.insert(result, '<div class="plus or-separator">&plus;</div>')
        end
        if not utils.nilCheck(item) then
          table.insert(result, i18n[lang]['BlankValue'])
        else
          if string.find(item, '/') then
            local z = mw.text.split(item, '%s*/%s*') or {}
            local z2 = ingredientNums[i] and mw.text.split(ingredientNums[i], '%s*/%s*') or {}
            local z3 = ingredientExtras[i] and mw.text.split(ingredientExtras[i], '%s*/%s*') or {}
            for i2, item2 in ipairs(z) do
              local itemName = item2
              local itemNum = z2[i2] or 1
              local itemExt = z3[i2]
              local itemMat
              local itemSkin
              local itemVar
              local itemEle
              if i2 > 1 then
                table.insert(result, '<div class="or-separator">' .. i18n[lang]['Or'] .. '</div>')
              end
              if namespaceName == 'Elin' then
                utils.setPropertyData('IngredientAll',itemName)
              end
              itemName, itemMat, itemSkin, itemVar, itemEle = items.getItem(itemName)
              table.insert(result, items.generateItem({
                lang = lang,
                name = itemName,
                num = itemNum,
                variety = itemVar,
                itemMat = itemMat,
                skin = itemSkin,
                element = itemEle
              }))
              if itemExt == i18n[lang]['TitleExtra'] then
                table.insert(result, i18n[lang]['TextExtra'])
              elseif itemExt == i18n[lang]['TitleGourmet'] then
                table.insert(result, i18n[lang]['TextGourmet'])
              end
            end
          else
            local itemName = item
            local itemMat
            local itemSkin
            local itemVar
            local itemEle
            itemName, itemMat, itemSkin, itemVar, itemEle = items.getItem(itemName)
            table.insert(result, items.generateItem({
              lang = lang,
              name = itemName or item,
              num = ingredientNums[i] or nil,
              variety = itemVar or nil,
              itemMat = itemMat,
              skin = itemSkin,
              element = itemEle
            }))
            if namespaceName == 'Elin' then
              utils.setPropertyData('IngredientAll',item)
            end
          end
          if ingredientExtras[i] == i18n[lang]['TitleExtra'] then
            table.insert(result, i18n[lang]['TextExtra'])
          elseif ingredientExtras[i] == i18n[lang]['TitleGourmet'] then
            table.insert(result, i18n[lang]['TextGourmet'])
          end
        end
      end
      IngredientResults[tableNum] = tostring(table.concat(result))
    elseif tableNum == 1 then
      local result = {}
      table.insert(result, i18n[lang]['ErrorIngredient'])
      IngredientResults[1] = tostring(table.concat(result))
    end
    --====== CraftResult ======
    local results = splitAndSet(f, 'CraftingResult', recipe.CraftResult, tableNum)
    if #results > 0 then
      local result = {}
      for i, item in ipairs(results) do
        if i > 1 then
          table.insert(CraftingResults[tableNum], '<div class="or-separator">' .. i18n[lang]['Or'] .. '</div>')
        end
        local itemName = item
        local itemNum = 1
        local itemMat
        local itemSkin
        local itemVar
        local itemEle
        if string.find(itemName, '/') then
          itemName, itemNum = itemName:match("([^/]+)/([^/]+)")
        end
        itemName, itemMat, itemSkin, itemVar, itemEle = items.getItem(itemName)
        table.insert(CraftingResults[tableNum], items.generateItem({
          lang = lang,
          name = itemName,
          num = itemNum,
          variety = itemVar,
          itemMat = itemMat,
          skin = itemSkin,
          element = itemEle
        }))
      end
      CraftingResultStrings[tableNum] = tostring(table.concat(CraftingResults[tableNum]))
    end
    
    local results = recipe.CraftResultRuby
    if results then
      CraftResultRubyStrings[tableNum] = string.format('<small><sup>&lbrack;%s&rbrack;</sup></small>', recipe.CraftResultRuby)
    else
      CraftResultRubyStrings[tableNum] = {}
    end
  end
  --表示
  local html = mw.html.create('p')
  local div = html:tag('div'):addClass('CraftingTable'):cssText('display: ruby;')
  local table = div:tag('table'):addClass('wikitable')
  if Craftingskill or CraftingskillLv then
    local Skills = (Craftingskill or '?') .. i18n[lang]['TitleSkill'] .. '&nbsp;' .. (CraftingskillLv and 'Lv.' .. CraftingskillLv or 'Lv.?')
    table:tag('tr'):tag('th'):attr('colspan', #CraftingResultStrings > 0 and 3 or 2):wikitext(Skills)
    if Craftingskill and namespaceName == 'Elin' then
      utils.setPropertyData('CraftingSkill',Craftingskill)
    end
    if CraftingskillLv and namespaceName == 'Elin' then
      utils.setPropertyData('CraftingSkillLv',CraftingskillLv)
    end
  end
  --1~3の繰り返し表示
  for tableNum = 1, 3, 1 do
    if #CraftingStationResults[tableNum] > 0 or #IngredientResults[tableNum] > 0 or #CraftingResultStrings[tableNum] > 0 then
      if tableNum > 1 then
        table = div:tag('table'):addClass('wikitable'):cssText('margin-left:1em;')
      end
      local headerRow = table:tag('tr')
      headerRow:tag('th'):wikitext(i18n[lang]['TitleCraftingStation'])
      headerRow:tag('th'):wikitext(i18n[lang]['TitleIngredient'])
      if #CraftingResultStrings[tableNum] > 0 then
        headerRow:tag('th'):wikitext(i18n[lang]['TitleResult'])
      end
      local dataRow = table:tag('tr')
      dataRow:tag('td'):wikitext(CraftingStationResults[tableNum])
      dataRow:tag('td'):cssText('text-align: center;'):wikitext(IngredientResults[tableNum])
      local value = ''
      if #CraftResultRubyStrings[tableNum] > 0 then
        value = CraftResultRubyStrings[tableNum]
      end
      if #CraftingResultStrings[tableNum] > 0 then
        dataRow:tag('td'):cssText('text-align: center;'):wikitext(CraftingResultStrings[tableNum]..value)
      end
    end
  end

  if utils.nilCheck(CraftBonus) then
    html:tag('li'):wikitext('<b>' .. i18n[lang]['TitleCraftBonus'] .. '</b> : ' .. CraftBonus):done()
    if namespaceName == 'Elin' then
      utils.setPropertyData('CraftBonus',CraftBonus)
    end
  end
  if utils.nilCheck(ElementNote) then
    html:tag('li'):wikitext('<b>' .. i18n[lang]['ElementNote'] .. '</b> : ' .. ElementNote):done()
      utils.setPropertyData('ElementNote',ElementNote)
  end
  if utils.nilCheck(ObtainRecipe) then
    html:tag('li'):wikitext('<b>' .. i18n[lang]['TitleObtainRecipe'] .. '</b> : ' .. ObtainRecipe):done()
    if namespaceName == 'Elin' then
      utils.setPropertyData('ObtainRecipe',ObtainRecipe)
    end
  end
  if utils.nilCheck(Note) then
    html:tag('li'):wikitext('<b>' .. i18n[lang]['Note'] .. '</b> : ' .. Note):done()
  end

  if namespaceName == 'Elin' then
    html:wikitext(i18n[lang]['Category'])
    if utils.nilCheck(CSCategory) then
      html:wikitext(CSCategory)
    end
  end
  return tostring(html)
end

return p