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

时间:2015-07-13 05:54:27

标签: php mediawiki mediawiki-extensions

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

这是WYSIWIG维基文本编辑器,显示了edittools工具箱。如果您单击任何按钮(例如,<nowiki></nowiki>一个),它将插入您单击的按钮中显示的wikitext到上面显示的WYSIWIG编辑器中。

enter image description here

现在问题的原因是我希望能够修改CharInsert扩展,以便可以插入与用于JavaScript(JS)按钮的显示标题的wikitext不同的wiki文本。我认为可以这样做的一种方法是添加一个属性,比如“内容”。我提到这个是因为它有助于我解释我的意思,比如说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脚本文件。

我在MediaWiki.org的Extension_Talk:CharInsert页面上提出了这个问题,该问题将我发送到了Phabricator上的this问题,我尝试了提供的补丁中提到的技术,但它没有用(参见charinsert谈话页面的细节,这是前一段时间,所以我不记得他们在手边),可能是因为这个补丁有多大(现在约5年)。我几个月后在这里问这个问题,因为我还没有收到有用的答复。

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

1 个答案:

答案 0 :(得分:3)

老实说,仔细观察CharInsert extension及其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。替换你的&lt; charinsert&gt;标签包含&lt; span class =&#34; mw-charinsert&#34;&gt;:

这应该是一个替代品;只需转换:

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

成:

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

请注意,与CharInsert扩展不同,上面的JS代码不支持一个标记中的多个以空格分隔的链接。也就是说,

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

创建一个插入foo bar的链接,而不是两个插入foobar的链接(但请参阅下面有关折叠空白的说明!)。您仍然希望在<nowiki>标记内包含任何包含wiki标记的文本,以防止其解析。

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

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

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

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

注意:似乎MediaWiki(或者更可能是HTML Tidy)在标题和文本中折叠连续的空格。我添加了一个对已插入文本进行网址解码的kluge,以便您可以使用%20表示文字空格,使用%0A表示换行符,使用%2B加号表示。这意味着您还需要使用%替换任何文字%25符号。

Ps。以上代码 EditTools gadget不兼容,或者更具体地说,是makeButtons()函数尝试转换标准CharInsert链接到按钮。这是一个将<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;
        } );
    } );
} );