Genshin Impact Вики
Genshin Impact Вики
1642
страницы

Для документации этого модуля может быть создана страница Модуль:Рецепт/doc

local p = {}
--Arguments for template
local param = {
  sCharArg="Персонаж",
  sTypeArg="Тип",
  sSortArg="Сорт",
  sSortDelim=",", --Needs to be pattern
  sTimeArg="Время",
  sYieldArg="Результат"
}
function padLeft(str,amt)
	return string.rep('0',amt - str:len()) .. str
end
function addRecipe(sAmt,sName)
  local cardNode = require('Модуль:Card')._main({
    ['Название']=sName,
    ['Текст']=sAmt,
    ['Моб']='bulleted'
  })
  cardNode:wikitext("[[Категория:Используется ",sName,"|",padLeft(sAmt:gsub("%D",""),10),"]]")
  return cardNode
end

function p.main(frame)
  local args = require('Модуль:Аргументы').getArgs(frame, {
    parentFirst = true,
    wrapper = { 'Шаблон:Рецепт' }
  })
  return p._main(args,frame)
end
function p._main(args,frame)
  local output = mw.html.create('div')
    :addClass('')
  if type(args[param.sTypeArg]) ~= "string" then
    output:tag('span'):css({
      color='red',
      ['font-weight']='bold'
    }):wikitext('Ошибка\: Неверно указан тип рецепта.')
  else
    local tArgsProcessed = {}
    local header = output:tag('div'):addClass('new_genshin_recipe_header')

    --Type Parse
    local sType = args[param.sTypeArg]
    header:tag('span'):addClass('new_genshin_recipe_header_main')
      -- Mobile Icon
      :tag('span'):addClass('mobileHide'):wikitext("[[Файл:Иконка_"..sType.."_(мини).png|15x15px|link="..sType.."|alt=]] "):done()
      -- Desktop Icon
      :tag('span'):addClass('hidden'):wikitext("[[Файл:Иконка_"..sType.."_(мини).png|37x37px|link="..sType.."|alt=]]"):done()
      -- Text
      :tag('span'):addClass('new_genshin_recipe_header_text'):wikitext('[['.. sType .. "]][[Категория:"..sType.."]]"):done()

    --Time Parse
    if type(args[param.sTimeArg]) == "string" then
      local tTime = {}
      local key = false
      local plural = false
      for a,h,b,m,c,s in mw.ustring.gmatch(args[param.sTimeArg],"(%d+)(ч?)(%d*)(м?)(%d*)(с?)") do
          table.insert(tTime,a) --insert first value definitly
          if h=="ч" then
              table.insert(tTime,"час.")
              key = true
          end
          if b~="" then
              table.insert(tTime,b)
          end
          if m=="м" then
              table.insert(tTime,"мин.")
              key = true
          end
          if c~="" then
              table.insert(tTime,c)
          end
          if s=="с" then
              table.insert(tTime,"сек.")
              key = true
          end
      end
      if not(key) then
          table.insert(tTime,"мин.")
      end
      local sTime = ""
      for _,each in ipairs(tTime) do
          sTime = sTime .. each .. " "
      end
      header:tag('span'):addClass('new_genshin_recipe_header_sub')
        :tag('span'):addClass('mobileHide'):wikitext(' в течение '):done()
        :tag('span'):addClass('hidden'):wikitext('[[Файл:Иконка часов.png|24x24px]]'):done()
        :tag('span'):addClass('new_genshin_recipe_header_text'):wikitext(sTime):done()
    end
    --Character Parse
    if type(args[param.sCharArg]) == "string" then
      local sCharName = args[param.sCharArg]
      header:tag('span'):addClass('new_genshin_recipe_header_sub')
        :tag('span'):addClass('mobileHide'):wikitext(' при помощи '):done()
        :tag('span'):addClass('hidden'):wikitext('[[Файл:Персонаж '..sCharName..' иконка.png|24x24px|link='..sCharName..']]'):done()
        :tag('span'):addClass('new_genshin_recipe_header_text'):wikitext('[['..sCharName..']]'):done()      
    end

    --Process Sort Paremeter (Split by Delimiter)
    for sKey in string.gmatch(args[param.sSortArg]or"", "([^"..param.sSortDelim.."]+)") do
      if type(args[sKey]) ~= "nil" then
        output:node(addRecipe(args[sKey],sKey))
        tArgsProcessed[sKey] = true
      end
    end

    --Process Rest of Unrestricted Parameters
    for sKey,sVal in pairs(args) do
      --Check if restricted parameter
      local restricted = false
      for _,keyParam in pairs(param) do
        if keyParam == sKey then
          restricted = true
        end
      end
      --If not proccessed, and not a restricted parameter
      if tArgsProcessed[sKey] ~= true and not(restricted) then 
        output:node(addRecipe(sVal,sKey))
      end
    end

    --Yield Parse
    local sYield = args[param.sYieldArg] or "1"
    local pageTitle = mw.title.getCurrentTitle().text
    local yieldCard = require('Модуль:Card')._main({
      ['Название']=pageTitle,
      ['Текст']=sYield
    })
    output
      :tag('div'):addClass('hidden'):addClass('hidden-icon')
        :wikitext("[[Файл:Иконка_"..sType.."_Изготовление.png|35x35px|link="..sType.."|alt=]]"):done()
      :tag('div'):addClass('hidden')
        :css("display", "inline-block")
        :node(yieldCard)
    local itemText = frame:expandTemplate{ title = 'Item', args = {
      pageTitle,
      '15',
      x=sYield,
      nobr=1
    }}
    output:tag('span'):addClass('mobileHide'):wikitext('Результат'..itemText)
  end
  return output
end

return p