refactor: more oop style files
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import { App, FuzzyMatch, FuzzySuggestModal } from 'obsidian';
|
||||
import { ZoteroClient } from "./ZoteroClient";
|
||||
import { ZoteroAnnotation } from "./ZoteroAnnotation";
|
||||
import { loadAnnotations, renderZoteroAnnotation } from "./Utils"
|
||||
|
||||
const ZOTERO_BASE_URL = "zotero://select/library/items/";
|
||||
|
||||
export class AnnotationModal extends FuzzySuggestModal<ZoteroAnnotation> {
|
||||
private client: ZoteroClient;
|
||||
private annotations: ZoteroAnnotation[] = [];
|
||||
private createLink: boolean;
|
||||
private onChoose: (annotations: string) => void;
|
||||
|
||||
constructor(
|
||||
app: App,
|
||||
port: string,
|
||||
createLink: boolean,
|
||||
style: string,
|
||||
onChoose: (annotations: string) => void,
|
||||
) {
|
||||
super(app);
|
||||
this.client = new ZoteroClient(port, style);
|
||||
this.setPlaceholder("Loading...");
|
||||
this.createLink = createLink
|
||||
this.onChoose = onChoose;
|
||||
}
|
||||
|
||||
async onOpen(){
|
||||
this.annotations = await loadAnnotations(this.client);
|
||||
super.onOpen();
|
||||
}
|
||||
|
||||
getItems(): ZoteroAnnotation[] {
|
||||
return this.annotations;
|
||||
}
|
||||
|
||||
|
||||
getItemText(annotation: ZoteroAnnotation): string {
|
||||
return annotation.toString();
|
||||
}
|
||||
|
||||
renderSuggestion(match: FuzzyMatch<ZoteroAnnotation>, el: HTMLElement) {
|
||||
renderZoteroAnnotation(match, el);
|
||||
}
|
||||
|
||||
async onChooseItem(annotation: ZoteroAnnotation) {
|
||||
|
||||
let citation = annotation.parentItem.citation;
|
||||
|
||||
if (this.createLink) {
|
||||
citation = `[${citation}](${ZOTERO_BASE_URL}${annotation.parentItemKey})`;
|
||||
}
|
||||
|
||||
this.onChoose(`"${annotation.text}" ${citation}`);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
import { App, FuzzyMatch, FuzzySuggestModal } from 'obsidian';
|
||||
import { ZoteroClient } from "./ZoteroClient";
|
||||
import { ZoteroItem } from "./ZoteroItem";
|
||||
|
||||
const ZOTERO_BASE_URL = "zotero://select/library/items/";
|
||||
|
||||
export class CiteModal extends FuzzySuggestModal<ZoteroItem> {
|
||||
|
||||
private onChoose: (reference: string) => void;
|
||||
private client: ZoteroClient;
|
||||
private items: ZoteroItem[] = [];
|
||||
private createLink: boolean;
|
||||
private mode: string;
|
||||
|
||||
constructor(
|
||||
app: App,
|
||||
port: string,
|
||||
createLink: boolean,
|
||||
style: string,
|
||||
mode: string,
|
||||
onChoose: (reference: string) => void,
|
||||
) {
|
||||
super(app);
|
||||
this.setPlaceholder("Loading...");
|
||||
this.client = new ZoteroClient(port, style);
|
||||
this.createLink = createLink;
|
||||
this.mode = mode;
|
||||
this.onChoose = onChoose;
|
||||
}
|
||||
|
||||
async onOpen(){
|
||||
this.items = await loadItems(this, this.client);
|
||||
super.onOpen();
|
||||
}
|
||||
|
||||
getItems(): ZoteroItem[] {
|
||||
return this.items;
|
||||
}
|
||||
|
||||
getItemText(item: ZoteroItem): string {
|
||||
return item.toString();
|
||||
}
|
||||
|
||||
renderSuggestion(match: FuzzyMatch<ZoteroItem>, el: HTMLElement) {
|
||||
renderZoteroItem(match, el);
|
||||
}
|
||||
|
||||
onChooseItem(item: ZoteroItem) {
|
||||
|
||||
let output = "";
|
||||
|
||||
if (this.mode === "citation"){
|
||||
output = item.citation;
|
||||
} else if (this.mode === "bibliography"){
|
||||
output = item.bibliography;
|
||||
} else {
|
||||
throw new Error(`Unknown mode: ${this.mode}`);
|
||||
}
|
||||
|
||||
if (!this.createLink) {
|
||||
this.onChoose(output);
|
||||
} else {
|
||||
this.onChoose(`[${output}](${ZOTERO_BASE_URL}${item.key})`);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
import { shell } from "electron";
|
||||
import { App, FuzzyMatch, FuzzySuggestModal } from 'obsidian';
|
||||
import { ZoteroClient } from "./ZoteroClient";
|
||||
import { ZoteroItem } from "./ZoteroItem";
|
||||
|
||||
const ZOTERO_BASE_URL = "zotero://select/library/items/";
|
||||
|
||||
export class OpenModal extends FuzzySuggestModal<ZoteroItem> {
|
||||
private client: ZoteroClient;
|
||||
private items: ZoteroItem[] = [];
|
||||
|
||||
constructor(
|
||||
app: App,
|
||||
port: string,
|
||||
) {
|
||||
super(app);
|
||||
this.client = new ZoteroClient(port);
|
||||
this.setPlaceholder("Loading...");
|
||||
}
|
||||
|
||||
async onOpen(){
|
||||
this.items = await loadItems(this, this.client);
|
||||
super.onOpen();
|
||||
}
|
||||
|
||||
getItems(): ZoteroItem[] {
|
||||
return this.items;
|
||||
}
|
||||
|
||||
getItemText(item: ZoteroItem): string {
|
||||
return item.toString();
|
||||
}
|
||||
|
||||
renderSuggestion(match: FuzzyMatch<ZoteroItem>, el: HTMLElement) {
|
||||
renderZoteroItem(match, el);
|
||||
}
|
||||
|
||||
onChooseItem(item: ZoteroItem) {
|
||||
if (!item.key) return;
|
||||
const uri = `${ZOTERO_BASE_URL}${item.key}`;
|
||||
shell.openExternal(uri);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
import { renderResults, Notice } from "obsidian";
|
||||
|
||||
export function renderZoteroItem(
|
||||
match: FuzzyMatch<ZoteroItem>,
|
||||
el: HTMLElement
|
||||
) {
|
||||
const { item } = match;
|
||||
|
||||
const titleEl = el.createDiv();
|
||||
renderResults(titleEl, item.title, match.match);
|
||||
|
||||
const subtitleEl = el.createEl("small");
|
||||
const offset = -(item.title.length + 1);
|
||||
renderResults(
|
||||
subtitleEl,
|
||||
`${item.creators}, ${item.year}`,
|
||||
match.match,
|
||||
offset
|
||||
);
|
||||
}
|
||||
|
||||
export function renderZoteroAnnotation(
|
||||
match: FuzzyMatch<ZoteroAnnotation>,
|
||||
el: HTMLElement
|
||||
) {
|
||||
const { item: annotation } = match;
|
||||
|
||||
const titleEl = el.createDiv();
|
||||
renderResults(titleEl, annotation.text, match.match);
|
||||
|
||||
const subtitleEl = el.createEl("small");
|
||||
const offset = -(annotation.text.length + 1);
|
||||
renderResults(subtitleEl, annotation.parentItem.toStringShort(), match.match, offset);
|
||||
}
|
||||
|
||||
export async function loadItems(
|
||||
modal: FuzzySuggestModal<ZoteroItem>,
|
||||
client: ZoteroClient,
|
||||
): Promise<ZoteroItem[]> {
|
||||
try {
|
||||
const items = await client.getItemsTop();
|
||||
modal.setPlaceholder("Search Zotero...");
|
||||
modal.inputEl.disabled = false;
|
||||
modal.inputEl.focus();
|
||||
modal.updateSuggestions();
|
||||
return items;
|
||||
} catch (error) {
|
||||
new Notice(
|
||||
"Failed to load citations/bibliographies from Zotero."
|
||||
);
|
||||
console.error(error);
|
||||
modal.close();
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export async function loadAnnotations(
|
||||
client: ZoteroClient,
|
||||
): Promise<ZoteroAnnotation[]> {
|
||||
|
||||
try {
|
||||
const annotations = await client.getAnnotations();
|
||||
return annotations;
|
||||
} catch (error) {
|
||||
new Notice(
|
||||
"Failed to load annotations from Zotero."
|
||||
);
|
||||
console.error(error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -1,6 +1,8 @@
|
||||
import { App, Editor, MarkdownView, Modal, Plugin, Notice } from 'obsidian';
|
||||
import { DEFAULT_SETTINGS, Settings, SettingTab } from "./settings";
|
||||
import { CiteModal, OpenModal, AnnotationModal } from "./modals"
|
||||
import { CiteModal } from "./CiteModal";
|
||||
import { OpenModal } from "./OpenModal";
|
||||
import { AnnotationModal } from "./AnnotationModal";
|
||||
|
||||
export default class Cite extends Plugin {
|
||||
settings: Settings;
|
||||
|
||||
-228
@@ -1,228 +0,0 @@
|
||||
import { shell } from "electron";
|
||||
import { App, FuzzyMatch, FuzzySuggestModal, renderResults, Notice } from 'obsidian';
|
||||
import { ZoteroClient } from "./clients";
|
||||
import { ZoteroItem } from "./ZoteroItem";
|
||||
import { ZoteroAnnotation } from "./ZoteroAnnotation";
|
||||
|
||||
const ZOTERO_BASE_URL = "zotero://select/library/items/";
|
||||
|
||||
function renderZoteroItem(
|
||||
match: FuzzyMatch<ZoteroItem>,
|
||||
el: HTMLElement
|
||||
) {
|
||||
const { item } = match;
|
||||
|
||||
const titleEl = el.createDiv();
|
||||
renderResults(titleEl, item.title, match.match);
|
||||
|
||||
const subtitleEl = el.createEl("small");
|
||||
const offset = -(item.title.length + 1);
|
||||
renderResults(
|
||||
subtitleEl,
|
||||
`${item.creators}, ${item.year}`,
|
||||
match.match,
|
||||
offset
|
||||
);
|
||||
}
|
||||
|
||||
function renderZoteroAnnotation(
|
||||
match: FuzzyMatch<ZoteroAnnotation>,
|
||||
el: HTMLElement
|
||||
) {
|
||||
const { item: annotation } = match;
|
||||
|
||||
const titleEl = el.createDiv();
|
||||
renderResults(titleEl, annotation.text, match.match);
|
||||
|
||||
const subtitleEl = el.createEl("small");
|
||||
const offset = -(annotation.text.length + 1);
|
||||
renderResults(subtitleEl, annotation.parentItem.toStringShort(), match.match, offset);
|
||||
}
|
||||
|
||||
async function loadItems(
|
||||
modal: FuzzySuggestModal<ZoteroItem>,
|
||||
client: ZoteroClient,
|
||||
): Promise<ZoteroItem[]> {
|
||||
try {
|
||||
const items = await client.getItemsTop();
|
||||
modal.setPlaceholder("Search Zotero...");
|
||||
modal.inputEl.disabled = false;
|
||||
modal.inputEl.focus();
|
||||
modal.updateSuggestions();
|
||||
return items;
|
||||
} catch (error) {
|
||||
new Notice(
|
||||
"Failed to load citations/bibliographies from Zotero."
|
||||
);
|
||||
console.error(error);
|
||||
modal.close();
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async function loadAnnotations(
|
||||
client: ZoteroClient,
|
||||
): Promise<ZoteroAnnotation[]> {
|
||||
|
||||
try {
|
||||
const annotations = await client.getAnnotations();
|
||||
return annotations;
|
||||
} catch (error) {
|
||||
new Notice(
|
||||
"Failed to load annotations from Zotero."
|
||||
);
|
||||
console.error(error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export class AnnotationModal extends FuzzySuggestModal<ZoteroAnnotation> {
|
||||
private client: ZoteroClient;
|
||||
private annotations: ZoteroAnnotation[] = [];
|
||||
private createLink: boolean;
|
||||
private onChoose: (annotations: string) => void;
|
||||
|
||||
constructor(
|
||||
app: App,
|
||||
port: string,
|
||||
createLink: boolean,
|
||||
style: string,
|
||||
onChoose: (annotations: string) => void,
|
||||
) {
|
||||
super(app);
|
||||
this.client = new ZoteroClient(port, style);
|
||||
this.setPlaceholder("Loading...");
|
||||
this.createLink = createLink
|
||||
this.onChoose = onChoose;
|
||||
}
|
||||
|
||||
async onOpen(){
|
||||
this.annotations = await loadAnnotations(this.client);
|
||||
super.onOpen();
|
||||
}
|
||||
|
||||
getItems(): ZoteroAnnotation[] {
|
||||
return this.annotations;
|
||||
}
|
||||
|
||||
getItemText(annotation: ZoteroAnnotation): string {
|
||||
return annotation.toString();
|
||||
}
|
||||
|
||||
renderSuggestion(match: FuzzyMatch<ZoteroAnnotation>, el: HTMLElement) {
|
||||
renderZoteroAnnotation(match, el);
|
||||
}
|
||||
|
||||
async onChooseItem(annotation: ZoteroAnnotation) {
|
||||
|
||||
let citation = annotation.parentItem.citation;
|
||||
|
||||
if (this.createLink) {
|
||||
citation = `[${citation}](${ZOTERO_BASE_URL}${annotation.parentItemKey})`;
|
||||
}
|
||||
|
||||
this.onChoose(`"${annotation.text}" ${citation}`);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export class OpenModal extends FuzzySuggestModal<ZoteroItem> {
|
||||
private client: ZoteroClient;
|
||||
private items: ZoteroItem[] = [];
|
||||
|
||||
constructor(
|
||||
app: App,
|
||||
port: string,
|
||||
) {
|
||||
super(app);
|
||||
this.client = new ZoteroClient(port);
|
||||
this.setPlaceholder("Loading...");
|
||||
}
|
||||
|
||||
async onOpen(){
|
||||
this.items = await loadItems(this, this.client);
|
||||
super.onOpen();
|
||||
}
|
||||
|
||||
getItems(): ZoteroItem[] {
|
||||
return this.items;
|
||||
}
|
||||
|
||||
getItemText(item: ZoteroItem): string {
|
||||
return item.toString();
|
||||
}
|
||||
|
||||
renderSuggestion(match: FuzzyMatch<ZoteroItem>, el: HTMLElement) {
|
||||
renderZoteroItem(match, el);
|
||||
}
|
||||
|
||||
onChooseItem(item: ZoteroItem) {
|
||||
if (!item.key) return;
|
||||
const uri = `${ZOTERO_BASE_URL}${item.key}`;
|
||||
shell.openExternal(uri);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export class CiteModal extends FuzzySuggestModal<ZoteroItem> {
|
||||
|
||||
private onChoose: (reference: string) => void;
|
||||
private client: ZoteroClient;
|
||||
private items: ZoteroItem[] = [];
|
||||
private createLink: boolean;
|
||||
private mode: string;
|
||||
|
||||
constructor(
|
||||
app: App,
|
||||
port: string,
|
||||
createLink: boolean,
|
||||
style: string,
|
||||
mode: string,
|
||||
onChoose: (reference: string) => void,
|
||||
) {
|
||||
super(app);
|
||||
this.setPlaceholder("Loading...");
|
||||
this.client = new ZoteroClient(port, style);
|
||||
this.createLink = createLink;
|
||||
this.mode = mode;
|
||||
this.onChoose = onChoose;
|
||||
}
|
||||
|
||||
async onOpen(){
|
||||
this.items = await loadItems(this, this.client);
|
||||
super.onOpen();
|
||||
}
|
||||
|
||||
getItems(): ZoteroItem[] {
|
||||
return this.items;
|
||||
}
|
||||
|
||||
getItemText(item: ZoteroItem): string {
|
||||
return item.toString();
|
||||
}
|
||||
|
||||
renderSuggestion(match: FuzzyMatch<ZoteroItem>, el: HTMLElement) {
|
||||
renderZoteroItem(match, el);
|
||||
}
|
||||
|
||||
onChooseItem(item: ZoteroItem) {
|
||||
|
||||
let output = "";
|
||||
|
||||
if (this.mode === "citation"){
|
||||
output = item.citation;
|
||||
} else if (this.mode === "bibliography"){
|
||||
output = item.bibliography;
|
||||
} else {
|
||||
throw new Error(`Unknown mode: ${this.mode}`);
|
||||
}
|
||||
|
||||
if (!this.createLink) {
|
||||
this.onChoose(output);
|
||||
} else {
|
||||
this.onChoose(`[${output}](${ZOTERO_BASE_URL}${item.key})`);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user