Комментарии 16
Спасибо за полезный материал, тоже как будто бы не встречал статей про написание плагинов под Obsidian на хабре, хотя тема как никогда актуальная.
Жду вторую часть!
В Вашем примере возможна утечка хендлеров событий при включении/выключении плагина. Лучше использовать семейство функций register*Event.
/**
* Registers an event to be detached when unloading
* @public
*/
registerEvent(eventRef: EventRef): void;
А речь про подписку на клик по ссылке <a>
?
В первую очередь про this.plugin.app.vault.on(...)
. Для подписок на click есть также registerDomEvent
, но не уверен, что они там точно нужны, т.к. по идее подписки должны быть аннулированы, как только разрушен DOM-элемент.
Спасибо за примечание! Нашел эту информацию в GitHub-репозитории obsidian-api. Упомянул вас в статье :)
давно собираюсь поизучать эту тему, теперь это будет сделать проще, спасибо)
Кстати, плагины, которые не опубликованы в community plugins, удобно качать через отдельный community plugin BART - он следит за гитхаб репозиториями и автоматически оповещает о новых версиях.
>> Плагин сразу подхватится Obsidian, и его можно будет включить в настройках как обычный Community plugin.
если плагин создал, к obsidian подключил, а потом что-то в js-файле поправил, то как "обновить" плагин в obsidian? или плагины там не кэшируются и достаточно рефреша заметки?
Передернуть "выключил-включил" плагин в настройках. Если хочется большего удобства, есть плагин Hot reload. Правда, он почему-то доступен только через GitHub
А вот рефреш заметки плагин не обновит
Очень полезно, спасибо! Давно подмывало попробовать в плагины, тормозило только нежелание тратить кучу времени на документацию.
А есть ли какие-то ограничения по использованию сторонних библиотек?
Да, ограничения есть.
Все библиотеки и внешние зависимости должны быть в кончном счете затащены в main.js так, чтобы не осталось внешних импортов
Использование NodeJS и Electron API позволено через
require('fs')
,require('electron')
, но плагин будет работать только на десктопеВ сухом остатке получается, что
main.js
может импортить толькоrequire('obsidian')
, если хочется mobile/desktop. Если хочется desktop-only, тоrequire('obsidian')
,require('fs')
,require('electron')
В официальном GitHub-репо к API это описано так:
main.js
This is the main entry point of your plugin.
Import any Obsidian API using require('obsidian')
Import NodeJS or Electron API using require('fs') or require('electron')
Must export a default class which extends Plugin
Must bundle all external dependencies into this file, using Rollup, Webpack, or another javascript bundler.
А в Developers доках есть предостережение про Electron и NodeJS:
The Node.js API, and the Electron API aren't available on mobile devices. Any calls to these libraries made by your plugin or it's dependencies can cause your plugin to crash.
Плюсов не надо, просто любопытно: "Smoke on the Water" Deep Purple?
А есть решение, чтобы веб-клиппер обсидиана нормально обрабатывал блоки кода, в частности на python к примеру? По умолчанию он вставляет их сплошным текстом вырезая <br> и отступы. Ну или хотя бы плагин для авто распознования и форматирования этой стены текста.. хотя маловероятно наверное.
Пишем плагины для Obsidian. Часть 1