Dota 2 Wiki
(Using assert)
mNo edit summary
Line 16: Line 16:
 
end
 
end
   
assert(args[1], 'Enter an expression.')
+
assert(args[1], 'Enter an expression')
 
 
 
if args['v1'] then
 
if args['v1'] then

Revision as of 10:30, 19 March 2018

Documentation for Module:Calculate Jump to code ↴ [ edit | purge ]

Reality Rift icon
▶️ Planeshift.
The documentation for this module can be found at Template:Calculate.
You may be forwarded to another wiki language, in case a translation is not available.

Tests

Lua error in package.lua at line 80: module 'Module:Utils' not found.


Dependencies

local expr = mw.ext.ParserFunctions.expr
local getArgs = require('Module:Arguments').main
local split = require('Module:Utils').split
local p = {}

function p.main()
  local args = getArgs()
  return p._main(args)
end

function p._main(args)
  local calculate = function(calc)
    -- Replaces percentage signs with /100 since #expr can't handle them.
    calc = string.gsub(calc, '%%', '/100')
    return expr(calc)
  end

  assert(args[1], 'Enter an expression')
  
  if args['v1'] then
    -- Create a table that holds a table for each v argument.
    local v_values = {}
    local n = 1
    while args['v'..n] do
      -- Escape percentage signs to prevent them from escaping the / during the split.
      v = string.gsub(args['v'..n], '%%', '%%%%')
      -- Split the v into the individual values and add them to the v_values table.
      table.insert(v_values, split(v, '/'))
      n = n + 1
    end

    local output = {}
    -- Run once for each value in the v1 argument.
    for level,_ in ipairs(v_values[1]) do
      local calc = args[1]
      -- Do a replacement for each v arg.
      for i,v in ipairs(v_values) do
        calc = calc:gsub('v'..i, v[level])
      end

      -- Solve the calculation we just constructed and insert it into the output.
      -- args[2] is used to trigger special percentage handling.
      if args[2] then
        table.insert(output, calculate('('..calc..')*100') .. '%') 
      else
        table.insert(output, calculate(calc)) 
      end
    end

    -- Return the values in the output table separated by a /.
    return table.concat(output, '/')
  else
    -- Just do a normal #calc if no v values are given.
    -- Still has percentage handling which normal #calc doesn't.
    return calculate(args[1])
  end
end

return p