Terraria Wiki
Terraria Wiki
KKeine Bearbeitungszusammenfassung
 
(Erstellt.)
Markierung: Neue Weiterleitung
 
Zeile 1: Zeile 1:
  +
#WEITERLEITUNG [[Tag-und-Nacht-Zyklus]]
-- Note: for "Any xxx" group (e.g. "Any Birds"), they should be added to {{tr}} database.
 
local l10n_info = {
 
['de'] = {
 
-- for {{recipes}}--
 
['cate_unexcepted_rows_count'] = 'Rezepte-Tabelle mit unerwarteter Gesamtzahl an Zeilen',
 
['cate_no_row'] = 'Rezepte-Tabelle ohne Zeilen',
 
['header_result'] = 'Resultat',
 
['header_ingredients'] = 'Zutaten',
 
['header_station'] = '[[Herstellungsobjekt]]',
 
 
['cate_craftable'] = 'Herstellbare Gegenstände',
 
 
['station_by_hand'] = '[[kein Objekt]]',
 
['station_sep_or'] = "<br/>'''''oder'''''<br/>",
 
['station_sep_and'] = " '''und''' ",
 
 
['ingredients_sep'] = " ''oder'' ",
 
['snow_biome'] = '[[Tundra]]',
 
 
['station_cate'] = {
 
['Lead Anvil'] = 'Eisen- oder Bleiamboss',
 
['Iron Anvil'] = 'Eisen- oder Bleiamboss',
 
['Orichalcum Anvil'] = 'Mithril- oder Oreichalkosamboss',
 
['Mythril Anvil'] = 'Mithril- oder Oreichalkosamboss',
 
['Demon Altar'] = 'Dämonen- oder Purpur-Altar',
 
['Crimson Altar'] = 'Dämonen- oder Purpur-Altar',
 
['Altar'] = 'Dämonen- oder Purpur-Altar',
 
['Titanium Forge'] = 'Adamantit- oder Titanschmiede',
 
['Adamantite Forge'] = 'Adamantit- oder Titanschmiede',
 
['Cauldron'] = 'Kochtopf oder Kessel',
 
['Cooking Pot'] = 'Kochtopf oder Kessel',
 
['Bottle only'] = 'Platzierte Flasche',
 
['Placed Bottle only'] = 'Platzierte Flasche',
 
['Bottle'] = 'Platzierte Flasche oder Alchemietisch',
 
['Placed Bottle'] = 'Platzierte Flasche oder Alchemietisch',
 
['Alchemy Table'] = 'Platzierte Flasche oder Alchemietisch',
 
['Water'] = 'Wasser oder Waschbecken',
 
['Sink'] = 'Wasser oder Waschbecken',
 
['Crystal Ball and Water'] = 'Kristallkugel und Wasser oder Waschbecken',
 
['Sky Mill and Snow Biome'] = 'Himmelsmühle und Tundra',
 
['Sky Mill and Water'] = 'Himmelsmühle und Wasser oder Waschbecken',
 
['Crystal Ball and Lava'] = 'Kristallkugel und Lava',
 
['Crystal Ball and Honey'] = 'Kristallkugel und Honig',
 
},
 
-- for {{recipes/extract}}--
 
['default_sep_compact'] = "<br/>'''oder'''<br/>",
 
['default_sep_ingredients'] = "'''oder'''",
 
['compact_snow_biome'] = '[[Tundra]]',
 
},
 
}
 
 
 
local l10n_auto_translate_eicons_pagename = {
 
['zh'] = true,
 
}
 
 
 
------- The following is not related to l10n. --------------
 
 
 
local item_link = require('Module:Item').go
 
local trim = mw.text.trim
 
local cargo = mw.ext.cargo
 
 
local currentFrame -- global cache for current frame object.
 
local inputArgs -- global args cache.
 
local lang -- cache current lang.
 
local l10n_table
 
 
local l10n = function(key)
 
return l10n_table[key] or l10n_info['en'][key]
 
end
 
 
function getArg(key)
 
local v = trim(inputArgs[key] or '')
 
if v=='' then
 
return nil
 
else
 
return v
 
end
 
end
 
 
local itemLink = function(name, args)
 
local args = args or {}
 
args[1] = name
 
args[2] = currentFrame:expandTemplate{ title = 'tr', args = {name, lang=lang} }
 
args['eicons'] = l10n_auto_translate_eicons_pagename[lang]
 
args['small'] = 'y'
 
args['lang'] = lang or 'en'
 
args['nolink'] = args['nolink'] and 'y' or nil
 
return item_link(currentFrame, args)
 
end
 
 
-- credit: http://richard.warburton.it
 
-- this version is with trim.
 
local explode = function(div,str)
 
if (div=='') then return false end
 
local pos,arr = 0,{}
 
-- for each divider found
 
for st,sp in function() return string.find(str,div,pos,true) end do
 
table.insert(arr, trim(string.sub(str,pos,st-1))) -- Attach chars left of current divider
 
pos = sp + 1 -- Jump past current divider
 
end
 
