diff --git a/bower.json b/bower.json
index 1725cb234a..42a75d1c71 100644
--- a/bower.json
+++ b/bower.json
@@ -34,7 +34,7 @@
"markdown-it": "^8.3.1",
"toMark": "https://github.com/nhnent/toMark.git#0.0.18",
"tui-component-colorpicker": "~1.0.2",
- "squire-rte": "kyuwoo-choi/Squire#tui-editor-release",
+ "squire-rte": "https://github.com/neilj/Squire.git#306230d0df9b38047cd06204476ddc0582569cfd",
"plantuml-encoder": "^1.2.4",
"tui-chart": "^2.9.4"
},
diff --git a/src/js/wwListManager.js b/src/js/wwListManager.js
index 4f9592b1c0..9593030413 100644
--- a/src/js/wwListManager.js
+++ b/src/js/wwListManager.js
@@ -6,6 +6,8 @@
import domUtils from './domUtils';
const FIND_LI_ELEMENT = /
this._convertToArbitraryNestingList(html));
+
this.eventManager.listen('wysiwygRangeChangeAfter', () => {
this._findAndRemoveEmptyList();
this._removeBranchListAll();
- this._wrapDefaultBlockToListInner();
});
this.eventManager.listen('wysiwygSetValueAfter', () => {
this._removeBranchListAll();
- this._wrapDefaultBlockToListInner();
});
- this.eventManager.listen('wysiwygProcessHTMLText', html => this._prepareInsertBlankToBetweenSameList(html));
+ this.eventManager.listen('wysiwygProcessHTMLText', html => {
+ html = this._insertBlankToBetweenSameList(html);
+ html = this._convertFromArbitraryNestingList(html);
+
+ return html;
+ });
this.eventManager.listen('convertorAfterHtmlToMarkdownConverted',
markdown => markdown.replace(/:BLANK_LINE:\n/g, ''));
@@ -87,7 +94,7 @@ class WwListManager {
if (range.collapsed) {
if (this.wwe.getEditor().hasFormat('LI')) {
ev.preventDefault();
- const $ul = $(range.startContainer).closest('li').children('ul, ol');
+ const $ul = $(range.startContainer).closest('li').children(UL_OR_OL);
this.eventManager.emit('command', 'DecreaseDepth');
@@ -131,7 +138,7 @@ class WwListManager {
* @private
*/
_findAndRemoveEmptyList() {
- this.wwe.get$Body().find('ul,ol').each((index, node) => {
+ this.wwe.get$Body().find(UL_OR_OL).each((index, node) => {
if (!(FIND_LI_ELEMENT.test(node.innerHTML))) {
$(node).remove();
}
@@ -177,22 +184,62 @@ class WwListManager {
$firstLi.remove();
}
+ _insertBlankToBetweenSameList(html) {
+ return html.replace(/<\/(ul|ol)>(
|
){0,}<\1>/g, '$1>:BLANK_LINE:<$1>');
+ }
+
/**
- * _wrapDefaultBlockToListInner
- * Wrap default block to list inner contents
+ * make arbitrary nesting list out of standard list
+ * `` to
+ * ``
+ * @param {string} html string to convert
+ * @returns {string} converted HTML text
* @private
*/
- _wrapDefaultBlockToListInner() {
- this.wwe.get$Body().find('li').each((index, node) => {
- if ($(node).children('div, p').length <= 0) {
- $(node).wrapInner('');
- $(node).find('div').children('ul, ol').appendTo(node);
- }
- });
+ _convertToArbitraryNestingList(html) {
+ const NESTED_LIST_QUERY = 'li > ul, li > ol';
+ const wrapper = document.createElement('div');
+ wrapper.innerHTML = html;
+
+ let nestedList = wrapper.querySelector(NESTED_LIST_QUERY);
+ while (nestedList !== null) {
+ const parentLI = nestedList.parentNode;
+ const parentList = parentLI.parentNode;
+
+ parentList.insertBefore(nestedList, parentLI.nextElementSibling);
+
+ nestedList = wrapper.querySelector(NESTED_LIST_QUERY);
+ }
+
+ return wrapper.innerHTML;
}
- _prepareInsertBlankToBetweenSameList(html) {
- return html.replace(/<\/(ul|ol)>(
|
){0,}<\1>/g, '$1>:BLANK_LINE:<$1>');
+ /**
+ * make standard list out of arbitrary nesting list
+ * `` from
+ * ``
+ * @param {string} html string to convert
+ * @returns {string} converted HTML text
+ * @private
+ */
+ _convertFromArbitraryNestingList(html) {
+ const NESTED_LIST_QUERY = 'ol > ol, ol > ul, ul > ol, ul > ul';
+ const wrapperDiv = document.createElement('div');
+ wrapperDiv.innerHTML = html;
+
+ let nestedList = wrapperDiv.querySelector(NESTED_LIST_QUERY);
+ while (nestedList !== null) {
+ let prevLI = nestedList.previousElementSibling;
+ while (prevLI.tagName !== 'LI') {
+ prevLI = prevLI.previousElementSibling;
+ }
+
+ prevLI.appendChild(nestedList);
+
+ nestedList = wrapperDiv.querySelector(NESTED_LIST_QUERY);
+ }
+
+ return wrapperDiv.innerHTML;
}
/**
@@ -205,34 +252,106 @@ class WwListManager {
*/
getLinesOfSelection(start, end) {
const lines = [];
- let isEndPassed = false;
+ let isLastLine = false;
let needNext = true;
let nextLine;
if (domUtils.isTextNode(start)) {
- start = $(start).parents('div').first().get(0);
+ start = $(start).parents(DIV_OR_LI).first().get(0);
}
if (domUtils.isTextNode(end)) {
- end = $(end).parents('div').first().get(0);
+ end = $(end).parents(DIV_OR_LI).first().get(0);
}
for (let line = start; needNext; line = nextLine) {
- if ($(line).is('DIV')) {
+ if ($(line).is(DIV_OR_LI)) {
lines.push(line);
if (line === end) {
- isEndPassed = true;
+ isLastLine = true;
+ } else {
+ nextLine = this._getNextLine(line, end);
}
- nextLine = line.nextElementSibling;
} else {
break;
}
- needNext = nextLine && !isEndPassed;
+ needNext = nextLine && !isLastLine;
}
return lines;
}
+
+ /**
+ * get next line
+ * @param {Node} currentLine - current line node
+ * @param {Node} end - last node in selection
+ * @returns {Node} - next line node
+ * @private
+ */
+ _getNextLine(currentLine, end) {
+ let nextLine = currentLine.nextElementSibling;
+
+ if (!nextLine) {
+ // current line was the last line in ul/ol
+ // while we have lines those has not been processed yet.
+ nextLine = currentLine.parentNode.nextElementSibling;
+ } else if ($(nextLine).is(UL_OR_OL)) {
+ // we don't sure firstChild is LI. arbtrary list can have another ol/ul
+ nextLine = nextLine.querySelector('li');
+ }
+
+ if ($(nextLine).is(DIV_OR_LI) || nextLine === end) {
+ return nextLine;
+ }
+
+ return this._getNextLine(nextLine);
+ }
+
+ /**
+ * merge to previous list
+ * consider remove this function when https://github.com/neilj/Squire/issues/294 resolved
+ * @param {HTMLLIElement} currentLine - current li element
+ * @ignore
+ */
+ mergeList(currentLine) {
+ let currentList = currentLine.parentNode;
+ const prevList = currentList.previousElementSibling;
+ const nextList = currentList.nextElementSibling;
+
+ if (currentList.firstElementChild === currentLine) {
+ if (prevList && $(prevList).is(UL_OR_OL)) {
+ this._mergeList(currentList, prevList);
+ currentList = prevList;
+ }
+ }
+
+ if (currentList.lastElementChild === currentLine) {
+ if (nextList && $(nextList).is(UL_OR_OL)) {
+ this._mergeList(nextList, currentList);
+ }
+ }
+ }
+
+ /**
+ * merge list to targetList
+ * @param {HTMLOListElement|HTMLUListElement} list - list to merge
+ * @param {HTMLOListElement|HTMLUListElement} targetList - target list
+ * @ignore
+ */
+ _mergeList(list, targetList) {
+ let listItem = list.firstElementChild;
+
+ if (targetList && $(targetList).is(UL_OR_OL)) {
+ while (listItem) {
+ const temp = listItem.nextElementSibling;
+ targetList.appendChild(listItem);
+ listItem = temp;
+ }
+
+ list.parentNode.removeChild(list);
+ }
+ }
}
module.exports = WwListManager;
diff --git a/src/js/wwTaskManager.js b/src/js/wwTaskManager.js
index 4ec43726fc..05bc9e8247 100644
--- a/src/js/wwTaskManager.js
+++ b/src/js/wwTaskManager.js
@@ -3,8 +3,6 @@
* @author Sungho Kim(sungho-kim@nhnent.com) FE Development Team/NHN Ent.
*/
-import domUtils from './domUtils';
-
const TASK_CLASS_NAME = 'task-list-item';
const TASK_ATTR_NAME = 'data-te-task';
const TASK_CHECKED_CLASS_NAME = 'checked';
@@ -165,78 +163,6 @@ class WwTaskManager {
$(node).removeClass('task-list');
});
}
-
- /**
- * Return lines in selection
- * @param {Node} start Start element
- * @param {Node} end End element
- * @param {HTMLElement} body Editor body element
- * @returns {Array.}
- * @private
- */
- getLinesOfSelection(start, end) {
- const divOrLi = 'DIV,LI';
- const lines = [];
- let isEndPassed = false;
- let needNext = true;
- let nextLine;
-
- if (domUtils.isTextNode(start)) {
- start = $(start).parents('div').first().get(0);
- }
-
- if (domUtils.isTextNode(end)) {
- end = $(end).parents('div').first().get(0);
- }
-
- for (let line = start; needNext; line = nextLine) {
- if ($(line).is(divOrLi)) {
- lines.push(line);
-
- if (line === end || line.parentNode === end) {
- isEndPassed = true;
- }
-
- const isStartInList = $(start).is('li') || ($(start).parent('li').length !== 0);
- nextLine = this._getNextLine(line, isStartInList, isEndPassed);
- } else {
- break;
- }
-
- needNext = nextLine && !isEndPassed;
- }
-
- return lines;
- }
-
- /**
- * Get next line element
- * @param {HTMLElement} line Current line element
- * @param {boolean} isStartInList Boolean value of start in list
- * @param {boolean} isEndPassed Boolean value of end element passed
- * @returns {HTMLElement|undefined}
- * @private
- */
- _getNextLine(line, isStartInList, isEndPassed) {
- let nextLine;
- if (isStartInList && line.parentNode.tagName === 'LI') {
- const $nextLI = $(line).parent().next();
-
- nextLine = $nextLI.children('div').first().get(0);
-
- const hasNextLiHaveDivChild = $nextLI[0] && !nextLine;
- const isLastLiInList = !$nextLI[0] && !nextLine;
- if (hasNextLiHaveDivChild) {
- nextLine = $nextLI.get(0);
- } else if (isLastLiInList && !isEndPassed) {
- nextLine = $(line).parents('ol,ul').first().next().get(0);
- }
- } else {
- nextLine = line.nextElementSibling;
- }
-
- return nextLine;
- }
}
module.exports = WwTaskManager;
diff --git a/src/js/wysiwygCommands/decreaseDepth.js b/src/js/wysiwygCommands/decreaseDepth.js
index cb79094eaa..efca8abe43 100644
--- a/src/js/wysiwygCommands/decreaseDepth.js
+++ b/src/js/wysiwygCommands/decreaseDepth.js
@@ -15,14 +15,15 @@ const CommandManager = require('../commandManager');
*/
const DecreaseDepth = CommandManager.command('wysiwyg', /** @lends HR */{
name: 'DecreaseDepth',
+
/**
- * 커맨드 핸들러
- * @param {WysiwygEditor} wwe WysiwygEditor instance
+ * Command Handler
+ * @param {WysiwygEditor} wwe WysiwygEditor instance
*/
exec(wwe) {
let $node = getCurrent$Li(wwe);
- if ($node.length) {
+ if ($node.length && isExecutable($node)) {
wwe.getEditor().saveUndoState();
const nodeClasses = $node.attr('class');
@@ -34,10 +35,23 @@ const DecreaseDepth = CommandManager.command('wysiwyg', /** @lends HR */{
}
});
+/**
+ * test if decrease the depth of given list item
+ * arbitrary list allows list item to be in any position
+ * while markdown spec does not
+ * @param {jQuery} $currentLiNode - jQuery list item element
+ * @returns {boolean} - true to executable
+ * @ignore
+ */
+function isExecutable($currentLiNode) {
+ return !($currentLiNode.next().is('OL,UL'));
+}
+
/**
* Get list item element of current selection
* @param {object} wwe Wysiwyg editor instance
* @returns {jQuery}
+ * @ignore
*/
function getCurrent$Li(wwe) {
const range = wwe.getEditor().getSelection();
diff --git a/src/js/wysiwygCommands/increaseDepth.js b/src/js/wysiwygCommands/increaseDepth.js
index 2627f6b575..c948bffa22 100644
--- a/src/js/wysiwygCommands/increaseDepth.js
+++ b/src/js/wysiwygCommands/increaseDepth.js
@@ -16,10 +16,11 @@ import CommandManager from '../commandManager';
const IncreaseDepth = CommandManager.command('wysiwyg', /** @lends HR */{
name: 'IncreaseDepth',
/**
- * 커맨드 핸들러
- * @param {WysiwygEditor} wwe WYsiwygEditor instance
+ * Command Handler
+ * @param {WysiwygEditor} wwe WYsiwygEditor instance
*/
exec(wwe) {
+ const listManager = wwe.componentManager.getManager('list');
const range = wwe.getEditor().getSelection();
const $node = $(range.startContainer).closest('li');
let prevClasses, nodeClasses, nextClasses;
@@ -43,6 +44,7 @@ const IncreaseDepth = CommandManager.command('wysiwyg', /** @lends HR */{
}
wwe.getEditor().increaseListLevel();
+ listManager.mergeList($node.get(0));
$node.attr('class', nodeClasses);
$prev.attr('class', prevClasses);
diff --git a/src/js/wysiwygCommands/ol.js b/src/js/wysiwygCommands/ol.js
index 793b61e560..abfb4c7da3 100644
--- a/src/js/wysiwygCommands/ol.js
+++ b/src/js/wysiwygCommands/ol.js
@@ -17,8 +17,8 @@ const OL = CommandManager.command('wysiwyg', /** @lends OL */{
name: 'OL',
keyMap: ['CTRL+O', 'META+O'],
/**
- * 커맨드 핸들러
- * @param {WysiwygEditor} wwe WYSIWYGEditor instance
+ * Command Handler
+ * @param {WysiwygEditor} wwe WYSIWYGEditor instance
*/
exec(wwe) {
const sq = wwe.getEditor();
@@ -36,25 +36,30 @@ const OL = CommandManager.command('wysiwyg', /** @lends OL */{
const lines = listManager.getLinesOfSelection(startContainer, endContainer);
+ const newLIs = [];
for (let i = 0; i < lines.length; i += 1) {
- this._changeFormatToOrderedListIfNeed(wwe, lines[i]);
+ const newLI = this._changeFormatToOrderedListIfNeed(wwe, lines[i]);
+ newLIs.push(newLI);
}
range = sq.getSelection();
- range.setStart(startContainer, startOffset);
- range.setEnd(endContainer, endOffset);
+ range.setStart(newLIs[0].firstChild, startOffset);
+ range.setEnd(newLIs[newLIs.length - 1].firstChild, endOffset);
sq.setSelection(range);
sq.saveUndoState(range);
},
+
/**
* Change format to unordered list if need
* @param {WysiwygEditor} wwe Wysiwyg editor instance
* @param {HTMLElement} target Element target for change
+ * @returns {HTMLElement} newly created list item
* @private
*/
_changeFormatToOrderedListIfNeed(wwe, target) {
const sq = wwe.getEditor();
const range = sq.getSelection();
+ let newLI = range.startContainer;
if (!sq.hasFormat('TABLE') && !sq.hasFormat('PRE')) {
range.setStart(target, 0);
@@ -69,7 +74,11 @@ const OL = CommandManager.command('wysiwyg', /** @lends OL */{
wwe.unwrapBlockTag();
sq.makeOrderedList();
}
+
+ newLI = sq.getSelection().startContainer;
}
+
+ return newLI;
}
});
diff --git a/src/js/wysiwygCommands/task.js b/src/js/wysiwygCommands/task.js
index a3d9be893e..5474256c71 100644
--- a/src/js/wysiwygCommands/task.js
+++ b/src/js/wysiwygCommands/task.js
@@ -17,46 +17,51 @@ const Task = CommandManager.command('wysiwyg', /** @lends Task */{
name: 'Task',
keyMap: ['CTRL+T', 'META+T'],
/**
- * 커맨드 핸들러
- * @param {WysiwygEditor} wwe WYSIWYGEditor instance
+ * Command Handler
+ * @param {WysiwygEditor} wwe WYSIWYGEditor instance
*/
exec(wwe) {
const sq = wwe.getEditor();
let range = sq.getSelection();
- const taskManager = wwe.componentManager.getManager('task');
+ const listManager = wwe.componentManager.getManager('list');
const {
startContainer,
endContainer,
startOffset,
endOffset
- } = range;
+ } = range;
wwe.focus();
sq.saveUndoState(range);
- const lines = taskManager.getLinesOfSelection(startContainer, endContainer);
+ const lines = listManager.getLinesOfSelection(startContainer, endContainer);
+ const newLIs = [];
for (let i = 0; i < lines.length; i += 1) {
- this._changeFormatToTaskIfNeed(wwe, lines[i]);
+ const newLI = this._changeFormatToTaskIfNeed(wwe, lines[i]);
+ newLIs.push(newLI);
}
range = sq.getSelection();
- range.setStart(startContainer, startOffset);
- range.setEnd(endContainer, endOffset);
+ range.setStart(newLIs[0].firstChild, startOffset);
+ range.setEnd(newLIs[newLIs.length - 1].firstChild, endOffset);
sq.setSelection(range);
sq.saveUndoState(range);
},
+
/**
* Change format to unordered list and return current li element if need
* @param {WysiwygEditor} wwe Wysiwyg editor instance
* @param {HTMLElement} target Element target for change
+ * @returns {HTMLElement} newly created list
* @private
*/
_changeFormatToTaskIfNeed(wwe, target) {
const sq = wwe.getEditor();
const range = sq.getSelection();
const taskManager = wwe.componentManager.getManager('task');
+ let newLI = range.startContainer;
if (!sq.hasFormat('TABLE') && !sq.hasFormat('PRE')) {
range.setStart(target, 0);
@@ -64,16 +69,20 @@ const Task = CommandManager.command('wysiwyg', /** @lends Task */{
sq.setSelection(range);
if (!sq.hasFormat('li')) {
- wwe.unwrapBlockTag();
sq.makeUnorderedList();
+ target = sq.getSelection().startContainer;
}
- if ($(target).parents('li').first().hasClass('task-list-item')) {
+ if ($(target).hasClass('task-list-item')) {
taskManager.unformatTask(target);
} else {
taskManager.formatTask(target);
}
+
+ newLI = sq.getSelection().startContainer;
}
+
+ return newLI;
}
});
diff --git a/src/js/wysiwygCommands/ul.js b/src/js/wysiwygCommands/ul.js
index 5cdf687f6e..d11733ef8d 100644
--- a/src/js/wysiwygCommands/ul.js
+++ b/src/js/wysiwygCommands/ul.js
@@ -17,8 +17,8 @@ const UL = CommandManager.command('wysiwyg', /** @lends UL */{
name: 'UL',
keyMap: ['CTRL+U', 'META+U'],
/**
- * 커맨드 핸들러
- * @param {WysiwygEditor} wwe WYSIWYGEditor instance
+ * Command Handler
+ * @param {WysiwygEditor} wwe WYSIWYGEditor instance
*/
exec(wwe) {
const sq = wwe.getEditor();
@@ -29,32 +29,37 @@ const UL = CommandManager.command('wysiwyg', /** @lends UL */{
endContainer,
startOffset,
endOffset
- } = range;
+ } = range;
wwe.focus();
sq.saveUndoState(range);
const lines = listManager.getLinesOfSelection(startContainer, endContainer);
+ const newLIs = [];
for (let i = 0; i < lines.length; i += 1) {
- this._changeFormatToUnorderedListIfNeed(wwe, lines[i]);
+ const newLI = this._changeFormatToUnorderedListIfNeed(wwe, lines[i]);
+ newLIs.push(newLI);
}
range = sq.getSelection();
- range.setStart(startContainer, startOffset);
- range.setEnd(endContainer, endOffset);
+ range.setStart(newLIs[0].firstChild, startOffset);
+ range.setEnd(newLIs[newLIs.length - 1].firstChild, endOffset);
sq.setSelection(range);
sq.saveUndoState(range);
},
+
/**
* Change format to unordered list if need
* @param {WysiwygEditor} wwe Wysiwyg editor instance
* @param {HTMLElement} target Element target for change
+ * @returns {HTMLElement} newly created list
* @private
*/
_changeFormatToUnorderedListIfNeed(wwe, target) {
const sq = wwe.getEditor();
const range = sq.getSelection();
+ let newLI = range.startContainer;
if (!sq.hasFormat('TABLE') && !sq.hasFormat('PRE')) {
range.setStart(target, 0);
@@ -69,8 +74,13 @@ const UL = CommandManager.command('wysiwyg', /** @lends UL */{
wwe.unwrapBlockTag();
sq.makeUnorderedList();
}
+
+ newLI = sq.getSelection().startContainer;
}
+
+ return newLI;
}
});
module.exports = UL;
+
diff --git a/test/integration/clipboard.spec.js b/test/integration/clipboard.spec.js
index b012e4e9e9..d8219a8645 100644
--- a/test/integration/clipboard.spec.js
+++ b/test/integration/clipboard.spec.js
@@ -1,6 +1,13 @@
/* eslint-disable max-nested-callbacks */
import Editor from '../../src/js/editor';
+/**
+ * make fake clipboard event
+ * @param {string} text - clipboard text
+ * @param {string} html - clipboard html
+ * @param {array} fileType - supported file types
+ * @returns {Event} - clipboard event
+ */
function pasteClipboardEvent(text, html, fileType) {
const event = document.createEvent('Event', false, true);
const clipboardData = {};
@@ -136,9 +143,9 @@ describe('Clipboard', () => {
setTimeout(() => {
const outputDOM = se._root;
- expect(outputDOM.firstChild.tagName).toEqual('TABLE');
- expect(outputDOM.firstChild.children[0].tagName).toEqual('THEAD');
- expect(outputDOM.firstChild.children[1].tagName).toEqual('TBODY');
+ expect(outputDOM.querySelector('table')).toBeDefined();
+ expect(outputDOM.querySelector('table thead')).toBeDefined();
+ expect(outputDOM.querySelector('table tbody')).toBeDefined();
done();
}, 0);
});
diff --git a/test/wwListManager.spec.js b/test/wwListManager.spec.js
index 8e9ffc08c8..a078831ef6 100644
--- a/test/wwListManager.spec.js
+++ b/test/wwListManager.spec.js
@@ -3,40 +3,29 @@ import EventManager from '../src/js/eventManager';
import WwListManager from '../src/js/wwListManager';
describe('WwListManager', () => {
- let $container, em, wwe, mgr;
+ let container, em, wwe, mgr;
beforeEach(() => {
- $container = $('');
-
- $('body').append($container);
+ container = document.createElement('div');
+ document.body.appendChild(container);
em = new EventManager();
- wwe = new WysiwygEditor($container, em);
+ wwe = new WysiwygEditor($(container), em);
wwe.init();
mgr = new WwListManager(wwe);
});
- //we need to wait squire input event process
+ // we need to wait squire input event process
afterEach(done => {
setTimeout(() => {
- $('body').empty();
+ document.body.removeChild(container);
done();
});
});
- describe('Event', () => {
- it('wysiwygSetValueAfter: wrap list inner to div after setValue', () => {
- const html = '';
- wwe.setValue(html);
-
- expect(wwe.get$Body().find('li div').length).toEqual(1);
- expect(wwe.get$Body().find('li div').text()).toEqual('test');
- });
- });
-
describe('_findAndRemoveEmptyList()', () => {
it('remove ul that without li element within.', () => {
wwe.setValue(['',
@@ -70,6 +59,34 @@ describe('WwListManager', () => {
});
});
+ describe('convert from/to arbitrary nesting list', () => {
+ it('_convertToArbitraryNestingList should convert nested ul to arbitrary nested ul', () => {
+ expect(mgr._convertToArbitraryNestingList(''))
+ .toBe('');
+ });
+
+ it('_convertFromArbitraryNestingList should convert nested ul to arbitrary nested ul', () => {
+ expect(mgr._convertFromArbitraryNestingList(''))
+ .toBe('');
+ });
+
+ it('should be called _convertToArbitraryNestingList on wysiwygSetValueBefore', () => {
+ const standardList = '';
+
+ const arbitraryList = em.emitReduce('wysiwygSetValueBefore', standardList);
+
+ expect(arbitraryList).toBe('');
+ });
+
+ it('should be called _convertFromArbitraryNestingList on wysiwygProcessHTMLText', () => {
+ const standardList = '';
+
+ const arbitraryList = em.emitReduce('wysiwygProcessHTMLText', standardList);
+
+ expect(arbitraryList).toBe('');
+ });
+ });
+
describe('_removeBranchListAll', () => {
it('Remove all branch list', () => {
wwe.getEditor().setHTML([
@@ -154,7 +171,7 @@ describe('WwListManager', () => {
''
].join('');
- const result = mgr._prepareInsertBlankToBetweenSameList(html);
+ const result = mgr._insertBlankToBetweenSameList(html);
expect(result.indexOf(':BLANK_LINE:')).not.toBe(-1);
expect(result.indexOf('
')).toBe(-1);
@@ -172,7 +189,7 @@ describe('WwListManager', () => {
''
].join('');
- const result = mgr._prepareInsertBlankToBetweenSameList(html);
+ const result = mgr._insertBlankToBetweenSameList(html);
expect(result.indexOf(':BLANK_LINE:')).not.toBe(-1);
expect(result.indexOf('
')).toBe(-1);
@@ -188,27 +205,135 @@ describe('WwListManager', () => {
''
].join('');
- const result = mgr._prepareInsertBlankToBetweenSameList(html);
+ const result = mgr._insertBlankToBetweenSameList(html);
expect(result.indexOf(':BLANK_LINE:')).not.toBe(-1);
expect(result.indexOf('
')).toBe(-1);
});
});
- describe('_wrapDefaultBlockToListInner', () => {
- it('Wrap default blocks to list top inline nodes', () => {
- wwe.getEditor().setHTML([
- '',
- '- ',
- 't1
',
- '',
- ' ',
- '
'].join(''));
- mgr._wrapDefaultBlockToListInner();
+ describe('mergeList', () => {
+ it('should merge list to previous list', () => {
+ const list = $(`
+
+ - 1
+
+
+ - 3
+ - 4
+
+
+ `)[0];
+
+ mgr.mergeList(list.querySelector('#target'));
+
+ //
+ // - 1
+ //
+ // - 2
+ // - 3
+ // - 4
+ //
+ //
+ expect(list.querySelectorAll('ol > ul > li').length).toBe(3);
+ expect(list.querySelectorAll('ol > ol').length).toBe(0);
+ });
+
+ it('should not merge list to previous list if target is not the first list item', () => {
+ const list = $(`
+
+ - 1
+
+
+ - 3
+ - 4
+
+
+ `)[0];
+
+ mgr.mergeList(list.querySelector('#target'));
+
+ //
+ // - 1
+ //
+ //
+ // - 3
+ // - 4
+ //
+ //
+ expect(list.querySelectorAll('ol > ul > li').length).toBe(1);
+ expect(list.querySelectorAll('ol > ol > li').length).toBe(2);
+ });
+
+ it('should merge next list', () => {
+ // merge rule: merge to previous list
+ const list = $(`
+
+ - 1
+
+ - 2
+
+
+
+ `)[0];
+
+ mgr.mergeList(list.querySelector('#target'));
+
+ //
+ // - 1
+ //
+ // - 2
+ // - 3
+ // - 4
+ //
+ //
+ expect(list.querySelectorAll('ol > ol > li').length).toBe(3);
+ expect(list.querySelectorAll('ol > ul').length).toBe(0);
+ });
- expect(wwe.get$Body().find('div').length).toEqual(2);
- expect(wwe.get$Body().find('div').eq(0).text()).toEqual('t1');
- expect(wwe.get$Body().find('div').eq(1).text()).toEqual('t2');
+ it('should merge prev/next list', () => {
+ // merge rule: merge to previous list
+ const list = $(`
+
+ - 1
+
+
+ - 4
+
+
+
+ `)[0];
+
+ mgr.mergeList(list.querySelector('#target'));
+
+ //
+ // - 1
+ //
+ // - 2
+ // - 3
+ // - 4
+ // - 5
+ // - 6
+ //
+ //
+ expect(list.querySelectorAll('ol > ul > li').length).toBe(5);
+ expect(list.querySelectorAll('ol > ul').length).toBe(1);
+ expect(list.querySelectorAll('ol > ol').length).toBe(0);
});
});
});
diff --git a/test/wysiwygCommands/codeBlock.spec.js b/test/wysiwygCommands/codeBlock.spec.js
index 668d892463..e4e8642c92 100644
--- a/test/wysiwygCommands/codeBlock.spec.js
+++ b/test/wysiwygCommands/codeBlock.spec.js
@@ -21,7 +21,7 @@ describe('CodeBlock', () => {
sq.focus();
});
- //we need to wait squire input event process
+ // we need to wait squire input event process
afterEach(done => {
setTimeout(() => {
$('body').empty();
@@ -32,15 +32,15 @@ describe('CodeBlock', () => {
it('add CodeBlock', () => {
CodeBlock.exec(wwe);
- expect($body.find('pre').length).toEqual(1);
- expect($body.find('pre div').length).toEqual(1);
+ expect($body.find('pre').length).toBe(1);
+ expect($body.find('pre div').length).toBe(1);
expect($body.find('pre').attr('data-te-codeblock')).toBeDefined();
});
it('add CodeBlock with language', () => {
CodeBlock.exec(wwe, 'javascript');
expect($body.find('pre').hasClass('te-content-codeblock-1')).toBe(true);
- expect($body.find('pre').attr('data-language')).toEqual('javascript');
+ expect($body.find('pre').attr('data-language')).toBe('javascript');
});
it('add CodeBlock with selection', () => {
wwe.setValue('hello, my name is code
');
@@ -53,9 +53,9 @@ describe('CodeBlock', () => {
CodeBlock.exec(wwe);
- expect($body.find('pre').length).toEqual(1);
- expect($body.find('pre div').length).toEqual(1);
- expect($body.find('div').eq(0).text()).toEqual('hello');
- expect($body.find('div').eq(1).text()).toEqual(', my name is code');
+ expect($body.find('pre').length).toBe(1);
+ expect($body.find('pre div').length).toBe(1);
+ expect($body.find('pre div').eq(0).text()).toBe('hello');
+ expect($body.find('pre + div').eq(0).text()).toBe(', my name is code');
});
});
diff --git a/test/wysiwygCommands/decreaseDepth.spec.js b/test/wysiwygCommands/decreaseDepth.spec.js
index d153d3b188..a33a2a2d6c 100644
--- a/test/wysiwygCommands/decreaseDepth.spec.js
+++ b/test/wysiwygCommands/decreaseDepth.spec.js
@@ -4,36 +4,34 @@ import WysiwygEditor from '../../src/js/wysiwygEditor';
import EventManager from '../../src/js/eventManager';
describe('DecreaseDepth', () => {
- let wwe, sq;
+ let wwe, sq, container;
beforeEach(() => {
- const $container = $('');
-
- $('body').append($container);
-
- wwe = new WysiwygEditor($container, new EventManager());
+ container = document.createElement('div');
+ document.body.appendChild(container);
+ wwe = new WysiwygEditor($(container), new EventManager());
wwe.init();
sq = wwe.getEditor();
wwe.componentManager.addManager(WwTaskManager);
sq.focus();
- wwe.get$Body().html([
- '',
- 'abcdef
',
- ' ',
- '
',
- '
'
- ].join(''));
+ wwe.get$Body().html(`
+
+ `);
});
- //we need to wait squire input event process
+ // we need to wait squire input event process
afterEach(done => {
setTimeout(() => {
- $('body').empty();
+ document.body.removeChild(container);
done();
});
});
@@ -41,23 +39,22 @@ describe('DecreaseDepth', () => {
it('should be able to decrease depth second to first.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 0);
+ range.setStart(wwe.get$Body().find('li')[1].firstChild, 0);
range.collapse(true);
sq.setSelection(range);
DecreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul li').length).toEqual(3);
- expect(sq.get$Body().find('ul li ul').length).toEqual(0);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(0);
- expect(sq.get$Body().find('ul li').hasClass('task-list-item')).toBe(true);
- expect(sq.get$Body().find('ul li').hasClass('checked')).toBe(true);
+ expect(sq.get$Body().find('ul > li').length).toEqual(3);
+ expect(sq.get$Body().find('ul > ul > li').length).toEqual(0);
+ expect(sq.get$Body().find('ul > li').hasClass('task-list-item')).toBe(true);
+ expect(sq.get$Body().find('ul > li').hasClass('checked')).toBe(true);
});
it('should break out list element and delete input.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[2].firstChild, 0);
+ range.setStart(wwe.get$Body().find('li')[2].firstChild, 0);
range.collapse(true);
sq.setSelection(range);
@@ -65,70 +62,95 @@ describe('DecreaseDepth', () => {
DecreaseDepth.exec(wwe);
expect(sq.get$Body().find('ul li').length).toEqual(2);
- expect(sq.get$Body().find('ul li ul').length).toEqual(1);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(1);
+ expect(sq.get$Body().find('ul ul li').length).toEqual(1);
expect(sq.get$Body().find('ul li').hasClass('task-list-item')).toBe(true);
});
- describe('should guarantee to remove non task`s class attribute', () => {
- it('when super depth is task and child depth is not', () => {
- const range = wwe.getEditor().getSelection().cloneRange();
+ it('should preserve original class(task / non-task)', () => {
+ const range = wwe.getEditor().getSelection().cloneRange();
- wwe.get$Body().html([
- '',
- 'abcdef
',
- ' ',
- '
',
- '
'
- ].join(''));
-
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 0);
- range.collapse(true);
+ wwe.get$Body().html(`
+
+ `);
+
+ range.setStart(wwe.get$Body().find('ul ul li')[0].firstChild, 0);
+ range.collapse(true);
- sq.setSelection(range);
+ sq.setSelection(range);
- DecreaseDepth.exec(wwe);
+ DecreaseDepth.exec(wwe);
- const $Body = sq.get$Body();
+ const $Body = sq.get$Body();
- expect($Body.find('ul li').length).toEqual(3);
- expect($Body.find('ul li ul').length).toEqual(0);
- expect($Body.find('ul li').eq(0).hasClass('task-list-item')).toBe(true);
- expect($Body.find('ul li').eq(1).hasClass('task-list-item')).toBe(true);
- expect($Body.find('ul li').eq(2).hasClass('task-list-item')).toBe(true);
- });
+ expect($Body.find('ul li').length).toEqual(3);
+ expect($Body.find('ul ul li').length).toEqual(0);
+ expect($Body.find('ul li').eq(0).hasClass('task-list-item')).toBe(true);
+ expect($Body.find('ul li').eq(1).hasClass('task-list-item')).toBe(false);
+ expect($Body.find('ul li').eq(2).hasClass('task-list-item')).toBe(true);
});
+
+ it('should not decrease if next element is UL/OL (arbitrary list)', () => {
+ const range = wwe.getEditor().getSelection().cloneRange();
+
+ wwe.get$Body().html(`
+
+ `);
+
+ range.setStart(wwe.get$Body().find('#target')[0].firstChild, 0);
+ range.collapse(true);
+
+ sq.setSelection(range);
+
+ DecreaseDepth.exec(wwe);
+
+ const $Body = sq.get$Body();
+
+ expect($Body.find('> ul > li').length).toEqual(1);
+ expect($Body.find('> ul > ul > li').length).toEqual(1);
+ expect($Body.find('> ul > ul > ul > li').length).toEqual(1);
+ });
+
describe('should decrease depth when cursor', () => {
it('at startOffset 0.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 0);
+ range.setStart(wwe.get$Body().find('li')[1].firstChild, 0);
range.collapse(true);
sq.setSelection(range);
DecreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul li').length).toEqual(3);
- expect(sq.get$Body().find('ul li ul').length).toEqual(0);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(0);
- expect(sq.get$Body().find('ul li').hasClass('task-list-item')).toBe(true);
+ expect(sq.get$Body().find('ul > li').length).toEqual(3);
+ expect(sq.get$Body().find('ul ul li').length).toEqual(0);
+ expect(sq.get$Body().find('ul > li').hasClass('task-list-item')).toBe(true);
});
it('should decrease depth when cursor at any offset.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 2);
+ range.setStart(wwe.get$Body().find('li')[1].firstChild, 2);
range.collapse(true);
sq.setSelection(range);
DecreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul li').length).toEqual(3);
- expect(sq.get$Body().find('ul li ul').length).toEqual(0);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(0);
- expect(sq.get$Body().find('ul li').hasClass('task-list-item')).toBe(true);
+ expect(sq.get$Body().find('ul > li').length).toEqual(3);
+ expect(sq.get$Body().find('ul ul li').length).toEqual(0);
+ expect(sq.get$Body().find('ul > li').hasClass('task-list-item')).toBe(true);
});
});
});
diff --git a/test/wysiwygCommands/increaseDepth.spec.js b/test/wysiwygCommands/increaseDepth.spec.js
index 465dc5e5a5..24a77c5aa7 100644
--- a/test/wysiwygCommands/increaseDepth.spec.js
+++ b/test/wysiwygCommands/increaseDepth.spec.js
@@ -1,37 +1,38 @@
import IncreaseDepth from '../../src/js/wysiwygCommands/increaseDepth';
import WwTaskManager from '../../src/js/wwTaskManager';
+import WwListManager from '../../src/js/wwListManager';
import WysiwygEditor from '../../src/js/wysiwygEditor';
import EventManager from '../../src/js/eventManager';
describe('IncreaseDepth', () => {
- let wwe, sq;
+ let wwe, sq, container;
beforeEach(() => {
- const $container = $('');
+ container = document.createElement('div');
+ document.body.appendChild(container);
- $('body').append($container);
-
- wwe = new WysiwygEditor($container, new EventManager());
+ wwe = new WysiwygEditor($(container), new EventManager());
wwe.init();
sq = wwe.getEditor();
wwe.componentManager.addManager(WwTaskManager);
+ wwe.componentManager.addManager(WwListManager);
sq.focus();
- wwe.get$Body().html([
- '',
- 'abcdef
',
- 'abcde
',
- '
',
- '
'
- ].join(''));
+ wwe.get$Body().html(`
+
+ `);
});
- //we need to wait squire input event process
+ // we need to wait squire input event process
afterEach(done => {
setTimeout(() => {
- $('body').empty();
+ document.body.removeChild(container);
done();
});
});
@@ -39,88 +40,112 @@ describe('IncreaseDepth', () => {
it('success when it not first li.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 0);
+ range.setStart(wwe.get$Body().find('li')[1].firstChild, 0);
range.collapse(true);
sq.setSelection(range);
IncreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul li ul').length).toEqual(1);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(1);
- expect(sq.get$Body().find('ul li ul li').hasClass('task-list-item')).toBe(true);
+ expect(sq.get$Body().find('ul ul li').length).toEqual(1);
+ expect(sq.get$Body().find('ul ul li').hasClass('task-list-item')).toBe(true);
});
it('fail when it does not have previous li.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[0].firstChild, 0);
+ range.setStart(wwe.get$Body().find('li')[0].firstChild, 0);
range.collapse(true);
sq.setSelection(range);
IncreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul li ul').length).toEqual(0);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(0);
- expect(sq.get$Body().find('ul li ul li').hasClass('task-list-item')).toBe(false);
+ expect(sq.get$Body().find('ul ul li').length).toEqual(0);
});
describe('should increase depth when cursor', () => {
it('at startOffset 0.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 0);
+ range.setStart(wwe.get$Body().find('li')[1].firstChild, 0);
range.collapse(true);
sq.setSelection(range);
IncreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul li ul').length).toEqual(1);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(1);
- expect(sq.get$Body().find('ul li ul li').hasClass('task-list-item')).toBe(true);
+ expect(sq.get$Body().find('ul ul li').length).toEqual(1);
+ expect(sq.get$Body().find('ul ul li').hasClass('task-list-item')).toBe(true);
});
it('at startOffset 1.', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 1);
+ range.setStart(wwe.get$Body().find('li')[1].firstChild, 1);
range.collapse(true);
sq.setSelection(range);
IncreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul li ul').length).toEqual(1);
- expect(sq.get$Body().find('ul li ul li').length).toEqual(1);
- expect(sq.get$Body().find('ul li ul li').hasClass('task-list-item')).toBe(true);
+ expect(sq.get$Body().find('ul ul li').length).toEqual(1);
+ expect(sq.get$Body().find('ul ul li').hasClass('task-list-item')).toBe(true);
});
});
it('should increase ordinary list', () => {
const range = wwe.getEditor().getSelection().cloneRange();
- wwe.get$Body().html([
- '',
- 'abcdef
',
- 'abcde
',
- '',
- ' ',
- '
',
- ''
- ].join(''));
-
- range.setStart(wwe.get$Body().find('div')[1].firstChild, 1);
+ wwe.get$Body().html(`
+
+ `);
+
+ range.setStart(wwe.get$Body().find('li')[1].firstChild, 1);
+ range.collapse(true);
+
+ sq.setSelection(range);
+
+ IncreaseDepth.exec(wwe);
+
+ expect(sq.get$Body().find('ul > li').length).toEqual(4);
+ expect(sq.get$Body().find('ul > ul > li').length).toEqual(3);
+ expect(sq.get$Body().find('ul > ul > ul > li').length).toEqual(1);
+ expect(sq.get$Body().find('ul > ul > ul > li').hasClass('task-list-item')).toBe(true);
+ });
+
+ it('should merge prev/next list after increase depth', () => {
+ const range = wwe.getEditor().getSelection().cloneRange();
+
+ wwe.get$Body().html(`
+
+ - list 1
+
+ - list 2
+ - list 3
+
+ - list 4
+
+
+ `);
+
+ range.setStart(wwe.get$Body().find('#target')[0].firstChild, 1);
range.collapse(true);
sq.setSelection(range);
IncreaseDepth.exec(wwe);
- expect(sq.get$Body().find('ul').length).toEqual(3);
- expect(sq.get$Body().find('ul > li > ul > li > ul > li').length).toEqual(1);
- expect(sq.get$Body().find('ul > li > ul > li > ul > li').hasClass('task-list-item')).toBe(true);
+ expect(sq.get$Body().find('> ul > li').length).toEqual(1);
+ expect(sq.get$Body().find('> ul > ol > li').length).toEqual(5);
+ expect(sq.get$Body().find('> ul > ul > li').length).toEqual(0);
});
});
diff --git a/test/wysiwygCommands/ol.spec.js b/test/wysiwygCommands/ol.spec.js
index 16c9ed1564..13c1c818ec 100644
--- a/test/wysiwygCommands/ol.spec.js
+++ b/test/wysiwygCommands/ol.spec.js
@@ -5,14 +5,13 @@ import WysiwygEditor from '../../src/js/wysiwygEditor';
import EventManager from '../../src/js/eventManager';
describe('OL', () => {
- let wwe, sq;
+ let wwe, sq, container;
beforeEach(() => {
- const $container = $('');
+ container = document.createElement('div');
+ document.body.appendChild(container);
- $('body').append($container);
-
- wwe = new WysiwygEditor($container, new EventManager());
+ wwe = new WysiwygEditor($(container), new EventManager());
wwe.init();
@@ -22,10 +21,10 @@ describe('OL', () => {
sq.focus();
});
- //we need to wait squire input event process
+ // we need to wait squire input event process
afterEach(done => {
setTimeout(() => {
- $('body').empty();
+ document.body.removeChild(container);
done();
});
});
@@ -44,9 +43,9 @@ describe('OL', () => {
it('if have task in range then remove task and change to ul', () => {
const range = sq.getSelection().cloneRange();
- sq.setHTML('');
+ sq.setHTML('');
- range.setStart(wwe.get$Body().find('li div')[0].firstChild, 1);
+ range.setStart(wwe.get$Body().find('li')[0].firstChild, 1);
range.collapse(true);
sq.setSelection(range);
@@ -88,7 +87,7 @@ describe('OL', () => {
const $div1 = $('hello
');
const $div2 = $('world
');
const $div3 = $('i`m
');
- const $ol = $('fine
');
+ const $ol = $('- fine
');
$body.append($div1);
$body.append($div2);
@@ -107,12 +106,12 @@ describe('OL', () => {
expect(wwe.get$Body().find('li').length).toEqual(4);
});
- it('do not convert next element of OL with selection start ol within', () => {
+ it('convert next element of OL with selection start ol within', () => {
const $body = sq.get$Body();
const $div1 = $('hello
');
const $div2 = $('world
');
const $div3 = $('i`m
');
- const $ol = $('fine
');
+ const $ol = $('- fine
');
$body.append($ol);
$body.append($div1);
@@ -121,25 +120,25 @@ describe('OL', () => {
const range = sq.getSelection();
- range.setStart($ol.find('li div')[0].firstChild, 0);
+ range.setStart($ol.find('li')[0].firstChild, 0);
range.setEnd($div3[0], 1);
sq.setSelection(range);
OL.exec(wwe);
expect(wwe.get$Body().find('ol').length).toEqual(1);
- expect(wwe.get$Body().find('li').length).toEqual(1);
+ expect(wwe.get$Body().find('li').length).toEqual(4);
});
it('change UL to OL', () => {
const $body = sq.get$Body();
- const $ul = $('');
+ const $ul = $('');
$body.append($ul);
const range = sq.getSelection();
- range.setStart($ul[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ul[0].firstChild.firstChild, 1);
range.collapse(true);
sq.setSelection(range);
@@ -151,14 +150,14 @@ describe('OL', () => {
it('change UL to OL with selection', () => {
const $body = sq.get$Body();
- const $ul = $('');
+ const $ul = $('');
$body.append($ul);
const range = sq.getSelection();
- range.setStart($ul.find('li div')[0].firstChild, 1);
- range.setEnd($ul.find('li div')[0].firstChild, 1);
+ range.setStart($ul.find('li')[0].firstChild, 1);
+ range.setEnd($ul.find('li')[0].firstChild, 1);
sq.setSelection(range);
OL.exec(wwe);
@@ -169,13 +168,13 @@ describe('OL', () => {
it('change TASK to OL', () => {
const $body = sq.get$Body();
- const $ul = $('');
+ const $ul = $('');
$body.append($ul);
const range = sq.getSelection();
- range.setStart($ul[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ul[0].firstChild.firstChild, 1);
range.collapse(true);
sq.setSelection(range);
@@ -188,14 +187,14 @@ describe('OL', () => {
it('change TASK to OL with selection', () => {
const $body = sq.get$Body();
- const $ul = $('');
+ const $ul = $('');
$body.append($ul);
const range = sq.getSelection();
- range.setStart($body.find('ul>li>div').eq(0)[0], 0);
- range.setEnd($body.find('ul>li>div').eq(1)[0], 1);
+ range.setStart($body.find('ul>li').eq(0)[0], 0);
+ range.setEnd($body.find('ul>li').eq(1)[0], 1);
sq.setSelection(range);
OL.exec(wwe);
@@ -205,7 +204,7 @@ describe('OL', () => {
expect(wwe.get$Body().find('li').length).toEqual(2);
});
- it('stop changing format to OL when meet PRE, TABLE element', () => {
+ it('skip changing format to OL from PRE, TABLE element', () => {
const $body = sq.get$Body();
const $div1 = $('fine
');
const $div2 = $('thank you
');
@@ -225,8 +224,8 @@ describe('OL', () => {
OL.exec(wwe);
- expect(wwe.get$Body().find('ol').length).toEqual(1);
+ expect(wwe.get$Body().find('ol').length).toEqual(2);
expect(wwe.get$Body().children('pre').length).toEqual(1);
- expect(wwe.get$Body().find('li').length).toEqual(2);
+ expect(wwe.get$Body().find('li').length).toEqual(3);
});
});
diff --git a/test/wysiwygCommands/task.spec.js b/test/wysiwygCommands/task.spec.js
index 217320f05e..39cd15bb3e 100644
--- a/test/wysiwygCommands/task.spec.js
+++ b/test/wysiwygCommands/task.spec.js
@@ -5,14 +5,13 @@ import WysiwygEditor from '../../src/js/wysiwygEditor';
import EventManager from '../../src/js/eventManager';
describe('Task', () => {
- let wwe, sq;
+ let wwe, sq, container;
beforeEach(() => {
- const $container = $('');
+ container = document.createElement('div');
+ document.body.appendChild(container);
- $('body').append($container);
-
- wwe = new WysiwygEditor($container, new EventManager());
+ wwe = new WysiwygEditor($(container), new EventManager());
wwe.init();
@@ -22,10 +21,10 @@ describe('Task', () => {
wwe.getEditor().focus();
});
- //we need to wait squire input event process
+ // we need to wait squire input event process
afterEach(done => {
setTimeout(() => {
- $('body').empty();
+ document.body.removeChild(container);
done();
});
});
@@ -62,9 +61,9 @@ describe('Task', () => {
it('add input too if there is nested task list', () => {
const range = sq.getSelection().cloneRange();
- sq.setHTML('
');
+ sq.setHTML('
');
- range.setStart(wwe.get$Body().find('ul div')[0], 0);
+ range.setStart(wwe.get$Body().find('ul li')[0], 0);
range.collapse(true);
sq.setSelection(range);
@@ -103,7 +102,7 @@ describe('Task', () => {
const $div1 = $('hello
');
const $div2 = $('world
');
const $div3 = $('i`m
');
- const $ol = $('');
+ const $ol = $('');
$body.append($ol);
$body.append($div1);
@@ -112,7 +111,7 @@ describe('Task', () => {
const range = sq.getSelection();
- range.setStart($ol[0].firstChild.firstChild.firstChild, 0);
+ range.setStart($ol[0].firstChild.firstChild, 0);
range.setEnd($div3[0], 1);
sq.setSelection(range);
@@ -125,13 +124,13 @@ describe('Task', () => {
it('change UL to Task', () => {
const $body = sq.get$Body();
- const $ul = $('');
+ const $ul = $('');
$body.append($ul);
const range = sq.getSelection();
- range.setStart($ul[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ul[0].firstChild.firstChild, 1);
range.collapse(true);
sq.setSelection(range);
@@ -144,13 +143,13 @@ describe('Task', () => {
it('change OL to Task', () => {
const $body = sq.get$Body();
- const $ol = $('fine
');
+ const $ol = $('- fine
');
$body.append($ol);
const range = sq.getSelection();
- range.setStart($ol[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ol[0].firstChild.firstChild, 1);
range.collapse(true);
sq.setSelection(range);
@@ -163,13 +162,13 @@ describe('Task', () => {
it('change UL to Task with selection', () => {
const $body = sq.get$Body();
- const $ul = $('');
+ const $ul = $('');
$body.append($ul);
const range = sq.getSelection();
- range.setStart($ul[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ul[0].firstChild.firstChild, 1);
range.setEnd($ul[0].firstChild.nextSibling.firstChild, 1);
sq.setSelection(range);
@@ -182,13 +181,13 @@ describe('Task', () => {
it('change OL to Task with selection', () => {
const $body = sq.get$Body();
- const $ol = $('fine
thank you
');
+ const $ol = $('- fine
- thank you
');
$body.append($ol);
const range = sq.getSelection();
- range.setStart($ol[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ol[0].firstChild.firstChild, 1);
range.setEnd($ol[0].firstChild.nextSibling.firstChild, 1);
sq.setSelection(range);
@@ -199,7 +198,7 @@ describe('Task', () => {
expect(wwe.get$Body().find('li').length).toEqual(2);
});
- it('stop changing format to Task when meet PRE, TABLE element', () => {
+ it('skip changing format to Task from PRE, TABLE element', () => {
const $body = sq.get$Body();
const $div1 = $('fine
');
const $div2 = $('thank you
');
@@ -219,9 +218,9 @@ describe('Task', () => {
Task.exec(wwe);
- expect(wwe.get$Body().find('ul').length).toEqual(1);
+ expect(wwe.get$Body().find('ul').length).toEqual(2);
expect(wwe.get$Body().children('pre').length).toEqual(1);
- expect(wwe.get$Body().find('li.task-list-item').length).toEqual(2);
- expect(wwe.get$Body().find('li').length).toEqual(2);
+ expect(wwe.get$Body().find('li.task-list-item').length).toEqual(3);
});
});
+
diff --git a/test/wysiwygCommands/ul.spec.js b/test/wysiwygCommands/ul.spec.js
index 8ee415b3e4..bcb57a5bc0 100644
--- a/test/wysiwygCommands/ul.spec.js
+++ b/test/wysiwygCommands/ul.spec.js
@@ -5,14 +5,13 @@ import WysiwygEditor from '../../src/js/wysiwygEditor';
import EventManager from '../../src/js/eventManager';
describe('UL', () => {
- let wwe, sq;
+ let wwe, sq, container;
beforeEach(() => {
- const $container = $('');
+ container = document.createElement('div');
+ document.body.appendChild(container);
- $('body').append($container);
-
- wwe = new WysiwygEditor($container, new EventManager());
+ wwe = new WysiwygEditor($(container), new EventManager());
wwe.init();
@@ -22,10 +21,10 @@ describe('UL', () => {
sq.focus();
});
- //we need to wait squire input event process
+ // we need to wait squire input event process
afterEach(done => {
setTimeout(() => {
- $('body').empty();
+ document.body.removeChild(container);
done();
});
});
@@ -69,7 +68,7 @@ describe('UL', () => {
const $div1 = $('hello
');
const $div2 = $('world
');
const $div3 = $('i`m
');
- const $ol = $('');
+ const $ol = $('');
$body.append($div1);
$body.append($div2);
@@ -93,7 +92,7 @@ describe('UL', () => {
const $div1 = $('hello
');
const $div2 = $('world
');
const $div3 = $('i`m
');
- const $ol = $('fine
');
+ const $ol = $('- fine
');
$body.append($ol);
$body.append($div1);
@@ -102,7 +101,7 @@ describe('UL', () => {
const range = sq.getSelection();
- range.setEnd($ol[0].firstChild.firstChild.firstChild, 1);
+ range.setEnd($ol[0].firstChild.firstChild, 1);
range.setStart($div3[0].firstChild, 1);
sq.setSelection(range);
@@ -114,13 +113,13 @@ describe('UL', () => {
it('change OL to UL', () => {
const $body = sq.get$Body();
- const $ol = $('fine
');
+ const $ol = $('- fine
');
$body.append($ol);
const range = sq.getSelection();
- range.setStart($ol[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ol[0].firstChild.firstChild, 1);
range.collapse(true);
sq.setSelection(range);
@@ -132,14 +131,14 @@ describe('UL', () => {
it('change OL to UL with selection', () => {
const $body = sq.get$Body();
- const $ol = $('fine
thank you
');
+ const $ol = $('- fine
- thank you
');
$body.append($ol);
const range = sq.getSelection();
- range.setStart($ol[0].firstChild.firstChild.firstChild, 1);
- range.setEnd($ol[0].firstChild.nextSibling.firstChild, 1);
+ range.setStart($ol[0].firstChild.firstChild, 1);
+ range.setEnd($ol[0].firstChild.nextSibling, 1);
sq.setSelection(range);
UL.exec(wwe);
@@ -150,13 +149,13 @@ describe('UL', () => {
it('change TASK to UL', () => {
const $body = sq.get$Body();
- const $ol = $('fine
');
+ const $ol = $('- fine
');
$body.append($ol);
const range = sq.getSelection();
- range.setStart($ol[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ol[0].firstChild.firstChild, 1);
range.collapse(true);
sq.setSelection(range);
@@ -170,13 +169,13 @@ describe('UL', () => {
it('change TASK to UL with selection', () => {
const $body = sq.get$Body();
- const $ol = $('fine
thank you
');
+ const $ol = $('- fine
- thank you
');
$body.append($ol);
const range = sq.getSelection();
- range.setStart($ol[0].firstChild.firstChild.firstChild, 1);
+ range.setStart($ol[0].firstChild.firstChild, 1);
range.setEnd($ol[0].firstChild.nextSibling.firstChild, 1);
sq.setSelection(range);
@@ -187,7 +186,7 @@ describe('UL', () => {
expect(wwe.get$Body().find('li').length).toEqual(2);
});
- it('stop changing format to UL when meet PRE, TABLE element', () => {
+ it('skip changing format to UL from TABLE/PRE element', () => {
const $body = sq.get$Body();
const $div1 = $('fine
');
const $div2 = $('thank you
');
@@ -207,8 +206,8 @@ describe('UL', () => {
UL.exec(wwe);
- expect(wwe.get$Body().find('ul').length).toEqual(1);
+ expect(wwe.get$Body().find('ul').length).toEqual(2);
expect(wwe.get$Body().children('pre').length).toEqual(1);
- expect(wwe.get$Body().find('li').length).toEqual(2);
+ expect(wwe.get$Body().find('li').length).toEqual(3);
});
});