Documentation for this module may be created at Module:Form calculator/doc
-- 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
--
-- <nowiki>
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)
return p._jsnotice(frame:getParent().args)
end
function p._jsnotice(args)
local page = mw.title.getCurrentTitle()
if args.forminit then
return 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)
return p._resnotice(frame:getParent().args)
end
function p._resnotice(args)
if args.resultinit then
return 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)
return p._main(frame:getParent().args)
end
function p._main(args)
local template, form, result
local err = ''
if hascontent(args.template) then
template = args.template
else
err = 'No template specified<br />'
end
if hascontent(args.form) then
form = args.form
else
err = err .. 'No form ID specified<br />'
end
if hascontent(args.result) then
result = args.result
else
err = err .. 'No result ID specified<br />'
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 = '[[Category:Form calculators]]'
end
if err ~= '' then
if cat ~= '' then
cat = cat .. '[[Category:Form calculator errors]]'
end
return '<span class="error">'.."'''Fatal error(s) found in form definition:'''<br />" .. err .. '</span>' .. 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<br />'
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<div id="'..form..'">'..p._jsnotice(args)..'</div>\n<div id="'..result..'">'..p._resnotice(args)..'</div>'
elseif outtype == 'verticaltable' then
out = makeVTable(args, form, result)
elseif outtype == 'horizontaltable' then
out = makeHTable(args, form, result)
end
if err ~= '' then
err = '<span class="error">' .. "'''Minor error(s) found in form definition:'''<br />" .. err .. '</span>'
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(args, form, result)
return mw.html.create('table')
:tag('tr')
:tag('td')
:attr('id', form)
:wikitext(p._jsnotice(args))
:done()
:tag('td')
:css('width', '10px')
:done()
:tag('td')
:attr('id', result)
:wikitext(p._resnotice(args))
:done()
:done()
end
function makeVTable(args, 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(args))
:done()
:done()
:tag('tr')
:tag('th')
:wikitext('Result')
:done()
:done()
:tag('tr')
:tag('td')
:attr('id', result)
:wikitext(p._resnotice(args))
:done()
:done()
end
return p