table.insert(arr, trim(string.sub(str,pos))) -- Attach chars right of last divider
 
return arr
 
end
 
 
-- retuan a array of itemname, split xxx/yyy to item1=xxx, item2=yyy. If it's something like "Lead/Iron Bar", it will normalize as item1 = Iron Bar, item2 = Lead Bar.
 
local split = (function()
 
local metals = {
 
['Copper/Tin'] = 1,
 
['Silver/Tungsten'] = 1,
 
['Gold/Platinum'] = 1,
 
['Iron/Lead'] = 1,
 
['Cobalt/Palladium'] = 1,
 
['Mythril/Orichalcum'] = 1,
 
['Adamantite/Titanium'] = 1,
 
['Tin/Copper'] = 2,
 
['Tungsten/Silver'] = 2,
 
['Platinum/Gold'] = 2,
 
['Lead/Iron'] = 2,
 
['Palladium/Cobalt'] = 2,
 
['Orichalcum/Mythril'] = 2,
 
['Titanium/Adamantite'] = 2,
 
}
 
return function(name)
 
local count = select(2, name:gsub("/", "/", 2))
 
if count == 0 then
 
-- only 1 item
 
return { trim(name) }
 
elseif count == 1 then
 
-- 2 items
 
local item1a, item1b, item2a, item2b = name:match("^%s*(%S+)%s*(.-)/%s*(%S+)%s*(.-)$")
 
local x = metals[item1a..'/'..item2a]
 
if tostring(item1b) == '' and x then
 
item1b = item2b
 
end
 
if x == 2 then
 
return {trim(item2a..' '..item2b), trim(item1a..' '..item1b)}
 
else
 
return {trim(item1a..' '..item1b), trim(item2a..' '..item2b)}
 
end
 
else
 
-- 3 or more items
 
return explode('/', name)
 
end
 
end
 
end)()
 
 
-- return 1 or 2 value(s), when input is name[note], return item, note.
 
local itemname = function(str)
 
local item, note = str:match("^(.-)(%b[])$")
 
if item then
 
return item, note
 
else
 
return str
 
end
 
end
 
 
-- normalize ingredient name input, Lead Bar=>¦Lead Bar¦, Iron/Lead Bar => ¦Iron Bar¦Lead Bar¦, Lead/Iron Bar => ¦Iron Bar¦Lead Bar¦ ....
 
local normalize = function(name)
 
local result = '¦'
 
for k, v in ipairs(split(name)) do
 
result = result .. itemname(v) .. '¦'
 
end
 
return result
 
end
 
 
local escape = function(str)
 
return str:gsub("'", "\\'"):gsub("&#39;", "\\'")
 
end
 
local enclose = function(str)
 
return "'" .. escape(str) .. "'"
 
end
 
 
local getItemGroupName = function(item)
 
if item == 'Wood' or item == 'Ebonwood' or item == 'Rich Mahogany' or item == 'Pearlwood' or item == 'Shadewood'
 
or item == 'Spooky Wood' or item == 'Boreal Wood' or item == 'Palm Wood' then
 
return 'Any Wood'
 
elseif item == 'Iron Bar' or item == 'Lead Bar' then
 
return 'Any Iron Bar'
 
elseif item == 'Sand Block' or item == 'Pearlsand Block' or item == 'Crimsand Block' or item == 'Ebonsand Block' or item == 'Hardened Sand Block' then
 
return 'Any Sand'
 
elseif item == 'Red Pressure Plate' or item == 'Green Pressure Plate' or item == 'Gray Pressure Plate' or item == 'Brown Pressure Plate'
 
or item == 'Blue Pressure Plate' or item == 'Yellow Pressure Plate' or item == 'Lihzahrd Pressure Plate' then
 
return 'Any Pressure Plate'
 
elseif item == 'Bird' or item == 'Blue Jay' or item == 'Cardinal' then
 
return 'Any Bird'
 
elseif item == 'Black Scorpion' or item == 'Scorpion' then
 
return 'Any Scorpion'
 
elseif item == 'Squirrel' or item == 'Red Squirrel' then
 
return 'Any Squirrel'
 
elseif item == 'Grubby' or item == 'Sluggy' or item == 'Buggy' then
 
return 'Any Bug'
 
elseif item == 'Mallard Duck' or item == 'Duck' then
 
return 'Any Duck'
 
elseif item == 'Sulphur Butterfly' or item == 'Julia Butterfly' or item == 'Monarch Butterfly' or item == 'Purple Emperor Butterfly'
 
or item == 'Red Admiral Butterfly' or item == 'Tree Nymph Butterfly' or item == 'Ulysses Butterfly' or item == 'Zebra Swallowtail Butterfly' then
 
return 'Any Butterfly'
 
elseif item == 'Firefly' or item == 'Lightning Bug' then
 
return 'Any Firefly'
 
elseif item == 'Snail' or item == 'Glowing Snail' then
 
return 'Any Snail'
 
end
 
end
 
 
local normalizeStation = function(station)
 
if station == 'Altar' then
 
station = 'Demon Altar'
 
end
 
return station
 
