add: get note markdown

This commit is contained in:
xiangyu 2022-04-29 16:51:58 +08:00
parent 703a505d59
commit abcb918089
2 changed files with 103 additions and 35 deletions

View File

@ -8,7 +8,7 @@ class AddonEvents extends AddonBase {
public async onInit() { public async onInit() {
Zotero.debug("Knowledge4Zotero: init called"); Zotero.debug("Knowledge4Zotero: init called");
this._Addon.knowledge = new Knowledge(undefined); this._Addon.knowledge = new Knowledge();
this.addEditorInstanceListener(); this.addEditorInstanceListener();
this.resetState(); this.resetState();
} }
@ -108,7 +108,8 @@ class AddonEvents extends AddonBase {
} }
*/ */
Zotero.debug("Knowledge4Zotero: addToKnowledge"); Zotero.debug("Knowledge4Zotero: addToKnowledge");
this._Addon.knowledge.addLink( this._Addon.knowledge.addLinkToNote(
undefined,
-1, -1,
message.content.editorInstance._item.id message.content.editorInstance._item.id
); );
@ -202,11 +203,15 @@ class AddonEvents extends AddonBase {
} }
// Make sure this is a direct child node of editor // Make sure this is a direct child node of editor
while ( try {
!focusNode.parentElement.className || while (
focusNode.parentElement.className.indexOf("primary-editor") === -1 !focusNode.parentElement.className ||
) { focusNode.parentElement.className.indexOf("primary-editor") === -1
focusNode = focusNode.parentNode; ) {
focusNode = focusNode.parentNode;
}
} catch (e) {
return;
} }
let currentLineIndex = getChildIndex(focusNode); let currentLineIndex = getChildIndex(focusNode);

View File

