add: workspace window
add: knowledge workspace methods fix: protocol bugs
This commit is contained in:
parent
494ddf8271
commit
850f695d3a
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet href="chrome://global/skin/"?>
|
||||
<?xml-stylesheet href="chrome://zotero/skin/zotero.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://zotero/skin/overlay.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://zotero-platform/content/overlay.css"?>
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % zoteroDTD SYSTEM "chrome://zotero/locale/zotero.dtd">
|
||||
%zoteroDTD;
|
||||
<!ENTITY % knowledgeDTD SYSTEM "chrome://__addonRef__/locale/overlay.dtd">
|
||||
%knowledgeDTD;
|
||||
]>
|
||||
|
||||
<window id="zotero-knowledge-workspace" orient="vertical" width="1000" height="350" title="&zotero.__addonRef__.workspace.title;" persist="screenX screenY width height" windowtype="zotero:knowledgeWorkspace" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
|
||||
<script src="chrome://zotero/content/include.js" />
|
||||
<script src="chrome://zotero/content/note.js" />
|
||||
|
||||
<script type="application/javascript">
|
||||
window.addEventListener(
|
||||
"load",
|
||||
function (e) {
|
||||
let vbox = document.getElementById('zotero-knowledge-outline');
|
||||
vbox.width = 250;
|
||||
vbox.minWidth = 250;
|
||||
vbox.maxWidth = 250;
|
||||
},
|
||||
false
|
||||
);
|
||||
</script>
|
||||
|
||||
<keyset>
|
||||
<key id="key_close" key="W" modifiers="accel" command="cmd_close" />
|
||||
</keyset>
|
||||
<command id="cmd_close" oncommand="window.close();" />
|
||||
|
||||
<hbox flex="1">
|
||||
<vbox id="zotero-knowledge-outline" flex="1" width="250" maxWidth="250" minWidth="250">
|
||||
<!-- Outline Here -->
|
||||
</vbox>
|
||||
<splitter collapse="before">
|
||||
<grippy></grippy>
|
||||
</splitter>
|
||||
<zoteronoteeditor id="zotero-note-editor-main" flex="1" onerror="return;onError()" />
|
||||
<splitter collapse="after">
|
||||
<grippy></grippy>
|
||||
</splitter>
|
||||
<zoteronoteeditor id="zotero-note-editor-preview" flex="1" onerror="return;onError()" />
|
||||
</hbox>
|
||||
|
||||
</window>
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
<!ENTITY zotero.__addonRef__.workspace.title "Knowledge Management">
|
||||
|
||||
<!ENTITY zotero.__addonRef__.help.feedback.caption.label "User Guide and Feedback">
|
||||
<!ENTITY zotero.__addonRef__.help.feedback.label "GitHub">
|
||||
<!ENTITY zotero.__addonRef__.help.version.label "__addonName__ VERSION __buildVersion__">
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ class Knowledge4Zotero {
|
|||
this.events = new AddonEvents(this);
|
||||
this.views = new AddonViews(this);
|
||||
this.prefs = new AddonPrefs(this);
|
||||
this.knowledge = new Knowledge
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@ class AddonEvents extends AddonBase {
|
|||
|
||||
public async onInit() {
|
||||
Zotero.debug("Knowledge4Zotero: init called");
|
||||
this._Addon.knowledge = new Knowledge();
|
||||
await Zotero.uiReadyPromise;
|
||||
this._Addon.views.addOpenWorkspaceButton();
|
||||
this.addEditorInstanceListener();
|
||||
this.resetState();
|
||||
}
|
||||
|
|
@ -57,9 +58,8 @@ class AddonEvents extends AddonBase {
|
|||
}
|
||||
|
||||
public async onEditorEvent(message: EditorMessage) {
|
||||
Zotero.debug(
|
||||
`Knowledge4Zotero: onEditorEvent\n${message.type}\n${message.content}`
|
||||
);
|
||||
Zotero.debug(`Knowledge4Zotero: onEditorEvent\n${message.type}`);
|
||||
Zotero.debug(message.content);
|
||||
if (message.type === "addNoteInstance") {
|
||||
let mainKnowledgeID = parseInt(
|
||||
Zotero.Prefs.get("Knowledge4Zotero.mainKnowledgeID")
|
||||
|
|
@ -88,11 +88,6 @@ class AddonEvents extends AddonBase {
|
|||
itemID: message.content.editorInstance._item.id,
|
||||
})
|
||||
);
|
||||
this.addEditorEventListener(
|
||||
message.content.editorInstance,
|
||||
"click",
|
||||
new EditorMessage("noteEditorClick", {})
|
||||
);
|
||||
if (!message.content.editorInstance._knowledgeSelectionInitialized) {
|
||||
this.addEditorDocumentEventListener(
|
||||
message.content.editorInstance,
|
||||
|
|
@ -144,6 +139,7 @@ class AddonEvents extends AddonBase {
|
|||
"This Note is Knowledge Workspace"
|
||||
);
|
||||
// TODO: update workspace window here
|
||||
await this._Addon.knowledge.setWorkspaceMainNote();
|
||||
for (let editor of Zotero.Notes._editorInstances) {
|
||||
await editor._initPromise;
|
||||
if (editor._item.id === mainKnowledgeID) {
|
||||
|
|
@ -159,37 +155,20 @@ class AddonEvents extends AddonBase {
|
|||
}
|
||||
}
|
||||
}
|
||||
} else if (message.type === "noteEditorClick") {
|
||||
let el: XUL.Element = message.content.event.target;
|
||||
if (el.children.length !== 0) {
|
||||
// This is not a line element
|
||||
return;
|
||||
}
|
||||
if (
|
||||
el.tagName === "A" &&
|
||||
(el as HTMLLinkElement).href.search(/zotero:\/\/note\//g) >= 0
|
||||
) {
|
||||
let urlIndex = (el as HTMLLinkElement).href.search(
|
||||
/zotero:\/\/note\//g
|
||||
);
|
||||
if (urlIndex >= 0) {
|
||||
let noteID = parseInt(
|
||||
(el as HTMLLinkElement).href.substring(
|
||||
urlIndex + "zotero://note/".length
|
||||
)
|
||||
);
|
||||
let note = Zotero.Items.get(noteID);
|
||||
if (note && note.isNote()) {
|
||||
// TODO: Open note
|
||||
Zotero.debug(`Knowledge4Zotero: noteEditorClick ${note.id}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (message.type === "onNoteLink") {
|
||||
// TODO: Open note
|
||||
Zotero.debug(
|
||||
`Knowledge4Zotero: onNoteLink ${message.content.params.item}`
|
||||
`Knowledge4Zotero: onNoteLink ${message.content.params.item.id}`
|
||||
);
|
||||
let _window = this._Addon.knowledge.getWorkspaceWindow();
|
||||
if (_window) {
|
||||
this._Addon.knowledge.setWorkspacePreviewNote(
|
||||
message.content.params.item
|
||||
);
|
||||
(_window as Window).focus();
|
||||
} else {
|
||||
ZoteroPane.openNoteWindow(message.content.params.item.id);
|
||||
}
|
||||
} else if (message.type === "noteEditorSelectionChange") {
|
||||
if (
|
||||
message.content.editorInstance._item.id ===
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
import Knowledge4Zotero from "./addon";
|
||||
import { Knowledge } from "./knowledge";
|
||||
|
||||
Zotero.Knowledge4Zotero = new Knowledge4Zotero();
|
||||
|
||||
Zotero.Knowledge = Knowledge
|
||||
|
||||
window.addEventListener(
|
||||
"load",
|
||||
async function (e) {
|
||||
|
|
|
|||
117
src/knowledge.ts
117
src/knowledge.ts
|
|
@ -2,6 +2,7 @@ const TreeModel = require("./treemodel");
|
|||
|
||||
class Knowledge {
|
||||
currentLine: number;
|
||||
workspaceWindow: Window;
|
||||
constructor() {
|
||||
this.currentLine = 0;
|
||||
}
|
||||
|
|
@ -12,6 +13,72 @@ class Knowledge {
|
|||
);
|
||||
}
|
||||
|
||||
getWorkspaceWindow(): Window | boolean {
|
||||
if (this.workspaceWindow && !this.workspaceWindow.closed) {
|
||||
return this.workspaceWindow;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
async openWorkspaceWindow() {
|
||||
if (this.getWorkspaceWindow()) {
|
||||
(this.getWorkspaceWindow() as Window).focus();
|
||||
} else {
|
||||
let win = window.open(
|
||||
"chrome://Knowledge4Zotero/content/workspace.xul",
|
||||
"_blank",
|
||||
"chrome,extrachrome,menubar,resizable,scrollbars,status,width=900,height=600"
|
||||
);
|
||||
this.workspaceWindow = win;
|
||||
await this.waitWorkspaceRedy();
|
||||
this.setWorkspaceMainNote();
|
||||
}
|
||||
}
|
||||
|
||||
async waitWorkspaceRedy() {
|
||||
let _window = this.getWorkspaceWindow() as Window;
|
||||
if (!_window) {
|
||||
return false;
|
||||
}
|
||||
let t = 0;
|
||||
while (_window.document.readyState !== "complete" && t < 500) {
|
||||
t += 1;
|
||||
await Zotero.Promise.delay(10);
|
||||
}
|
||||
return t < 500;
|
||||
}
|
||||
|
||||
async setWorkspaceMainNote(note: ZoteroItem = undefined) {
|
||||
let _window = this.getWorkspaceWindow() as Window;
|
||||
note = note || this.getWorkspaceNote();
|
||||
if (!_window) {
|
||||
return;
|
||||
}
|
||||
await this.waitWorkspaceRedy();
|
||||
let noteEditor: any = _window.document.getElementById(
|
||||
"zotero-note-editor-main"
|
||||
);
|
||||
noteEditor.mode = "edit";
|
||||
noteEditor.viewMode = "library";
|
||||
noteEditor.parent = null;
|
||||
noteEditor.item = note;
|
||||
}
|
||||
|
||||
async setWorkspacePreviewNote(note: ZoteroItem) {
|
||||
let _window = this.getWorkspaceWindow() as Window;
|
||||
if (!_window) {
|
||||
return;
|
||||
}
|
||||
await this.waitWorkspaceRedy();
|
||||
let noteEditor: any = _window.document.getElementById(
|
||||
"zotero-note-editor-preview"
|
||||
);
|
||||
noteEditor.mode = "edit";
|
||||
noteEditor.viewMode = "library";
|
||||
noteEditor.parent = null;
|
||||
noteEditor.item = note;
|
||||
}
|
||||
|
||||
getLinesInNote(note: ZoteroItem): string[] {
|
||||
note = note || this.getWorkspaceNote();
|
||||
if (!note) {
|
||||
|
|
@ -279,55 +346,35 @@ class Knowledge {
|
|||
return [node.model.lineIndex, endIndex];
|
||||
}
|
||||
|
||||
async getNoteMarkdown(note: ZoteroItem) {
|
||||
async getNoteExport(note: ZoteroItem, format: "markdown" | "html") {
|
||||
note = note || this.getWorkspaceNote();
|
||||
if (!note) {
|
||||
return;
|
||||
}
|
||||
let items = [note];
|
||||
let markdownFormat = {
|
||||
let formatObj = {
|
||||
mode: "export",
|
||||
id: Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN,
|
||||
id:
|
||||
format === "markdown"
|
||||
? Zotero.Translators.TRANSLATOR_ID_NOTE_MARKDOWN
|
||||
: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML,
|
||||
};
|
||||
// let htmlFormat = {
|
||||
// mode: "export",
|
||||
// id: Zotero.Translators.TRANSLATOR_ID_NOTE_HTML,
|
||||
// };
|
||||
let mdText = "";
|
||||
let text = "";
|
||||
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"));
|
||||
// }
|
||||
// );
|
||||
Zotero.QuickCopy.getContentFromItems(items, formatObj, (obj, worked) => {
|
||||
if (!worked) {
|
||||
Zotero.log(Zotero.getString("fileInterface.exportError"), "warning");
|
||||
return;
|
||||
}
|
||||
);
|
||||
text = obj.string.replace(/\r\n/g, "\n");
|
||||
done = true;
|
||||
});
|
||||
let t = 0;
|
||||
while (!done && t < 500) {
|
||||
t += 1;
|
||||
await Zotero.Promise.delay(10);
|
||||
}
|
||||
return mdText;
|
||||
return text;
|
||||
}
|
||||
|
||||
parseNoteHTML(note: ZoteroItem): Element {
|
||||
|
|
|
|||
15
src/views.ts
15
src/views.ts
|
|
@ -63,6 +63,21 @@ class AddonViews extends AddonBase {
|
|||
editor.parentNode.scrollTo(0, editor.children[lineIndex].offsetTop);
|
||||
}
|
||||
|
||||
addOpenWorkspaceButton() {
|
||||
let lastButton = document.getElementById("zotero-tb-advanced-search");
|
||||
let button = document.createElement("toolbarbutton");
|
||||
button.setAttribute("id", "zotero-tb-knowledge-openwindow");
|
||||
button.setAttribute("tooltiptext", "Open Knowledge Workspace");
|
||||
button.addEventListener("click", (e) => {
|
||||
this._Addon.knowledge.openWorkspaceWindow();
|
||||
});
|
||||
button.setAttribute(
|
||||
"style",
|
||||
"list-style-image: url('chrome://Knowledge4Zotero/skin/favicon@0.5x.png');"
|
||||
);
|
||||
lastButton.after(button);
|
||||
}
|
||||
|
||||
showProgressWindow(
|
||||
header: string,
|
||||
context: string,
|
||||
|
|
|
|||
|
|
@ -1286,7 +1286,9 @@ function ZoteroProtocolHandler() {
|
|||
Zotero.debug(`${noteID} called with ${extraParams}`);
|
||||
let item = Zotero.Items.get(noteID);
|
||||
if (item && item.isNote()) {
|
||||
Zotero.Knowledge4Zotero.events.onEditorEvent({
|
||||
Zotero.Knowledge4Zotero.events.onEditorEvent.bind(
|
||||
Zotero.Knowledge4Zotero.events
|
||||
)({
|
||||
type: "onNoteLink",
|
||||
content: {
|
||||
params: {
|
||||
|
|
|
|||
Loading…
Reference in New Issue