end
 
 
local normalizeVersion = function(_version)
 
local _version = trim(_version):lower()
 
local version = ''
 
if _version:find('desktop', 1, true) then
 
version = version .. ' desktop'
 
end
 
if _version:find('console', 1, true) then
 
version = version .. ' console'
 
elseif _version:find('konsole', 1, true) then
 
version = version .. ' console'
 
end
 
if _version:find('old-gen', 1, true) then
 
version = version .. ' old-gen'
 
end
 
if _version:find('japan', 1, true) then
 
version = version .. ' japan'
 
end
 
if _version:find('mobile', 1, true) then
 
version = version .. ' mobile'
 
elseif _version:find('mobil', 1, true) then
 
version = version .. ' mobile'
 
end
 
if _version:find('3ds', 1, true) then
 
version = version .. ' 3ds'
 
end
 
if version == ' desktop console old-gen mobile 3ds' then
 
version = ''
 
elseif version == ' desktop konsole old-gen mobile 3ds' then
 
version = ''
 
elseif version == ' desktop console old-gen mobil 3ds' then
 
version = ''
 
elseif version == ' desktop konsole old-gen mobil 3ds' then
 
version = ''
 
end
 
return trim(version)
 
end
 
 
local criStr = function(args)
 
local constraints = {}
 
-- station = ? and station != ?
 
local _station = trim(args['station'] or '')
 
local _stationnot = trim(args['stationnot'] or '')
 
local str = ''
 
if _station ~= '' then
 
for _, v in ipairs(explode('/', _station)) do
 
if str ~= '' then
 
str = str .. ' OR '
 
end
 
str = str .. "station = " .. enclose(normalizeStation(v))
 
end
 
end
 
if _stationnot ~= '' then
 
if str ~= '' then
 
str = '(' .. str .. ')'
 
end
 
for _, v in ipairs(explode('/', _stationnot)) do
 
if str ~= '' then
 
str = str .. ' AND '
 
end
 
str = str .. 'station <> ' .. enclose(normalizeStation(v))
 
end
 
end
 
constraints['station'] = str
 
-- result = ? and result != ?
 
local _result = trim(args['result'] or '')
 
local _resultnot = trim(args['resultnot'] or '')
 
local str = ''
 
if _result ~= '' then
 
for _, v in ipairs(explode('/', _result)) do
 
if str ~= '' then
 
str = str .. ' OR '
 
end
 
if mw.ustring.sub(v, 1, 5) == 'LIKE ' then
 
str = str .. "result LIKE " .. enclose(trim(mw.ustring.sub(v, 6)))
 
else
 
str = str .. 'result=' .. enclose(v)
 
end
 
end
 
end
 
if _resultnot ~= '' then
 
if str ~= '' then
 
str = '(' .. str .. ')'
 
end
 
for _, v in ipairs(explode('/', _resultnot)) do
 
if str ~= '' then
 
str = str .. ' AND '
 
end
 
if mw.ustring.sub(v, 1, 5) == 'LIKE ' then
 
str = str .. "result NOT LIKE " .. enclose(trim(mw.ustring.sub(v, 6)))
 
else
 
str = str .. 'result <> ' .. enclose(v)
 
end
 
end
 
end
 
if str ~= '' then
 
constraints['result'] = str
 
end
 
-- ingredient = ?
 
local _ingredient = trim(args['ingredient'] or '')
 
if _ingredient ~= '' then
 
local str = ''
 
for _, v in ipairs(explode('/', _ingredient)) do
 
if str ~= '' then
 
str = str .. ' OR '
 
end
 
if mw.ustring.sub(v, 1, 1) == '#' then
 
str = str .. "ingredients HOLDS LIKE '%¦" .. escape(mw.ustring.sub(v, 2)) .. "¦%'"
 
elseif mw.ustring.sub(v, 1, 5) == 'LIKE ' then
 
str = str .. "ingredients HOLDS LIKE '%¦" .. escape(trim(mw.ustring.sub(v, 6))) .. "¦%'"
 
else
 
str = str .. "ingredients HOLDS LIKE '%¦" .. escape(v) .. "¦%'"
 
-- any xxx
 
local group = getItemGroupName(v)
 
if group then
 
str = str .. " OR ingredients HOLDS LIKE '%¦" .. escape(group) .. "¦%'"
 
end
 
end
 
end
 
constraints['ingredient'] = str
 
end
 
 
--versions
 
local _version = normalizeVersion(args['version'] or args['versions'] or '')
 
if _version ~= '' then
 
constraints['version'] = 'version = '..enclose(_version)
 
end
 
 
local where = ''
 
if constraints['station'] then
 
where = constraints['station']
 
end
 
if constraints['result'] then
 
if where ~= '' then
 
where = where .. ' AND '
 
end
 
where = where .. '(' .. constraints['result'] .. ')'
 
end
 
if constraints['ingredient'] then
 
if where ~= '' then
 
where = where .. ' AND '
 
end
 
where = where .. '(' .. constraints['ingredient'] .. ')'
 
end
 
if constraints['version'] then
 
