【问题标题】:Lua error on MediaWikiMediaWiki 上的 Lua 错误
【发布时间】:2013-11-22 23:49:55
【问题描述】:

我正在尝试设置 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)。

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

已编辑模块:NavboxHtmlBuilder

【问题讨论】:

  • 在第 302 行包含代码会很有帮助。
  • 代码全部取自维基百科模块,实际抛出错误的函数是: function renderMainTable() local tbl = HtmlBuilder.create('table') .attr('cellspacing', 0 ) .addClass('nowraplinks') .addClass(args.bodyclass) 但是,如果我修改代码以跳过该行,则模块的其余部分会引发相同的错误。 en.wikipedia.org/wiki/Module:Navbox
  • attr 是 nil,从我通过阅读 Wikipedia 文档可以看出,这意味着 HtmlBuilder.create('table') 调用正在返回一个没有该字段的 Lua 表,这只能意味着它没有设置构建器元表。您能否提供更多信息或代码(如果已修改)?
  • 代码直接从维基百科导入 - HtmlBuilder 代码在这里:en.wikipedia.org/wiki/Module:HtmlBuilder
  • Navbox HtmlBuilder 谢谢。

标签: lua mediawiki mediawiki-templates scribunto


【解决方案1】:

非常非常仔细查看您粘贴的代码与维基百科的代码相比。事实上,我建议对两者进行比较。

Your code

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

Wikipedia

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

你看出区别了吗? Metamethods in Lua 总是以两个下划线 __ 开头,而不是一个。我不确定你的代码是如何达到它所处的状态的,但这可以很好地解释你遇到的所有麻烦,甚至为什么attr 无法访问。这是由于元表的__index 字段缺少下划线,这当然意味着它根本不会被识别。我很惊讶我注意到了,因为在略读时很容易错过额外的下划线。

我建议先将您的 HtmlBuilder 模块恢复到其原始状态,然后查看是否可以解决您的问题。如果您的修改不是太重要,您可能想要恢复 NavBox 和您可能修改过的任何其他内容,但 diff肯定告诉您版本之间有什么不同。

请注意您未来的更改,但只要您有备份,就不要害怕尝试!

【讨论】:

  • 哇。感谢那!我只能猜测维基百科在导出模块时做了一些事情来“纠正”双下划线。再次感谢,享受您的 50 次代表!
  • @yedidyak 我认为您必须实际单击赏金按钮才能授予它。 atm 它仍然显示赏金开放。
【解决方案2】:

让我说,尝试回答您的问题非常困难。在原始帖子中,您并没有说太多有助于解决问题的内容。我将基于您提到的这行代码:

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

我可能会尝试用这个替换它:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多