Ошибка 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')