if where ~= '' then
 
where = where .. ' AND '
 
end
 
where = where .. '(' .. constraints['version'] .. ')'
 
end
 
return where
 
end
 
 
local ingredientsCell = function(ingSum, ingSumKeys)
 
local str = '<ul>'
 
for i, k in ipairs(ingSumKeys) do
 
local item = k
 
local amount = ingSum[k]
 
str = str .. '<li>'
 
local s
 
for _, itemname in ipairs(split(item)) do
 
if s then
 
s = s .. l10n('ingredients_sep') .. itemLink(itemname)
 
else
 
s = itemLink(itemname)
 
end
 
end
 
str = str .. s
 
if amount ~= '1' then
 
str = str .. ' <span class="note-text">(' .. amount .. ')</span>'
 
end
 
str = str .. '</li>'
 
end
 
str = str .. '</ul>'
 
return str
 
end
 
 
local stationCell = function(station, options)
 
options = options or {wrap = 'y'}
 
if station == 'By Hand' then
 
return l10n('station_by_hand')
 
elseif station == 'Furnace' or station == 'Work Bench' or station == 'Sawmill' or station == "Tinkerer's Workshop" or station == 'Dye Vat'
 
or station == 'Loom' or station == 'Keg' or station == 'Hellforge' or station == 'Bookcase' or station == 'Imbuing Station' or station == 'Lava'
 
or station == 'Honey' or station == 'Glass Kiln' or station == 'Flesh Cloning Vat' or station == 'Autohammer' or station == 'Crystal Ball'
 
or station == 'Ice Machine' or station == 'Meat Grinder' or station == 'Living Loom' or station == 'Heavy Work Bench' or station == 'Sky Mill'
 
or station == 'Solidifier' or station == 'Honey Dispenser' or station == 'Bone Welder' or station == 'Blend-O-Matic' or station == 'Steampunk Boiler'
 
or station == 'Ancient Manipulator' or station == 'Lihzahrd Furnace' or station == 'Living Wood' then
 
return itemLink(station, options)
 
elseif station == 'Iron Anvil' then
 
return itemLink('Iron Anvil', options) .. l10n('station_sep_or') .. itemLink('Lead Anvil', options)
 
elseif station == 'Adamantite Forge' then
 
return itemLink('Adamantite Forge', options) .. l10n('station_sep_or') .. itemLink('Titanium Forge', options)
 
elseif station == 'Mythril Anvil' then
 
return itemLink('Mythril Anvil', options) .. l10n('station_sep_or') .. itemLink('Orichalcum Anvil', options)
 
elseif station == 'Demon Altar' then
 
return itemLink('Demon Altar', options) .. l10n('station_sep_or') .. itemLink('Crimson Altar', options)
 
elseif station == 'Cooking Pot' then
 
return itemLink('Cooking Pot', options) .. l10n('station_sep_or') .. itemLink('Cauldron', options)
 
elseif station == 'Placed Bottle' then
 
return itemLink('Placed Bottle', options) .. l10n('station_sep_or') .. itemLink('Alchemy Table', options)
 
elseif station == 'Water' then
 
return itemLink('Water', options) .. l10n('station_sep_or') .. itemLink('Sink', options)
 
elseif station == 'Table and Chair' then
 
return itemLink('Table', options) .. l10n('station_sep_and') .. itemLink('Chair', options)
 
elseif station == 'Work Bench and Chair' then
 
return itemLink('Work Bench', options) .. l10n('station_sep_and') .. itemLink('Chair', options)
 
elseif station == 'Crystal Ball and Lava' then
 
return itemLink('Crystal Ball', options) .. l10n('station_sep_and') .. itemLink('Lava', options)
 
elseif station == 'Crystal Ball and Honey' then
 
return itemLink('Crystal Ball', options) .. l10n('station_sep_and') .. itemLink('Honey', options)
 
elseif station == 'Crystal Ball and Water' then
 
return itemLink('Crystal Ball', options) .. l10n('station_sep_and').. '<span class="water">' .. itemLink('Water', options) .. l10n('station_sep_or') .. itemLink('Sink', options) .. '</span>'
 
elseif station == 'Sky Mill and Water' then
 
return itemLink('Sky Mill', options) .. l10n('station_sep_and').. '<span class="water">' .. itemLink('Water', options) .. l10n('station_sep_or') .. itemLink('Sink', options) .. '</span>'
 
elseif station == 'Sky Mill and Snow Biome' then
 
return itemLink('Sky Mill', options) .. l10n('station_sep_and').. l10n('snow_biome')
 
elseif station == 'Placed Bottle only' then
 
return itemLink('Placed Bottle', options)
 
else
 
return station
 
end
 
end
 
 
-- for extract/ingredientsum.
 
local compactStation = function(station, sep)
 
sep = sep or ' @&thinsp;' -- default sep
 
if station == 'By Hand' then
 
return ''
 
elseif station == 'Furnace' or station == 'Work Bench' or station == 'Sawmill' or station == "Tinkerer's Workshop" or station == 'Dye Vat'
 
