我如何修改 MediaWiki CharInsert 扩展以允许插入与其提供的按钮不同的 wiki 文本?

How do I modify the MediaWiki CharInsert extension to enable the insertion of wikitext different from the button it provides?

MediaWiki CharInsert extension 是一个扩展,可以在 Wiki 页面上使用 <charinsert></charinsert> 标签。这些标签提供了一个 JavaScript 弹出窗口,允许将 wiki 文本的固定片段插入到文章中。它还创建了一个名为 MediaWiki:Edittools 的 Wiki 页面,用户可以在 charinsert 标签内添加 wiki 文本片段,他们可以通过单击将其插入到 Wiki 页面中。我很难清楚地解释这一点,所以我将使用下面的屏幕截图来帮助我解释它。

这是 WYSIWIG wiki 文本编辑器,显示了 edittools 工具箱。如果您点击任何按钮(例如 <nowiki></nowiki> 按钮),它会将您点击的按钮中显示的 wiki 文本插入到上面显示的所见即所得编辑器中。

现在这个问题的原因是我希望能够修改 CharInsert 扩展名,这样就可以插入与 JavaScript (JS) 显示标题不同的 wiki 文本按钮。我认为可以做到这一点的一种方法是添加一个属性,比如 "content"。我提到这个是因为它可以帮助我解释我的意思,例如 Edittools 页面包含一行:

<charinsert content = "{{Information%0A|Description=%0A|Source=%0A|Date=%0A|License=%0A|Author=%0A}}">{{Information}}</charinsert>

然后,虽然只有 {{Information}} 会出现在 edittools 工具箱中,但 {{Information%0A|Description=%0A|Source=%0A|Date=%0A|License=%0A|Author=%0A}} 将是此按钮将插入到 WYSIWIG 编辑器中的内容。

有谁知道我将如何修改 CharInsert 扩展以使其能够执行此操作?请记住,我对 PHP 知之甚少,所以请不要给我一些对有经验的 PHP 程序员有帮助但对像我这样的新手毫无用处的程序员话语。因此,请给我简单的说明,确切说明要添加到哪个(即,你告诉我哪个)PHP 脚本文件。

我已经在 Phabricator 的 Extension_Talk:CharInsert page at MediaWiki.org, which sent me to this 问题上问过这个问题,我尝试了提供的补丁中提到的技术,但它没有用(详情请参阅 charinsert 讨论页面,这是前一段时间所以我记不住它们),可能是因为这个补丁有多旧(现在大约 5 年了)。几个月后我在这里问这个问题,因为我仍然没有收到有用的答复。

如果相关,我正在使用 MediaWiki 1.25.1。

老实说,仔细研究了 CharInsert extension and its source code,我建议不要使用它。它实在是太笨拙了,而且它没有做任何用 JavaScript.

不能更容易完成的事情

所以,这是我的建议:

1。将以下代码添加到您的 MediaWiki:Common.js 页面:

// Turn <span class="mw-charinsert">foo</span> into a link that inserts "foo"
// into the edit box:
$( function () {
    $('span.mw-charinsert').wrap( '<a href="#">' ).click( function () {
        var text = this.title || this.textContent;
        var parts = text.split( '+' );
        if ( text === '+' ) parts = [ text ];
        var front = decodeURIComponent( parts[0] || '' );
        var back  = decodeURIComponent( parts[1] || '' );
        insertTags( front, back, '' );
        return false;
    } );
} );

2。将 标签替换为 :

这应该主要是 drop-in 替换;只需转换:

<charinsert>foo</charinsert>
<charinsert>bar</charinsert>

进入:

<span class="mw-charinsert">foo</span>
<span class="mw-charinsert">bar</span>

请注意,与 CharInsert 扩展不同,上面的 JS 代码不支持在一个标签中使用多个 whitespace-separated link。也就是说,

<span class="mw-charinsert">foo bar</span>

创建一个插入 foo bar 的单个 link,而不是插入 foobar 的两个 link(但请参阅下面的注释折叠空白!)。您仍然需要将任何包含 wiki 标记的文本包装在 <nowiki> 标签内以防止其被解析。

3。可选地,添加标题属性以更改插入的文本:

例如,要创建读取 foo 但插入 bar 的 link,请使用以下标记:

<span class="mw-charinsert" title="bar">foo</span>

请注意,与 CharInsert 扩展一样,您可以在插入的文本中使用 + 符号来标记光标(和任何选定文本)将放置的位置。

注意:似乎 MediaWiki(或者更可能是 HTML Tidy)折叠了标题和文本中的连续空白。我添加了一个 URL-decodes 插入文本的组合,这样您就可以用 %20 表示文字空格,用 %0A 表示换行符,用 %2B 表示加号。这确实意味着您还需要将任何文字 % 符号替换为 %25.


Ps. 上面的代码EditTools gadget兼容,或者更具体地说,与它的 makeButtons() 函数试图将标准的 CharInsert link 转换为按钮。这是一个将 <span class="mw-charinsert"> 元素直接变成按钮的变体, 与小工具兼容:

// Turn <span class="mw-charinsert">foo</span> into a button that inserts "foo"
// into the edit box:
$( function () {
    $( 'span.mw-charinsert' ).wrap( function () {
        var text = this.title || this.textContent;
        var parts = text.split( '+' );
        if ( text === '+' ) parts = [ text ];
        var front = decodeURIComponent( parts[0] || '' );
        var back  = decodeURIComponent( parts[1] || '' );
        return $( '<button>' ).click( function () {
            insertTags( front, back, '' );
            return false;
        } );
    } );
} );