8
0
Просмотр исходного кода

Merge branch 'master' into t/47

Piotrek Koszuliński 9 лет назад
Родитель
Сommit
fd9156328e

+ 26 - 0
packages/ckeditor5-typing/.travis.yml

@@ -0,0 +1,26 @@
+sudo: required
+dist: trusty
+addons:
+  apt:
+    sources:
+      - google-chrome
+    packages:
+      - google-chrome-stable
+language: node_js
+node_js:
+  - "6"
+cache:
+  - node_modules
+before_install:
+  - export CHROME_BIN=chromium-browser
+  - export DISPLAY=:99.0
+  - sh -e /etc/init.d/xvfb start
+install:
+  - npm install
+  - npm install @ckeditor/ckeditor5-dev-tests
+  - npm install codeclimate-test-reporter
+script:
+  - node_modules/.bin/ckeditor5-dev-tests --coverage --ignore-duplicates
+after_success:
+  - sed -i.backup 's/\.build\/ckeditor5\/[^\/]*/src/g' .build/coverage/lcov.info
+  - node_modules/.bin/codeclimate-test-reporter < .build/coverage/lcov.info

+ 5 - 0
packages/ckeditor5-typing/README.md

@@ -1,6 +1,11 @@
 CKEditor 5 Typing Feature
 ========================================
 
