Module:Inflation and Module:Inflation/sandbox: Difference between pages

(Difference between pages)
Page 1
Page 2
imported>MusikBot II
m Protected "Module:Inflation": High-risk template or module: 13949 transclusions (more info) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
 
imported>DaxServer
fix
 
Line 1: Line 1:
local p={}
local p = {}
local getArgs = require('Module:Arguments').getArgs
local mm = require('Module:Math')
local yesno = require('Module:Yesno')
local lang = mw.getContentLanguage()
local currentyear = tonumber(os.date('%Y'))


local function split(text, pattern, plain)
local function formatnum(num)
    local ret = {}
return lang:parseFormattedNumber(num) and lang:formatNum(lang:parseFormattedNumber(num)) or num
    local s, l = 1, string.len( text )
    while s do
    local e, n = string.find( text, pattern, s, plain )
    if not e then
    table.insert(ret, string.sub ( text, s ))
    s = nil
    elseif n < e then
    -- Empty separator!
    table.insert(ret, string.sub ( text, s, e ))
    if e < l then
    s = e + 1
    else
    s = nil
    end
    else
    table.insert(ret, e > s and string.sub( text, s, e - 1 ) or '')
    s = n + 1
    end
    end
    return ret
end
end


function p._parse(index, template, frame)
local function moduleExists(t)
if not frame then frame = mw.getCurrentFrame() end
return package.loaded[t] or package.loaders[1](t) or package.loaders[2](t) or false
local error = ' when using {{tl|Inflation/' .. template .. '}}.{{main other|[[Category:Pages with errors in inflation template]]}}</span>'
end
if index and index ~= 'ERR' then
 
local tempTitle = "Inflation/" .. index .. "/dataset"
local function checkYearRangeForError(index, argstartyear, argendyear, datastartyear, dataendyear)
local dataset = mw.title.new(tempTitle, "Template"):getContent()
local errorParams = {}
if dataset then
local msg
local redirect = mw.ustring.match(dataset, "#REDIRECT%s*%[%[Template:Inflation/(.*)/dataset%]%]")
 
if redirect then return p._parse(redirect, template, frame) end
if argstartyear < datastartyear then
dataset = mw.ustring.gsub(mw.ustring.gsub(dataset, "<!%-%-.-%-%->", ""), "\n?%s*|%s*#default%s*", "")
msg = "{{para|start_year|'''" .. argstartyear
local datatable = {}
.. "'''}} (parameter 3) is lower than the earliest available year ('''" .. datastartyear .. "''')"
local data = split(dataset, "\n", true)
.. " in index \"'''" .. index .. "'''\""
for _, row in ipairs(data) do
table.insert(errorParams, msg)
local year, value = mw.ustring.match(row, "%s*|%s*(%d%d%d%d)%s*=%s*([^=]+)%s*")
end
if year and value and tonumber(year) then
 
year = tonumber(year)
if argstartyear > argendyear then
if tonumber(value) then
if argstartyear ~= currentyear then
datatable[year] = tonumber(value)
msg = "{{para|start_year|'''" .. argstartyear .. "'''}} (parameter 3) is greater than "
elseif mw.ustring.sub(value,1,8) == '{{#expr:' and mw.ustring.sub(value,-2) == '}}' then
-- ToDo Fix
value = mw.ustring.sub(value, 3, -3)
.. "{{para|end_year|'''" .. argendyear .. "'''}} (parameter 4) "
datatable[year] = tonumber(frame:callParserFunction( value ))
.. "the latest available year ('''" .. dataendyear .. "''') in index \"'''" .. index .. "'''\""
end
table.insert(errorParams, msg)
end
end
end
end
if table.maxn(datatable) > 0 then
 
return datatable
-- 4c: [parameter 4/end_year] greater than [parameter 1/index] highest year
else
if argendyear > dataendyear then
error = '<span class="error">Error: unable to parse "Template:' .. tempTitle .. '"' .. error
msg = "{{para|end_year|'''" .. argendyear
end
.. "'''}} (parameter 4) is greater than the latest available year ('''" .. dataendyear .. "''') "
.. "in index \"'''" .. index .. "'''\""
table.insert(errorParams, msg)
end
 
if next(errorParams) ~= nil then
return mw.text.listToText(errorParams, ', & #32;', '&#32; and &#32;') .. '.'
end
 
return nil
end
 
function p._parse(index, value, startyear, endyear, round)
local dataset = mw.loadData('Module:Inflation/' .. index)
 
-- Dataset is not properly configured
if dataset.data == nil or dataset['start_year'] == nil or dataset.default == nil then
return {inflatedValue = nil, endyear = nil, error = 'error'}
end
 
startyear = tonumber(startyear)
 
if endyear ~= nil then
endyear = tonumber(endyear)
else
endyear = tonumber(dataset.default)
end
 
