Module:Form calculator

-- implements Template:Form calculator --   for generating form calculators -- RuneScape:Calculators/Form calculators -- -- performs some minor checks on the input; the javascript still does most of it, though -- -- local pt = require('Module:Paramtest') local hascontent = pt.has_content local defto = pt.default_to

-- possible parameter types local param_types = {string = true, article = true, number = true, int = true, select = true, check = true, hs = true, fixed = true, hidden = true, semihidden = true}

local p = {} --used internally but can also be an entry point function p.jsnotice(frame) local page = mw.title.getCurrentTitle if frame and frame:getParent.args.forminit then return frame:getParent.args.forminit else return 'The calculator form will appear here soon. You will need Javascript enabled and cannot be using the mobile version of the Wiki.\n\nIf you are on a mobile device, you can load the full version of the site by [' .. page:fullUrl('useskin=oasis') .. ' clicking here].' end end

--used internally but can also be an entry point function p.resnotice(frame) if frame and frame:getParent.args.resultinit then return frame:getParent.args.resultinit else return 'The result will appear here when you submit the form.' end end

--main entry for constructing a calculator function p.main(frame) local args = frame:getParent.args local template, form, result local err = '' if hascontent(args.template) then template = args.template else err = 'No template specified '   end if hascontent(args.form) then form = args.form else err = err .. 'No form ID specified '   end if hascontent(args.result) then result = args.result else err = err .. 'No result ID specified '   end local cat = '' -- if the category is not overriden AND [the page param is missing OR the page param = the title] if defto(args.cat, 'yes') ~= 'no' and (not hascontent(args.page) or args.page == mw.title.getCurrentTitle.prefixedText) then cat = '' end if err ~= '' then if cat ~= '' then cat = cat .. ''       end return ' '.."Fatal error(s) found in form definition: " .. err .. ' ' .. cat end local conf = mw.html.create('div') conf:addClass('hidden jcConfig') :wikitext('\n') :wikitext('template = ' .. template .. '\n') :wikitext('form = ' .. form .. '\n') :wikitext('result = ' .. result .. '\n') :done if hascontent(args.suggestns) then --check ns stuff for i,v in pairs(mw.text.split(args.suggestns, ',', true)) do           if not mw.site.namespaces(tonumber(v)) then err = err .. 'Invalid namespace(s) detected in suggestns '               break end end conf:wikitext('suggestns = ' .. args.suggestns) end local i = 1 while hascontent(args['param' .. i]) do       process_param(args, conf, i)        i = i + 1 end local outtype = defto(args.outputtype, 'none') local out if outtype == 'none' or outtype == '0' then out = '' elseif outtype == 'basic' or outtype == '1' then out = '\n\n '..p.jsnotice(frame)..' \n '..p.resnotice(frame)..' ' elseif outtype == 'verticaltable' then out = makeVTable(frame, form, result) elseif outtype == 'horizontaltable' then out = makeHTable(frame, form, result) end if err ~= '' then err = ' ' .. "Minor error(s) found in form definition: " .. err .. ' '   end return tostring(conf) .. tostring(err) .. tostring(out) .. tostring(cat) end

function type_check(arg) if hascontent(arg) and param_types[arg] then return arg else return 'string' end end

function process_param(args, conf, num) local param = args['param' .. num] local label = defto(args['label' .. num], param) local type = type_check(args['type' .. num]) local default = defto(args['default' .. num], '') local range = defto(args['range' .. num], '') --for clarity, do this here local str = param .. '|' .. label .. '|' .. default .. '|' .. type .. '|' .. range conf:wikitext('param = ' .. str .. '\n') end

function makeHTable(frame, form, result) return mw.html.create('table') :tag('tr') :tag('td') :attr('id', form) :wikitext(p.jsnotice(frame)) :done :tag('td') :css('width', '10px') :done :tag('td') :attr('id', result) :wikitext(p.resnotice(frame)) :done :done end

function makeVTable(frame, form, result) return mw.html.create('table') :addClass('wikitable') :tag('tr') :tag('th') :wikitext('Calculator') :done :done :tag('tr') :tag('td') :attr('id', form) :wikitext(p.jsnotice(frame)) :done :done :tag('tr') :tag('th') :wikitext('Result') :done :done :tag('tr') :tag('td') :attr('id', result) :wikitext(p.resnotice(frame)) :done :done end

return p