Module:Item

From Ylvapedia

このモジュールはTemplate:ItemTemplate:アイテムに使用されています。


local utils = require('Module:Utils')
local p = {}

--valueをname,mat,skin,varietyに分離
function p.getItem(value)
  local name = value
  local mat
  local skin
  local variety
  local element
  if string.find(name, '@') then
    name, mat = name:match("([^@]+)@([^@]+)")
  end
  if string.find(name, ':') then
    name, skin = name:match("([^:]+):([^:]+)")
  end
  if string.find(name, '_') then
    name, variety = name:match("([^_]+)_([^_]+)")
  end
  if string.find(name, '%+') then
    name, element = name:match("([^%+]+)%+([^%+]+)")
  end
  return name, mat, skin, variety, element
end

function p.generateItem(itemArgs)
  local lang = itemArgs['lang'] or 'JA'
  local grid = utils.nilCheck(itemArgs['grid'])
  local itemName = utils.nilCheck(itemArgs['name'])
  local ext = utils.getDefaultIfEmpty(itemArgs['ext'], 'png')
  local size = utils.getDefaultIfEmpty(itemArgs['size'], '32x32px')
  local itemCount = utils.nilCheck(itemArgs['num'])
  local image = utils.nilCheck(itemArgs['image'])
  local link = utils.nilCheck(itemArgs['link'])
  local variety = utils.nilCheck(itemArgs['variety'])
  local element = utils.nilCheck(itemArgs['element'])
  local skin = utils.nilCheck(itemArgs['skin'])
  local itemMat = utils.nilCheck(itemArgs['itemMat'])
  local id = utils.nilCheck(itemArgs['id'])
  local icon = utils.nilCheck(itemArgs['icon'])
  local ruby = utils.nilCheck(itemArgs['ruby'])

  local data = mw.loadData('Module:Item/IDAliases')
  local data4 = mw.loadData('Module:Item/Materials')
  local data2, data3
  local foundId
  
  itemName = mw.text.trim(itemName)

  if string.find(itemName, '@') then
    --mw.log('log: ',itemName,' マテリアル設定が重複しています。アイテム名に含まれるほうを優先します。')
    itemName, itemMat = itemName:match('([^@]+)@([^@]+)')
  end

  if string.find(itemName, ':') then
    itemName, skin = itemName:match("([^:]+):([^:]+)")
  end

  if string.find(itemName, '_') then
    --mw.log('log:  '..itemName.." アイテム名にヴァリエーション情報の'_'が含まれています。")
    if variety then
      itemName, variety = itemName:match('([^_]+)_([^_]+)')
    else
      --mw.log('log:  '..itemName.." ヴァリエーション設定が重複しています。アイテム名の処理をします。")
      itemName = string.gsub(itemName, '_', ' ')
    end
  end

  if not image then
    if not id then
      local imageNameParts = { 'Elin Item Sprite ' }

      if lang == 'EN' then
        table.insert(imageNameParts, itemName)
      elseif lang == 'JA' then
        data2 = mw.loadData('Module:Item/JaAliases')
        data3 = mw.loadData('Module:Item/JaAliases2')
      --elseif lang == 'add lang' then
      end

      if not variety and lang ~= 'EN' then
        table.insert(imageNameParts, data[data2[itemName]] or data3[itemName])
      elseif variety and lang ~= 'EN' then
        table.insert(imageNameParts, data[data2[itemName..variety]] or data3[itemName..variety])
      elseif variety then
        table.insert(imageNameParts, ' '..variety)
      end

      if skin then
        table.insert(imageNameParts, ' skin'..skin)
      end

      if itemMat then
        for _, matData in pairs(data4) do
          if lang == 'EN' and matData and matData.name == itemMat or
             lang == 'JA' and matData and matData.name_JP == itemMat then
            foundId = matData.id
            break
          end
        end
      end

      if foundId then
        table.insert(imageNameParts, ' '..foundId)
      end

      table.insert(imageNameParts, '.'..ext)

      image = table.concat(imageNameParts)
      if image == 'Elin Item Sprite .png' then
        image = 'clear.png'
      end
    else
      image = data[id] and 'Elin Item Sprite '..data[id]..'.'..ext or 'clear.png'
    end
  else
    if not string.find(image, '%.') then
      image = image..'.'..ext
    end
  end

  local wt = mw.html.create('span'):addClass('item')
  if utils.checkOnOff(grid) then
    wt:cssText('display: inline-grid; text-align: center;')
  elseif string.len(itemName) >= 36 then
    wt:cssText('font-size: smaller; white-space: pre-wrap; letter-spacing: -0.1em;')
  else
    wt:cssText('white-space: nowrap;')
  end

  local elementString = element and '≪'..element..'≫' or ''
  local matString = itemMat and ' '..itemMat or ''
  local varietyString = variety and ' '..variety or ''
  local alt = itemName..varietyString..matString
  local linkPage = 'Elin:'..itemName..varietyString
  local linkString

  if skin and link == 'skin' then
    linkString = '[[Elin:'..itemName..' skin'..skin..'|'..itemName..matString..elementString..']]'
  elseif link and link == 'no' then
    linkString = itemName..matString
    linkPage = ''
  elseif link then
    if string.find(link, 'Elin:') then
      linkString = '[['..link..'|'..itemName..matString..elementString..']]'
    else
      linkString = '[[Elin:'..link..'|'..itemName..matString..elementString..']]'
    end
  else
    linkString = '[[Elin:'..itemName..varietyString..'|'..itemName..matString..elementString..']]'
  end

  if icon and icon == 'no' then
  else
    wt:wikitext(string.format('[[File:%s|%s|link=%s|alt=%s|class=itemimg]]', image, size, linkPage, alt))
  end
  wt:wikitext(linkString)
  if ruby then
  wt:wikitext(string.format('<small><sup>&lbrack;%s&rbrack;</sup></small>', ruby))
  end

  if itemCount then
    wt:wikitext(string.format('<span class="itemCount">%s</span>', itemCount))
  end

  return tostring(wt)
end

function p.itemparameters(f)
  local args = f:getParent().args
  local itemData = {
    lang = utils.getDefaultIfEmpty(f.args['lang'], 'JA'),
    grid = args['grid'],
    name = args[1] or f.args[1],
    ext = utils.getDefaultIfEmpty(args['ext'], 'png'),
    size = utils.getDefaultIfEmpty(args['size'], '32x32px'),
    num = utils.nilCheck(args['x'] or args[2]),
    image = utils.nilCheck(args['img']),
    link = utils.nilCheck(args['link']),
    variety = utils.nilCheck(args['v']),
    element = utils.nilCheck(args['e']),
    skin = utils.nilCheck(args['s']),
    itemMat = utils.nilCheck(args['itemMat']),
    id = utils.nilCheck(args['id']),
    icon = utils.nilCheck(args['icon']),
    ruby = utils.nilCheck(args['ruby'])
  }

  return p.generateItem(itemData)
end

return p