+[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-typing.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing)
+[![Build Status](https://travis-ci.org/ckeditor/ckeditor5-typing.svg?branch=master)](https://travis-ci.org/ckeditor/ckeditor5-typing)
+[![Test Coverage](https://codeclimate.com/github/ckeditor/ckeditor5-typing/badges/coverage.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-typing/coverage)
+[![Code Climate](https://codeclimate.com/github/ckeditor/ckeditor5-typing/badges/gpa.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-typing)
+[![Dependency Status](https://david-dm.org/ckeditor/ckeditor5-typing/status.svg)](https://david-dm.org/ckeditor/ckeditor5-typing#info=dependencies)
 [![devDependency Status](https://david-dm.org/ckeditor/ckeditor5-typing/dev-status.svg)](https://david-dm.org/ckeditor/ckeditor5-typing#info=devDependencies)
 
 The typing feature for CKEditor 5. More information about the project can be found at the following URL: <https://github.com/ckeditor/ckeditor5-typing>.

+ 13 - 2
packages/ckeditor5-typing/package.json

@@ -1,11 +1,22 @@
 {
   "name": "ckeditor5-typing",
-  "version": "0.3.0",
+  "version": "0.4.0",
   "description": "Typing feature for CKEditor 5.",
   "keywords": [],
-  "dependencies": {},
+  "dependencies": {
+    "ckeditor5-core": "ckeditor/ckeditor5-core",
+    "ckeditor5-engine": "ckeditor/ckeditor5-engine",
+    "ckeditor5-utils": "ckeditor/ckeditor5-utils"
+  },
   "devDependencies": {
     "@ckeditor/ckeditor5-dev-lint": "^1.0.1",
+    "ckeditor5-basic-styles": "ckeditor/ckeditor5-basic-styles",
+    "ckeditor5-editor-classic": "ckeditor/ckeditor5-editor-classic",
+    "ckeditor5-enter": "ckeditor/ckeditor5-enter",
+    "ckeditor5-heading": "ckeditor/ckeditor5-heading",
+    "ckeditor5-paragraph": "ckeditor/ckeditor5-paragraph",
+    "ckeditor5-typing": "ckeditor/ckeditor5-typing",
+    "ckeditor5-undo": "ckeditor/ckeditor5-undo",
     "gulp": "^3.9.0",
     "guppy-pre-commit": "^0.4.0"
   },

+ 4 - 3
packages/ckeditor5-typing/src/deletecommand.js

@@ -50,17 +50,18 @@ export default class DeleteCommand extends Command {
 	 * or a piece of content in the {@link typing.DeleteCommand#direction defined direction}.
 	 *
 	 * @param {Object} [options] The command options.
-	 * @param {'character'} [options.unit='character'] See {@link engine.model.composer.modifySelection}'s options.
+	 * @param {'character'} [options.unit='character'] See {@link engine.controller.modifySelection}'s options.
 	 */
 	_doExecute( options = {} ) {
 		const doc = this.editor.document;
+		const dataController = this.editor.data;
 
 		doc.enqueueChanges( () => {
 			const selection = Selection.createFromSelection( doc.selection );
 
 			// Try to extend the selection in the specified direction.
 			if ( selection.isCollapsed ) {
-				doc.composer.modifySelection( selection, { direction: this.direction, unit: options.unit } );
+				dataController.modifySelection( selection, { direction: this.direction, unit: options.unit } );
 			}
 
 			// If selection is still collapsed, then there's nothing to delete.
@@ -76,7 +77,7 @@ export default class DeleteCommand extends Command {
 				);
 			} );
 
-			doc.composer.deleteContents( this._buffer.batch, selection, { merge: true } );
+			dataController.deleteContent( selection, this._buffer.batch, { merge: true } );
 			this._buffer.input( changeCount );
 
 			doc.selection.setRanges( selection.getRanges(), selection.isBackward );

+ 1 - 1
packages/ckeditor5-typing/src/input.js

@@ -78,7 +78,7 @@ export default class Input extends Feature {
 		}
 
 		doc.enqueueChanges( () => {
-			doc.composer.deleteContents( this._buffer.batch, doc.selection );
+			this.editor.data.deleteContent( doc.selection, this._buffer.batch );
 		} );
 	}
 

+ 5 - 5
packages/ckeditor5-typing/tests/changebuffer.js

@@ -3,10 +3,10 @@
  * For licensing, see LICENSE.md.
  */
 
-import ChangeBuffer from '/ckeditor5/typing/changebuffer.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import Batch from '/ckeditor5/engine/model/batch.js';
-import Position from '/ckeditor5/engine/model/position.js';
+import ChangeBuffer from 'ckeditor5/typing/changebuffer.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Batch from 'ckeditor5/engine/model/batch.js';
+import Position from 'ckeditor5/engine/model/position.js';
 
 describe( 'ChangeBuffer', () => {
 	const CHANGE_LIMIT = 3;
@@ -18,7 +18,7 @@ describe( 'ChangeBuffer', () => {
 		buffer = new ChangeBuffer( doc, CHANGE_LIMIT );
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'sets all properties', () => {
 			expect( buffer ).to.have.property( 'document', doc );
 			expect( buffer ).to.have.property( 'limit', CHANGE_LIMIT );

+ 3 - 3
packages/ckeditor5-typing/tests/delete.js

@@ -3,9 +3,9 @@
  * For licensing, see LICENSE.md.
  */
 
-import VirtualTestEditor from '/tests/core/_utils/virtualtesteditor.js';
-import Delete from '/ckeditor5/typing/delete.js';
-import DomEventData from '/ckeditor5/engine/view/observer/domeventdata.js';
+import VirtualTestEditor from 'tests/core/_utils/virtualtesteditor.js';
+import Delete from 'ckeditor5/typing/delete.js';
+import DomEventData from 'ckeditor5/engine/view/observer/domeventdata.js';
 
 describe( 'Delete feature', () => {
 	let editor, editingView;

+ 4 - 4
packages/ckeditor5-typing/tests/deletecommand-integration.js

@@ -3,10 +3,10 @@
  * For licensing, see LICENSE.md.
  */
 
-import ModelTestEditor from '/tests/core/_utils/modeltesteditor.js';
-import DeleteCommand from '/ckeditor5/typing/deletecommand.js';
-import UndoEngine from '/ckeditor5/undo/undoengine.js';
-import { getData, setData } from '/ckeditor5/engine/dev-utils/model.js';
+import ModelTestEditor from 'tests/core/_utils/modeltesteditor.js';
+import DeleteCommand from 'ckeditor5/typing/deletecommand.js';
+import UndoEngine from 'ckeditor5/undo/undoengine.js';
+import { getData, setData } from 'ckeditor5/engine/dev-utils/model.js';
 
 let editor, doc;
 

+ 5 - 5
packages/ckeditor5-typing/tests/deletecommand.js

@@ -3,9 +3,9 @@
  * For licensing, see LICENSE.md.
  */
 
-import ModelTestEditor from '/tests/core/_utils/modeltesteditor.js';
-import DeleteCommand from '/ckeditor5/typing/deletecommand.js';
-import { getData, setData } from '/ckeditor5/engine/dev-utils/model.js';
+import ModelTestEditor from 'tests/core/_utils/modeltesteditor.js';
+import DeleteCommand from 'ckeditor5/typing/deletecommand.js';
+import { getData, setData } from 'ckeditor5/engine/dev-utils/model.js';
 
 describe( 'DeleteCommand', () => {
 	let editor, doc;
@@ -67,7 +67,7 @@ describe( 'DeleteCommand', () => {
 		it( 'does not try to delete when selection is at the boundary', () => {
 			const spy = sinon.spy();
 
-			doc.composer.on( 'deleteContents', spy );
+			editor.data.on( 'deleteContent', spy );
 			setData( doc, '<p>[]foo</p>' );
 
 			editor.execute( 'delete' );
@@ -79,7 +79,7 @@ describe( 'DeleteCommand', () => {
 		it( 'passes options to modifySelection', () => {
 			const spy = sinon.spy();
 
-			doc.composer.on( 'modifySelection', spy );
+			editor.data.on( 'modifySelection', spy );
 			setData( doc, '<p>foo[]bar</p>' );
 
 			editor.commands.get( 'delete' ).direction = 'forward';

+ 4 - 4
packages/ckeditor5-typing/tests/deleteobserver.js

@@ -5,10 +5,10 @@
 
 /* globals document */
 
-import DeleteObserver from '/ckeditor5/typing/deleteobserver.js';
-import ViewDocument from '/ckeditor5/engine/view/document.js';
-import DomEventData from '/ckeditor5/engine/view/observer/domeventdata.js';
-import { getCode } from '/ckeditor5/utils/keyboard.js';
+import DeleteObserver from 'ckeditor5/typing/deleteobserver.js';
+import ViewDocument from 'ckeditor5/engine/view/document.js';
+import DomEventData from 'ckeditor5/engine/view/observer/domeventdata.js';
+import { getCode } from 'ckeditor5/utils/keyboard.js';
 
 describe( 'DeleteObserver', () => {
 	let viewDocument, observer;

+ 14 - 14
packages/ckeditor5-typing/tests/input.js

@@ -3,24 +3,24 @@
  * For licensing, see LICENSE.md.
  */
 
-import VirtualTestEditor from '/tests/core/_utils/virtualtesteditor.js';
-import Input from '/ckeditor5/typing/input.js';
-import Paragraph from '/ckeditor5/paragraph/paragraph.js';
+import VirtualTestEditor from 'tests/core/_utils/virtualtesteditor.js';
+import Input from 'ckeditor5/typing/input.js';
+import Paragraph from 'ckeditor5/paragraph/paragraph.js';
 
-import Batch from '/ckeditor5/engine/model/batch.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import buildModelConverter from '/ckeditor5/engine/conversion/buildmodelconverter.js';
-import buildViewConverter from '/ckeditor5/engine/conversion/buildviewconverter.js';
+import Batch from 'ckeditor5/engine/model/batch.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import buildModelConverter from 'ckeditor5/engine/conversion/buildmodelconverter.js';
+import buildViewConverter from 'ckeditor5/engine/conversion/buildviewconverter.js';
 
-import ViewText from '/ckeditor5/engine/view/text.js';
-import ViewElement from '/ckeditor5/engine/view/element.js';
-import ViewSelection from '/ckeditor5/engine/view/selection.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
+import ViewElement from 'ckeditor5/engine/view/element.js';
+import ViewSelection from 'ckeditor5/engine/view/selection.js';
 
-import EmitterMixin from '/ckeditor5/utils/emittermixin.js';
-import { getCode } from '/ckeditor5/utils/keyboard.js';
+import EmitterMixin from 'ckeditor5/utils/emittermixin.js';
+import { getCode } from 'ckeditor5/utils/keyboard.js';
 
-import { getData as getModelData } from '/ckeditor5/engine/dev-utils/model.js';
-import { getData as getViewData } from '/ckeditor5/engine/dev-utils/view.js';
+import { getData as getModelData } from 'ckeditor5/engine/dev-utils/model.js';
+import { getData as getViewData } from 'ckeditor5/engine/dev-utils/view.js';
 
 describe( 'Input feature', () => {
 	let editor, model, modelRoot, view, viewRoot, listenter;

+ 0 - 0
packages/ckeditor5-typing/tests/tickets/40/1.html → packages/ckeditor5-typing/tests/manual/40/1.html


+ 0 - 0
packages/ckeditor5-typing/tests/tickets/40/1.js → packages/ckeditor5-typing/tests/manual/40/1.js


+ 0 - 0
packages/ckeditor5-typing/tests/tickets/40/1.md → packages/ckeditor5-typing/tests/manual/40/1.md


+ 0 - 0
packages/ckeditor5-typing/tests/tickets/49/1.html → packages/ckeditor5-typing/tests/manual/49/1.html


+ 0 - 0
packages/ckeditor5-typing/tests/tickets/49/1.js → packages/ckeditor5-typing/tests/manual/49/1.js


+ 0 - 0
packages/ckeditor5-typing/tests/tickets/49/1.md → packages/ckeditor5-typing/tests/manual/49/1.md


+ 7 - 0
packages/ckeditor5-typing/tests/manual/59/1.html

@@ -0,0 +1,7 @@
+<head>
+	<link rel="stylesheet" href="%APPS_DIR%ckeditor/build/modules/amd/theme/ckeditor.css">
+</head>
+
+<div id="editor">
+	<p><strong>This</strong> is an editor <strong>instance</strong>.</p>
+</div>

+ 22 - 0
packages/ckeditor5-typing/tests/manual/59/1.js

@@ -0,0 +1,22 @@
+/**
+ * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* globals console, document, window */
+
+import ClassicEditor from '/ckeditor5/editor-classic/classic.js';
+import Typing from '/ckeditor5/typing/typing.js';
+import Paragraph from '/ckeditor5/paragraph/paragraph.js';
+import Bold from '/ckeditor5/basic-styles/bold.js';
+
+ClassicEditor.create( document.querySelector( '#editor' ), {
+	features: [ Typing, Paragraph, Bold ],
+	toolbar: [ 'bold' ]
+} )
+.then( editor => {
+	window.editor = editor;
+} )
+.catch( err => {
+	console.error( err.stack );
+} );

+ 8 - 0
packages/ckeditor5-typing/tests/manual/59/1.md

@@ -0,0 +1,8 @@
+@bender-ui: collapsed
+@bender-tags: ticket, 59, iteration4
+
+### Issue [#59](https://github.com/ckeditor/ckeditor5-typing/issues/59) manual test
+
+1. Put selection at the end of the text.
+2. Start backspacing.
+3. No error should be thrown.

+ 2 - 2
packages/ckeditor5-typing/tests/manual/unicode.html

@@ -3,6 +3,6 @@
 </head>
 
 <div id="editor">
-	<p>Some surrogate pair characters: 💩💩 and 𨭎𨭎</p>
-	<p>Some base characters with combining marks: a̻̐ and z͙ͤͣ</p>
+	<p>Some surrogate pair characters: 🐛🐛 and 𨭎𨭎</p>
+	<p>Some base characters with combining marks: a̻̐ and zͤͣ</p>
 </div>

+ 58 - 0
packages/ckeditor5-typing/tests/tickets/59.js

@@ -0,0 +1,58 @@
+/**
+ * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* globals document */
+
+import ClassicEditor from 'ckeditor5/editor-classic/classic.js';
+import Typing from 'ckeditor5/typing/typing.js';
+import Paragraph from 'ckeditor5/paragraph/paragraph.js';
+import Bold from 'ckeditor5/basic-styles/bold.js';
+import { setData } from 'ckeditor5/engine/dev-utils/model.js';
+
+describe( 'Bug #59', () => {
+	let editor;
+	let container;
+
+	beforeEach( () => {
+		container = document.createElement( 'div' );
+		document.body.appendChild( container );
+
+		return ClassicEditor.create( container, {
+			features: [ Typing, Paragraph, Bold ]
+		} )
+		.then( newEditor => {
+			editor = newEditor;
+		} );
+	} );
+
+	it( 'editor does not blow up when deleting last styled character', () => {
+		editor.document.enqueueChanges( () => {
+			editor.editing.view.getDomRoot().focus();
+			setData( editor.document, '<paragraph><$text bold="true">foo</$text> x <$text bold="true">bar</$text>.[]</paragraph>' );
+		} );
+
+		while ( editor.document.selection.anchor.offset > 0 ) {
+			editor.execute( 'delete' );
+		}
+
+		expect( editor.getData() ).to.equal( '<p>&nbsp;</p>' );
+	} );
+
+	// This is something that came to my mind after I worked on ckeditor/ckeditor5-engine#659.
+	// Toggling bold at the end creates a lot of weird cases so it's interesting to see if it works... and it didn't back then.
+	it( 'editor does not blow up when deleting last styled character, forcing bold switch', () => {
+		editor.document.enqueueChanges( () => {
+			editor.editing.view.getDomRoot().focus();
+			setData( editor.document, '<paragraph><$text bold="true">foo</$text> x <$text bold="true">bar</$text>.[]</paragraph>' );
+		} );
+
+		while ( editor.document.selection.anchor.offset > 0 ) {
+			editor.execute( 'delete' );
+			editor.execute( 'bold' );
+		}
+
+		expect( editor.getData() ).to.equal( '<p>&nbsp;</p>' );
+	} );
+} );

+ 3 - 3
packages/ckeditor5-typing/tests/typing.js

@@ -3,9 +3,9 @@
  * For licensing, see LICENSE.md.
  */
 
-import Typing from '/ckeditor5/typing/typing.js';
-import Input from '/ckeditor5/typing/input.js';
-import Delete from '/ckeditor5/typing/delete.js';
+import Typing from 'ckeditor5/typing/typing.js';
+import Input from 'ckeditor5/typing/input.js';
+import Delete from 'ckeditor5/typing/delete.js';
 
 describe( 'Typing feature', () => {
 	it( 'requires Input and Delete features', () => {