Module:CraftingTable
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">+</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>[%s]</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'] .. ' ' .. (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