Jump to content

Topic on Talk:VisualEditor/Gadgets/Add a tool

Enclose selected text in custom tags

3
JuanMC78 (talkcontribs)

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 );

JuanMC78 (talkcontribs)

Now, I have one problem: this code creates a new line before and after the wrapped text, but I want it to stay inline. Anybody can suggest a solution?

JuanMC78 (talkcontribs)

Okay, I figured it out. I did two replace transactions, in order to remove the newlines inserted before and after the HTLM (2 characters each, since they are CR/LF). It looks like this:


model.getFragment().insertHtml('<bible>'+wikitext+'</bible>');

var inicio = model.selection.range.from; var mitransac = ve.dm.TransactionBuilder.static.newFromReplacement( doc, new ve.Range( inicio, inicio+2 ), '' )

model.getFragment().change(mitransac);

var fin = model.selection.range.to;

var mitransac2 = ve.dm.TransactionBuilder.static.newFromReplacement( doc, new ve.Range( fin-2, fin ), '' )

model.getFragment().change(mitransac2);

Reply to "Enclose selected text in custom tags"