Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

16.09.2023

Автоматичне редагування документів в Obsidian

Повернувся до проєкту “автосадівника” дерева задач для Obsidian. На зараз ціль проста: щоб до задач автоматично додавався час створення та завершення, а також щоб завершені задачі переносились до “архівного” списку в кінці документа.

Сьогодні маю прогрес: базова версія працює. Проте зрозумів, що пара моїх підходів хибна. А саме:

Перетворення AST це чудовий підхід, але якщо інструмент не передбачає відтворення коду “як в оригіналі”, то покладатися на нього буде ненадійно.

Наприклад: Remark на виводі нормалізує символ списку — скажімо, до зірочки *. Це само по собі не так погано. Але якщо поруч є два списки — один з зірочками, а інший з рисочками - - то парсер бачив їх окремо. А коли другий список буде нормалізований у зірочки, то списки для парсера зливаються в один. Щоб виправити це, Remark додає між списками коментар HTML: <!---->. Звісно, такого я зовсім не хочу.

Раніше я вже придумав тільки частково заміняти текст, тобто перетворювати тільки там, де є реальні зміни, але навіть часткова заміна має ризик зіпсувати документ… частково.

Напевно, все ж найнадійніший підхід це за допомогою AST тільки знаходити місце для зміни, а потім змінювати вхідний документ прямим підставлянням.

Тут наступне розуміння: в Obsidian активний документ варто редагувати тільки функцією editor.replaceRange. Вона безпосередню змінює зміст редактора та чудово співіснує з подальшим користуванням редактором. Мій перший намір був зберігати зміни в файл через vault.modify, тобто “на диск”. Але це відразу почало створювати конфлікти з будь-якими змінами, які я одночасно зробив вручну. Не кажучи вже про те, що подія onModify, яку я використовую для виконання свого коду, відбувалася й після моїх автоматичних змін теж (проте від цього нескладно захиститись.)

Нарешті, щоб зовсім не заважати користувачеві, ще треба перевіряти рядок, в якому знаходиться курсор (editor.getCursor) та нічого в ньому не робити.