То, что вы пытаетесь сделать, почти возможно без JavaScript, но не совсем.
Попытка №1: обычные заголовки
Во-первых, причина, по которой простой == Hello World ==
не работает в Scribunto, заключается в том, что вики-текст, который вы создаете в Scribunto, не обрабатывается автоматически синтаксическим анализатором MediaWiki. Из документации Scribunto:
Функция модуля обычно должна возвращать одну строку; любые возвращенные значения будут переданы через tostring(), а затем объединены без разделителя. Эта строка включена в викитекст как результат {{#invoke:}}
.
На этом этапе синтаксического анализа страницы шаблоны уже развернуты, функции анализатора и теги расширения уже обработаны, а преобразования перед сохранением (например, расширение подписи с помощью тильды и трюк с трубой) уже выполнены. Поэтому модуль не может использовать эти функции в своем выходном тексте. Например, если модуль возвращает "Hello,
[[world]]! {{welcome}}"
, страница будет выглядеть так: «Привет, мир! {{ добро пожаловать}}".
Чтобы обойти это, вы можете использовать метод Scribunto frame:preprocess. для предварительной обработки строк с помощью синтаксического анализатора MediaWiki перед их выводом. Например, предварительная обработка == Hello World ==
зарегистрирует заголовок в синтаксическом анализаторе и добавит маркер полосы перед заголовок заголовка. Затем в процессе синтаксического анализа синтаксический анализатор удаляет маркер полосы и добавляет ссылку на раздел редактирования.
Вы можете сделать это с помощью следующего кода модуля:
local p = {}
function p.main(frame)
return frame:preprocess("== Hello World ==")
end
return p
При вызове на вики-странице этот код даст вам законную ссылку для редактирования MediaWiki. К сожалению, это ссылка на первый раздел страницы модуля, и нажатие на нее приведет к ошибке «Редактирование раздела не поддерживается».
Вы можете обойти это, используя другой объект фрейма для предварительной обработки. Если вы хотите, чтобы ссылка раздела редактирования указывала на страницу, с которой вы вызвали модуль, вы можете использовать родительский фрейм:
local p = {}
function p.main(frame)
return frame:getParent():preprocess("== Hello World ==")
end
return p
А если вы хотите, чтобы ссылка указывала на произвольную страницу, вы можете создать новый дочерний кадр:
local p = {}
function p.main(frame)
local childFrame = frame:newChild{title = "Your page here"}
return childFrame:preprocess("== Hello World ==")
end
return p
Проблема с двумя приведенными выше примерами заключается в том, что они оба указывают на первый раздел на странице, а заголовки разделов, добавленные с помощью #invoke, не учитываются при подсчете разделов. Поэтому, если вы не знаете, что вам нужно отредактировать первый раздел, эти ссылки не будут работать для вас. К сожалению, я не знаю, как изменить номер раздела ссылок редактирования, сгенерированных таким образом.
Попытка №2: поддельные заголовки
На самом деле вы были очень близки в своей попытке подражать заголовку HTML. Проблема, с которой вы столкнулись, заключается в том, что MediaWiki не разрешает использовать теги <a>
в викитексте для предотвращения атак межсайтового скриптинга. Вы можете легко обойти это, используя синтаксис внешних ссылок MediWiki ([http://www.example.com Example]
).
Вот что-то ближе к тому, к чему вы стремились:
local p = {}
function p.makeHeading(title, page)
local result = mw.html.create('h2')
result
:tag('span')
:attr({id = title, class='mw-headline'})
:wikitext(title)
:done()
:tag('span')
:addClass('mw-editsection')
:addClass('plainlinks')
:tag('span')
:attr('class', 'mw-editsection-bracket')
:wikitext('[')
:done()
:wikitext(string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, {action = 'edit'})),
'edit'
))
:tag('span')
:attr('class', 'mw-editsection-bracket')
:wikitext(']')
return tostring(result)
end
return p
Это даст вам заголовок, который ссылается на нужное место и выглядит почти так же, как оригинал. Есть только две проблемы:
- Цвет ссылки немного не тот. В MediaWiki внешние ссылки имеют немного другой цвет, чем внутренние ссылки. Здесь мы используем «внешнюю» ссылку на URL-адрес режима редактирования страницы, но ссылкам редактирования, сгенерированным MediaWiki, присваивается цвет внутренней ссылки. Это можно обойти с помощью разумного использования стилей, но остается проблема номер два:
- Текст «[править]» включен в оглавление.
К сожалению, я не знаю, как убрать текст «[edit]» из оглавления без использования JavaScript. Таким образом, единственное решение, которое будет надежно работать и все будет выглядеть правильно, — это использовать JavaScript, как это сделали вы.
person
Jack Taylor
schedule
02.05.2017