Как организовать библиотеку книг в Obsidian

Поделюсь своим опытом создания цифровой библиотеки книг в Obsidian, используя плагины Dataview и Meta Bind. Цель — создать простой каталог книг с фильтрацией по различным параметрам, таким как жанры, авторы и статус прочтения.

22c2f09ca8b4af3d8789f1854c0e893c.gif

Необходимые плагины

  • Dataview — плагин, с помощью которого можно создавать динамические списки, таблицы и графики на основе ваших заметок, использую SQL-подобные запросы.

  • Meta Bind — плагин, позволяющий добавлять в заметки интерактивные элементы (например, кнопки и поля для ввода данных).

Кроме того, для преобразования табличного вида списка книг в симпатичные карточки с обложками, понадобится установить тему Minimal Theme или подключить соответствующий css-сниппет.

Файловая структура

Нам понадобится всего два типа заметок:

  • Отдельная заметка для каждой книги в нашей библиотеке;

  • Заметка с общим списком книг и фильтрами.

Заметка с информацией о книге

Для каждой книги придётся создать отдельную заметку, в шапке которой необходимо указать метаданные (YAML), по которым можно будет фильтровать и сортировать нашу библиотеку:

---
aliases: # Альтернативное название книги (например, на другом языке)
  - Сто лет одиночества
created: 2023-12-31 # Дата создания заметки
author: "Габриэль Гарсиа Маркес" # Автор книги
genre: fiction # Жанр книги
published: 1967 # Год публикации книги
image: https://m.media-amazon.com/images/I/71wuXP0vTrL._SY522_.jpg # Картинка с обложкой
status: unread # Статус прочтения книги
---
## Записи

Какие-то записи о прочитанной книге.

Заметка со списком книг

Метаданные

В YAML-блоке указываем параметры, которые будем использовать при фильтрации таблицы книжных заметок с помощью плагина Mеta Bind по статусу, жанру, дате создания и названию — dvStatus,  dvGenre,  dvDate,  dvName.

Для того, чтобы Dataview таблица со списком книг выводилась в виде карточек с обложками книг, в параметре cssclasses указываем вспомогательные классы cards,  cards-cover,  cards-2–3 и cards-cols-4.

---
cssclasses:
  - cards
  - cards-cover
  - cards-2-3
  - cards-cols-4
dvStatus: unread
dvGenre: ""
dvDate: ""
dvName: ""
---

Динамические фильтры

Создаём блок с полями для фильтрации таблицы со списком книг, используя синтаксис плагина Meta Bind:

`INPUT[inlineSelect(defaultValue(unread), option(unread, Unread), option(read, Read), option('', *)):dvStatus]` `INPUT[inlineSelect(defaultValue(''), option(2023, 2023), option(2024, 2024), option('', *)):dvDate]` `INPUT[inlineSelect(defaultValue(''), option(fantasy, Fantasy), option(science fiction, Science Fiction), option(fiction, Fiction), option(non-fiction, Non-fiction), option('', *)):dvGenre]` `INPUT[text(placeholder(Book Name)):dvName]`

Результат в Reading Mode должен выглядеть так:

e1ecd77462dff534f5c3d92d3deab014.png

Таблица со списком книг

Создаём таблицы со списком книг, используя синтаксис плагина Dataview:

```dataview
TABLE WITHOUT ID
  ("![coverimg|100](" + image + ")") AS "Cover",
  choice(!aliases, link(file.link, file.name), link(file.link, aliases)) AS "Title",
  published,
  genre,
  "by " + author AS "Author"
WHERE contains(file.folder, "Books") AND contains(lower(file.aliases), lower(this.dvName)) AND contains(string(created.year), string(this.dvDate)) AND startswith(genre, this.dvGenre) AND contains(status, this.dvStatus) AND file.name != this.file.name
SORT file.name ASC
```

В строке contains(file.folder, "Books") необходимо заменить Books на название папки, в которой хранятся все книжные заметки.

Результат в Reading Mode должен выглядеть так:

1bd3c57e8b9ee5fe75ec60358e0b69ef.png

Итоговое содержание заметки со списком книг

---
cssclasses:
  - cards
  - cards-cover
  - cards-2-3
  - cards-cols-4
dvStatus: unread
dvGenre: ""
dvDate: ""
dvName: ""
---
## Список книг

`INPUT[inlineSelect(defaultValue(unread), option(unread, Unread), option(read, Read), option('', *)):dvStatus]` `INPUT[inlineSelect(defaultValue(''), option(2023, 2023), option(2024, 2024), option('', *)):dvDate]` `INPUT[inlineSelect(defaultValue(''), option(fantasy, Fantasy), option(science fiction, Science Fiction), option(fiction, Fiction), option(non-fiction, Non-fiction), option('', *)):dvGenre]` `INPUT[text(placeholder(Book Name)):dvName]`

```dataview
TABLE WITHOUT ID
  ("![coverimg|100](" + image + ")") AS "Cover",
  choice(!aliases, link(file.link, file.name), link(file.link, aliases)) AS "Title",
  published,
  genre,
  "by " + author AS "Author"
WHERE contains(file.folder, "Books") AND contains(lower(file.aliases), lower(this.dvName)) AND contains(string(created.year), string(this.dvDate)) AND startswith(genre, this.dvGenre) AND contains(status, this.dvStatus) AND file.name != this.file.name
SORT file.name ASC
```

Финальное

Если вы ищете способ упорядочить свою библиотеку книг,  Obsidian — это отличный вариант!

© Habrahabr.ru