fix: line index parse for multi-level list

This commit is contained in:
xiangyu 2022-07-08 12:07:59 +08:00
parent ce17c50709
commit 7628a7f75d
2 changed files with 38 additions and 28 deletions

View File

@ -981,34 +981,34 @@ class AddonEvents extends AddonBase {
let currentLineIndex = getChildIndex(focusNode);
const tableElements = Array.prototype.filter.call(
// Parse list
const diveTagNames = ["OL", "UL", "LI"];
// Find list elements before current line
const listElements = Array.prototype.filter.call(
Array.prototype.slice.call(
focusNode.parentElement.childNodes,
0,
currentLineIndex
),
(e) => {
return e.tagName === "UL" || e.tagName === "OL";
}
(e) => diveTagNames.includes(e.tagName)
);
console.log(currentLineIndex, tableElements);
for (const tableElement of tableElements) {
currentLineIndex += tableElement.childElementCount - 1;
for (const e of listElements) {
currentLineIndex += this._Addon.views.diveNode(e).length - 1;
}
const tagName = focusNode.tagName;
if (tagName === "UL" || tagName === "OL") {
let liElement = selection.focusNode as XUL.Element;
while (
liElement.tagName !== "LI" ||
!liElement.parentElement.parentElement.className.includes(
"primary-editor"
)
) {
liElement = liElement.parentElement;
// Find list index if current line is inside a list
if (diveTagNames.includes(focusNode.tagName)) {
const eleList = this._Addon.views.diveNode(focusNode);
for (const i in eleList) {
if (
selection.focusNode.parentElement.parentElement === eleList[i]
) {
currentLineIndex += Number(i);
break;
}
}
currentLineIndex += getChildIndex(liElement);
}
Zotero.debug(`Knowledge4Zotero: line ${currentLineIndex} selected.`);
console.log(currentLineIndex);

View File

@ -255,26 +255,36 @@ class AddonViews extends AddonBase {
}
}
// TODO: move these parse functions to a seperate file
diveNode(
e: Element,
eleList: Element[] = undefined,
diveTagNames: string[] = ["OL", "UL", "LI"]
) {
if (!eleList) {
eleList = [];
}
for (let _e of e.children) {
if (diveTagNames.includes(_e.tagName)) {
this.diveNode(_e, eleList);
} else {
eleList.push(e);
}
}
return eleList;
}
async scrollToLine(instance: EditorInstance, lineIndex: number) {
await instance._initPromise;
let editorElement = this.getEditorElement(instance._iframeWindow.document);
const eleList = [];
const diveTagNames = ["OL", "UL", "LI"];
function dive(e: Element, targetIndex: string) {
for (let _e of e.children) {
if (diveTagNames.includes(_e.tagName)) {
dive(_e, targetIndex);
} else {
eleList.push(e);
}
}
}
const nodes = Array.from(editorElement.children);
for (let i in nodes) {
const ele = nodes[i];
if (diveTagNames.includes(ele.tagName)) {
dive(ele, i);
this.diveNode(ele, eleList, diveTagNames);
} else {
eleList.push(ele);
}