• 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:View/Quest"

From Kancolle Wiki
Jump to navigation Jump to search
(Fixed edit button. Copied edit button formatting from Module:MapRewards.)
 
(46 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
local _ = require('Module:Core')
 
local _ = require('Module:Core')
local Data = require('Module:Data')
+
-- local Data = require('Module:Data')
local View = require('Module:View')
+
-- local View = require('Module:View')
 +
 
 +
local p = {}
 +
 
 +
p.cache = {}
  
 
-- [[Category:Todo]]:
 
-- [[Category:Todo]]:
Line 7: Line 11:
 
-- * Module:View/Table for table UI tree construction
 
-- * Module:View/Table for table UI tree construction
  
local table_header = [=[{|style="width:100%;text-align:center"
+
local table_header = [=[{|style="width:100%;text-align:center" cellspacing="0"
 
|style="width:4%"|ID
 
|style="width:4%"|ID
|style="width:{{{requirements_width|35%}}}"|Requirements
+
|style="width:35%"|Requirements
 
|style="width:0.5%"|
 
|style="width:0.5%"|
 
|style="width:20%"|[[File:Fuel.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Ammunition.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Steel.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Bauxite.png|30px|link=Tutorial: FAQ#How do resources work in this game?]]
 
|style="width:20%"|[[File:Fuel.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Ammunition.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Steel.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Bauxite.png|30px|link=Tutorial: FAQ#How do resources work in this game?]]
Line 15: Line 19:
 
|style="width:20%"|Rewards
 
|style="width:20%"|Rewards
 
|style="width:0.5%"|
 
|style="width:0.5%"|
|style="width:30%"|Note
+
|style="width:30%"|Note<span class="plainlinks" style="float:right">&#x5b;[https://en.kancollewiki.net/Module:Data/Quest/${category}?action=edit edit]&#x5d;</span>
 
|-]=]
 
|-]=]
  
 
local table_footer = '|}'
 
local table_footer = '|}'
  
local table_row = [=[|- id="${label}" class="quest_A"
+
local table_row = [=[|- id="${label}" class="q${letter}"
 
|rowspan="2"|'''${label}'''
 
|rowspan="2"|'''${label}'''
 
|colspan="11"|'''<span lang="ja">${title}</span>'''<br>''${title_en}''
 
|colspan="11"|'''<span lang="ja">${title}</span>'''<br>''${title_en}''
|- class="quest_details_A"
+
|- class="qd${letter}"
 
|${detail_en}
 
|${detail_en}
 
|
 
|
Line 32: Line 36:
 
|${note}]=]
 
|${note}]=]
  
local function render(args)
+
local table_row_alias = [=[|- id="${label}" class="q${letter}" style="height:50px"
   local category = args.explicit[1]
+
|rowspan="1"|'''${label}'''
   local data = Data.load('Quest', category)
+
|colspan="11"|See [[#${alias_of}|${alias_of}]].
 +
]=]
 +
 
 +
local function render(args, frame)
 +
  -- Filter term ([1] = pattern to match, [2] = data element to match)
 +
   local filter = { (args.explicit['filterMatch'] or nil), (args.explicit['filterGroup'] or nil) }
 +
   local idsList = nil
 +
  if(args.explicit['filterIDs']) then
 +
      idsList = mw.text.split(args.explicit['filterIDs'], '%s')
 +
  end
 
   local result = {}
 
   local result = {}
   table.insert(result, table_header)
+
   for i, category in ipairs(args.explicit) do
  for _, q in ipairs(data) do
+
  if not p.cache[category] then
    table.insert(result, _.format(table_row, q))
+
  p.cache[category] = mw.loadData('Module:Data/Quest/' .. category)
 +
end
 +
local data = p.cache[category]
 +
    table.insert(result, _.format(table_header, { category = category }))
 +
    for i, q in ipairs(data) do
 +
      local proceed = false
 +
      if(idsList) then
 +
        for j, qid in ipairs(idsList) do
 +
          if(q.label == qid) then
 +
              proceed = true
 +
              table.remove(idsList, j)
 +
              break
 +
          end
 +
        end
 +
      end
 +
      if (proceed or (not idsList and not filter[1] and not filter[2]) or (filter[1] and filter[2] and q[filter[2]] and string.match(q[filter[2]], filter[1]))) then
 +
        if(q.alias_of) then
 +
            table.insert(result, _.format(table_row_alias, {
 +
                label = q.label,
 +
                letter = q.letter or q.label:sub(1, 1),
 +
                alias_of = q.alias_of
 +
            }))
 +
        else
 +
            -- table.insert(result, _.format(table_row, q))
 +
            table.insert(result, _.format(table_row, {
 +
              label = q.label,
 +
              title = q.title or '?',
 +
              title_en = q.title_en or '?',
 +
              detail_en = q.detail_en or '?',
 +
              reward_fuel = q.reward_fuel or '?',
 +
              reward_ammo = q.reward_ammo or '?',
 +
              reward_steel = q.reward_steel or '?',
 +
              reward_bauxite = q.reward_bauxite or '?',
 +
              reward_other = q.reward_other or '?',
 +
              note = q.note or '?',
 +
              letter = q.letter or q.label:sub(1, 1)
 +
            }))
 +
        end
 +
      end
 +
    end
 +
    table.insert(result, table_footer)
 
   end
 
   end
   table.insert(result, table_footer)
+
   local s = _.join(result, '\n')
   return _.join(result, '\n')
+
  s = s:gsub("{{Audio|file=([^}]+)}}", '<span class="audio-button">[[Media:%1|Play]]</span>')
 +
  s = s:gsub("{{ShipLink|([^|^}]+)}}", function(e) return string.format('[[%s]]', e:gsub('/', ' ')) end)
 +
  s = s:gsub("{{ShipLink|([^|^}]+)|kai=x}}", function(e) return string.format('[[%s]] (Kai)', e:gsub('/', ' ')) end)
 +
  s = s:gsub("{{ShipLink|([^|^}]+)|kai=x|kai_ni=x}}", function(e) return string.format('[[%s]] (Kai, Kai Ni)', e:gsub('/', ' ')) end)
 +
 
 +
  s = s:gsub("{{ShipLink|[^|^}]+|text=([^|^}]+)|link_class=([^|^}]+)}}", function(text, class) return string.format('[[:Category:%s Class|%s]]', class, text) end)
 +
   s = s:gsub("{{ShipLink|[^|^}]+|[^|^}]+|text=([^|^}]+)|link_class=([^|^}]+)}}", function(text, class) return string.format('[[:Category:%s Class|%s]]', class, text) end)
 +
  s = s:gsub("{{ShipLink|[^|^}]+|[^|^}]+|[^|^}]+|text=([^|^}]+)|link_class=([^|^}]+)}}", function(text, class) return string.format('[[:Category:%s Class|%s]]', class, text) end)
 +
 
 +
  s = s:gsub("{{EquipmentLink|([^|^}]+)}}", "[[%1]]")
 +
  s = s:gsub("{{EquipmentLink|([^|^}]+)|text=true|image=30px}}", "[[%1]]")
 +
  s = s:gsub("{{EquipmentLink|([^|^}]+)|image=30px|text=true}}", "[[%1]]")
 +
  s = s:gsub("{{EquipmentLink|text=true|image=30px|([^|^}]+)}}", "[[%1]]")
 +
  s = s:gsub("{{ItemLink|text=true|image=30px|([^|^}]+)}}", "[[%1]]")
 +
  s = s:gsub("{{color|red|([^}]+)}}", '<span style="color:red">%1</span>')
 +
  return s
 +
end
 +
 
 +
p.render = function(frame)
 +
    return render(frame and _.getTemplateArgs(frame) or {}, frame)
 
end
 
end
  
return View(render)
+
return p

Latest revision as of 04:41, 1 November 2022

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

local _ = require('Module:Core')
-- local Data = require('Module:Data')
-- local View = require('Module:View')

local p = {}

p.cache = {}

-- [[Category:Todo]]:
-- * Support render : Args -> UI tree in Module:View, currently Args -> String
-- * Module:View/Table for table UI tree construction

local table_header = [=[{|style="width:100%;text-align:center" cellspacing="0"
|style="width:4%"|ID
|style="width:35%"|Requirements
|style="width:0.5%"|
|style="width:20%"|[[File:Fuel.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Ammunition.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Steel.png|30px|link=Tutorial: FAQ#How do resources work in this game?]][[File:Bauxite.png|30px|link=Tutorial: FAQ#How do resources work in this game?]]
|style="width:0.5%"|
|style="width:20%"|Rewards
|style="width:0.5%"|
|style="width:30%"|Note<span class="plainlinks" style="float:right">&#x5b;[https://en.kancollewiki.net/Module:Data/Quest/${category}?action=edit edit]&#x5d;</span>
|-]=]

local table_footer = '|}'

local table_row = [=[|- id="${label}" class="q${letter}"
|rowspan="2"|'''${label}'''
|colspan="11"|'''<span lang="ja">${title}</span>'''<br>''${title_en}''
|- class="qd${letter}"
|${detail_en}
|
|${reward_fuel} / ${reward_ammo} / ${reward_steel} / ${reward_bauxite}
|
|''${reward_other}''
|
|${note}]=]

local table_row_alias = [=[|- id="${label}" class="q${letter}" style="height:50px"
|rowspan="1"|'''${label}'''
|colspan="11"|See [[#${alias_of}|${alias_of}]].
]=]

local function render(args, frame)
  -- Filter term ([1] = pattern to match, [2] = data element to match)
  local filter = { (args.explicit['filterMatch'] or nil), (args.explicit['filterGroup'] or nil) }
  local idsList = nil
  if(args.explicit['filterIDs']) then
      idsList = mw.text.split(args.explicit['filterIDs'], '%s')
  end
  local result = {}
  for i, category in ipairs(args.explicit) do
  	if not p.cache[category] then
  		p.cache[category] = mw.loadData('Module:Data/Quest/' .. category)
	end
	local data = p.cache[category]
    table.insert(result, _.format(table_header, { category = category }))
    for i, q in ipairs(data) do
      local proceed = false
      if(idsList) then
         for j, qid in ipairs(idsList) do
           if(q.label == qid) then
              proceed = true
              table.remove(idsList, j)
              break
           end
         end
      end
      if (proceed or (not idsList and not filter[1] and not filter[2]) or (filter[1] and filter[2] and q[filter[2]] and string.match(q[filter[2]], filter[1]))) then
         if(q.alias_of) then
            table.insert(result, _.format(table_row_alias, {
                label = q.label,
                letter = q.letter or q.label:sub(1, 1),
                alias_of = q.alias_of
            }))
         else
            -- table.insert(result, _.format(table_row, q))
            table.insert(result, _.format(table_row, {
              label = q.label,
              title = q.title or '?',
              title_en = q.title_en or '?',
              detail_en = q.detail_en or '?',
              reward_fuel = q.reward_fuel or '?',
              reward_ammo = q.reward_ammo or '?',
              reward_steel = q.reward_steel or '?',
              reward_bauxite = q.reward_bauxite or '?',
              reward_other = q.reward_other or '?',
              note = q.note or '?',
              letter = q.letter or q.label:sub(1, 1)
            }))
        end
      end 
    end
    table.insert(result, table_footer)
  end
  local s = _.join(result, '\n')
  s = s:gsub("{{Audio|file=([^}]+)}}", '<span class="audio-button">[[Media:%1|Play]]</span>')
  s = s:gsub("{{ShipLink|([^|^}]+)}}", function(e) return string.format('[[%s]]', e:gsub('/', ' ')) end)
  s = s:gsub("{{ShipLink|([^|^}]+)|kai=x}}", function(e) return string.format('[[%s]] (Kai)', e:gsub('/', ' ')) end)
  s = s:gsub("{{ShipLink|([^|^}]+)|kai=x|kai_ni=x}}", function(e) return string.format('[[%s]] (Kai, Kai Ni)', e:gsub('/', ' ')) end)
  
  s = s:gsub("{{ShipLink|[^|^}]+|text=([^|^}]+)|link_class=([^|^}]+)}}", function(text, class) return string.format('[[:Category:%s Class|%s]]', class, text) end)
  s = s:gsub("{{ShipLink|[^|^}]+|[^|^}]+|text=([^|^}]+)|link_class=([^|^}]+)}}", function(text, class) return string.format('[[:Category:%s Class|%s]]', class, text) end)
  s = s:gsub("{{ShipLink|[^|^}]+|[^|^}]+|[^|^}]+|text=([^|^}]+)|link_class=([^|^}]+)}}", function(text, class) return string.format('[[:Category:%s Class|%s]]', class, text) end)

  s = s:gsub("{{EquipmentLink|([^|^}]+)}}", "[[%1]]")
  s = s:gsub("{{EquipmentLink|([^|^}]+)|text=true|image=30px}}", "[[%1]]")
  s = s:gsub("{{EquipmentLink|([^|^}]+)|image=30px|text=true}}", "[[%1]]")
  s = s:gsub("{{EquipmentLink|text=true|image=30px|([^|^}]+)}}", "[[%1]]")
  s = s:gsub("{{ItemLink|text=true|image=30px|([^|^}]+)}}", "[[%1]]")
  s = s:gsub("{{color|red|([^}]+)}}", '<span style="color:red">%1</span>')
  return s
end

p.render = function(frame)
    return render(frame and _.getTemplateArgs(frame) or {}, frame)
end

return p