Changes

no edit summary
Line 1: Line 1:  
local U = require("Module:Core")
 
local U = require("Module:Core")
local Formatting = require("Module:Formatting")
+
--local Formatting = require("Module:Formatting")
local Equipment = require("Module:Equipment")
+
--local Equipment = require("Module:Equipment")
local Iterator = require("Module:Iterator")
+
--local Iterator = require("Module:Iterator")
local ShipIterator = require("Module:ShipIterator")
+
--local ShipCapabilities = require("Module:ShipCapabilities")
local ShipCapabilities = require("Module:ShipCapabilities")
+
--local ShipCardKai = require("Module:ShipCardKai")
local ShipCardKai = require("Module:ShipCardKai")
+
--local ShipBattleCardKai = require("Module:ShipBattleCardKai")
local ShipBattleCardKai = require("Module:ShipBattleCardKai")
+
--local Combat = require("Module:CalcCombat")
local Combat = require("Module:CalcCombat")
+
--local EquipmentCardKai = require("Module:EquipmentCardKai")
local EquipmentCardKai = require("Module:EquipmentCardKai")
+
--local EquipmentGraphicKai = require("Module:EquipmentGraphicKai")
local EquipmentGraphicKai = require("Module:EquipmentGraphicKai")
+
--local EquipmentCollection = require("Module:Collection/Equipment")
local EquipmentCollection = require("Module:Collection/Equipment")
+
--local AllEquipmentCollection = require("Module:Collection/EquipmentByApiId")
local AllEquipmentCollection = require("Module:Collection/EquipmentByApiId")
+
--local Development = require("Module:Development")
local Development = require("Module:Development")
+
--local ShipsByApiId = require("Module:Collection/ShipsByApiId")
local ShipsByApiId = require("Module:Collection/ShipsByApiId")
+
local Ship = require("Module:Ship")
    
local args = nil
 
local args = nil
local Ship = nil
+
-- local Ship = nil
 
local ship = nil
 
local ship = nil
 
local shipCapabilities = {}
 
local shipCapabilities = {}
 
local target = nil
 
local target = nil
 
local equipment = nil
 
local equipment = nil
local filterArg = {}
+
local filterArgs = {}
 
local sorted = false
 
local sorted = false
 
local sequence = nil
 
local sequence = nil
Line 27: Line 27:  
local sequence_position = nil
 
local sequence_position = nil
 
local env = {}
 
local env = {}
local implicitTrigger = true
      
local enumerating_functions = {
 
local enumerating_functions = {
 
     args = function() return mw.text.split(args.args, "%s*,%s*") end,
 
     args = function() return mw.text.split(args.args, "%s*,%s*") end,
     base_names = function() return ShipIterator.baseForms end,
+
     base_names = function() return require('Module:Collection/ShipsBase') end,
     all_names = function() return ShipIterator.allForms end,
+
     all_names = function() return require('Module:Collection/Ships') end,
     enemy = function() return ShipIterator.enemyForms end,
+
     enemy = function() return require('Module:Collection/EnemyShips') end,
 
     equipment = function() return U.imap(EquipmentCollection, function(e) return e._name end) end,
 
     equipment = function() return U.imap(EquipmentCollection, function(e) return e._name end) end,
 
     allEquipment = function()
 
     allEquipment = function()
Line 116: Line 115:  
     end,
 
     end,
 
     icon_damaged = function(obj) return string.format("[[File:Ship Icon %s Damaged.png|100px]]", obj:name()) end,
 
     icon_damaged = function(obj) return string.format("[[File:Ship Icon %s Damaged.png|100px]]", obj:name()) end,
 +
    link = function(obj) return string.format("[[%s]]", obj:name()) end,
 +
    --[[
 
     link = function(obj)
 
     link = function(obj)
 
         if obj._dummy then
 
         if obj._dummy then
Line 127: Line 128:  
         end
 
         end
 
     end,
 
     end,
 +
    ]]--
 
     class = function(ship) return ship:class() and ship:class():name() or "?" end,
 
     class = function(ship) return ship:class() and ship:class():name() or "?" end,
 
     implementation_date = function(ship)
 
     implementation_date = function(ship)
Line 193: Line 195:  
}
 
}
    +
--[[
 
local function addFormattingFunctions(name, table)
 
local function addFormattingFunctions(name, table)
 
     for k, v in pairs(table) do
 
     for k, v in pairs(table) do
Line 201: Line 204:  
addFormattingFunctions("FitData", require("Module:CalcFit"))
 
addFormattingFunctions("FitData", require("Module:CalcFit"))
 
addFormattingFunctions("Assets", require("Module:CalcAsset"))
 
addFormattingFunctions("Assets", require("Module:CalcAsset"))
 +
]]--
    
