Поделюсь своим опытом создания цифровой библиотеки книг в 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 по статусу, жанру, дате создания и названию — dvStatusdvGenredvDatedvName.

Для того, чтобы Dataview таблица со списком книг выводилась в виде карточек с обложками книг, в параметре cssclasses указываем вспомогательные классы cardscards-covercards-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)


  1. ponikrf
    27.12.2024 11:11

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

    NocoDB и без всякой дрочки запросов и тп.


  1. kanasero
    27.12.2024 11:11

    А в чем смысл, зачем это в Obsidian пытаться запихивать? Чем специализированный софт не устроил типа Calibre?


    1. BlackSCORPION
      27.12.2024 11:11

      Наверное в том что это НЕ для хранения самих книг А для заметок о прочитанных книгах


      1. kanasero
        27.12.2024 11:11

        Если заметки о книгах планируется интегрировать в общую базу заметок Obsidian с взаимосвязями, перекрестными ссылками и т. д. для последующего анализа, работы с ними, тогда возможно и есть смысл.

        Но по крайней мере из того, что написано в статье, привожу дословно: "Если вы ищете способ упорядочить свою библиотеку книг, Obsidian - это отличный вариант!". Т. е. либо речь все же об обычной каталогизации, либо автор не совсем корректно донес свою мысль.

        В Calibre, кстати, тоже можно реализовать простейшие заметки к книгам в поле "Комментарии" (но естественно без дополнительного функционала в виде перекрестных ссылок на заметки и пр.). А сами прочитанные книги из общей базы можно выделять либо в "виртуальные библиотеки", либо в "сохраненные поиски".


  1. CrocoCat
    27.12.2024 11:11

    А чем zotero не устраивает?


  1. sap058
    27.12.2024 11:11

    Удобнее Нюши все равно ничего нет