Skip to content

Commit b5d5cc5

Browse files
committed
first prove of concept O_O implementation
1 parent 3db3496 commit b5d5cc5

File tree

4 files changed

+80
-7
lines changed

4 files changed

+80
-7
lines changed

src/api/apis/WikipediaAPI.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export class WikipediaAPI extends APIModel {
6666
englishTitle: result.title,
6767
year: '',
6868
dataSource: this.apiName,
69+
url: result.fullurl,
6970
id: result.pageid,
7071

7172
wikiUrl: result.fullurl,

src/main.ts

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian';
1+
import {MarkdownView, Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder} from 'obsidian';
22
import {getDefaultSettings, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
33
import {APIManager} from './api/APIManager';
44
import {MediaTypeModel} from './models/MediaTypeModel';
@@ -88,6 +88,78 @@ export default class MediaDbPlugin extends Plugin {
8888
return true;
8989
},
9090
});
91+
// register link insert command
92+
this.addCommand({
93+
id: 'add-media-db-link',
94+
name: 'Add a link.',
95+
checkCallback: (checking: boolean) => {
96+
if (!this.app.workspace.getActiveFile()) {
97+
return false;
98+
}
99+
if (!checking) {
100+
this.createLinkWithSearchModal();
101+
}
102+
return true;
103+
},
104+
});
105+
}
106+
107+
/**
108+
* first very simple approach
109+
* - replace the detail query
110+
* - maybe custom link syntax
111+
*/
112+
async createLinkWithSearchModal() {
113+
let results: MediaTypeModel[] = [];
114+
115+
const {advancedSearchOptions, advancedSearchModal} = await this.openMediaDbAdvancedSearchModal();
116+
if (!advancedSearchOptions) {
117+
advancedSearchModal.close();
118+
return;
119+
}
120+
121+
let apiSearchResults: MediaTypeModel[] = undefined;
122+
try {
123+
apiSearchResults = await this.apiManager.query(advancedSearchOptions.query, advancedSearchOptions.apis);
124+
} catch (e) {
125+
console.warn(e);
126+
new Notice(e.toString());
127+
advancedSearchModal.close();
128+
return;
129+
}
130+
131+
advancedSearchModal.close();
132+
133+
const {selectRes, selectModal} = await this.openMediaDbSelectModal(apiSearchResults, false, false);
134+
if (!selectRes) {
135+
selectModal.close();
136+
return;
137+
}
138+
139+
// TODO: let's try to not query details for this
140+
try {
141+
results = await this.queryDetails(selectRes);
142+
} catch (e) {
143+
console.warn(e);
144+
new Notice(e.toString());
145+
selectModal.close();
146+
return;
147+
}
148+
149+
selectModal.close();
150+
151+
if (!results || results.length < 1) {
152+
return;
153+
}
154+
155+
const link = `[${results[0].title}](${results[0].url})`
156+
157+
const view = this.app.workspace.getActiveViewOfType(MarkdownView);
158+
159+
// Make sure the user is editing a Markdown file.
160+
if (view) {
161+
view.editor.replaceRange(link, view.editor.getCursor());
162+
}
91163
}
92164

93165
async createEntryWithSearchModal() {
@@ -473,8 +545,8 @@ export default class MediaDbPlugin extends Plugin {
473545
return {idSearchOptions: res, idSearchModal: modal};
474546
}
475547

476-
async openMediaDbSelectModal(resultsToDisplay: MediaTypeModel[], skipButton: boolean = false): Promise<{ selectRes: MediaTypeModel[], selectModal: MediaDbSearchResultModal }> {
477-
const modal = new MediaDbSearchResultModal(this, resultsToDisplay, skipButton);
548+
async openMediaDbSelectModal(resultsToDisplay: MediaTypeModel[], skipButton: boolean = false, allowMultiSelect: boolean = true): Promise<{ selectRes: MediaTypeModel[], selectModal: MediaDbSearchResultModal }> {
549+
const modal = new MediaDbSearchResultModal(this, resultsToDisplay, skipButton, allowMultiSelect);
478550
const res: MediaTypeModel[] = await new Promise((resolve, reject) => {
479551
modal.setSubmitCallback(res => resolve(res));
480552
modal.setSkipCallback(() => resolve([]));

src/modals/MediaDbSearchResultModal.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ export class MediaDbSearchResultModal extends SelectModal<MediaTypeModel> {
1212

1313
sendCallback: boolean;
1414

15-
constructor(plugin: MediaDbPlugin, elements: MediaTypeModel[], skipButton: boolean) {
16-
super(plugin.app, elements);
15+
constructor(plugin: MediaDbPlugin, elements: MediaTypeModel[], skipButton: boolean, allowMultiSelect: boolean = true) {
16+
super(plugin.app, elements, allowMultiSelect);
1717
this.plugin = plugin;
1818

1919
this.title = 'Search Results';

src/modals/SelectModal.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ export abstract class SelectModal<T> extends Modal {
1616
selectModalElements: SelectModalElement<T>[];
1717

1818

19-
protected constructor(app: App, elements: T[]) {
19+
protected constructor(app: App, elements: T[], allowMultiSelect: boolean = true) {
2020
super(app);
21-
this.allowMultiSelect = true;
21+
this.allowMultiSelect = allowMultiSelect;
2222

2323
this.title = '';
2424
this.description = '';

0 commit comments

Comments
 (0)