local function format_value(key, ship, target)
 
local function format_value(key, ship, target)
Line 207: Line 211:  
         return formatting_function(ship, target)
 
         return formatting_function(ship, target)
 
     end
 
     end
 +
    --[[
 
     if shipCapabilities[key] then
 
     if shipCapabilities[key] then
 
         local a, b = shipCapabilities[key](shipCapabilities)
 
         local a, b = shipCapabilities[key](shipCapabilities)
 
         return format_lua(b or a)
 
         return format_lua(b or a)
 
     end
 
     end
     if ship then
+
     ]]--
        local lua = ship[key]
+
    local lua = ship[key]
        if type(lua) == "function" then
+
    if type(lua) == "function" then
            return format_lua(lua(ship))
+
        return format_lua(lua(ship))
        else
+
    else
            return format_lua(lua)
+
        return format_lua(lua)
        end
   
     end
 
     end
 
end
 
end
Line 225: Line 229:  
end
 
end
    +
--[[
 
local function interpret_setter(s)
 
local function interpret_setter(s)
 
     local kv = mw.text.split(s, "%s*~%s*")
 
     local kv = mw.text.split(s, "%s*~%s*")
Line 268: Line 273:  
end
 
end
   −
local function trigger(implicit)
+
local function trigger()
implicitTrigger = implicit
   
     local ship_key = sequence[sequence_position]
 
     local ship_key = sequence[sequence_position]
    ship_key = tonumber(ship_key) or ship_key
   
     sequence_position = sequence_position + 1
 
     sequence_position = sequence_position + 1
 
     ship = Ship(ship_key)
 
     ship = Ship(ship_key)
Line 286: Line 289:  
     local prefix = string.sub(arg, 1, 1)
 
     local prefix = string.sub(arg, 1, 1)
 
     local prefix2 = string.sub(arg, 1, 2)
 
     local prefix2 = string.sub(arg, 1, 2)
     if arg == "_" then
+
     if arg == "-" then return format_arg("")
        return false
+
elseif arg == "!@" then trigger(false)
    elseif arg == "-" then
  −
        return format_arg("")
  −
    elseif prefix == "~" then
  −
    table.insert(filterArg, string.sub(arg, 2))
  −
    elseif 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
  −
            sequence_length = #sequence
  −
        elseif not sequence then
  −
            local buildIterator = Iterator[enumerator]
  −
            if buildIterator then
  −
                sequence = {}
  −
                sequence_position = 1
  −
                local iterator = buildIterator(args)
  −
                while iterator.next() do
  −
                    table.insert(sequence, iterator.current())
  −
                end
  −
                sequence_length = #sequence
  −
            end
  −
        end
  −
        if args.sort and sequence and not sorted then
  −
        sorted = true
  −
        local sorts = mw.text.split(args.sort, "%s*,%s*")
  −
        table.sort(sequence, function(a, b)
  −
        local a = Ship(a)
  −
        local b = Ship(b)
  −
        for _, sort in ipairs(sorts) do
  −
      local x = a[sort](a)
  −
      local y = b[sort](b)
  −
      if x < y then return true end
  −
      if x > y then return false end
  −
        end
  −
return false
  −
end)
  −
        end
  −
    elseif arg == "!@" then
  −
trigger(false)
   
     elseif prefix2 == "!!" then
 
     elseif prefix2 == "!!" then
 
         local key = string.sub(arg, 3)
 
         local key = string.sub(arg, 3)
Line 355: Line 318:  
     elseif prefix == "#" and args.format == "table" then
 
     elseif prefix == "#" and args.format == "table" then
 
         return "|-\n"
 
         return "|-\n"
     elseif prefix == "?" then
+
     if prefix == "?" then
    if implicitTrigger and sequence then
  −
    trigger(true)
  −
    end
   
         local prefix2 = string.sub(arg, 1, 2)
 
         local prefix2 = string.sub(arg, 1, 2)
         if prefix2 == "??" then
+
         if prefix2 == "??" then return format_arg(format_value(string.sub(arg, 3), target, ship))
            return format_arg(format_value(string.sub(arg, 3), target, ship))
+
         elseif prefix2 == "?#" then return "?# is unimplemented" -- frame:preprocess(format{string.sub(arg, 3), this = env[this] or ""})
         elseif prefix2 == "?#" then
  −
            return "?# is unimplemented" -- frame:preprocess(format{string.sub(arg, 3), this = env[this] or ""})
   
         else
 
         else
        if #filterArg > 0 then
+
if test then
        local test = true
+
return format_arg(format_value(string.sub(arg, 2), ship, target))
        for _, e in ipairs(filterArg) do
+
else
        local kv = mw.text.split(e, "%s*~%s*")
+
return nil
        local xs = mw.text.split(kv[2], "%s*,%s*")
+
end
        local test2 = false
  −
        for _, e2 in ipairs(xs) do
  −
if tostring(ship[kv[1]](ship)) == e2 then
  −
        test2 = true
  −
        break
  −
        end
  −
        end
  −
        if not test2 then
  −
        test = false
  −
        break
  −
        end
  −
        end
  −
        if test then
  −
        return format_arg(format_value(string.sub(arg, 2), ship, target))
  −
        else
  −
        return nil
  −
        end
  −
        else
  −
            return format_arg(format_value(string.sub(arg, 2), ship, target))
  −
            end
  −
        end
   
     else
 
     else
 
         return format_arg(arg)
 
         return format_arg(arg)
Line 396: Line 333:  
end
 
end
   −
local function interpret_args(args_)
  −
args = args_
   
     Ship = args.enemy and require("Module:EnemyShip") or require("Module:Ship")
 
     Ship = args.enemy and require("Module:EnemyShip") or require("Module:Ship")
 
     if args.from and args.to then
 
     if args.from and args.to then
Line 406: Line 341:  
         sequence_position = 1
 
         sequence_position = 1
 
     end
 
     end
     local i = 1
+
 
 +
        else
 +
            local buildIterator = Iterator[enumerator]
 +
            if buildIterator then
 +
                sequence = {}
 +
                sequence_position = 1
 +
                local iterator = buildIterator(args)
 +
                while iterator.next() do
 +
                    table.insert(sequence, iterator.current())
 +
                end
 +
                sequence_length = #sequence
 +
            end
 +
 
 +
]]--
 +
 
 +
