Line 2: |
Line 2: |
| local format = require("Module:StringInterpolation").format | | local format = require("Module:StringInterpolation").format |
| local find = require("Module:Utils").find | | local find = require("Module:Utils").find |
| + | local BaseData = require("Module:BaseData") |
| | | |
− | local templates = { | + | local MapBranchingTable = BaseData{ |
| + | |
| + | _grammar = { |
| + | nodes = "^(%S+)%s*->%s*(%S+)$", |
| + | node_and_color = "^(%S+)/(%S+)$", |
| + | digit_node = "^%d$", |
| + | }, |
| + | |
| + | _id = "mapbranchingtable", -- not supporting unique ids for now |
| + | _title = "Branching Rules", |
| + | _width = "auto", |
| + | _start = "'''Start'''", |
| | | |
| -- .branching-table is defined in MediaWiki:Common.css | | -- .branching-table is defined in MediaWiki:Common.css |
− | table_header = [[{| class="wikitable typography-xl-optout branching-table" style="width:${width};" | + | _template = [[{| class="wikitable typography-xl-optout branching-table" style="width:${width};" |
| |- class="mw-customtoggle-${id}" style="cursor:pointer;" | | |- class="mw-customtoggle-${id}" style="cursor:pointer;" |
− | !colspan="3"|Branching Rules | + | !colspan="3"|${title} |
| |- class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}" | | |- class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}" |
− | !colspan="2"|Nodes||Rules]], | + | !colspan="2"|Nodes||Rules |
| + | ${rows} |
| + | |}]], |
| | | |
− | table_footer = "|}", | + | _row_start_template = [[|- class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}" |
− | | |
− | table_row_start = [[|- class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}"
| |
| |rowspan="${rowspan}" style="text-align:center;vertical-align:middle;width:10%"|${from}]], | | |rowspan="${rowspan}" style="text-align:center;vertical-align:middle;width:10%"|${from}]], |
| | | |
− | table_row_separator = [[|- class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}" | + | _row_separator_template = [[|- class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}" |
| ]], | | ]], |
| | | |
− | table_row = [[${separator}|class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}" style="text-align:center;width:10%;"|${to} | + | _row_template = [[${separator}|class="mw-collapsible mw-collapsed" id="mw-customcollapsible-${id}" style="text-align:center;width:10%;"|${to} |
| | | | | |
| ${rules}]], | | ${rules}]], |
| | | |
| -- .kcRoute is defined in MediaWiki:Common.css | | -- .kcRoute is defined in MediaWiki:Common.css |
− | node = [[<div class="kcRoute" style="vertical-align:middle"><div class="kcRouteNode" style="background:${color};">${label}</div></div>]], | + | _node_template = [[<div class="kcRoute" style="vertical-align:middle"><div class="kcRouteNode" style="background:${color};">${label}</div></div>]], |
| | | |
− | } | + | _node_colors = { |
| + | grey = "grey", |
| + | battle = "#FF1744", -- Red A400 |
| + | resource = "#64DD17", -- Light Green A700 |
| + | storm = "#EA80FC", -- Purple A100 |
| + | empty = "#40C4FF", -- Light Blue A200 |
| + | }, |
| | | |
− | local node_colors = {
| |
− | grey = "grey",
| |
− | battle = "#FF1744", -- Red A400
| |
− | resource = "#64DD17", -- Light Green A700
| |
− | storm = "#EA80FC", -- Purple A100
| |
− | empty = "#40C4FF", -- Light Blue A200
| |
| } | | } |
| | | |
− | function formatNode(label, color) | + | function make_id_from_title(title) |
− | return label == "0" and "'''Start'''" or format{ | + | return title:gsub("%s", ""):lower() |
− | templates.node,
| |
− | label = label,
| |
− | color = label:match("^%d$") and node_colors.grey or node_colors[color] or color or node_colors.battle
| |
− | }
| |
| end | | end |
| | | |
− | -- not supporting unique ids for now
| + | function MapBranchingTable:parse(args) |
− | function defaultId(args) | + | self._vars = { |
− | return "mapbranchingtable" | + | id = args.id or args.title and make_id_from_title(args.title) or self._id, |
− | end
| + | title = args.title or self._title, |
− | | + | width = args.width or self._width, |
− | function formatTable(args)
| + | branching = { index = {} }, |
− | local branching = { index = {} }
| + | } |
| + | local branching = self._vars.branching |
| for route, rules in pairs(args) do | | for route, rules in pairs(args) do |
− | local from, to = route:match("^(%S+)%s*->%s*(%S+)$") | + | if type(route) ~= "number" then |
− | if from and to then
| + | local from, to = route:match(self._grammar.nodes) |
− | local from_color = from:match("^%S+/(%S+)$")
| + | if from and to then |
− | local to_color = to:match("^%S+/(%S+)$")
| + | local from_, from_color = from:match(self._grammar.node_and_color) |
− | from = from_color and from:match("^(%S+)/") or from
| + | local to_, to_color = to:match(self._grammar.node_and_color) |
− | to = to_color and to:match("^(%S+)/") or to
| + | from = from_color and from_ or from |
− | if not find(branching.index, from) then
| + | to = to_color and to_ or to |
− | table.insert(branching.index, from)
| + | if not find(branching.index, from) then |
− | end
| + | table.insert(branching.index, from) |
− | if not branching[from] then
| + | end |
− | branching[from] = { color = from_color, index = {} }
| + | if not branching[from] then |
− | end
| + | branching[from] = { color = from_color, index = {} } |
− | branching[from][to] = { color = to_color, rules = rules }
| + | end |
− | if not find(branching[from].index, to) then
| + | branching[from][to] = { color = to_color, rules = rules } |
− | table.insert(branching[from].index, to)
| + | if not find(branching[from].index, to) then |
| + | table.insert(branching[from].index, to) |
| + | end |
| end | | end |
| end | | end |
Line 75: |
Line 86: |
| table.sort(branching[from].index) | | table.sort(branching[from].index) |
| end | | end |
− | local id = args.id or defaultId(args) | + | end |
| + | |
| + | function MapBranchingTable:format_node(label, color) |
| + | return label == "0" and self._start or format{ |
| + | self._node_template, |
| + | label = label, |
| + | color = label:match(self._grammar.digit_node) |
| + | and self._node_colors.grey |
| + | or self._node_colors[color] |
| + | or color |
| + | or self._node_colors.battle |
| + | } |
| + | end |
| + | |
| + | function MapBranchingTable:prepare_rows() |
| + | local branching = self._vars.branching |
| local rows = {} | | local rows = {} |
− | table.insert(rows, format{
| |
− | templates.table_header,
| |
− | width = args.width or "auto",
| |
− | id = id,
| |
− | })
| |
| for _, from in ipairs(branching.index) do | | for _, from in ipairs(branching.index) do |
| table.insert(rows, format{ | | table.insert(rows, format{ |
− | templates.table_row_start, | + | self._row_start_template, |
| rowspan = #branching[from].index, | | rowspan = #branching[from].index, |
− | from = formatNode(from, branching[from].color), | + | from = self:format_node(from, branching[from].color), |
− | id = id, | + | id = self._vars.id, |
| }) | | }) |
| local first = true | | local first = true |
| for _, to in ipairs(branching[from].index) do | | for _, to in ipairs(branching[from].index) do |
| table.insert(rows, format{ | | table.insert(rows, format{ |
− | templates.table_row, | + | self._row_template, |
− | separator = first and "" or format{templates.table_row_separator, id = id}, | + | separator = first and "" or format{self._row_separator_template, id = self._vars.id}, |
− | to = formatNode(to, branching[from][to].color), | + | to = self:format_node(to, branching[from][to].color), |
| rules = branching[from][to].rules, | | rules = branching[from][to].rules, |
− | id = id, | + | id = self._vars.id, |
| }) | | }) |
| first = false | | first = false |
| end | | end |
| end | | end |
− | table.insert(rows, templates.table_footer) | + | self._vars.rows = table.concat(rows, "\n") |
− | return table.concat(rows, "\n")
| |
| end | | end |
| | | |
− | local MapBranchingTable = {}
| + | function MapBranchingTable:format(args) |
| + | self:parse(args) |
| + | self:prepare_rows() |
| + | return format(self._template, self._vars) |
| + | end |
| | | |
− | function MapBranchingTable.format(frame, args_) | + | function MapBranchingTable.Table(frame, args) |
− | local args = args_ or getArgs{frame = frame:getParent()} | + | return MapBranchingTable:format(args or getArgs{frame = frame:getParent()}) |
− | return formatTable(args)
| |
| end | | end |
| | | |
− | -- MapBranchingTable.t = MapBranchingTable.format(nil, { ["0 -> 1"] = "Fixed route", ["1 -> B/green"] = "Random", ["1 -> C"] = "Random" }) | + | -- MapBranchingTable.t = MapBranchingTable.Table(nil, { ["0 -> 1"] = "Fixed route", ["1 -> B/green"] = "Random", ["1 -> C"] = "Random", ["title"] = "A Custom Title", "?" }) |
| | | |
| return MapBranchingTable | | return MapBranchingTable |