-- Check if a parameter is out of calculable bounds
local er = checkYearRangeForError(index, startyear, endyear, dataset['start_year'], dataset.default)
 
if er ~= nil then
return {inflatedValue = nil, endyear = nil, error = er}
end
 
-- ToDo Throw error
-- dataset.data[dataset.default]
 
 
local m
if currentyear == startyear then
m = 1
else
m = mm._divide(dataset.data[endyear], dataset.data[startyear])
end
 
inflatedValue = lang:parseFormattedNumber(value) * m
inflatedValue = mm._round(inflatedValue, round)
 
return {inflatedValue = inflatedValue, endyear = endyear, error = nil}
end
 
local function checkForError(index, value, startyear, endyear, round)
-- Check if required parameters are set
local errorParams = {}
 
if not index then
table.insert(errorParams, '{{para|index}} (parameter 1)')
end
 
if not value then
table.insert(errorParams, '{{para|value}} (parameter 2)')
end
 
if not startyear then
table.insert(errorParams, '{{para|start_year}} (parameter 3)')
end
 
if next(errorParams) ~= nil then
return mw.text.listToText(errorParams, ', & #32;', '&#32; and &#32;') .. 'must be specified.'
end
 
-- Check if dataset exists
if not moduleExists('Module:Inflation/' .. index) then
return "{{para|index|'''" .. index .. "'''}} (parameter 1) not a recognized index."
end
 
-- Check if numeric parameters have non-numeric data
errorParams = {}
 
if lang:parseFormattedNumber(value) == nil then
table.insert(errorParams, "{{para|value|'''" .. value .. "'''}} (parameter 2)")
end
 
if lang:parseFormattedNumber(startyear) == nil then
table.insert(errorParams, "{{para|start_year|'''" .. startyear .. "'''}} (parameter 3)")
end
 
if lang:parseFormattedNumber(endyear) == nil then
table.insert(errorParams, "{{para|end_year|'''" .. endyear .. "'''}} (parameter 4)")
end
 
if lang:parseFormattedNumber(round) == nil then
table.insert(errorParams, "{{para|r|'''" .. round .. "'''}}")
end
 
if next(errorParams) ~= nil then
return '[[NaN]], check parameters for non-numeric data:'
.. mw.text.listToText(errorParams, ', & #32;', '&#32; and &#32;')
.. '.'
end
 
return nil
end
 
local function formatResult(originalValue, endyear, inflatedValue, fmt, cursign, orig)
local result = inflatedValue
 
if fmt == 'eq' then
result = 'equivalent to ' .. cursign .. formatnum(inflatedValue) .. ' in '
 
if currentyear == startyear then
result = result .. currentyear
else
else
error = '<span class="error">Error: undefined index "' .. index .. '"' .. error
result = result .. endyear
end
end
else
 
error = '<span class="error">Error: no index specified' .. error
if orig then
result = cursign .. originalValue .. ' (' .. result .. ')'
end
end
 
if fmt == 'c' then
result = formatnum(inflatedValue)
end
end
return frame:preprocess(error)
 
return result
end
end


function p.year(frame)
local function formatError(er, nocat)
local index = frame.args.index or frame.args[1] or frame:getParent().args.index or frame:getParent().args[1]
er = "<span class=\"error\">Error when using {{tl|'''Inflation'''}}: " .. er .. "</span>"
local result = p._parse(index, 'year', frame)
 
if type(result) == "table" then
if not nocat then
return table.maxn(result)
er = er .. '{{main other|[[Category:Pages with errors in inflation template]]}}'
else
end
return result
 
return er
end
 
function p.main(frame)
local args = getArgs(frame)
if not frame then frame = mw.getCurrentFrame() end
 
local index = args[1] or args.index --or frame:getParent().args[1] or frame:getParent().args.index
local value = args[2] or args.value --or frame:getParent().args[2] or frame:getParent().args.value
local startyear = args[3] or args['start_year'] --or frame:getParent().args[3] or frame:getParent().args['start_year']
local endyear = args[4] or args['end_year'] --or frame:getParent().args[4] or frame:getParent().args['end_year']
local round = args.r or 0
local fmt = args.fmt or 'raw'
local orig = yesno(args.orig) or false
local cursign = args.cursign or '$'
local nocat = yesno(args.nocat) or false
 
local error = checkForError(index, value, startyear, endyear, round)
if error ~= nil then
return frame:preprocess(formatError(error, nocat))
end
 
local parsed = p._parse(index, value, startyear, endyear, round)
 
if parsed.error ~= nil then
return frame:preprocess(formatError(parsed.error, nocat))
end
end
return formatResult(value, parsed.endyear, parsed.inflatedValue, fmt, cursign, orig)
end
end


return p
return p