Line 1: |
Line 1: |
− | local Utils = require('Module:Utils') | + | local U = require('Module:Core') |
| + | local Utils = require('Module:Core') |
| + | local format = require('Module:Core').format |
| local getArgs = require('Module:GetArgs') | | local getArgs = require('Module:GetArgs') |
− | local Ship = require('Module:Ship')
| |
| | | |
− | local seiyuus = { | + | local artists = require('Module:Collection/Artists') |
− | ["Bridcut Sarah Emi"] = {
| + | local seiyuus = require('Module:Collection/Seiyuus') |
− | url = "http://myanimelist.net/people/19371/Sarah_Emi_Bridcut",
| + | local types = require('Module:Collection/ShipsByType') |
− | ships = {"Hatsukaze", "Kumano", "Maikaze", "Suzuya", "Yuubari", },
| |
− | },
| |
− | ["Endou Aya"] = {
| |
− | url = "http://myanimelist.net/people/54/Aya_Endou",
| |
− | ships = {"Bismarck", "Z1", "Z3", },
| |
− | },
| |
− | ["Fujita Saki"] = {
| |
− | url = "http://myanimelist.net/people/504",
| |
− | ships = {"Akagi", "Fusou", "Kagerou", "Kuroshio", "Shiranui", "Tokitsukaze", "Yamashiro", "Yukikaze", },
| |
− | },
| |
− | ["Hayami Saori"] = {
| |
− | url = "http://myanimelist.net/people/869/Saori_Hayami",
| |
− | ships = {"Graf Zeppelin", "Hagikaze", },
| |
− | },
| |
− | ["Hayasaka Kozue"] = {
| |
− | url = null,
| |
− | ships = {"Akebono", "Oboro", "Sazanami", "Ushio", },
| |
− | },
| |
− | ["Hidaka Rina"] = {
| |
− | url = "http://myanimelist.net/people/5250/Rina_Hidaka",
| |
− | ships = {"Fumizuki", "Kikuzuki", "Kisaragi", "Mikazuki", "Mochizuki", "Mutsuki", "Nagatsuki", "Ryuujou", "Satsuki", "Uzuki", "Yayoi", },
| |
− | },
| |
− | ["Horie Yui"] = {
| |
− | url = "http://myanimelist.net/people/28/Yui_Horie",
| |
− | ships = {"Amagi", "Asagumo", "Yamagumo", },
| |
− | },
| |
− | ["Iguchi Yuka"] = {
| |
− | url = "http://myanimelist.net/people/885/Yuka_Iguchi",
| |
− | ships = {"Chikuma", "Isuzu", "Kaga", "Nagara", "Natori", "Tatsuta", "Tenryuu", "Tone", },
| |
− | },
| |
− | ["Ise Mariya"] = {
| |
− | url = "http://myanimelist.net/people/655/Mariya_Ise",
| |
− | ships = {"I-401", },
| |
− | },
| |
− | ["Ishigami Shizuka"] = {
| |
− | url = "http://myanimelist.net/people/28755/Shizuka_Ishigami",
| |
− | ships = {"Kawakaze", "Mizuho", "Umikaze", },
| |
− | },
| |
− | ["Kanemoto Hisako"] = {
| |
− | url = "http://myanimelist.net/people/8555/Hisako_Kanemoto",
| |
− | ships = {"Harusame", "Hayashimo", "Kiyoshimo", },
| |
− | },
| |
− | ["Kawasumi Ayako"] = {
| |
− | url = "http://myanimelist.net/people/13/Ayako_Kawasumi",
| |
− | ships = {"Isokaze", "Ooyodo", "Unryuu", },
| |
− | },
| |
− | ["Kayano Ai"] = {
| |
− | url = "http://myanimelist.net/people/10765/",
| |
− | ships = {"Arashi", "Asashimo", "Kashima", "Katori", "Katsuragi", "Ro-500", "U-511", },
| |
− | },
| |
− | ["Kitou Akari"] = {
| |
− | url = "https://ja.wikipedia.org/wiki/%E9%AC%BC%E9%A0%AD%E6%98%8E%E9%87%8C",
| |
− | ships = {"Kazagumo", "Libeccio", },
| |
− | },
| |
− | ["Kobayashi Motoko"] = {
| |
− | url = "http://myanimelist.net/people/12285/Motoko_Kobayashi",
| |
− | ships = {"Hatsuharu", "Hatsushimo", "Nenohi", "Wakaba", },
| |
− | },
| |
− | ["Komatsu Mana"] = {
| |
− | url = "http://myanimelist.net/people/12941/Mana_Komatsu",
| |
− | ships = {"Hamakaze", "Tanikaze", "Urakaze", "Zuihou", },
| |
− | },
| |
− | ["Komatsu Mikako"] = {
| |
− | url = "http://myanimelist.net/people/10071/Komatsu_Mikako",
| |
− | ships = {"Akitsushima", "Teruzuki", },
| |
− | },
| |
− | ["Kuno Misaki"] = {
| |
− | url = "http://myanimelist.net/people/11641/Misaki_Kuno",
| |
− | ships = {"Littorio", "Roma", "Takanami", },
| |
− | },
| |
− | ["Misato"] = {
| |
− | url = "http://myanimelist.net/people/12759/Misato",
| |
− | ships = {"I-19", "I-8", "Musashi", },
| |
− | },
| |
− | ["Miyagawa Wakana"] = {
| |
− | url = "http://www.animenewsnetwork.com.au/encyclopedia/people.php?id=98235",
| |
− | ships = {"Arare", "Arashio", "Asashio", "Chitose", "Chiyoda", "Kasumi", "Michishio", "Ooshio", },
| |
− | },
| |
− | ["Nakajima Megumi"] = {
| |
− | url = "http://myanimelist.net/people/1105/Megumi_Nakajima",
| |
− | ships = {"I-168", "I-58", "Kinugasa", "Mikuma", },
| |
− | },
| |
− | ["Nomizu Iori"] = {
| |
− | url = "http://myanimelist.net/people/8956/Iori_Nomizu",
| |
− | ships = {"Abukuma", "Hayasui", "Kinu", "Shoukaku", "Zuikaku", },
| |
− | },
| |
− | ["Noto Mamiko"] = {
| |
− | url = "http://myanimelist.net/people/40/Mamiko_Noto",
| |
− | ships = {"Akitsu Maru", "Maruyu", "Taihou", },
| |
− | },
| |
− | ["Ogura Yui"] = {
| |
− | url = "http://myanimelist.net/people/10981/Yui_Ogura",
| |
− | ships = {"Amatsukaze", "Ryuuhou", "Taigei", },
| |
− | },
| |
− | ["Ootsubo Yuka"] = {
| |
− | url = "http://myanimelist.net/people/12452/Yuka_Ootsubo",
| |
− | ships = {"Furutaka", "Hiyou", "Hyuuga", "Ise", "Junyou", "Kako", "Kitakami", "Ooi", },
| |
− | },
| |
− | ["Ozawa Ari"] = {
| |
− | url = "http://myanimelist.net/people/27395/Ari_Ozawa",
| |
− | ships = {"Akizuki", "Nowaki", "Prinz Eugen", },
| |
− | },
| |
− | ["Sakura Ayane"] = {
| |
− | url = "http://myanimelist.net/people/11622/Ayane_Sakura",
| |
− | ships = {"Jintsuu", "Kiso", "Kuma", "Mutsu", "Nagato", "Naka", "Sendai", "Shimakaze", "Tama", },
| |
− | },
| |
− | ["Suzaki Aya"] = {
| |
− | url = "http://myanimelist.net/people/19834/Aya_Suzaki",
| |
− | ships = {"Akatsuki", "Aoba", "Hibiki", "Houshou", "Ikazuchi", "Inazuma", "Mogami", },
| |
− | },
| |
− | ["Taketatsu Ayana"] = {
| |
− | url = "http://myanimelist.net/people/6996/Ayana_Taketatsu",
| |
− | ships = {"Akigumo", "Makigumo", "Naganami", "Yamato", "Yuugumo", },
| |
− | },
| |
− | ["Taneda Risa"] = {
| |
− | url = "http://myanimelist.net/people/16135/Risa_Taneda",
| |
− | ships = {"Akashi", "Ashigara", "Haguro", "Myoukou", "Nachi", "Samidare", "Shouhou", "Suzukaze", },
| |
− | },
| |
− | ["Tanibe Yumi"] = {
| |
− | url = "http://myanimelist.net/people/35951",
| |
− | ships = {"Murasame", "Shigure", "Shiratsuyu", "Yura", "Yuudachi", },
| |
− | },
| |
− | ["Touyama Nao"] = {
| |
− | url = "http://myanimelist.net/people/11184/Nao_Touyama",
| |
− | ships = {"Atago", "Ayanami", "Choukai", "Haruna", "Hiei", "Kirishima", "Kongou", "Maya", "Shikinami", "Takao", },
| |
− | },
| |
− | ["Uesaka Sumire"] = {
| |
− | url = "http://myanimelist.net/people/14441/Sumire_Uesaka",
| |
− | ships = {"Fubuki", "Hatsuyuki", "Hiryuu", "Isonami", "Miyuki", "Murakumo", "Shirayuki", "Souryuu", },
| |
− | },
| |
− | ["Yamada Yuki"] = {
| |
− | url = "http://myanimelist.net/people/28053/Yuki_Yamada",
| |
− | ships = {"Agano", "Noshiro", "Sakawa", "Yahagi", },
| |
− | },
| |
− | }
| |
| | | |
− | local types = { | + | local function requireSeasonModule(name) |
− | ["Destroyers"] = {
| + | local success, data = U.requireModule('Data/Season/' .. name) |
− | ships = { "Akatsuki", "Akebono", "Akigumo", "Akizuki", "Amatsukaze", "Arare", "Arashi", "Arashio", "Asagumo", "Asashimo", "Asashio", "Ayanami", "Fubuki", "Fumizuki", "Hagikaze", "Hamakaze", "Harusame", "Hatsuharu", "Hatsukaze", "Hatsushimo", "Hatsuyuki", "Hayashimo", "Hibiki", "Ikazuchi", "Inazuma", "Isokaze", "Isonami", "Kagerou", "Kasumi", "Kawakaze", "Kazagumo", "Kikuzuki", "Kisaragi", "Kiyoshimo", "Kuroshio", "Libeccio", "Maikaze", "Makigumo", "Michishio", "Mikazuki", "Miyuki", "Mochizuki", "Murakumo", "Murasame", "Mutsuki", "Naganami", "Nagatsuki", "Nenohi", "Nowaki", "Oboro", "Ooshio", "Samidare", "Satsuki", "Sazanami", "Shigure", "Shikinami", "Shimakaze", "Shiranui", "Shiratsuyu", "Shirayuki", "Suzukaze", "Takanami", "Tanikaze", "Teruzuki", "Tokitsukaze", "Umikaze", "Urakaze", "Ushio", "Uzuki", "Wakaba", "Yamagumo", "Yayoi", "Yukikaze", "Yuudachi", "Yuugumo", "Z1", "Z3" }
| + | if not success then |
− | },
| + | success, data = U.requireModule('Seasonal/' .. name) |
− | ["Light Cruisers"] = {
| + | end |
− | ships = { "Abukuma", "Agano", "Isuzu", "Jintsuu", "Katori", "Kinu", "Kiso", "Kitakami", "Kuma", "Nagara", "Naka", "Natori", "Noshiro", "Ooi", "Ooyodo", "Sakawa", "Sendai", "Tama", "Tatsuta", "Tenryuu", "Yahagi", "Yura", "Yuubari" }
| + | if not success then |
− | }, | + | data = {index = {}, ships = {}} |
− | ["Heavy Cruisers"] = {
| + | end |
− | ships = { "Aoba", "Ashigara", "Atago", "Chikuma", "Choukai", "Furutaka", "Haguro", "Kako", "Kinugasa", "Kumano", "Maya", "Mikuma", "Mogami", "Myoukou", "Nachi", "Prinz Eugen", "Suzuya", "Takao", "Tone" }
| + | return data |
− | },
| + | end |
− | ["Battleships"] = { | |
− | ships = { "Bismarck", "Fusou", "Haruna", "Hiei", "Hyuuga", "Ise", "Kirishima", "Kongou", "Littorio", "Musashi", "Mutsu", "Nagato", "Roma", "Yamashiro", "Yamato" }
| |
− | },
| |
− | ["Light Carriers"] = {
| |
− | ships = { "Chitose", "Chiyoda", "Hiyou", "Houshou", "Jun'you", "Ryuuhou", "Ryuujou", "Shouhou", "Zuihou" }
| |
− | },
| |
− | ["Standard Carriers"] = {
| |
− | ships = { "Akagi", "Amagi", "Graf Zeppelin", "Hiryuu", "Kaga", "Katsuragi", "Shoukaku", "Souryuu", "Taihou", "Unryuu", "Zuikaku" }
| |
− | },
| |
− | ["Submarines"] = {
| |
− | ships = { "I-168", "I-19", "I-401", "I-58", "I-8", "Maruyu", "U-511" }
| |
− | },
| |
− | ["Auxiliaries"] = {
| |
− | ships = { "Akashi", "Akitsu Maru", "Akitsushima", "Hayasui", "Kashima", "Katori", "Mizuho", "Taigei" }
| |
− | },
| |
− | }
| |
| | | |
− | local Seasonal = {}
| + | function findType(ship) |
| + | for type, data in pairs(types) do |
| + | if data.ships and Utils.find(data.ships, ship) then |
| + | return type |
| + | end |
| + | end |
| + | return "?" |
| + | end |
| | | |
− | function gen(args, tbl, type, format) | + | function genToc(args, tbl, format) |
| local result = "" | | local result = "" |
| local i = 0 | | local i = 0 |
| local n = 0 | | local n = 0 |
− | for k, data in pairs(tbl) do | + | for _, k in ipairs(tbl.index) do |
| + | local data = tbl[k] |
| local ships = Utils.filter(data.ships, function(ship) return Utils.find(args, ship) end) | | local ships = Utils.filter(data.ships, function(ship) return Utils.find(args, ship) end) |
| if #ships > 0 then | | if #ships > 0 then |
| i = i + 1 | | i = i + 1 |
| n = n + #ships | | n = n + #ships |
− | local ships_str = table.concat(Utils.map(ships, function(ship) return string.format("[[#%s|%s]]", ship, ship) end), ", ") | + | local ships_str = table.concat(Utils.map(ships, function(ship) return string.format("[[#%s|%s]]", args.art and (tbl.type == "types" and k or findType(ship)) or ship, ship) end), ", ") |
| if data.url then | | if data.url then |
| result = result .. string.format("|-\n|[%s %s]\n|%s\n", data.url, k, ships_str) | | result = result .. string.format("|-\n|[%s %s]\n|%s\n", data.url, k, ships_str) |
− | elseif type == "types" then | + | elseif tbl.type == "types" then |
− | result = result .. string.format("|-\n|[[#%s|%s]] (%s)\n|%s\n", args[k] or k, k, #ships, ships_str) | + | result = result .. string.format("|-\n|[[#%s|%s]] (%s)\n|%s\n", args[k] and (k .. " 2") or k, k, #ships, ships_str) |
| else | | else |
| result = result .. string.format("|-\n|%s\n|%s\n", k, ships_str) | | result = result .. string.format("|-\n|%s\n|%s\n", k, ships_str) |
Line 193: |
Line 51: |
| end | | end |
| | | |
| + | local Seasonal = {} |
| + | |
| + | -- Template:SeasonalTOC |
| function Seasonal.toc(frame) | | function Seasonal.toc(frame) |
| local args = getArgs{frame = frame:getParent()} | | local args = getArgs{frame = frame:getParent()} |
| return | | return |
− | gen(args, types, "types", function(r, i, n) return string.format([===[{| class="mw-collapsible mw-collapsed wikitable typography-xl-optout" style="width:100%%" | + | genToc(args, types, function(r, i, n) return string.format([===[{| class="mw-collapsible mw-collapsed wikitable typography-xl-optout" style="width:100%%" |
| |- | | |- |
| !width=20%%|Class | | !width=20%%|Class |
− | !Ship girls (%s) | + | !%s (%s) |
− | ]===], n) .. r .. "|}" end) | + | ]===], args.text or "Ship girls", n) .. r .. "|}" end) |
| .. "\n" .. | | .. "\n" .. |
− | gen(args, seiyuus, "seiyuus", function(r, i, n) return string.format([===[{| class="mw-collapsible mw-collapsed wikitable typography-xl-optout" style="width:100%%" | + | genToc(args, args.art and artists or seiyuus, function(r, i, n) return string.format([===[{| class="mw-collapsible mw-collapsed wikitable typography-xl-optout" style="width:100%%" |
| |- | | |- |
− | !width=20%%|[[Glossary#List_of_Vessels_by_Seiyuu|Seiyuu]] (%s) | + | !width=20%%|[[%s]] (%s) |
| ! | | ! |
− | ]===], i) .. r .. "|}" end) | + | ]===], args.art and "Glossary#List_of_Vessels_by_Artist|Artist" or "Glossary#List_of_Vessels_by_Seiyuu|Seiyuu", i) .. r .. "|}" end) |
| + | |
| + | end |
| + | |
| + | -- Template:SeasonalQuotesInclude |
| + | function Seasonal.include(frame) |
| + | |
| + | local ship_row_template = [=[|align="center" rowspan="${rowspan}"|[[${ship}]] |
| + | ]=] |
| + | |
| + | local id_string_template = [[id="${ship}"]] |
| + | |
| + | local quote_template = [=[|- ${id_string} |
| + | ${ship_row}|align="center"|<span class="audio-button click-parent">[[File:${ship}${form} ${season}${line}.ogg|Play]]</span> |
| + | |lang="ja"|${ja} |
| + | |${en} |
| + | |${note}]=] |
| + | |
| + | local args = getArgs{frame = frame:getParent()} |
| + | local season, type = args[1], args[2] |
| + | local only = args.only |
| + | local result = { |
| + | "|-", |
| + | string.format([=[!colspan="5"|From [[Seasonal/%s|%s]]]=], season, season) |
| + | } |
| + | local seasonal_data = requireSeasonModule(season) |
| + | for _, ship in ipairs(seasonal_data.index[type]) do |
| + | if only and Utils.find(args, ship) or not only and not Utils.find(args, ship) then |
| + | local ship_data = seasonal_data.ships[ship] |
| + | local quotes = Utils.ifilter(ship_data, function(quote) |
| + | return not Utils.find(args, string.format("%s/%s", ship, quote.line or "")) |
| + | end) |
| + | for i, quote in ipairs(quotes) do |
| + | local note = args[ship .. "." .. "note"] |
| + | if note and note == "nil" then |
| + | note = "" |
| + | elseif note and note:sub(-1) == "+" then |
| + | note = note:sub(1, -2) .. (quote.note or "") |
| + | end |
| + | table.insert(result, format{ |
| + | quote_template, |
| + | id_string = i > 1 and "" or format{ |
| + | id_string_template, |
| + | ship = ship, |
| + | }, |
| + | ship_row = i > 1 and "" or format{ |
| + | ship_row_template, |
| + | rowspan = #quotes, |
| + | ship = ship, |
| + | }, |
| + | ship = quote.ship or ship, |
| + | form = quote.form or "", |
| + | season = quote.season or season, |
| + | line = quote.line and " " .. quote.line or "", |
| + | ja = quote.ja or "", |
| + | en = quote.en or "", |
| + | note = (quote.ship and "''As " .. quote.ship .. "''<br>" or "") .. (quote.line and "''" .. quote.line .. "''<br>" or "") .. (note or quote.note or ""), |
| + | }) |
| + | end |
| + | end |
| + | end |
| + | return table.concat(result, "\n") |
| | | |
| end | | end |
| + | |
| return Seasonal | | return Seasonal |