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.

2 ответа

Решение

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

Ваш код

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 определенно скажет вам, что отличается между вашими версиями.

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

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

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

Я, вероятно, попытался бы заменить это следующим:

function renderMainTable() local tbl = HtmlBuilder.create('table')
Другие вопросы по тегам