diff --git a/addon/chrome/content/treeView.html b/addon/chrome/content/treeView.html index 44eebc2..1466a21 100644 --- a/addon/chrome/content/treeView.html +++ b/addon/chrome/content/treeView.html @@ -105,6 +105,7 @@ ) { return; } + window._e = e; const fromTreeView = getTreeView(); const toTreeView = getTreeView(); @@ -121,6 +122,18 @@ return; } + window.parent.postMessage( + { + type: "moveNode", + fromID: parseInt(fromNode.itemData.id), + toID: toNode + ? parseInt(toNode.itemData.id) + : toItems[toItems.length - 1].itemData.id, + moveType: e.dropInsideItem ? "child" : "before", + }, + "*" + ); + const fromTopVisibleNode = getTopVisibleNode(fromTreeView); const toTopVisibleNode = getTopVisibleNode(toTreeView); @@ -191,18 +204,6 @@ ? toItems.length : findIndex(toItems, toNode.itemData.id); - window.parent.postMessage( - { - type: "moveNode", - fromID: parseInt(fromNode.itemData.id), - toID: toNode - ? parseInt(toNode.itemData.id) - : toItems[toItems.length - 1].itemData.id, - type: toNode ? "before" : "after", - }, - "*" - ); - toItems.splice(toIndex, 0, fromNode.itemData); moveChildren(fromNode, fromItems, toItems); diff --git a/src/events.ts b/src/events.ts index a5773ac..68bb825 100644 --- a/src/events.ts +++ b/src/events.ts @@ -420,7 +420,7 @@ class AddonEvents extends AddonBase { /* message.content = { params: { - fromID, toID, type: "before" | "after" + fromID, toID, moveType: "before" | "child" } } */ @@ -437,11 +437,12 @@ class AddonEvents extends AddonBase { ); Zotero.debug(fromNode.model); Zotero.debug(toNode.model); + Zotero.debug(message.content.params.moveType); this._Addon.knowledge.moveHeaderLineInNote( undefined, fromNode, toNode, - message.content.params.type + message.content.params.moveType ); this._Addon.views.buildOutline(); } else if (message.type === "closePreview") { diff --git a/src/knowledge.ts b/src/knowledge.ts index 436f8a5..7f13653 100644 --- a/src/knowledge.ts +++ b/src/knowledge.ts @@ -415,51 +415,54 @@ class Knowledge extends AddonBase { return undefined; } - let currentLineRange = this.getNodeLineRangeInNoteTree(note, currentNode); - let targetLineRange = this.getNodeLineRangeInNoteTree(note, targetNode); let targetIndex = 0; let targetRank = 1; let lines = this.getLinesInNote(note); if (as === "child") { - targetIndex = targetLineRange[1]; + targetIndex = targetNode.model.endIndex; targetRank = targetNode.model.rank === 6 ? 6 : targetNode.model.rank + 1; } else if (as === "before") { - targetIndex = targetLineRange[0]; - targetRank = targetNode.model.rank; + targetIndex = targetNode.model.lineIndex; + targetRank = + targetNode.model.rank === 7 + ? targetNode.parent.model.rank === 6 + ? 6 + : targetNode.parent.model.rank + 1 + : targetNode.model.rank; } else if (as === "after") { - targetIndex = targetLineRange[1]; - targetRank = targetNode.model.rank; - } - - if (targetIndex > currentLineRange[1]) { - targetIndex -= currentLineRange[1] - currentLineRange[0]; + targetIndex = targetNode.model.endIndex; + targetRank = + targetNode.model.rank === 7 + ? targetNode.parent.model.rank === 6 + ? 6 + : targetNode.parent.model.rank + 1 + : targetNode.model.rank; } let rankChange = targetRank - currentNode.model.rank; + Zotero.debug(`move to ${targetIndex}`); + let movedLines = lines.splice( - currentLineRange[0], - currentLineRange[1] - currentLineRange[0] + currentNode.model.lineIndex, + currentNode.model.endIndex - currentNode.model.lineIndex ); - let headerStartReg = new RegExp(""); - let headerStopReg = new RegExp(""); - for (let i = 0; i < movedLines.length; i++) { - let headerStart = movedLines[i].search(headerStartReg); - if (headerStart === -1) { - continue; - } - let lineRank = parseInt(movedLines[i][headerStart + 2]) + rankChange; - if (lineRank > 6) { - lineRank = 6; - } else if (lineRank < 1) { - lineRank = 1; - } - movedLines[i] = movedLines[i] - .replace(headerStartReg, ``) - .replace(headerStopReg, ``); + let headerReg = /<\/?h[1-6]>/g; + for (const i in movedLines) { + movedLines[i] = movedLines[i].replace(headerReg, (e) => { + let rank = parseInt(e.slice(-2, -1)); + rank += rankChange; + if (rank > 6) { + rank = 6; + } + if (rank < 1) { + rank = 1; + } + return `${e.slice(0, -2)}${rank}>`; + }); } let newLines = lines .slice(0, targetIndex) @@ -585,27 +588,6 @@ class Knowledge extends AddonBase { }); } - getNodeLineRangeInNoteTree( - note: ZoteroItem, - node: TreeModel.Node - ): number[] { - note = note || this.getWorkspaceNote(); - if (!note) { - return; - } - let nodes = this.getNoteTreeAsList(note); - let endIndex = node.model.endIndex; - for (let i = 0; i < nodes.length; i++) { - if ( - nodes[i].model.lineIndex >= node.model.lineIndex && - nodes[i].model.rank > node.model.rank - ) { - endIndex = nodes[i].model.endIndex; - } - } - return [node.model.lineIndex, endIndex]; - } - async exportNoteToFile( note: ZoteroItem, convertNoteLinks: boolean = true,