shiftenter.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /**
  2. * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /**
  6. * @module enter/shiftenter
  7. */
  8. import ShiftEnterCommand from './shiftentercommand';
  9. import EnterObserver from './enterobserver';
  10. import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
  11. import { upcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
  12. import { downcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
  13. /**
  14. * The ShiftEnter feature. Handles the <kbd>Shift + Enter</kbd> keys in the editor.
  15. *
  16. * @extends module:core/plugin~Plugin
  17. */
  18. export default class ShiftEnter extends Plugin {
  19. /**
  20. * @inheritDoc
  21. */
  22. static get pluginName() {
  23. return 'ShiftEnter';
  24. }
  25. init() {
  26. const editor = this.editor;
  27. const schema = editor.model.schema;
  28. const conversion = editor.conversion;
  29. const view = editor.editing.view;
  30. const viewDocument = view.document;
  31. // Configure schema.
  32. schema.register( 'break', {
  33. allowWhere: '$text'
  34. } );
  35. // Configure converters.
  36. conversion.for( 'upcast' )
  37. .add( upcastElementToElement( {
  38. model: 'break',
  39. view: 'br'
  40. } ) );
  41. conversion.for( 'downcast' )
  42. .add( downcastElementToElement( {
  43. model: 'break',
  44. view: ( modelElement, viewWriter ) => viewWriter.createEmptyElement( 'br' )
  45. } ) );
  46. view.addObserver( EnterObserver );
  47. editor.commands.add( 'shiftEnter', new ShiftEnterCommand( editor ) );
  48. // TODO We may use the keystroke handler for that.
  49. this.listenTo( viewDocument, 'enter', ( evt, data ) => {
  50. // The 'Enter' key is handled by the Enter plugin.
  51. if ( !data.isSoft ) {
  52. return;
  53. }
  54. editor.execute( 'shiftEnter' );
  55. data.preventDefault();
  56. view.scrollToTheSelection();
  57. }, { priority: 'low' } );
  58. }
  59. }