@ -2,13 +2,9 @@ const TreeModel = require("./treemodel");
class Knowledge { class Knowledge {
currentLine: number; currentLine: number;
constructor(noteItem: ZoteroItem) { constructor() {
this.currentLine = 0; this.currentLine = 0;
// this.createKnowledgeItem();
} }
// createKnowledgeItem() {
// return;
// }
getWorkspaceNote() { getWorkspaceNote() {
return Zotero.Items.get( return Zotero.Items.get(
@ -16,8 +12,8 @@ class Knowledge {
); );
} }
getLines(): string[] { getLinesInNote(note: ZoteroItem = undefined): string[] {
let note = this.getWorkspaceNote(); note = note || this.getWorkspaceNote();
if (!note) { if (!note) {
return []; return [];
} }
@ -33,11 +29,14 @@ class Knowledge {
return noteLines; return noteLines;
} }
getLineParent(lineIndex: number = -1): TreeModel.Node<object> { getLineParentInNote(
note: ZoteroItem,
lineIndex: number = -1
): TreeModel.Node<object> {
if (lineIndex < 0) { if (lineIndex < 0) {
lineIndex = this.currentLine; lineIndex = this.currentLine;
} }
let nodes = this.getOutlineList(); let nodes = this.getNoteOutlineList(note);
if (!nodes.length || nodes[0].model.lineIndex > lineIndex) { if (!nodes.length || nodes[0].model.lineIndex > lineIndex) {
// There is no parent node // There is no parent node
return undefined; return undefined;
@ -55,27 +54,27 @@ class Knowledge {
} }
} }
addLine(text: string, lineIndex: number) { addLineToNote(note: ZoteroItem, text: string, lineIndex: number) {
let note = this.getWorkspaceNote(); note = note || this.getWorkspaceNote();
if (!note) { if (!note) {
return; return;
} }
let noteLines = this.getLines(); let noteLines = this.getLinesInNote(note);
noteLines.splice(lineIndex, 0, text); noteLines.splice(lineIndex, 0, text);
note.setNote(`<div data-schema-version="8">${noteLines.join("\n")}</div>`); note.setNote(`<div data-schema-version="8">${noteLines.join("\n")}</div>`);
note.saveTx(); note.saveTx();
} }
addLineToParent(text: string, lineIndex: number = -1) { addSubLineToNote(note: ZoteroItem, text: string, lineIndex: number = -1) {
if (lineIndex < 0) { if (lineIndex < 0) {
lineIndex = this.currentLine; lineIndex = this.currentLine;
} }
let parentNode = this.getLineParent(); let parentNode = this.getLineParentInNote(note, lineIndex);
if (!parentNode) { if (!parentNode) {
this.addLine(text, lineIndex); this.addLineToNote(note, text, lineIndex);
return; return;
} }
let nodes = this.getOutlineList(); let nodes = this.getNoteOutlineList(note);
let i = 0; let i = 0;
for (let node of nodes) { for (let node of nodes) {
if (node.model.lineIndex === parentNode.model.lineIndex) { if (node.model.lineIndex === parentNode.model.lineIndex) {
@ -89,16 +88,30 @@ class Knowledge {
i = nodes.length - 1; i = nodes.length - 1;
} }
// Add line before next header, which is also the end of current parent header // Add line before next header, which is also the end of current parent header
this.addLine(text, nodes[i].model.lineIndex); this.addLineToNote(note, text, nodes[i].model.lineIndex);
} }
addLink(lineIndex: number, noteID: number) { addLinkToNote(note: ZoteroItem, lineIndex: number, linkedNoteID: number) {
this.addLineToParent(`<a href="zotero://note/${noteID}" rel="noopener noreferrer nofollow">${Zotero.Items.get(noteID).getNoteTitle()}</a>`, lineIndex); note = note || this.getWorkspaceNote();
if (!note) {
return;
}
this.addSubLineToNote(
note,
`<a href="zotero://note/${linkedNoteID}" rel="noopener noreferrer nofollow">${Zotero.Items.get(
linkedNoteID
).getNoteTitle()}</a>`,
lineIndex
);
} }
getOutline(): TreeModel.Node<object> { getNoteOutline(note: ZoteroItem): TreeModel.Node<object> {
// See http://jnuno.com/tree-model-js // See http://jnuno.com/tree-model-js
let metadataContainer = this.parseNoteHTML(); note = note || this.getWorkspaceNote();
if (!note) {
return undefined;
}
let metadataContainer = this.parseNoteHTML(note);
let tree = new TreeModel(); let tree = new TreeModel();
/* /*
tree-model/index.js: line 40 tree-model/index.js: line 40
@ -137,18 +150,68 @@ class Knowledge {
return root; return root;
} }
getOutlineList(doFilter: boolean = true): TreeModel.Node<object>[] { getNoteOutlineList(
return this.getOutline().all( note: ZoteroItem,
doFilter: boolean = true
): TreeModel.Node<object>[] {
return this.getNoteOutline(note).all(
(node) => !doFilter || node.model.lineIndex >= 0 (node) => !doFilter || node.model.lineIndex >= 0
); );
} }
jumpToNote(noteLinke: string) {} async getNoteMarkdown(note: ZoteroItem) {
note = note || this.getWorkspaceNote();
if (!note) {
return;
}
let items = [note];
let markdownFormat = {
mode: "export",
id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN,
};
// let htmlFormat = {
// mode: "export",
// id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML,
// };
let mdText = "";
let done = false;
Zotero.QuickCopy.getContentFromItems(
items,
markdownFormat,
(obj, worked) => {
if (!worked) {
Zotero.log(Zotero.getString("fileInterface.exportError"), "warning");
return;
}
mdText = obj.string.replace(/\r\n/g, "\n");
done = true;
// Zotero.QuickCopy.getContentFromItems(
// items,
// htmlFormat,
// (obj2, worked) => {
// if (!worked) {
// Zotero.log(
// Zotero.getString("fileInterface.exportError"),
// "warning"
// );
// return;
// }
// console.log(obj.string.replace(/\r\n/g, "\n"));
// console.log("text/html", obj2.string.replace(/\r\n/g, "\n"));
// }
// );
}
);
let t = 0;
while (!done && t < 500) {
t += 1;
await Zotero.Promise.delay(10);
}
return mdText;
}
export() {} parseNoteHTML(note: ZoteroItem): Element {
note = note || this.getWorkspaceNote();
parseNoteHTML(): Element {
let note = this.getWorkspaceNote();
if (!note) { if (!note) {
return undefined; return undefined;
} }