Skip to content

Instantly share code, notes, and snippets.

@danila-schelkov
Last active April 25, 2025 11:57
Show Gist options
  • Save danila-schelkov/9c0ce65196267ce9b431cef6b79c6dbf to your computer and use it in GitHub Desktop.
Save danila-schelkov/9c0ce65196267ce9b431cef6b79c6dbf to your computer and use it in GitHub Desktop.
Отображение книг по категориям с помощью Obsidian DataView plugin

Я отрисовываю книги и заголовки к ним с помощью плагина DataView для Obsidian.

Я намеренно отказался от использования Markdown-заголовков, чтобы полностью автоматизировать отображение книг по категориям.

Однако это влечет за собой некоторые ограничения, например, нельзя сворачивать категории.

TODO

  • Добавить дополнительно сортировку по какому-то category_ordering
// Load script extensions
eval(
    (await app.vault.read(app.vault.getAbstractFileByPath("dataviewjs/extensions.md")))
    .replace(/^```js/g, "").replace(/```$/g, "")
);

await window.extensions.loadExtension("books");

const remCategory = "Остальное";

const books = window.books.getAll().sort(book => book.file.cday, "desc");

let booksByCategories = {};
booksByCategories[remCategory] = [];

for (const book of books.values) {
	if (book.Категории) {
		for (const category of book.Категории) {
			if (!(category in booksByCategories)) {
				booksByCategories[category] = [];
			}
		
			booksByCategories[category].push(book);
		}
	} else {
		booksByCategories[remCategory].push(book);
	}
}

// https://stackoverflow.com/a/31102605
const booksByCategoriesOrdered = Object.keys(booksByCategories).sort().reduce(
	(obj, key) => {
		obj[key] = booksByCategories[key]; 
		return obj;
	},
	{}
);

for (const [category, categoryBooks] of Object.entries(booksByCategoriesOrdered)) {
	if (categoryBooks.length == 0) continue;

	dv.header(2, `${category} (${categoryBooks.length})`);
	dv.el("div", window.books.renderBooks(categoryBooks), {cls: ["books"]});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment