Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных

Если вам интересна тема персональных систем управления знаниями и задачами — переходите в мой тг-канал. Там я разбираю инструменты, публикую кейсы и делюсь тем, что работает на практике, а не только выглядит красиво на скриншотах.

Список «хочу прочитать» давно перевалил за сотню. Когда наконец добираешься до книги — появляется другая проблема: хочется зафиксировать цитату или мысль, но непонятно куда. Заметки в телефоне, вкладка в браузере, стикер на полях — через месяц это всё теряется. Обычный подход «одна заметка на книгу» не работал: либо файл разрастался до неприличия, либо я просто забывал его открывать. Тогда я перестал искать «правильный» плагин и спроектировал систему с нуля в Obsidian. В этой статье я покажу архитектуру, реальные шаблоны и конфигурацию баз данных — так, чтобы это можно было повторить.


Архитектура: три уровня, не один файл

Главная ошибка большинства читательских систем — складывать всё в одну заметку. Пересказ сюжета, цитаты, собственные мысли, ссылки на другие книги — всё это разная информация с разным сроком годности и разной частотой обращения.

В моей системе три типа объектов:

  • Книга — карточка с метаданными (автор, статус, жанр, темы, обложка). Без текста.

  • Цитата — отдельная заметка с дословным фрагментом, привязанная к книге.

  • Мысль — отдельная заметка с моим личным соображением, возникшим при чтении.

Цитата и мысль — не разделы внутри книги, а самостоятельные заметки. Это принципиально: они живут в своих папках, попадают в свои базы данных и могут ссылаться на другие заметки в vault независимо от источника.

Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных - 1

Заметка о книге: YAML + живая карточка

Каждая книга создаётся через шаблон Templater. Шаблон задаёт вопросы интерактивно: автор, статус, жанр, темы, страна происхождения, URL обложки.

<%*
const title = tp.file.title;
const author = await tp.system.prompt("Автор") || "";
const statusOptions = ["Буду читать", "Читаю", "Прочитано"];
const status = await tp.system.suggester(statusOptions, statusOptions) || "";
const cover = await tp.system.prompt("URL обложки (Enter если нет)", "") || "";
const genreOptions = ["Fiction", "Non-Fiction"];
const genre = await tp.system.suggester(genreOptions, genreOptions) || "";
const direction = await tp.system.prompt("Темы (Enter если нет)", "") || "";
const countryOptions = ["Иностранное", "Отечественное"];
const country = await tp.system.suggester(countryOptions, countryOptions) || "";
-%>

На выходе — frontmatter со всеми полями и callout-карточка с inline-полями Meta Bind:

---
author: Клаус Шваб
tags:
  - литература
status: Прочитано
cover: https://...
Жанр: Non-Fiction
Темы: технологии, общество
Страна: Иностранное
---

