MediaWiki 的 Lua 错误

8

我正在尝试建立一个MediaWiki,且希望使用Navbox模板。在本地机器上,一切都工作正常,但是当我将所有内容复制到服务器时,出现了Lua脚本错误,具体来说:

Lua error at line 302: attempt to call field 'attr' (a nil value).
Backtrace:
(tail call): ?
Module:Navbox:302: in function "renderMainTable"
Module:Navbox:348: in function "renderMainTable"
(tail call): ?
mw.lua:425: ?
(tail call): ?
[C]: in function "xpcall"
MWServer.lua:73: in function "handleCall"
MWServer.lua:266: in function "dispatch"
MWServer.lua:33: in function "execute"
mw_main.lua:7: in main chunk
[C]: ?

如果我编辑那个文件,它就会为所有其他字段产生错误。

我的服务器正在运行 MediaWiki 1.20,如果有差异。我尝试过 Scribunto 1.20、1.21 和 master(更改引擎以适应1.20版本)。

如果有人能帮忙,那就太好了。

已编辑的模块: Navbox, HtmlBuilder.


4
包括第302行周围的代码将会有所帮助。 - Etan Reisner
代码全部来自维基百科模块,实际引发错误的函数是:function renderMainTable() local tbl = HtmlBuilder.create('table') .attr('cellspacing', 0) .addClass('nowraplinks') .addClass(args.bodyclass)但是,如果我修改代码跳过该行,则模块的其余部分会引发相同的错误。http://en.wikipedia.org/wiki/Module:Navbox - yedidyak
attr 是空的,根据我阅读维基百科文档的理解,这意味着 HtmlBuilder.create('table') 调用返回了一个 Lua 表,但是没有该字段,这只能说明它没有设置构建器元表。如果有修改过代码,请提供更多信息或代码。 - Ryan Stein
代码直接从维基百科导入 - HtmlBuilder 代码在这里:http://en.wikipedia.org/wiki/Module:HtmlBuilder - yedidyak
你能否粘贴(或 pastebin)你的两个模块文件的确切内容? - Etan Reisner
1
Navbox HtmlBuilder谢谢。 - yedidyak
2个回答

6
请非常仔细地查看你的代码和Wikipedia的代码,并进行比较。实际上,我建议对这两者进行diff操作。

你的代码

metatable._index = function(t, key)
    local ret = rawget(t, key)
    if ret then
        return ret
    end

    ret = metatable[key]
    if type(ret) == 'function' then
        return function(...)
            return ret(t, ...)
        end
    else
        return ret
    end
end

维基百科

metatable.__index = function(t, key)
    local ret = rawget(t, key)
    if ret then
        return ret
    end

    ret = metatable[key]
    if type(ret) == 'function' then
        return function(...) 
            return ret(t, ...) 
        end 
    else
        return ret
    end
end

你看出区别了吗?Lua中的元方法总是以两个下划线__开头,而不是一个。我不确定你的代码如何变成现在这个状态的,但这很可能解释了你遇到的所有问题,甚至解释了为什么无法访问attr。这是由于元表的__index字段缺少下划线,这意味着它根本不会被识别。我惊讶地发现了这个问题,因为在快速浏览时很容易忽略这个额外的下划线。
我建议先将你的HtmlBuilder模块恢复到原始状态,然后查看是否解决了你的问题。如果你对NavBox和其他修改不太大,你可能想要将它们还原,但使用diff命令可以告诉你版本之间的差异。
只需注意你未来所做的更改,但不要害怕尝试,只要有备份!

2
哇,谢谢你!我只能猜测维基百科在导出模块时对双下划线进行了某种“修正”。再次感谢你,祝你获得50个声望点数! - yedidyak
1
@yedidyak 我认为你必须实际点击赏金按钮才能授予它。目前它仍显示为开放的赏金。 - greatwolf

3

让我说,试图回答你的问题是非常困难的。在原始帖子中,你没有提供很多有助于解决问题的信息。我只能根据你提到的这行代码来作出解答:

function renderMainTable() local tbl = HtmlBuilder.create('table') .attr('cellspacing', 0) .addClass('nowraplinks') .addClass(args.bodyclass)

我会尝试用这个来替换它:

function renderMainTable() local tbl = HtmlBuilder.create('table')

嗨,替换那行代码将错误移动到下一个使用“tbl”的地方。如果我没有提供足够的信息,我很抱歉,也许是因为我已经深陷其中太久了,所以我不再看到它从外面看起来是什么样子了。这段代码完全是从这两个模块中复制的:http://en.wikipedia.org/wiki/Module:Navbox http://en.wikipedia.org/wiki/Module:HtmlBuilder - yedidyak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接