obsidian-sample-plugin/main.ts

172 lines
6.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting } from 'obsidian';
// Не забудьте переименовать эти классы и интерфейсы!
interface MyPluginSettings {
mySetting: string;
}
const DEFAULT_SETTINGS: MyPluginSettings = {
mySetting: 'default'
}
export default class MyPlugin extends Plugin {
settings: MyPluginSettings;
async onload() {
await this.loadSettings();
new Notice('This is a notice!');
// Создает иконку в левой боковой панели.
const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => {
// Вызывается при клике на иконку.
this.findTagsInNote();
new Notice('This is a notice!');
});
// Добавляет дополнительные стили к иконке.
ribbonIconEl.addClass('my-plugin-ribbon-class');
// Добавляет элемент в статус-бар внизу приложения. Не работает в мобильных приложениях.
// const statusBarItemEl = this.addStatusBarItem();
// statusBarItemEl.setText('Status Bar Text');
// Добавляет простую команду, которую можно вызвать откуда угодно.
this.addCommand({
id: 'open-sample-modal-simple',
name: 'Open sample modal (simple)',
callback: () => {
new SampleModal(this.app).open();
}
});
// Добавляет команду для редактора, которая может выполнять операции с текущим экземпляром редактора.
this.addCommand({
id: 'sample-editor-command',
name: 'Sample editor command',
editorCallback: (editor: Editor, view: MarkdownView) => {
console.log(editor.getSelection());
editor.replaceSelection('Sample Editor Command');
}
});
// Добавляет сложную команду, которая проверяет, позволяет ли текущее состояние приложения выполнить команду.
this.addCommand({
id: 'open-sample-modal-complex',
name: 'Open sample modal (complex)',
checkCallback: (checking: boolean) => {
// Условия для проверки.
const markdownView = this.app.workspace.getActiveViewOfType(MarkdownView);
if (markdownView) {
// Если checking равно true, мы просто проверяем, может ли команда быть выполнена.
// Если checking равно false, мы выполняем операцию.
if (!checking) {
new SampleModal(this.app).open();
}
// Эта команда появится в палитре команд только если функция проверки возвращает true.
return true;
}
}
});
// Добавляет вкладку настроек, чтобы пользователь мог настроить различные аспекты плагина.
this.addSettingTab(new SampleSettingTab(this.app, this));
// Если плагин подключает глобальные события DOM (на частях приложения, которые не принадлежат этому плагину),
// использование этой функции автоматически удалит обработчик события при отключении плагина.
this.registerDomEvent(document, 'click', (evt: MouseEvent) => {
console.log('click', evt);
});
// При регистрации интервалов эта функция автоматически очистит интервал при отключении плагина.
this.registerInterval(window.setInterval(() => console.log('setInterval'), 5 * 60 * 1000));
}
onunload() {
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
}
/**
* Асинхронно находит и отображает теги в текущей активной Markdown заметке.
*
* Этот метод получает активное представление типа `MarkdownView` из рабочей области Obsidian.
* Если активное представление не найдено, метод завершает выполнение.
*
* Затем он получает содержимое активного представления и выводит его в консоль.
*
* Метод продолжает получать файл, связанный с активным представлением. Если файл не найден, метод завершает выполнение.
*
* Используя файл, он извлекает кэш файла из метаданных Obsidian. Он извлекает теги как из frontmatter, так и из тела заметки.
* Теги очищаются путем удаления ведущего символа '#'.
*
* Наконец, метод выводит найденные теги в консоль и отображает уведомление с найденными тегами.
*
* @returns {Promise<void>} Обещание, которое разрешается, когда теги найдены и отображены.
*/
async findTagsInNote() {
const activeView = this.app.workspace.getActiveViewOfType(MarkdownView);
if (!activeView) return;
const content = activeView.getViewData();
console.log('CONTENT', content);
const file = activeView.file;
if (!file) return;
const fileCache = this.app.metadataCache.getFileCache(file);
const tags = [
...(fileCache?.frontmatter?.tags.map(tag => tag.replace('#', '')) || []),
...(fileCache?.tags?.map(tag => tag.tag.replace('#', '')) || [])
];
console.log('TAGS', tags);
new Notice(`Found tags: ${tags.join(', ')}`);
}
}
class SampleModal extends Modal {
constructor(app: App) {
super(app);
}
onOpen() {
const {contentEl} = this;
contentEl.setText('Woah!');
}
onClose() {
const {contentEl} = this;
contentEl.empty();
}
}
class SampleSettingTab extends PluginSettingTab {
plugin: MyPlugin;
constructor(app: App, plugin: MyPlugin) {
super(app, plugin);
this.plugin = plugin;
}
display(): void {
const {containerEl} = this;
containerEl.empty();
new Setting(containerEl)
.setName('Setting #1')
.setDesc('It\'s a secret')
.addText(text => text
.setPlaceholder('Enter your secret')
.setValue(this.plugin.settings.mySetting)
.onChange(async (value) => {
this.plugin.settings.mySetting = value;
await this.plugin.saveSettings();
}));
}
}