local function interpret(args_)
 +
args = args_
 +
     for _, arg in ipairs(args) do
 +
    local prefix = string.sub(arg, 1, 1)
 +
    if prefix == "~" then
 +
    local kv = mw.text.split(string.sub(arg, 2), "%s*~%s*")
 +
    table.insert(filterArgs, kv)
 +
    end
 +
    end
 +
    local actions = {}
 +
    for _, arg in ipairs(args) do
 +
    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 then
 +
        sequence = {}
 +
        for _, e in ipairs(enumerating_function()) do
 +
        local ship = Ship(e)
 +
        if #filterArgs > 0 then
 +
    local test = true
 +
for _, kv in ipairs(filterArgs) do
 +
--local xs = mw.text.split(kv[2], "%s*,%s*")
 +
--local test2 = false
 +
--for _, e2 in ipairs(xs) do
 +
if tostring(ship[kv[1]](ship)) ~= kv[2] then
 +
--test2 = true
 +
--break
 +
--end
 +
--end
 +
--if not test2 then
 +
test = false
 +
break
 +
end
 +
end
 +
if test then
 +
table.insert(sequence, ship)
 +
end
 +
        else
 +
        table.insert(sequence, ship)
 +
        end
 +
        end
 +
        sequence_position = 1
 +
sequence_length = #sequence
 +
        end
 +
    elseif prefix == "?" then
 +
    table.insert(actions, string.sub(arg, 2))
 +
    end
 +
    end
 +
    if args.sort and sequence then
 +
    local sorts = mw.text.split(args.sort, "%s*,%s*")
 +
    table.sort(sequence, function(a, b)
 +
    for _, sort in ipairs(sorts) do
 +
  local x = a[sort](a)
 +
  local y = b[sort](b)
 +
  if x < y then return true end
 +
  if x > y then return false end
 +
    end
 +
return false
 +
end)
 +
    end
 
     local values = {}
 
     local values = {}
 
     repeat
 
     repeat
         for _, arg in ipairs(args) do
+
    if sequence then
             local value = interpret_arg(arg)
+
    ship = sequence[sequence_position]
 +
    sequence_position = sequence_position + 1
 +
    end
 +
         for _, arg in ipairs(actions) do
 +
             local value = format_arg(format_value(arg, ship)) -- interpret_arg(arg)
 
             if value then
 
             if value then
 
                 table.insert(values, value)
 
                 table.insert(values, value)
 
             end
 
             end
            i = i + 1
   
         end
 
         end
 
     until not sequence_length or sequence_position > sequence_length
 
     until not sequence_length or sequence_position > sequence_length
Line 420: Line 433:  
end
 
end
   −
return { format = function(frame) return interpret_args(U.getTemplateArgs(frame).explicit) end }
+
return {
 +
format = function(frame) return interpret(U.getTemplateArgs(frame).explicit) end,
 +
test = function() mw.log(interpret({"@base_names", "~is_battleship~true", "?link", sort = "type,id"})) end,
 +
}
cssedit, gkautomate
7,064

edits