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

Необходимые плагины
-
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 должен выглядеть так:

Таблица со списком книг
Создаём таблицы со списком книг, используя синтаксис плагина Dataview:
```dataview
TABLE WITHOUT ID
("") 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 должен выглядеть так:

Итоговое содержание заметки со списком книг
---
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
("") 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 - это отличный вариант!
Автор: FatNotBad