我正在尝试在可视化编辑器工具栏中插入指向特殊页面的自定义链接。见下图。
我用谷歌搜索了很多但没有成功。有人请给个路径...
我的回答基于以下资源:
另外,我很确定,据我所知,没有记录在 VE 中向工具栏添加工具的方法。尽管可以将工具添加到已添加的组中,但主要用于“插入”工具组,例如Syntaxhighlight_GeSHi)。可能有一种更简单或“更好”的方法来做到这一点:)
首先,VisualEditor 提供了一种在加载 VE 的主要部分时(主要是单击“编辑”按钮时)加载附加模块(称为插件)的方法。模块需要通过全局变量$wgVisualEditorPluginModules
(或 extension.json 中的等效变量,如果您使用新的扩展注册)进行注册。在您的扩展注册文件中,您应该初始化一个模块(使用添加工具所需的脚本文件)并将其添加为 VE 插件。
示例 PHP(通过 PHP 文件进行旧扩展注册):
// other setup...
$wgResourceModules['ext.extName.visualeditor'] = array(
'localBasePath' => __DIR__,
'remoteExtPath' => 'extName'
'dependencies' => array(
'ext.visualEditor.mwcore',
),
'scripts' => array(
'javascripts/ve.ui.ExtNameTool.js',
),
'messages' => array(
'extname-ve-toolname',
),
);
$wgVisualEditorPluginModules[] = 'ext.extName.visualeditor';
// other setup...
extension.json(新的基于 JSON 的扩展注册):
// other setup...
"ResourceModules": {
"ext.geshi.visualEditor": {
"scripts": [
"javascripts/ve.ui.ExtNameTool.js"
],
"dependencies": [
"ext.visualEditor.mwcore"
],
"messages": [
"extname-ve-toolname"
]
}
},
"VisualEditorPluginModules": [
"ext.extName.visualeditor"
],
// other setup...
现在,如果 VE 启动,它将加载您的模块,ext.extName.visualeditor
在本例中命名为 script ve.ui.ExtNameTool.js
。在这个脚本中,您现在可以做任何您想做的事情。例如,这是一种将新模块添加到工具栏中工具组列表末尾的方法:
ve.ui.ExtNameTool.js 示例:
( function () {
// create a new class, which will inherit ve.ui.Tool,
// which represents one tool
ve.ui.extNameTool = function extNameTool( toolGroup, config ) {
// parent constructor
ve.ui.extNameTool.super.apply( this, arguments );
// the tool should be enabled by default, enable it
this.setDisabled( false );
}
// inherit ve.ui.Tool
OO.inheritClass( ve.ui.extNameTool, ve.ui.Tool );
// every tool needs at least a name, or an icon
// (with the static property icon)
ve.ui.extNameTool.static.name = 'extname';
// don't add the tool to a named group automatically
ve.ui.extNameTool.static.autoAddToGroup = false;
// prevent this tool to be added to a catch-all group (*),
although this tool isn't added to a group
ve.ui.extNameTool.static.autoAddToCatchall = false;
// the title of the group (it's a message key,
// which should be added to the extensions i18n
// en.json file to be translateable)
// can be a string, too
ve.ui.extNameTool.static.title =
OO.ui.deferMsg( 'extname-ve-toolname' );
// onSelect is the handler for a click on the tool
ve.ui.extNameTool.prototype.onSelect = function () {
// show an alert box only, but you can do anything
alert( 'Hello' );
this.setActive( false );
}
// needs to be overwritten, but does nothing so far
ve.ui.extNameTool.prototype.onUpdateState = function () {
ve.ui.extNameTool.super.prototype.onUpdateState.apply( this, arguments );
}
// the tool needs to be registered to the toolFactory
// of the toolbar to be reachable with the given name
ve.ui.toolFactory.register( ve.ui.extNameTool );
// add this tool to the toolbar
ve.init.mw.Target.static.toolbarGroups.push( {
// this will create a new toolgroup with the tools
// named in this include directive. The naem is the name given
// in the static property of the tool
include: [ 'extname' ]
} );
} )();
在您的扩展程序中安装LocalSettings.php
并启动 VE 后,您应该会在工具栏中看到一个具有给定名称的新工具。单击它将显示一个带有“Hello”内容的警报框。就像内联注释中所写的那样:在点击处理程序 ( onSelect
) 中,您可以做任何您想做的事情,例如在新选项卡中打开一个链接,例如到一个特殊页面。要获得指向特殊页面的链接,我建议使用它mw.Title
来获取本地化的命名空间。例如:
var relativeUrl = mw.Title.newFromText( 'RecentChanges', -1 ).getUrl();
的第一个参数mw.Title.newFromText()
是页面的名称,第二个参数是命名空间的 ID(-1 是特殊页面的默认值,应该始终有效)。
我希望这会有所帮助!
我不确定我是否完全理解你的问题。就像选择一些文本,单击链图标,然后单击External Link
选项卡并将链接粘贴到那里一样简单。