• Welcome to the Kancolle Wiki!
  • If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord

Difference between revisions of "Module:Calc"

From Kancolle Wiki
Jump to navigation Jump to search
Line 7: Line 7:
 
local args = nil
 
local args = nil
 
local ship = nil
 
local ship = nil
 +
local frame = nil
  
 
local enumerating_functions = {
 
local enumerating_functions = {
      
+
 
 +
     args = function()
 +
        return mw.text.split(args.args, "%s*,%s*")
 +
    end,
 +
 
 
     base_names = function()
 
     base_names = function()
 
         return ShipIterator.baseForms
 
         return ShipIterator.baseForms
Line 102: Line 107:
 
         return "|-\n"
 
         return "|-\n"
 
     elseif prefix == "?" then
 
     elseif prefix == "?" then
         local key = string.sub(arg, 2)
+
         prefix = string.sub(prefix, 1, 1)
        local value = format_value(key)
+
         if prefix == "?" then
         if args.format == "table" then
+
            local key = string.sub(arg, 3)
             return "|" .. value .. "\n"
+
             return frame:preprocess(format{ key, ship = ship:name('/') })
 
         else
 
         else
             return value
+
             local key = string.sub(arg, 2)
 +
            local value = format_value(key)
 +
            if args.format == "table" then
 +
                return "|" .. value .. "\n"
 +
            else
 +
                return value
 +
            end
 
         end
 
         end
 
     else
 
     else
Line 130: Line 141:
 
local Calc = {}
 
local Calc = {}
  
function Calc.format(frame, args_)
+
function Calc.format(frame_, args_)
     return interpret_args(args_ or Utils.getTemplateArgs(frame).explicit)
+
    frame = frame_
 +
     return interpret_args(args_ or Utils.getTemplateArgs(frame_).explicit)
 
end
 
end
  
 
function Calc.test()
 
function Calc.test()
 +
    --[[
 
     mw.log(Calc.format(nil, {
 
     mw.log(Calc.format(nil, {
 
         format = "table",
 
         format = "table",
Line 140: Line 153:
 
         "#", "!@", "?id", "?link", "?implementation_date"
 
         "#", "!@", "?id", "?link", "?implementation_date"
 
     }))
 
     }))
 +
    ]]--
 
end
 
end
  
 
return Calc
 
return Calc

Revision as of 20:12, 29 October 2017

Documentation for this module may be created at Module:Calc/doc

local Utils = require("Module:Utils")
local format = require("Module:StringOperations").format
local Formatting = require("Module:Formatting")
local Ship = require("Module:Ship")
local ShipIterator = require("Module:ShipIterator")

local args = nil
local ship = nil
local frame = nil

local enumerating_functions = {

    args = function()
        return mw.text.split(args.args, "%s*,%s*")
    end,

    base_names = function()
        return ShipIterator.baseForms
    end,

    all_names = function()
        return ShipIterator.allForms
    end,
    
    enemy = function()
        return ShipIterator.enemyForms
    end,

}

-- TODO: have a syntax for calling Module:Formatting functions?
local formatting_functions = {

    night_battle_power = function(ship)
        return (ship:firepower_max() or 0) + (ship:torpedo_max() or 0)
    end,
    
    code = function(ship)
        return Formatting:format_ship_code(ship:type())
    end,

    -- overrides ShipData:type
    type = function(ship)
        return Formatting:format_ship_type(ship:type())
    end,

    -- overrides ShipData:link
    link = function(ship)
        return Formatting:format_link(ship:link())
    end,

    -- overrides ShipData:implementation_date
    implementation_date = function(ship)
        local date = ship:implementation_date()
        return not date and "??" or format{
            "${year}/${month}/${day}",
            year = date[1],
            month = date[2] < 10 and "0" .. date[2] or date[2],
            day = date[3] < 10 and "0" .. date[3] or date[3],
        }
    end,

}

function format_lua(lua)
    if type(lua) == "table" then
        return tostring(table.concat(lua, args.concat_value or ", "))
    else
        return tostring(lua)
    end
end

function format_value(key)
    local formatting_function = formatting_functions[key]
    if formatting_function then
        return formatting_function(ship)
    else
        local lua = ship[key]
        if type(lua) == "function" then
            return format_lua(lua(ship))
        else
            return format_lua(lua)
        end
    end
end

local sequence = nil
local sequence_position = nil

function interpret_arg(arg)
    local prefix = string.sub(arg, 1, 1)
    if prefix == "@" then
        local enumerator = string.sub(arg, 2)
        local enumerating_function = enumerating_functions[enumerator]
        if enumerating_function and not sequence then
            sequence = enumerating_function()
            sequence_position = 1
        end
    elseif arg == "!@" then
        local ship_key = sequence[sequence_position]
        sequence_position = sequence_position + 1
        ship = Ship(ship_key)
    elseif prefix == "!" then
        local ship_key = string.sub(arg, 2)
        ship = Ship(ship_key)
    elseif prefix == "#" and args.format == "table" then
        return "|-\n"
    elseif prefix == "?" then
        prefix = string.sub(prefix, 1, 1)
        if prefix == "?" then
            local key = string.sub(arg, 3)
            return frame:preprocess(format{ key, ship = ship:name('/') })
        else
            local key = string.sub(arg, 2)
            local value = format_value(key)
            if args.format == "table" then
                return "|" .. value .. "\n"
            else
                return value
            end
        end
    else
        return arg
    end
end

function interpret_args(args_)
    args = args_
    local values = {}
    repeat
        for _, arg in ipairs(args_) do
            local value = interpret_arg(arg)
            if value then
                table.insert(values, value)
            end
        end
    until not sequence or sequence_position > #sequence
    return table.concat(values, args.concat or "")
end

local Calc = {}

function Calc.format(frame_, args_)
    frame = frame_
    return interpret_args(args_ or Utils.getTemplateArgs(frame_).explicit)
end

function Calc.test()
    --[[
    mw.log(Calc.format(nil, {
        format = "table",
        "@base_names",
        "#", "!@", "?id", "?link", "?implementation_date"
    }))
    ]]--
end

return Calc