diff --git a/CHANGELOG.md b/CHANGELOG.md
index f4263232b..c171da330 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -46,6 +46,8 @@
* [73](https://github.com/Vanessa219/vditor/issues/73) 添加链接卡片样式 `引入特性`
* [70](https://github.com/Vanessa219/vditor/issues/70) 所见即所得模式下Table按钮重复点击会导致table嵌套,另外希望标题支持快捷键调整大小 `引入特性`
* [69](https://github.com/Vanessa219/vditor/issues/69) 渲染块按 esc 可以进行退出代码块进行预览 `改进功能`
+* [68](https://github.com/Vanessa219/vditor/issues/68) 列表标记符自动优化 `改进功能`
+* [65](https://github.com/Vanessa219/vditor/issues/65) 任务列表回车、删除优化 `改进功能`
### v2.0.15 / 2020-01-11
diff --git a/src/ts/wysiwyg/index.ts b/src/ts/wysiwyg/index.ts
index 1f0000753..420423557 100644
--- a/src/ts/wysiwyg/index.ts
+++ b/src/ts/wysiwyg/index.ts
@@ -17,6 +17,7 @@ import {highlightToolbar} from "./highlightToolbar";
import {input} from "./input";
import {insertHTML} from "./insertHTML";
import {processCodeRender} from "./processCodeRender";
+import {setRangeByWbr} from "./setRangeByWbr";
class WYSIWYG {
public element: HTMLPreElement;
@@ -122,7 +123,7 @@ class WYSIWYG {
// process code
const code = processPasteCode(textHTML, textPlain, "wysiwyg");
- const range = getSelection().getRangeAt(0)
+ const range = getSelection().getRangeAt(0);
if (event.target.tagName === "CODE") {
// 粘贴在代码位置
const position = getSelectPosition(event.target);
@@ -131,7 +132,7 @@ class WYSIWYG {
setSelectionByPosition(position.start + textPlain.length, position.start + textPlain.length,
event.target.parentElement);
} else if (code) {
- const pElement = hasClosestByMatchTag(range.startContainer, "P")
+ const pElement = hasClosestByMatchTag(range.startContainer, "P");
if (pElement) {
range.setStartAfter(pElement);
}
@@ -379,6 +380,51 @@ class WYSIWYG {
return;
}
+ // task list
+ const taskItemElement = hasClosestByClassName(range.startContainer, "vditor-task");
+ if (taskItemElement) {
+ if (taskItemElement.lastChild.textContent.trim() === "") {
+ if (taskItemElement.nextElementSibling) {
+ // 用段落隔断
+ let afterHTML = "";
+ let beforeHTML = "";
+ let isAfter = false;
+ taskItemElement.parentElement.querySelectorAll("li").forEach((liElement) => {
+ if (liElement.isEqualNode(taskItemElement)) {
+ isAfter = true;
+ } else {
+ if (isAfter) {
+ afterHTML += liElement.outerHTML;
+ } else {
+ beforeHTML += liElement.outerHTML;
+ }
+ }
+ });
+ if (beforeHTML) {
+ beforeHTML = `
`;
+ }
+ taskItemElement.parentElement.outerHTML = `${beforeHTML}\n
`;
+ } else {
+ // 变成段落
+ taskItemElement.parentElement.insertAdjacentHTML("afterend", `\n
`);
+ if (taskItemElement.parentElement.querySelectorAll('li').length === 1) {
+ taskItemElement.parentElement.remove();
+ } else {
+ taskItemElement.remove();
+ }
+ }
+ } else {
+ // 光标后文字添加到新列表中
+ range.setEndAfter(taskItemElement.lastChild);
+ taskItemElement.insertAdjacentHTML("afterend", ` `);
+ document.querySelector("wbr").after(range.extractContents());
+ }
+ setRangeByWbr(vditor.wysiwyg.element, range);
+ event.preventDefault();
+ afterRenderEvent(vditor);
+ return;
+ }
+
// https://github.com/Vanessa219/vditor/issues/48
const h6Element = hasClosestByMatchTag(range.startContainer, "H6");
if (h6Element && range.startContainer.textContent.length === range.startOffset) {
diff --git a/src/ts/wysiwyg/processKeydown.ts b/src/ts/wysiwyg/processKeydown.ts
index bd7c9c821..47b87cc20 100644
--- a/src/ts/wysiwyg/processKeydown.ts
+++ b/src/ts/wysiwyg/processKeydown.ts
@@ -2,6 +2,7 @@ import {setSelectionFocus} from "../editor/setSelection";
import {hasClosestByAttribute, hasClosestByClassName, hasClosestByMatchTag} from "../util/hasClosest";
import {afterRenderEvent} from "./afterRenderEvent";
import {processCodeRender} from "./processCodeRender";
+import {setRangeByWbr} from "./setRangeByWbr";
export const deleteKey = (vditor: IVditor, event: KeyboardEvent) => {
const range = getSelection().getRangeAt(0);
@@ -83,6 +84,33 @@ export const deleteKey = (vditor: IVditor, event: KeyboardEvent) => {
event.preventDefault();
}
}
+
+ // task list
+ const taskItemElement = hasClosestByClassName(startContainer, "vditor-task");
+ if (taskItemElement && range.collapsed &&
+ ((startContainer.nodeType === 3 && range.startOffset === 1 &&
+ (startContainer.previousSibling as HTMLElement).tagName === "INPUT") ||
+ startContainer.nodeType !== 3)) {
+
+ const previousElement = taskItemElement.previousElementSibling;
+ taskItemElement.querySelector("input").remove();
+ if (previousElement) {
+ previousElement.innerHTML += "" + taskItemElement.innerHTML.trim();
+ taskItemElement.remove();
+ } else {
+ taskItemElement.parentElement.insertAdjacentHTML("beforebegin",
+ `${taskItemElement.innerHTML.trim() || "\n"}
`);
+ if (taskItemElement.nextElementSibling) {
+ taskItemElement.remove();
+ } else {
+ taskItemElement.parentElement.remove();
+ }
+ }
+ setRangeByWbr(vditor.wysiwyg.element, range);
+ afterRenderEvent(vditor);
+ event.preventDefault();
+ return;
+ }
};
export const tabKey = (vditor: IVditor, event: KeyboardEvent) => {
diff --git a/src/ts/wysiwyg/setRangeByWbr.ts b/src/ts/wysiwyg/setRangeByWbr.ts
index 713ae7503..e2f44bf31 100644
--- a/src/ts/wysiwyg/setRangeByWbr.ts
+++ b/src/ts/wysiwyg/setRangeByWbr.ts
@@ -18,6 +18,7 @@ export const setRangeByWbr = (element: HTMLElement, range: Range) => {
if (wbrElement.previousElementSibling.lastChild) {
// text
range.setStartBefore(wbrElement);
+ range.collapse(true);
setSelectionFocus(range);
// fix Chrome set range bug
if (wbrElement.previousElementSibling.tagName === "EM") {
@@ -27,6 +28,7 @@ export const setRangeByWbr = (element: HTMLElement, range: Range) => {
} else if (wbrElement.previousElementSibling.tagName === "S") {
document.execCommand("strikeThrough", false, "");
}
+ wbrElement.remove();
return;
} else {
//
@@ -37,6 +39,7 @@ export const setRangeByWbr = (element: HTMLElement, range: Range) => {
range.setStart(wbrElement.previousSibling, wbrElement.previousSibling.textContent.length);
}
}
+ range.collapse(true);
wbrElement.remove();
setSelectionFocus(range);
};