> [!book]+ 📖 Четвёртая промышленная революция
> ![cover](https://...)
>
> | | |
> |---|---|
> | **Автор** | `INPUT[text:author]` |
> | **Жанр** | `INPUT[inlineSelect(option(Fiction),option(Non-Fiction)):Жанр]` |
> | **Темы** | `INPUT[inlineList:Темы]` |
> | **Страна** | `INPUT[inlineSelect(option(Иностранное),option(Отечественное)):Страна]` |
> | **Статус** | `INPUT[inlineSelect(option(Буду читать),option(Читаю),option(Прочитано)):status]` |

INPUT[] — это синтаксис Meta Bind. Поля в таблице кликабельны прямо в режиме чтения: можно поменять статус с «Читаю» на «Прочитано» не открывая frontmatter. Это мелочь, но она убирает «трение».

Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных - 2

Templater: цитаты создаются в два клика

Вот где начинается автоматизация. Когда я хочу сохранить цитату, я создаю новую заметку в папке Цитаты/ — Templater подхватывает шаблон автоматически.

Шаблон делает четыре вещи:

  1. Показывает список всех книг из папки литература/ (кроме самих баз данных — файлы, начинающиеся с 00, отфильтрованы).

  2. Вытаскивает автора из frontmatter выбранной книги — вводить вручную не нужно.

  3. Просит ввести название цитаты (первые слова или тема) и переименовывает файл.

  4. Открывает книгу и добавляет обратную ссылку в раздел # Цитаты.

<%*
const litFolder = 'ЖИЗНЬ/литература/';
const books = app.vault.getMarkdownFiles()
  .filter(f => f.path.startsWith(litFolder)
    && !f.path.includes('/Цитаты')
    && !f.name.startsWith('00'))
  .map(f => f.basename)
  .sort((a, b) => a.localeCompare(b, 'ru'));

const book = await tp.system.suggester(books, books, false, 'Из какой книги?');
if (!book) return;

const bookFile = app.vault.getFileByPath(litFolder + book + '.md');
const bookMeta = app.metadataCache.getFileCache(bookFile);
const author = bookMeta?.frontmatter?.author || '';

const title = await tp.system.prompt('Название / первые слова цитаты');
if (!title) return;

await tp.file.rename(title);

const bookContent = await app.vault.read(bookFile);
let newBookContent;
if (bookContent.includes('# Цитаты')) {
  newBookContent = bookContent.replace('# Цитатыn', '# Цитатыn- [[' + title + ']]n');
} else {
  newBookContent = bookContent.trimEnd() + 'nn# Цитатыn- [[' + title + ']]n';
}
await app.vault.modify(bookFile, newBookContent);
-%>

Шаблон для мыслей (Мысль.md) идентичен — только фильтрует ещё и папку /Мысли и пишет в раздел # Мысли книги.

Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных - 3

Двусторонние связи без ручной работы

После выполнения шаблона происходит следующее. В заметке цитаты:

---
tags:
  - цитата
book: "[[Четвёртая промышленная революция]]"
author: Клаус Шваб
---

Бенефициарами инноваций четвёртой промышленной революции в основном
являются те, кто обеспечивает интеллектуальный и физический капитал...

В заметке книги автоматически появляется:

# Цитаты
- [[Бенефициарами инноваций четвёртой промышленной революции]]

Связь двусторонняя: из книги видно все цитаты, из цитаты — источник через поле book. Никакого ручного труда — шаблон делает всё сам в момент создания.

[скриншот: заметка о книге с заполненными разделами Цитаты и Мысли — списки вики-ссылок]


Obsidian Bases: три базы, пять видов

Bases — встроенный плагин базы данных в Obsidian. Файлы .base лежат прямо в папке литература/ рядом с заметками.

00 Литература.base

Пять видов одной базы:

Карточки — визуальная галерея книг с обложками, автором и статусом. Сортировка по имени.

Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных - 4

Представление — полная таблица, сгруппированная по жанрам. Колонки: название, жанр, статус, автор, страна, темы. Сортировка многоуровневая: статус → жанр → автор.

📚 Буду читать — таблица только с нечитанными книгами, по автору.

📖 Читаю — только текущее чтение.

✅ Прочитано — архив прочитанного.

Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных - 5

00 Цитаты.base и 00 Мысли.base

Оба устроены одинаково: таблица с колонками «название», «книга», «автор». Сортировка по автору, потом по книге. Это позволяет быстро найти все цитаты конкретного автора — даже если они из разных его книг.

Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных - 6

Что в итоге

Сейчас в системе 98 книг, больше 20 цитат и несколько десятков мыслей. Самое ценное — не количество, а то, что каждая сохранённая цитата немедленно связана с источником и попадает в базу. Я не трачу время на организацию после факта — шаблон делает всё в момент захвата.

Три вещи, которые сделали систему рабочей:

  • Разделение на типы заметок — книга, цитата и мысль не смешиваются в одном файле.

  • Templater с JS — автоматизация на уровне создания, а не сортировки.

  • Bases с несколькими видами — одни данные, разные способы смотреть.

Если узнали себя в этой проблеме — напишите в комментариях, как сейчас фиксируете цитаты и мысли по прочитанному. Расскажу, что можно докрутить под ваш контекст. Больше про системы в Obsidian — в моём тг-канале.

Автор: psheno322

Источник

Оставить комментарий