Поделюсь своим опытом создания цифровой библиотеки книг в 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
("![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 должен выглядеть так:
Итоговое содержание заметки со списком книг
---
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 - это отличный вариант!
Комментарии (6)
kanasero
27.12.2024 11:11А в чем смысл, зачем это в Obsidian пытаться запихивать? Чем специализированный софт не устроил типа Calibre?
BlackSCORPION
27.12.2024 11:11Наверное в том что это НЕ для хранения самих книг А для заметок о прочитанных книгах
kanasero
27.12.2024 11:11Если заметки о книгах планируется интегрировать в общую базу заметок Obsidian с взаимосвязями, перекрестными ссылками и т. д. для последующего анализа, работы с ними, тогда возможно и есть смысл.
Но по крайней мере из того, что написано в статье, привожу дословно: "Если вы ищете способ упорядочить свою библиотеку книг, Obsidian - это отличный вариант!". Т. е. либо речь все же об обычной каталогизации, либо автор не совсем корректно донес свою мысль.
В Calibre, кстати, тоже можно реализовать простейшие заметки к книгам в поле "Комментарии" (но естественно без дополнительного функционала в виде перекрестных ссылок на заметки и пр.). А сами прочитанные книги из общей базы можно выделять либо в "виртуальные библиотеки", либо в "сохраненные поиски".
ponikrf
NocoDB и без всякой дрочки запросов и тп.