mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/CodeMirror
synced 2024-11-27 15:40:00 +00:00
Merge "CodeMirror: partially implement $.textSelection 'encapsulateSelection'"
This commit is contained in:
commit
0b7916bc59
2
resources/dist/main.js
vendored
2
resources/dist/main.js
vendored
File diff suppressed because one or more lines are too long
2
resources/dist/main.js.map.json
vendored
2
resources/dist/main.js.map.json
vendored
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
||||||
import { EditorState, Extension } from '@codemirror/state';
|
import { EditorSelection, EditorState, Extension } from '@codemirror/state';
|
||||||
import { EditorView, lineNumbers, highlightSpecialChars } from '@codemirror/view';
|
import { EditorView, lineNumbers, highlightSpecialChars } from '@codemirror/view';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -256,6 +256,30 @@ export default class CodeMirror {
|
||||||
this.view.focus();
|
this.view.focus();
|
||||||
return $cmDom;
|
return $cmDom;
|
||||||
},
|
},
|
||||||
|
encapsulateSelection: ( options ) => {
|
||||||
|
// First set the selection, if applicable.
|
||||||
|
if ( options.selectionStart || options.selectionEnd ) {
|
||||||
|
this.view.dispatch( {
|
||||||
|
selection: {
|
||||||
|
anchor: options.selectionStart,
|
||||||
|
head: ( options.selectionEnd || options.selectionStart )
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
// Do the actual replacements.
|
||||||
|
this.view.dispatch( this.view.state.changeByRange( ( range ) => ( {
|
||||||
|
changes: [
|
||||||
|
{ from: range.from, insert: options.pre },
|
||||||
|
{ from: range.to, insert: options.post }
|
||||||
|
],
|
||||||
|
range: EditorSelection.range(
|
||||||
|
range.from,
|
||||||
|
range.to + options.pre.length + options.post.length
|
||||||
|
)
|
||||||
|
} ) ) );
|
||||||
|
this.view.focus();
|
||||||
|
return $cmDom;
|
||||||
|
},
|
||||||
replaceSelection: ( value ) => {
|
replaceSelection: ( value ) => {
|
||||||
this.view.dispatch(
|
this.view.dispatch(
|
||||||
this.view.state.replaceSelection( value )
|
this.view.state.replaceSelection( value )
|
||||||
|
|
|
@ -20,6 +20,7 @@ describe( 'CodeMirror textSelection for the wikitext 2010 editor', () => {
|
||||||
await EditPage.clickText();
|
await EditPage.clickText();
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// Content is "[]{{template}}"
|
||||||
it( 'sets and gets the correct text when using setContents and getContents', async () => {
|
it( 'sets and gets the correct text when using setContents and getContents', async () => {
|
||||||
await browser.execute( () => $( '.cm-editor' ).textSelection( 'setContents', 'foobar' ) );
|
await browser.execute( () => $( '.cm-editor' ).textSelection( 'setContents', 'foobar' ) );
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
|
@ -28,6 +29,7 @@ describe( 'CodeMirror textSelection for the wikitext 2010 editor', () => {
|
||||||
);
|
);
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// Content is now "foobar"
|
||||||
it( 'sets and gets the correct selection when using setSelection and getSelection', async () => {
|
it( 'sets and gets the correct selection when using setSelection and getSelection', async () => {
|
||||||
await browser.execute( () => {
|
await browser.execute( () => {
|
||||||
$( '.cm-editor' ).textSelection( 'setSelection', { start: 3, end: 6 } );
|
$( '.cm-editor' ).textSelection( 'setSelection', { start: 3, end: 6 } );
|
||||||
|
@ -48,6 +50,7 @@ describe( 'CodeMirror textSelection for the wikitext 2010 editor', () => {
|
||||||
);
|
);
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// Content is now "foobaz"
|
||||||
it( 'returns the correct values for getCaretPosition', async () => {
|
it( 'returns the correct values for getCaretPosition', async () => {
|
||||||
await browser.execute( () => {
|
await browser.execute( () => {
|
||||||
$( '.cm-editor' ).textSelection( 'setSelection', { start: 3, end: 6 } );
|
$( '.cm-editor' ).textSelection( 'setSelection', { start: 3, end: 6 } );
|
||||||
|
@ -64,6 +67,23 @@ describe( 'CodeMirror textSelection for the wikitext 2010 editor', () => {
|
||||||
);
|
);
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
it( 'correctly wraps the selected text when using encapsulateSelection', async function () {
|
||||||
|
await browser.execute( () => {
|
||||||
|
$( '.cm-editor' ).textSelection( 'setContents', 'foobaz' )
|
||||||
|
.textSelection( 'encapsulateSelection', {
|
||||||
|
selectionStart: 0,
|
||||||
|
selectionEnd: 6,
|
||||||
|
pre: '<div>',
|
||||||
|
post: '</div>'
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
assert.strictEqual(
|
||||||
|
await browser.execute( () => $( '.cm-editor' ).textSelection( 'getContents' ) ),
|
||||||
|
'<div>foobaz</div>'
|
||||||
|
);
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Content is now "<div>foobaz</div>"
|
||||||
it( 'scrolls to the correct place when using scrollToCaretPosition', async () => {
|
it( 'scrolls to the correct place when using scrollToCaretPosition', async () => {
|
||||||
await browser.execute( () => {
|
await browser.execute( () => {
|
||||||
const $cmEditor = $( '.cm-editor' );
|
const $cmEditor = $( '.cm-editor' );
|
||||||
|
@ -81,6 +101,7 @@ describe( 'CodeMirror textSelection for the wikitext 2010 editor', () => {
|
||||||
);
|
);
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// Content is now "foobar\n" repeated 50 times.
|
||||||
it( 'retains the contents after turning CodeMirror off', async () => {
|
it( 'retains the contents after turning CodeMirror off', async () => {
|
||||||
await EditPage.legacyCodeMirrorButton.click();
|
await EditPage.legacyCodeMirrorButton.click();
|
||||||
await EditPage.legacyTextInput.waitForDisplayed();
|
await EditPage.legacyTextInput.waitForDisplayed();
|
||||||
|
|
Loading…
Reference in a new issue