Ошибка Lua на MediaWiki

Я пытаюсь настроить 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.


person yedidyak    schedule 11.11.2013    source источник
comment
Включение кода вокруг строки 302 будет полезно.   -  person Etan Reisner    schedule 11.11.2013
comment
Весь код взят из модулей википедии, функция, которая на самом деле выдает ошибку: function renderMainTable() local tbl = HtmlBuilder.create('table') .attr('cellspacing', 0) .addClass('nowraplinks') .addClass(args.bodyclass), но если я изменю код, чтобы пропустить эту строку, остальная часть модуля выдаст ту же ошибку. en.wikipedia.org/wiki/Module:Navbox   -  person yedidyak    schedule 11.11.2013
comment
attr равен нулю, и из того, что я могу сказать, прочитав документацию Википедии, это означает, что вызов HtmlBuilder.create('table') возвращает вам таблицу Lua без этого поля, что может означать только то, что он не устанавливает метатаблицу компоновщика. Можете ли вы предоставить дополнительную информацию или код, если он был изменен?   -  person Ryan Stein    schedule 16.11.2013
comment
Код импортирован прямо из Википедии — код HtmlBuilder находится здесь: en.wikipedia.org/wiki/Module :HtmlBuilder   -  person yedidyak    schedule 17.11.2013
comment
Можете ли вы вставить (или pastebin) точное содержимое ваших двух файлов модулей?   -  person Etan Reisner    schedule 19.11.2013
comment
Navbox HtmlBuilder Спасибо.   -  person yedidyak    schedule 19.11.2013


Ответы (2)


Посмотрите очень, очень внимательно на вставленный код и сравните его с кодом Википедии. На самом деле, я бы рекомендовал выполнить 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. определенно расскажет вам, чем отличаются ваши версии.

Просто помните о том, что вы измените в будущем, но не бойтесь экспериментировать, пока у вас есть резервные копии!

person Ryan Stein    schedule 19.11.2013
comment
Вот это да. Спасибо за это! Я могу только догадываться, что Википедия сделала что-то, чтобы «исправить» двойное подчеркивание при экспорте модулей. Еще раз спасибо, и наслаждайтесь своими 50 повторениями! - person yedidyak; 19.11.2013
comment
@yedidyak Я думаю, вам нужно нажать на кнопку награды, чтобы наградить ее. банкомат все еще показывает щедрость как открытую. - person greatwolf; 21.11.2013

Позвольте мне сказать, что очень трудно попытаться ответить на ваш вопрос. В исходном посте вы мало что говорите, чтобы помочь решить проблему. Я просто буду основываться на этой строке кода, которую вы упомянули:

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

Я бы, наверное, попробовал заменить его на это:

function renderMainTable() local tbl = HtmlBuilder.create('table')
person noize    schedule 17.11.2013
comment
Привет, замена этой строки переместила ошибку в следующее место, где используется tbl. Извините, если я не дал достаточно информации, может быть, потому что я был внутри этой штуки слишком долго, я больше не вижу, как это выглядит снаружи. Код полностью скопирован из этих двух модулей: en.wikipedia.org/wiki/Module :Navbox en.wikipedia.org/wiki/Module:HtmlBuilder< /б> - person yedidyak; 18.11.2013