| 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 |