Editing Module:Infobox recipe 0 You do not have permission to edit this page, for the following reasons: The action you have requested is limited to users in one of the groups: Autoconfirmed users, FANDOM Staff, FANDOM Helpers, Wiki Managers, Content Team Members. This page has been semi-protected and may only be edited by registered users. To request a change, create a new topic here or ask an administrator to reduce the protection level here. Additional information on this page's status may be found in the protection log. {|class="messagebox info" |width="50px"| |Please log in to edit the wiki. Joining is free and it only takes a minute.We hope that you sign up and become a member of our community! |} You must confirm your e-mail address before editing pages. Please set and validate your e-mail address through your user preferences. more + You can view and copy the source of this page: --<nowiki> --[=[<pre> -- Implements [[Template:Infobox recipe]] --]=] local p = {} local yesno = require('Module:Yesno') local params = require('Module:Paramtest') local commas = require('Module:Addcommas') local geprice = require('Module:Exchange')._price local skillpic = require('Module:Skill_clickpic')._main local editbutton = require('Module:Edit button') local onmain = require('Module:Mainonly').on_main local JSONmod = require('Module:JSON') local HF = require('Module:HF') function p.main(frame) local args = frame:getParent().args --[[ Function to handle all the materials listed Creates a table to pass to _main() consisting of * Item name, as a wikilink * Item image, as a wikilink, includes link to page * Quantity * Formatted price for display * Clean price for calculations If the parameter mat# is defined and not blank Every parameter (mat#img, mat#qty, mat#price) will be looked for as well --]] local function mat_list() local ret_list = {} for i=1,10,1 do local mat = args['mat'..i] if mat and params.has_content(mat) then local name = mat -- 2 separate prices -- 1 for display -- 1 for calculation local price,price_raw local qty = params.default_to(args['mat'..i..'qty'],'1') local img = params.default_to(args['mat'..i..'img'], name..'.png') :gsub('File:','') local price_v = params.default_to(args['mat'..i..'price'],'/') -- gemw = use exchange price if price_v:lower() == 'gemw' then price_raw = geprice(name) price = commas._add(price_raw) -- parseable as number = use that elseif tonumber(commas._strip(price_v),10) then price_raw = tonumber(commas._strip(price_v),10) price = commas._add(price_raw) -- Some untradeables have a distinct market price -- because of their materials -- The template {{GETotal}} will help here -- Look for template call elseif price_v:find('{{.*}}') then price_raw = frame:preprocess(price_v) price = commas._add(price_raw) -- everything else -- use N/A for display and 0 for calculations else price_raw = 0 price = 'N/A' end table.insert(ret_list, { name = '[['..name..']]', name_raw = name, price = price, price_raw = price_raw, quantity = qty, image = '[[File:'..img..'|link='..name..']]', image_raw = img } ) end end return ret_list end --[[ Function to get a list of additional requirements, should there be any Will take non-blank parameters and simply paste them as is into a table Which will then be passed into the _main() function --]] local function get_other_reqs() local req_list = {} for i=1,5,1 do local req = args['misc'..i] if req and req:find('%S') then table.insert(req_list,req) end end return req_list end -- Fetching and formatting parameters starting here local item_name,item_image, skill,level,experience = params.defaults{ {args.name,mw.title.getCurrentTitle().text}, {args.image,nil}, {args.skill,nil}, {args.level,editbutton('?')}, {args.skillXP,nil} } local skill2,experience2, quest = params.defaults{ {args.secSkill,nil}, {args.secXP,nil}, {args.quest,nil} } -- Add [[File: and |link=...]] to image, if it's defined if item_image then item_image = '[[File:'..item_image:gsub('File:','')..'|link='..item_name..']]' -- anti-redlink elseif mw.title.getCurrentTitle().text == 'Infobox recipe/preload' or mw.title.getCurrentTitle().text == 'PreloadPage/Orphanage' then item_image = '' else item_image = '[[File:'..item_name..'.png|link='..item_name..']]' end -- Allow amount to be removed if it's 1 local item_amount = tonumber(args.amount,10) or 1 -- Tables to pass; call above functions local materials = mat_list() local misc_reqs = get_other_reqs() -- Look for gemw in the parameter, otherwise nil local item_ge_v = string.lower(args.geValue or '') local item_gep if item_ge_v == 'gemw' then item_gep = geprice(item_name) elseif item_ge_v == 'no' then item_gep = 'no' else item_gep = nil end -- Only accept "yes" or "no" -- Anything else defaults to no -- Should this default to unknown instead? local members = yesno(args.members) and 'Yes' or 'No' -- Pass parameters to _main return p._main{ item_name, item_image, item_amount, materials, misc_reqs, skill, level, experience, skill2, experience2, item_gep, members, quest } end -- -- Main -- function p._main(...) -- Unpack parameters local item_name,item_image,item_amount, materials,misc_reqs, skill,level,experience, skill2,experience2,item_gep, members,quest = unpack(...) local ret = mw.html.create('table') :addClass('wikitable') :css({ width = '50%', ['max-width'] = '450px' }) -- Caption header local caption = item_image..' '..item_name if item_amount > 1 then caption = caption..' ×'..item_amount end ret:tag('caption'):wikitext(caption):done() -- Creation of row 1 -- Columns 1 and 5 local row1 = ret:tag('tr') :css('text-align','center') local row1a = row1:tag('th') :css('width','20%') :attr('colspan','2') if skill then if skill:lower() == 'no' then row1a:wikitext('-') else row1a:wikitext(skillpic(skill)) end else row1a:wikitext('\'\'?\'\' '..editbutton()) end local row1e = row1:tag('th') :css('width','20%') :attr('colspan','2') if skill2 and not (skill2:lower() == 'no') then row1e:wikitext(skillpic(skill2)) else row1e:wikitext('-') end row1:tag('th') :attr('title','Grand Exchange median price') :css('width','20%') :wikitext('[[File:Make-X GE icon.png|link=]]') :done() -- Creation of row 2 local row2 = ret:tag('tr') :css('text-align','center') local row2a = row2:tag('td') :attr('colspan','2') local row2b = row2:tag('td') :attr('colspan','2') local row2c = row2:tag('td') if skill and skill:lower() == 'no' then row2a:wikitext('-') elseif experience then row2a:wikitext(commas._add(experience)..' XP') else row2a:wikitext('\'\'?\'\' '..editbutton()) end if experience2 then row2b:wikitext(commas._add(experience2)..' XP') else row2b:wikitext('-') end if item_gep then if item_gep == 'no' then row2c:attr('title','Cannot be sold on the Grand Exchange') :wikitext('-') elseif item_amount > 1 then row2c:attr('title',commas._add(item_gep)..' coins each') :wikitext(commas._add(item_gep * item_amount)) else row2c:wikitext(commas._add(item_gep)) end else row2c:wikitext('\'\'?\'\' '..editbutton()) end -- Add "Requirements" header ret:tag('tr') :tag('th') :attr('colspan','5') :wikitext('Requirements') :done() :done() -- Skill requirement 1 if skill and not (skill:lower() == 'no') then ret:tag('tr') :tag('td') :attr('colspan','4') :wikitext(skillpic(skill)..' '.. params.ucflc(skill)..' level') :done() :tag('td') :css('text-align','center') :wikitext(level) :done() :done() end -- Quest requirement if quest then ret:tag('tr') :tag('td') :attr('colspan','5') :wikitext(skillpic('quest')..' '..quest) :done() :done() end -- Miscellaneous requirements for i, v in ipairs(misc_reqs) do ret:tag('tr') :tag('td') :attr('colspan','5') :wikitext(v) :done() :done() end -- Members requirement ret:tag('tr') :tag('td') :attr('colspan','4') :wikitext('[[File:P2P icon.png|20px|link=]] Members only') :done() :tag('td') :css('text-align','center') :wikitext(members) :done() :done() -- Materials header ret:tag('tr') :tag('th') :attr('colspan','5') :wikitext('Materials') :done() :done() :tag('tr') :tag('th') :attr('colspan','2') :wikitext('Item') :done() :tag('th') :wikitext('Quantity') :done() :tag('th') :wikitext('Price') :done() :tag('th') :wikitext('Total') :done() :done() -- Materials local total_price = 0 local valued_items = 0 -- Iterates through the tables in the table of materials for i, v in ipairs(materials) do -- Fetch all the variables local mat_name = v.name local mat_price = v.price local mat_raw = v.price_raw local mat_ttl local mat_qty = v.quantity local mat_img = v.image -- If no price is given for item, delete total -- Otherwise quantity * price each if mat_raw == 0 then mat_ttl = '-' else mat_ttl = mat_qty * mat_raw end -- If item total is a number -- Add it to the overall total -- Indicate this by incrementing valued item count -- Done with total calculations, add commas to total for formatting if type(mat_ttl) == 'number' then total_price = total_price + mat_ttl mat_ttl = commas._add(mat_ttl) if mat_raw > 0 then valued_items = valued_items + 1 end end ret:tag('tr') :tag('td') :css({ ['border-right'] = 'none', ['text-align'] = 'center' }) :wikitext(mat_img) :done() :tag('td') :css({ ['border-left'] = 'none', ['border-right'] = 'none', ['text-align'] = 'left' }) :wikitext(mat_name) :done() :tag('td') :css({ ['border-left'] = 'none', ['border-right'] = 'none', ['text-align'] = 'right' }) :wikitext(commas._add(mat_qty)) :done() :tag('td') :css({ ['border-left'] = 'none', ['text-align'] = 'right' }) :wikitext(mat_price) :done() :tag('td') :css('text-align','right') :wikitext(mat_ttl) :done() :done() end -- If no materials found -- Indicate nothing listed, add an edit button for the page if #materials == 0 then ret:tag('tr') :tag('td') :attr('colspan','5') :css({ ['font-style'] = 'italic', ['text-align'] = 'center' }) :wikitext('Materials unlisted '..editbutton()) :done() :done() end -- Total -- Hide if less than 2 items have a value if valued_items > 1 then ret:tag('tr') :tag('th') :attr('colspan','4') :css('text-align','right') :wikitext('Total price') :done() :tag('td') :css('text-align','right') :wikitext(commas._add(total_price)) :done() :done() end if onmain then smw = {} table.insert(smw,'Required materials:') local jsonmats = {} for _, v in ipairs(materials) do table.insert(jsonmats,string.format('{ "name": "%s", "quantity": "%s", "image": "%s" }', v.name_raw, v.quantity, v.image_raw )) --table.insert(smw,string.format('[[Made from item::%s]]',v.name_raw)) mw.smw.set{ ['Made from item'] = v.name_raw } mw.smw.subobject( { ['Item'] = v.name_raw, ['Quantity required'] = v.quantity, ['Icon'] = HF._stripFileWrapper(v.image), ['@category'] = 'Crafting material'}, 'Created from ' .. v.name_raw ) end jsonmats = table.concat(jsonmats,',') local json = string.format('{ "product": "%s", "image": "%s", "mats": [ %s ], "skill": "%s", "level": "%s" }', item_name, item_image, jsonmats, skill, tonumber(level) or '?') json = JSONmod.wikiescapes(json) table.insert(smw,'- - - - - - - - - -') table.insert(smw,'Production JSON:') table.insert(smw,string.format('[[Production JSON::%s]]',json)) mw.smw.set { ['Creation'] = ('%s;%s;%s;%s'):format(item_name, HF._stripFileWrapper(item_image), skill, tonumber(level) or '?') } ret :tag('div') :attr('smw-infobox-data') :addClass('hidden') :css('display','none') :tag('pre') :wikitext(table.concat(smw,'\n')) :done() :done() end return ret end return p Return to Module:Infobox recipe. Edit summary Show changes