Ошибка 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 ответов


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

код

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 не работает. Это было из-за metatable __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')