There are a few topics in this page about wrapping selection in custom tags, but none of them seem to give a complete working example. I am posting here my gadget to wrap text in "<bible></bible>" tags, in case it helps to someone:
ve.ui.BibliaCommand = function VeUiBibliaCommand() {
ve.ui.BibliaCommand.super.call( this, 'Biblia' );
};
OO.inheritClass( ve.ui.BibliaCommand, ve.ui.Command );
ve.ui.BibliaCommand.prototype.execute = function ( surface ) {
var model = surface.getModel(),
doc = model.getDocument(),
range = model.getSelection().getRange(),
docRange = doc.shallowCloneFromRange( range );
ve.init.target.getWikitextFragment( docRange, false ).done( function ( wikitext ) {
model.getFragment().insertHtml('<bible>'+wikitext+'</bible>');
} );
};
ve.ui.commandRegistry.register( new ve.ui.BibliaCommand() );
ve.ui.BibliaTool = function VeUiBibliaTool() {
ve.ui.BibliaTool.super.apply( this, arguments );
};
OO.inheritClass( ve.ui.BibliaTool, ve.ui.Tool );
ve.ui.BibliaTool.static.name = 'Biblia';
ve.ui.BibliaTool.static.group = 'cite';
ve.ui.BibliaTool.static.icon = 'book';
ve.ui.BibliaTool.static.title = 'Biblia';
ve.ui.BibliaTool.static.commandName = 'Biblia';
ve.ui.toolFactory.register( ve.ui.BibliaTool );