or station == 'Loom' or station == 'Keg' or station == 'Hellforge' or station == 'Bookcase' or station == 'Imbuing Station' or station == 'Lava'
 
or station == 'Honey' or station == 'Glass Kiln' or station == 'Flesh Cloning Vat' or station == 'Autohammer' or station == 'Crystal Ball'
 
or station == 'Ice Machine' or station == 'Meat Grinder' or station == 'Living Loom' or station == 'Heavy Work Bench' or station == 'Sky Mill'
 
or station == 'Solidifier' or station == 'Honey Dispenser' or station == 'Bone Welder' or station == 'Blend-O-Matic' or station == 'Steampunk Boiler'
 
or station == 'Ancient Manipulator' or station == 'Lihzahrd Furnace' or station == 'Living Wood' then
 
return sep .. itemLink(station, {mode = 'image'})
 
elseif station == 'Iron Anvil' then
 
return sep .. itemLink('Iron Anvil', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Lead Anvil', {mode = 'image'})
 
elseif station == 'Adamantite Forge' then
 
return sep .. itemLink('Adamantite Forge', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Titanium Forge', {mode = 'image'})
 
elseif station == 'Mythril Anvil' then
 
return sep .. itemLink('Mythril Anvil', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Orichalcum Anvil', {mode = 'image'})
 
elseif station == 'Demon Altar' then
 
return sep .. itemLink('Demon Altar', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Crimson Altar', {mode = 'image'})
 
elseif station == 'Cooking Pot' then
 
return sep .. itemLink('Cooking Pot', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Cauldron', {mode = 'image'})
 
elseif station == 'Placed Bottle' then
 
return sep .. itemLink('Placed Bottle', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Alchemy Table', {mode = 'image'})
 
elseif station == 'Water' then
 
return sep .. itemLink('Water', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Sink', {mode = 'image'})
 
elseif station == 'Table and Chair' then
 
return sep .. itemLink('Table', {mode = 'image'}) .. "&thinsp;&amp;&thinsp;" .. itemLink('Chair', {mode = 'image'})
 
elseif station == 'Work Bench and Chair' then
 
return sep .. itemLink('Work Bench', {mode = 'image'}) .. "&thinsp;&amp;&thinsp;" .. itemLink('Chair', {mode = 'image'})
 
elseif station == 'Crystal Ball and Lava' then
 
return sep .. itemLink('Crystal Ball', {mode = 'image'}) .. "&thinsp;&amp;&thinsp;" .. itemLink('Lava', {mode = 'image'})
 
elseif station == 'Crystal Ball and Honey' then
 
return sep .. itemLink('Crystal Ball', {mode = 'image'}) .. "&thinsp;&amp;&thinsp;" .. itemLink('Honey', {mode = 'image'})
 
elseif station == 'Crystal Ball and Water' then
 
return sep .. itemLink('Crystal Ball', {mode = 'image'}) .. "&thinsp;&amp;&thinsp;".. '(&thinsp;' .. itemLink('Water', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Sink', {mode = 'image'}) .. '&thinsp;)'
 
elseif station == 'Sky Mill and Water' then
 
return sep .. itemLink('Sky Mill', {mode = 'image'}) .. "&thinsp;&amp;&thinsp;".. '(&thinsp;' .. itemLink('Water', {mode = 'image'}) .. "&thinsp;/&thinsp;" .. itemLink('Sink', {mode = 'image'}) .. '&thinsp;)'
 
elseif station == 'Sky Mill and Snow Biome' then
 
return sep .. itemLink('Sky Mill', {mode = 'image'}) .. "&thinsp;&amp;&thinsp;".. l10n('compact_snow_biome')
 
elseif station == 'Placed Bottle only' then
 
return sep .. itemLink('Placed Bottle', {mode = 'image'})
 
else
 
return sep .. station
 
end
 
end
 
 
local getFlags = function(args)
 
local needCate = 1
 
local needLink = true
 
local _cate = trim(args['cate'] or '')
 
if _cate == 'force' or _cate == 'all' then
 
needCate = 2
 
elseif _cate == 'n' or _cate == 'no' then
 
needCate = nil
 
end
 
local _link = trim(args['link'] or '')
 
if _link == 'y' or _link == 'yes' or _link == 'force' then
 
needLink = true
 
elseif _link == 'n' or _link == 'no' then
 
needLink = false
 
end
 
return needCate, needLink
 
end
 
 
local identicalTables = function(a, b)
 
if table.maxn(a) ~= table.maxn(b) then
 
return false
 
else
 
local i = 0
 
for _, v in pairs(a) do
 
for _, w in pairs(b) do
 
if v == w then
 
i = i+1
 
end
 
end
 
end
 
return i == table.maxn(a)
 
end
 
end
 
 
local subset = function(a, b) -- is table 'a' a subset of table 'b'?
 
if table.maxn(a) > table.maxn(b) then
 
return false
 
else
 
local i = 0
 
for _, v in pairs(a) do
 
for _, w in pairs(b) do
 
if v == w then
 
i = i+1
 
end
 
end
 
end
 
return i == table.maxn(a)
 
end
 
end
 
 
local removeEmptyElements = function(t, mode)
 
if mode == 1 then -- table of strings
 
local continue = true
 
-- keep iterating over the table until no more empty elements are found
 
while(continue) do
 
if next(t) == nil then
 
continue = false
 
end
 
for i, v in pairs(t) do
 
if v == nil or v == '' then
 
table.remove(t, i)
 
continue = true
 
break
 
else
 
continue = false
 
end
 
end
 
end
 
return t
 
else -- table of tables
 
local continue = true
 
-- keep iterating over the table until no more empty elements are found
 
while(continue) do
 
if next(t) == nil then
 
continue = false
 
end
 
for i, v in pairs(t) do
 
if next(v) == nil then
 
table.remove(t, i)
 
continue = true
 
break
 
else
 
continue = false
 
end
 
end
 
end
 
return t
 
end
 
end
 
 
local tablelength = function(t)
 
local count = 0
 
for _ in pairs(t) do count = count + 1 end
 
return count
 
end
 
 
local getIngSum = function(row)
 
local ingSum = {}
 
for k, v in pairs(row.ingredients) do
 
for item, amount in pairs(v) do
 
if string.sub(item, 1, 1) ~= '_' then -- informations about result; not actual ingredients
 
if ingSum[item] then
 
ingSum[item] = ingSum[item] + amount
 
else
 
ingSum[item] = amount
 
end
 
end
 
end
 
end
 
return ingSum
 
end
 
 
local getIngSumKeys = function(ingSum)
 
-- sort ings
 
local ingSumKeys = {}
 
for k in pairs(ingSum) do
 
table.insert(ingSumKeys, k)
 
end
 
table.sort(ingSumKeys)
 
return ingSumKeys
 
end
 
 
-----------------------------------------------------------------
 
 
local p = {}
 
 
-- for {{recipes/ingredientsum}}
 
p.ingredientsum = function(frame)
 
currentFrame = frame -- global frame cache
 
 
local args = frame:getParent().args
 
inputArgs = args
 
 
lang = frame.args['lang'] or 'en'
 
l10n_table = l10n_info[lang] or l10n_info['en']
 
 
local where = trim(args['where'] or '')
 
if where == '' then
 
where = criStr(args)
 
end
 
 
-- no constraint -> no result.
 
if where == '' then
 
return '<span style="color:red;font-weight:bold;">Recipes/ingredientsum: No constraint</span>'
 
end
 
 
-- query:
 
local result = mw.ext.cargo.query('Recipes', 'result, resultid, resultimage, resulttext, amount, version, station, args', {
 
where = where,
 
groupBy = "resultid, result, amount, version, ings",
 
orderBy = "result, amount DESC, version", -- Don't order by station
 
limit = 30, -- enough.
 
})
 
 
-------- determine versions to differentiate between --------
 
local versions = {}
 
for i, resultRow in ipairs(result) do
 
if resultRow['version'] then
 
local v = resultRow['version']
 
v = string.gsub(v, ' ', '/')
 
if v == '' then
 
v = currentFrame:expandTemplate{ title = 'eversions', args = {resultRow['result'], ['raw'] = 'y'} }
 
end
 
if v == '' then v = 'desktop/console/old-gen/mobile/3ds' end
 
local currentVersionGroup = explode('/', v)
 
 
if next(versions) ~= nil and next(versions[next(versions)]) ~= nil then
 
local addVersion = {}
 
local dontAdd = false
 
for i, versionGroup in ipairs(versions) do -- iterate over existing version groups
 
local addVersionGroup = {}
 
local versionsDiff= {}
 
if identicalTables(currentVersionGroup, versionGroup) then
 
dontAdd = true
 
break
 
else
 
for j, v in ipairs(currentVersionGroup) do
 
for k, w in ipairs(versionGroup) do
 
if w == v and w ~= nil then
 
versionsDiff[w] = {
 
['indexA'] = k,
 
['indexB'] = j
 
}
 
break
 
end
 
end
 
end
 
for v, indices in pairs(versionsDiff) do
 
currentVersionGroup[indices['indexB']] = ''
 
versionGroup[indices['indexA']] = ''
 
table.insert(addVersionGroup, v)
 
end
 
currentVersionGroup = removeEmptyElements(currentVersionGroup, 1)
 
versionGroup = removeEmptyElements(versionGroup, 1)
 
if next(addVersionGroup) ~= nil then
 
table.insert(addVersion, addVersionGroup)
 
end
 
end
 
end
 
if (next(addVersion) == nil or next(currentVersionGroup) ~= nil) and not dontAdd then
 
-- no overlaps or there is a currentVersion left. Add current version as it is
 
local addVersionGroup = {}
 
for _, v in ipairs(currentVersionGroup) do
 
table.insert(addVersionGroup, v)
 
end
 
table.insert(addVersion, addVersionGroup)
 
end
 
if next(addVersion) ~= nil then
 
for _, v in ipairs(addVersion) do
 
if next(v) ~= nil then
 
table.insert(versions, v)
 
end
 
end
 
end
 
else -- initial
 
table.insert(versions, currentVersionGroup)
 
end
 
end
 
versions = removeEmptyElements(versions)
 
if versions[1][1] == '' then
 
table.remove(versions, 1)
 
end
 
end
 
 
-------- get rows --------
 
local str = ''
 
local outputRows = {} -- output rows
 
 
if next(versions) == nil then
 
table.insert(versions, {'desktop', 'console', 'old-gen', 'mobile', '3ds'} )
 
end
 
 
for h, versionGroup in ipairs(versions) do
 
version = table.concat(versionGroup, ' ')
 
if version == '' then version = 'desktop console old-gen mobile 3ds' end
 
outputRows[version] = {}
 
 
-- set query constraint for recipes of this specific version
 
local whereCached = where
 
if versionGroup[next(versionGroup)] ~= '' then
 
where = where .. " AND ((version LIKE '%"
 
for j, v in ipairs(versionGroup) do
 
if j ~= 1 then
 
where = where .. "%' AND version LIKE '%"
 
end
 
where = where .. v
 
end
 
where = where .. "%') OR version IS NULL)"
 
end
 
-- do query:
 
local result = mw.ext.cargo.query('Recipes', 'result, resultid, resultimage, resulttext, amount, version, station, args', {
 
where = where,
 
groupBy = "resultid, result, amount, version, ings",
 
orderBy = "result, amount DESC, version", -- Don't order by station
 
limit = 20, -- enough.
 
})
 
where = whereCached -- restore constraint for next version
 
 
local results = {} -- all result items that were stored in this version; used for new row checking
 
local firstRow = true -- is this the first row of this version?
 
for i, resultRow in ipairs(result) do -- iterate over cargo result rows
 
local resultItem = tostring(resultRow['result'])
 
 
-- skip this row if the result is not available in the current version(s)
 
local _eversions = currentFrame:expandTemplate{ title = 'eversions', args = {resultRow['result'], ['raw'] = 'y'} }
 
if _eversions == '' then _eversions = 'desktop/console/old-gen/mobile/3ds' end
 
eversions = explode('/', _eversions)
 
 
if subset(versionGroup, eversions) then
 
 
-- check if this resultRow requires a new output row
 
local newRow = false
 
for j, v in ipairs(results) do
 
if v == resultItem then -- result is already present, add new row for it
 
newRow = true
 
end
 
end
 
table.insert(results, resultItem) -- add current result to the list of results
 
 
-- handle creation of new output row
 
if newRow then
 
local oldRowMaxn = table.maxn(outputRows[version])
 
-- cycle through current rows and duplicate them, removing the duplicate result we want to eliminate
 
local rowsDupl = {}
 
for j, row in ipairs(outputRows[version]) do -- fill duplicate table from source table
 
rowsDupl[j] = {}
 
rowDupl = rowsDupl[j]
 
rowDupl.stations = row.stations
 
rowDupl.ingredients = {}
 
for k, v in pairs(row.ingredients) do
 
rowDupl.ingredients[k] = {}
 
for l, w in pairs(v) do
 
rowDupl.ingredients[k][l] = w
 
end
 
end
 
end
 
for _, rowDupl in ipairs(rowsDupl) do
 
if rowDupl.ingredients[resultItem] then
 
rowDupl.ingredients[resultItem] = nil
 
end
 
end
 
for _, v in ipairs(rowsDupl) do -- insert duplicate table into source table
 
table.insert(outputRows[version], v)
 
end
 
end
 
 
-- add information to row
 
if firstRow then -- first row of this version
 
firstRow = false
 
local firstRow = {}
 
firstRow['ingredients'] = {}
 
firstRow['stations'] = {}
 
-- information: ingredients
 
firstRow.ingredients[resultItem] = {}
 
firstRow.ingredients[resultItem]['_amount'] = resultRow['amount'] -- result amount
 
firstRow.ingredients[resultItem]['_resultimage'] = resultRow['resultimage'] -- resultimage
 
for _, v in ipairs(explode('^', resultRow['args'])) do
 
local item, amount = v:match('^(.-)¦(.-)$')
 
firstRow.ingredients[resultItem][item] = amount
 
end
 
-- information: stations
 
table.insert(firstRow['stations'], resultRow['station'])
 
 
table.insert(outputRows[version], firstRow) -- done.
 
else -- not the first row of this version
 
for j, row in ipairs(outputRows[version]) do
 
local skip = false
 
-- skip the first half of rows (we only want to insert this resultItem into the second half, hence why we duplicated the rows)
 
if newRow then
 
if j <= table.maxn(outputRows[version])/2 then
 
skip = true
 
end
 
end
 
if not skip then
 
-- information: ingredients
 
row.ingredients[resultItem] = {}
 
row.ingredients[resultItem]['_amount'] = resultRow['amount'] -- result amount
 
row.ingredients[resultItem]['_resultimage'] = resultRow['resultimage'] -- resultimage
 
for _, v in ipairs(explode('^', resultRow['args'])) do
 
local item, amount = v:match('^(.-)¦(.-)$')
 
row.ingredients[resultItem][item] = amount
 
end
 
-- information: stations
 
local stations = row['stations'] or {}
 
local newStation = true
 
for _, station in ipairs(stations) do
 
if station == resultRow['station'] then
 
newStation = false
 
end
 
end
 
if newStation then
 
table.insert(stations, resultRow['station'])
 
end
 
-- done.
 
end
 
end
 
end
 
end
 
end
 
end
 
 
local finalOutputRows = {}
 
for version, versionRows in pairs(outputRows) do
 
for i, row in ipairs(versionRows) do
 
local insert = {}
 
insert['version'] = version
 
insert['stations'] = row.stations
 
insert['ingredients'] = row.ingredients
 
table.insert(finalOutputRows, insert)
 
end
 
end
 
 
-------- output --------
 
local mode = getArg('mode')
 
local sep = getArg('sep') or getArg('seperator')
 
--default mode = compact
 
local withResult = getArg('withresult')
 
local withStation = not getArg('nostation')
 
local withVersion = not getArg('noversion')
 
 
if not mode or mode =='compact' or mode == '' then
 
local sep = sep or l10n('default_sep_compact')
 
for _, row in ipairs(finalOutputRows) do
 
if outputStr then
 
outputStr = outputStr .. sep
 
else
 
outputStr = ''
 
end
 
outputStr = outputStr .. '<span class="recipe compact">'
 
 
-- version
 
if withVersion then
 
if row['version'] ~= '' and row['version'] ~= 'desktop console old-gen mobile 3ds' then -- don't print empty or full eicons
 
outputStr = outputStr .. currentFrame:expandTemplate{ title = 'version icons', args = {row['version']} } .. ': '
 
end
 
end
 
 
-- ingredients
 
local ingSum = getIngSum(row)
 
local ingSumKeys = getIngSumKeys(ingSum)
 
local ingFlag = nil
 
for _, k in ipairs(ingSumKeys) do
 
local item = k
 
local amount = ingSum[k]
 
if ingFlag then
 
outputStr = outputStr .. ' + '
 
else
 
ingFlag = true
 
end
 
if amount ~= '1' then
 
outputStr = outputStr .. amount .. ' '
 
end
 
local s
 
for _, itemname in ipairs(split(item)) do
 
if s then
 
s = s .. "&thinsp;/&thinsp;" .. itemLink(itemname, {mode='image'})
 
else
 
s = itemLink(itemname, {mode='image'})
 
end
 
end
 
outputStr = outputStr .. s
 
end
 
 
-- station
 
local stationFlag = nil
 
if withStation then
 
for _, station in ipairs(row['stations']) do
 
if station ~= 'By Hand' then
 
if stationFlag then
 
outputStr = outputStr .. ' + ' .. compactStation(station, '')
 
else
 
stationFlag = true
 
outputStr = outputStr .. compactStation(station)
 
end
 
end
 
end
 
end
 
 
-- result
 
local resultFlag = nil
 
if withResult then
 
outputStr = outputStr .. ' = '
 
for k, v in pairs(row.ingredients) do
 
if resultFlag then
 
outputStr = outputStr .. ' + '
 
else
 
resultFlag = true
 
end
 
if v['_amount'] ~= '1' then
 
outputStr = outputStr .. v['_amount'] .. ' '
 
end
 
local args = { mode='image' }
 
if v['_resultimage'] then
 
args['image'] = v['_resultimage']
 
end
 
outputStr = outputStr .. itemLink(k, args)
 
end
 
end
 
outputStr = outputStr..'</span>'
 
end
 
return outputStr or ''
 
elseif mode == 'ingredients' then
 
local sep = sep or l10n('default_sep_ingredients')
 
local outputStr = nil
 
for _, row in ipairs(finalOutputRows) do
 
if outputStr then
 
outputStr = outputStr .. sep
 
else
 
outputStr = ''
 
end
 
local ingSum = getIngSum(row)
 
local ingSumKeys = getIngSumKeys(ingSum)
 
outputStr = outputStr .. ingredientsCell(ingSum, ingSumKeys)
 
end
 
return '<div class="crafting-ingredients">' .. outputStr .. '</div>'
 
elseif mode == 'station' then
 
local outputStr = nil
 
for _, row in ipairs(finalOutputRows) do
 
for _, station in ipairs(row.stations) do
 
if outputStr then
 
outputStr = outputStr .. ' + '
 
else
 
outputStr = ''
 
-- version
 
if withVersion then
 
if row['version'] ~= '' and row['version'] ~= 'desktop console old-gen mobile 3ds' then -- don't print empty or full eicons
 
outputStr = outputStr .. currentFrame:expandTemplate{ title = 'version icons', args = {row['version']} } .. ': '
 
end
 
end
 
end
 
outputStr = outputStr .. stationCell(station, {})
 
end
 
end
 
return outputStr
 
end
 
 
end -- p.ingredientsum
 
 
return p
 

Aktuelle Version vom 10. März 2020, 23:37 Uhr

Weiterleitung nach: