Module:Sandbox/Jackmcbarn: Difference between revisions
Appearance
Content deleted Content added
Jackmcbarn (talk | contribs) rm tables |
Jackmcbarn (talk | contribs) simplify |
||
Line 1: | Line 1: | ||
local translationwrapper = {} |
|||
local function translatenext(invariant) |
local function translatenext(invariant) |
||
local k, v = next(invariant |
local k, v = next(invariant.src, invariant.k) |
||
invariant.k = k |
invariant.k = k |
||
if k == nil then |
if k == nil then |
||
Line 9: | Line 7: | ||
return k, v |
return k, v |
||
end |
end |
||
local from = invariant |
local from = invariant.from[k] |
||
if from ~= nil then |
if from ~= nil then |
||
return from, v |
return from, v |
||
elseif invariant |
elseif invariant.to[k] == nil then |
||
return k, v |
return k, v |
||
else |
else |
||
Line 19: | Line 17: | ||
end |
end |
||
end |
end |
||
local function translate(src, to, from) |
|||
function translationwrapper.create(args) |
|||
-- |
-- to contains English keys and translated values |
||
-- if the value is a table, any of that table's values are valid translations |
-- if the value is a table, any of that table's values are valid translations |
||
-- |
-- from contains translated keys and English values |
||
-- optional if |
-- optional if to doesn't rely on __index |
||
-- |
-- src is the table being wrapped |
||
if not |
if not from then |
||
from = {} |
|||
for k,v in pairs( |
for k,v in pairs(to) do |
||
from[v] = k |
|||
end |
end |
||
end |
end |
||
Line 35: | Line 33: | ||
function mt.__index(t, k) |
function mt.__index(t, k) |
||
if type(k) == 'string' then |
if type(k) == 'string' then |
||
local retval = |
local retval = src[to[k]] |
||
if retval ~= nil or |
if retval ~= nil or from[k] ~= nil then |
||
return retval |
return retval |
||
end |
end |
||
end |
end |
||
return |
return src[k] |
||
end |
end |
||
function mt.__newindex(t, k, v) |
function mt.__newindex(t, k, v) |
||
if type(k) ~= 'string' then |
if type(k) ~= 'string' then |
||
src[k] = v |
|||
return |
return |
||
end |
end |
||
local to = |
local to = to[k] |
||
local falseCognate = |
local falseCognate = from[k] ~= nil |
||
if to ~= nil then |
if to ~= nil then |
||
if v == nil and not falseCognate then |
if v == nil and not falseCognate then |
||
src[k] = nil |
|||
end |
end |
||
src[to] = v |
|||
elseif not falseCognate then |
elseif not falseCognate then |
||
src[k] = v |
|||
else |
else |
||
error('Attempt to write key "' .. k .. '" which has no translation and is a false cognate', 2) |
error('Attempt to write key "' .. k .. '" which has no translation and is a false cognate', 2) |
||
Line 61: | Line 59: | ||
end |
end |
||
function mt.__pairs(t) |
function mt.__pairs(t) |
||
return translatenext, { |
return translatenext, {src = src, to = to, from = from} |
||
end |
end |
||
function mt.__ipairs(t) |
function mt.__ipairs(t) |
||
return ipairs( |
return ipairs(src) |
||
end |
end |
||
return setmetatable({}, mt) |
return setmetatable({}, mt) |
||
Line 83: | Line 81: | ||
three = 'drei' |
three = 'drei' |
||
} |
} |
||
local wrapper = |
local wrapper = translate(args, to) |
||
return wrapper |
return wrapper |
||
end |
end |
Revision as of 03:49, 21 July 2015
table
local function translatenext(invariant)
local k, v = next(invariant.src, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' then
return k, v
end
local from = invariant.from[k]
if from ~= nil then
return from, v
elseif invariant.to[k] == nil then
return k, v
else
-- skip this key. tail call
return translatenext(invariant)
end
end
local function translate(src, to, from)
-- to contains English keys and translated values
-- if the value is a table, any of that table's values are valid translations
-- from contains translated keys and English values
-- optional if to doesn't rely on __index
-- src is the table being wrapped
if not from then
from = {}
for k,v in pairs(to) do
from[v] = k
end
end
local mt = {}
function mt.__index(t, k)
if type(k) == 'string' then
local retval = src[to[k]]
if retval ~= nil or from[k] ~= nil then
return retval
end
end
return src[k]
end
function mt.__newindex(t, k, v)
if type(k) ~= 'string' then
src[k] = v
return
end
local to = to[k]
local falseCognate = from[k] ~= nil
if to ~= nil then
if v == nil and not falseCognate then
src[k] = nil
end
src[to] = v
elseif not falseCognate then
src[k] = v
else
error('Attempt to write key "' .. k .. '" which has no translation and is a false cognate', 2)
end
end
function mt.__pairs(t)
return translatenext, {src = src, to = to, from = from}
end
function mt.__ipairs(t)
return ipairs(src)
end
return setmetatable({}, mt)
end
local p = {}
function p.main(frame)
local args = {
eins = '#ff0000',
zwei = '#ff7f00',
drei = '#FFFF00',
three = 'yellow'
}
local to = {
one = 'eins',
two = 'zwei',
three = 'drei'
}
local wrapper = translate(args, to)
return wrapper
end
return p