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("'", "\\'") |
||
− | 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 ' @ ' -- 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'}) .. " / " .. itemLink('Lead Anvil', {mode = 'image'}) |
||
− | elseif station == 'Adamantite Forge' then |
||
− | return sep .. itemLink('Adamantite Forge', {mode = 'image'}) .. " / " .. itemLink('Titanium Forge', {mode = 'image'}) |
||
− | elseif station == 'Mythril Anvil' then |
||
− | return sep .. itemLink('Mythril Anvil', {mode = 'image'}) .. " / " .. itemLink('Orichalcum Anvil', {mode = 'image'}) |
||
− | elseif station == 'Demon Altar' then |
||
− | return sep .. itemLink('Demon Altar', {mode = 'image'}) .. " / " .. itemLink('Crimson Altar', {mode = 'image'}) |
||
− | elseif station == 'Cooking Pot' then |
||
− | return sep .. itemLink('Cooking Pot', {mode = 'image'}) .. " / " .. itemLink('Cauldron', {mode = 'image'}) |
||
− | elseif station == 'Placed Bottle' then |
||
− | return sep .. itemLink('Placed Bottle', {mode = 'image'}) .. " / " .. itemLink('Alchemy Table', {mode = 'image'}) |
||
− | elseif station == 'Water' then |
||
− | return sep .. itemLink('Water', {mode = 'image'}) .. " / " .. itemLink('Sink', {mode = 'image'}) |
||
− | elseif station == 'Table and Chair' then |
||
− | return sep .. itemLink('Table', {mode = 'image'}) .. " & " .. itemLink('Chair', {mode = 'image'}) |
||
− | elseif station == 'Work Bench and Chair' then |
||
− | return sep .. itemLink('Work Bench', {mode = 'image'}) .. " & " .. itemLink('Chair', {mode = 'image'}) |
||
− | elseif station == 'Crystal Ball and Lava' then |
||
− | return sep .. itemLink('Crystal Ball', {mode = 'image'}) .. " & " .. itemLink('Lava', {mode = 'image'}) |
||
− | elseif station == 'Crystal Ball and Honey' then |
||
− | return sep .. itemLink('Crystal Ball', {mode = 'image'}) .. " & " .. itemLink('Honey', {mode = 'image'}) |
||
− | elseif station == 'Crystal Ball and Water' then |
||
− | return sep .. itemLink('Crystal Ball', {mode = 'image'}) .. " & ".. '( ' .. itemLink('Water', {mode = 'image'}) .. " / " .. itemLink('Sink', {mode = 'image'}) .. ' )' |
||
− | elseif station == 'Sky Mill and Water' then |
||
− | return sep .. itemLink('Sky Mill', {mode = 'image'}) .. " & ".. '( ' .. itemLink('Water', {mode = 'image'}) .. " / " .. itemLink('Sink', {mode = 'image'}) .. ' )' |
||
− | elseif station == 'Sky Mill and Snow Biome' then |
||
− | return sep .. itemLink('Sky Mill', {mode = 'image'}) .. " & ".. 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 .. " / " .. 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: