Module:Recipe: Difference between revisions
No edit summary |
No edit summary |
||
| Line 8: | Line 8: | ||
sTypeArg = 'type', | sTypeArg = 'type', | ||
sSortArg = 'sort', | sSortArg = 'sort', | ||
sSortDelim = ';', | sSortDelim = ';', | ||
sSortDelim2 = '¤', | sSortDelim2 = '¤', | ||
sTimeArg = 'time', | sTimeArg = 'time', | ||
| Line 16: | Line 16: | ||
p.param = param | p.param = param | ||
-------------------------------------------------------------------------------- | |||
-- Utility | |||
-------------------------------------------------------------------------------- | |||
local function padLeft(str, amt) | local function padLeft(str, amt) | ||
| Line 37: | Line 41: | ||
end | end | ||
local function addRecipe(category, sAmt, sName) | local function joinDisplay(list, separator) | ||
local | local out = {} | ||
for _, value in ipairs(list) do | |||
table.insert(out, '[[' .. value .. ']]') | |||
end | |||
return table.concat(out, separator or ' / ') | |||
end | |||
local function joinFileNameParts(list) | |||
return table.concat(list, ' & ') | |||
end | |||
-------------------------------------------------------------------------------- | |||
-- Card helpers | |||
-------------------------------------------------------------------------------- | |||
local function addRecipe(category, sAmt, sName, quality) | |||
local cardArgs = { | |||
name = sName, | name = sName, | ||
text = sAmt, | text = sAmt, | ||
show_caption = '1', | show_caption = '1', | ||
mobile = 'bulleted' | mobile = 'bulleted' | ||
}) | } | ||
if quality then | |||
cardArgs.quality = quality | |||
end | |||
local cardNode = Card._main(cardArgs) | |||
category:wikitext( | category:wikitext( | ||
| Line 56: | Line 84: | ||
end | end | ||
local function | local function addMiniCard(category, sName, sText, quality) | ||
local cardArgs = { | |||
name = sName, | name = sName, | ||
text = sText, | text = sText or '', | ||
show_caption = '1', | show_caption = '1', | ||
mobile = 'bulleted' | mobile = 'bulleted', | ||
}) | mini = '1' | ||
} | |||
if quality then | |||
cardArgs.quality = quality | |||
end | |||
local cardNode = Card._main(cardArgs) | |||
if category and sName then | |||
category:wikitext('[[Category:Uses ', sName, ']]') | |||
end | |||
return cardNode | |||
end | end | ||
-------------------------------------------------------------------------------- | |||
-- Header rendering | |||
-------------------------------------------------------------------------------- | |||
local function renderHeader(args, output, category) | local function renderHeader(args, output, category) | ||
| Line 71: | Line 116: | ||
header:tag('span'):addClass('recipe_header_main') | header:tag('span'):addClass('recipe_header_main') | ||
:tag('span'):addClass('mobileHide'):wikitext('<big>' .. sType .. '</big>'):done() | :tag('span'):addClass('mobileHide'):wikitext('<big>' .. sType .. '</big>'):done() | ||
:tag('span'):addClass('mobileHide'):wikitext('<big>' .. sType .. '</big>'):done() | :tag('span'):addClass('mobileHide'):wikitext('<big>' .. sType .. '</big>'):done() | ||
:tag('span'):addClass('recipe_header_text'):wikitext('[[' .. sType .. ']]'):done() | :tag('span'):addClass('recipe_header_text'):wikitext('[[' .. sType .. ']]'):done() | ||
| Line 179: | Line 221: | ||
end | end | ||
local function | -------------------------------------------------------------------------------- | ||
-- Standard recipe rendering | |||
-------------------------------------------------------------------------------- | |||
local function renderStandardYield(args, body) | |||
if args[param.sYieldArg] == '0' then | if args[param.sYieldArg] == '0' then | ||
return | return | ||
| Line 199: | Line 245: | ||
:node(yieldCard) | :node(yieldCard) | ||
local itemText = require('Module:Item').main{ | local itemText = require('Module:Item').main{ | ||
[1] = pageTitle, | [1] = pageTitle, | ||
| Line 206: | Line 251: | ||
} | } | ||
end | end | ||
local function renderStandardRecipe(args, frame, output, category) | local function renderStandardRecipe(args, frame, output, category) | ||
| Line 223: | Line 264: | ||
local sSortDelim = param.sSortDelim | local sSortDelim = param.sSortDelim | ||
if ((args[param.sSortArg] or ''):find(param.sSortDelim2) ~= nil) then | if ((args[param.sSortArg] or ''):find(param.sSortDelim2) ~= nil) then | ||
sSortDelim = param.sSortDelim2 | sSortDelim = param.sSortDelim2 | ||
end | end | ||
for sKey in string.gmatch(args[param.sSortArg] or '', '([^' .. sSortDelim .. ']+)') do | for sKey in string.gmatch(args[param.sSortArg] or '', '([^' .. sSortDelim .. ']+)') do | ||
if type(args[sKey]) ~= 'nil' then | if type(args[sKey]) ~= 'nil' then | ||
| Line 236: | Line 275: | ||
end | end | ||
for sKey, sVal in pairs(args) do | for sKey, sVal in pairs(args) do | ||
local restricted = false | local restricted = false | ||
| Line 251: | Line 289: | ||
end | end | ||
renderStandardYield(args, body) | |||
body:done() | body:done() | ||
| Line 257: | Line 295: | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- Cooking recipe | -- Cooking recipe parsing | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
| Line 272: | Line 310: | ||
} | } | ||
-- |item_1_type = Fish | -- |item_1_type = Fish | ||
if argExists(args, prefix .. '_type') then | if argExists(args, prefix .. '_type') then | ||
| Line 278: | Line 315: | ||
end | end | ||
-- |item_1_type_1 = Freshwater Fish | -- |item_1_type_1 = Freshwater Fish | ||
-- |item_1_type_2 = Saltwater Fish | -- |item_1_type_2 = Saltwater Fish | ||
| Line 288: | Line 324: | ||
end | end | ||
-- |item_1_option_1 = Rice | -- |item_1_option_1 = Rice | ||
-- |item_1_option_2 = Wheat | -- |item_1_option_2 = Wheat | ||
| Line 313: | Line 348: | ||
local kitchenware = {} | local kitchenware = {} | ||
if argExists(args, 'kitchenware') then | if argExists(args, 'kitchenware') then | ||
table.insert(kitchenware, args.kitchenware) | table.insert(kitchenware, args.kitchenware) | ||
end | end | ||
local index = 1 | local index = 1 | ||
| Line 332: | Line 362: | ||
end | end | ||
-------------------------------------------------------------------------------- | |||
-- Cooking recipe display | |||
-------------------------------------------------------------------------------- | |||
local function renderCookingTypeCard(category, body, ingredient) | |||
local wrapper = body:tag('div') | |||
:addClass('recipe_body_cooking_ingredient') | |||
:addClass('recipe_body_cooking_type_card') | |||
local fileBase = joinFileNameParts(ingredient.types) | |||
local fileName = 'Recipe ' .. fileBase .. ' Icon.png' | |||
local caption = joinDisplay(ingredient.types, ' / ') | |||
for _, typeName in ipairs(ingredient.types) do | |||
category:wikitext('[[Category:Uses ', typeName, ']]') | category:wikitext('[[Category:Uses ', typeName, ']]') | ||
end | |||
local amountText = tostring(ingredient.amount or '1') | |||
local card = wrapper:tag('div') | |||
:addClass('card') | |||
:addClass('recipe-type-card') | |||
if ingredient.quality then | |||
card:addClass('card-quality-' .. normalizeType(ingredient.quality)) | |||
end | end | ||
card:tag('div') | |||
:addClass(' | :addClass('card-image') | ||
:wikitext( | :wikitext('[[File:' .. fileName .. '|64x64px|link=]]') | ||
card:tag('div') | |||
:addClass('card-caption') | |||
:wikitext(caption) | |||
if amountText ~= '' then | |||
card:tag('div') | |||
:addClass('card-text') | |||
:wikitext(amountText) | |||
end | end | ||
end | end | ||
local function | local function renderCookingOptionCards(category, body, ingredient) | ||
local wrapper = body:tag('div') | local wrapper = body:tag('div') | ||
:addClass('recipe_body_cooking_ingredient') | :addClass('recipe_body_cooking_ingredient') | ||
:addClass('recipe_body_cooking_options') | |||
for _, itemName in ipairs(ingredient.options) do | |||
wrapper:node(addRecipe(category, ingredient.amount, itemName, ingredient.quality)) | |||
end | end | ||
end | |||
local function renderCookingIngredient(category, body, ingredient) | |||
-- Specific item: | -- Specific item: | ||
-- |item_1 = Rice | -- |item_1 = Rice | ||
if ingredient.item then | if ingredient.item then | ||
body:node(addRecipe(category, ingredient.amount, ingredient.item, ingredient.quality)) | |||
return | return | ||
end | end | ||
-- Multiple specific | -- Multiple accepted specific items: | ||
-- |item_1_option_1 = Rice | -- |item_1_option_1 = Rice | ||
-- |item_1_option_2 = Wheat | -- |item_1_option_2 = Wheat | ||
if #ingredient.options > 0 then | if #ingredient.options > 0 then | ||
renderCookingOptionCards(category, body, ingredient) | |||
return | return | ||
end | end | ||
| Line 395: | Line 432: | ||
-- Type-based ingredient: | -- Type-based ingredient: | ||
-- |item_1_type = Fish | -- |item_1_type = Fish | ||
-- |item_1_type_1 = Freshwater Fish | -- |item_1_type_1 = Freshwater Fish | ||
-- |item_1_type_2 = Saltwater Fish | -- |item_1_type_2 = Saltwater Fish | ||
if #ingredient.types > 0 then | if #ingredient.types > 0 then | ||
renderCookingTypeCard(category, body, ingredient) | |||
return | |||
end | |||
end | |||
local function renderKitchenwareIcon(body, kitchenware) | |||
body:tag('div') | |||
:addClass('recipe_body_icon') | |||
:addClass('recipe_body_kitchenware_icon') | |||
:wikitext('[[File:Icon_' .. kitchenware .. '.png|35x35px|link=' .. kitchenware .. ']]') | |||
end | |||
local function renderKitchenwareMiniCard(category, body, kitchenware) | |||
body:tag('div') | |||
:addClass('recipe_body_icon') | |||
:addClass('recipe_body_kitchenware_card') | |||
:node(addMiniCard(category, kitchenware, '')) | |||
end | |||
local function renderCookingYield(args, category, body) | |||
if args[param.sYieldArg] == '0' then | |||
return | return | ||
end | end | ||
local | local sYield = args[param.sYieldArg] or '1' | ||
local pageTitle = args.page or mw.title.getCurrentTitle().text | |||
local kitchenware = getKitchenware(args) | local kitchenware = getKitchenware(args) | ||
local yieldCard = Card._main({ | |||
name = pageTitle, | |||
text = sYield, | |||
show_caption = '1', | |||
}) | |||
if #kitchenware == 0 then | if #kitchenware == 0 then | ||
body:tag('div') | |||
:addClass('recipe_body_icon') | |||
:wikitext('➜') | |||
elseif #kitchenware == 1 then | |||
-- Default: icon mode. | |||
-- Change this to renderKitchenwareMiniCard(category, body, kitchenware[1]) | |||
-- if you prefer mini-card kitchenware display. | |||
renderKitchenwareIcon(body, kitchenware[1]) | |||
category:wikitext('[[Category:Uses ', kitchenware[1], ']]') | |||
else | |||
local wrapper = body:tag('div') | |||
:addClass('recipe_body_icon') | |||
:addClass('recipe_body_kitchenware_multi') | |||
for _, itemName in ipairs(kitchenware) do | |||
wrapper:node(addMiniCard(category, itemName, '')) | |||
end | |||
end | end | ||
body:tag('div') | |||
:addClass(' | :addClass('recipe_body_yield') | ||
:node(yieldCard) | |||
local itemText = require('Module:Item').main{ | |||
[1] = pageTitle, | |||
[2] = '15', | |||
x = sYield | |||
} | |||
end | end | ||
| Line 460: | Line 533: | ||
end | end | ||
renderCookingYield(args, category, body) | |||
body:done() | body:done() | ||
| Line 484: | Line 555: | ||
:addClass('recipe_container') | :addClass('recipe_container') | ||
local category = mw.html.create() | local category = mw.html.create() | ||