Line 52: |
Line 52: |
| return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title | | return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title |
| end | | end |
| + | |
| + | local translate_mt = { __index = function(t, k) return k end } |
| | | |
| function arguments.getArgs(frame, options) | | function arguments.getArgs(frame, options) |
Line 58: |
Line 60: |
| frame = frame or {} | | frame = frame or {} |
| options = options or {} | | options = options or {} |
| + | |
| + | --[[ |
| + | -- Set up argument translation. |
| + | --]] |
| + | options.translate = options.translate or {} |
| + | if getmetatable(options.translate) == nil then |
| + | setmetatable(options.translate, translate_mt) |
| + | end |
| + | if options.backtranslate == nil then |
| + | options.backtranslate = {} |
| + | for k,v in pairs(options.translate) do |
| + | options.backtranslate[v] = k |
| + | end |
| + | end |
| + | if options.backtranslate and getmetatable(options.backtranslate) == nil then |
| + | setmetatable(options.backtranslate, { |
| + | __index = function(t, k) |
| + | if options.translate[k] ~= k then |
| + | return nil |
| + | else |
| + | return k |
| + | end |
| + | end |
| + | }) |
| + | end |
| | | |
| --[[ | | --[[ |
Line 97: |
Line 124: |
| end | | end |
| end | | end |
− |
| + | |
| -- We test for false specifically here so that nil (the default) acts like true. | | -- We test for false specifically here so that nil (the default) acts like true. |
| if found or options.frameOnly == false then | | if found or options.frameOnly == false then |
Line 122: |
Line 149: |
| luaArgs = frame | | luaArgs = frame |
| end | | end |
− |
| + | |
| -- Set the order of precedence of the argument tables. If the variables are | | -- Set the order of precedence of the argument tables. If the variables are |
| -- nil, nothing will be added to the table, which is how we avoid clashes | | -- nil, nothing will be added to the table, which is how we avoid clashes |
− | -- between the frame/parent args and the Lua args. | + | -- between the frame/parent args and the Lua args. |
| local argTables = {fargs} | | local argTables = {fargs} |
| argTables[#argTables + 1] = pargs | | argTables[#argTables + 1] = pargs |
Line 215: |
Line 242: |
| -- must be nil. | | -- must be nil. |
| --]] | | --]] |
| + | if type(key) == 'string' then |
| + | key = options.translate[key] |
| + | end |
| local val = metaArgs[key] | | local val = metaArgs[key] |
| if val ~= nil then | | if val ~= nil then |
Line 235: |
Line 265: |
| -- This function is called when a module tries to add a new value to the | | -- This function is called when a module tries to add a new value to the |
| -- args table, or tries to change an existing value. | | -- args table, or tries to change an existing value. |
| + | if type(key) == 'string' then |
| + | key = options.translate[key] |
| + | end |
| if options.readOnly then | | if options.readOnly then |
| error( | | error( |
Line 261: |
Line 294: |
| else | | else |
| metaArgs[key] = val | | metaArgs[key] = val |
| + | end |
| + | end |
| + | |
| + | local function translatenext(invariant) |
| + | local k, v = next(invariant.t, invariant.k) |
| + | invariant.k = k |
| + | if k == nil then |
| + | return nil |
| + | elseif type(k) ~= 'string' or not options.backtranslate then |
| + | return k, v |
| + | else |
| + | local backtranslate = options.backtranslate[k] |
| + | if backtranslate == nil then |
| + | -- Skip this one. This is a tail call, so this won't cause stack overflow |
| + | return translatenext(invariant) |
| + | else |
| + | return backtranslate, v |
| + | end |
| end | | end |
| end | | end |
Line 270: |
Line 321: |
| metatable.donePairs = true | | metatable.donePairs = true |
| end | | end |
− | return pairs(metaArgs) | + | return translatenext, { t = metaArgs } |
| end | | end |
− |
| + | |
| local function inext(t, i) | | local function inext(t, i) |
| -- This uses our __index metamethod | | -- This uses our __index metamethod |