diff --git a/Knowledges/Библиотека/Книги/Git для профессионалов.md b/Knowledges/Библиотека/Книги/Git для профессионалов.md index ef496bb..23b9f75 100644 --- a/Knowledges/Библиотека/Книги/Git для профессионалов.md +++ b/Knowledges/Библиотека/Книги/Git для профессионалов.md @@ -1,6 +1,6 @@ --- Тип: Книга -Статус: Запланировано +Статус: Прочитано Название: Git для профессионалов Автор: - Чакон Скотт diff --git a/Knowledges/Библиотека/Книги/covers/mobi-dik.jpg b/Knowledges/Библиотека/Книги/covers/mobi-dik.jpg new file mode 100644 index 0000000..9c75263 Binary files /dev/null and b/Knowledges/Библиотека/Книги/covers/mobi-dik.jpg differ diff --git a/Knowledges/Библиотека/Книги/Война миров.md b/Knowledges/Библиотека/Книги/Война миров.md index f75dd4f..9937473 100644 --- a/Knowledges/Библиотека/Книги/Война миров.md +++ b/Knowledges/Библиотека/Книги/Война миров.md @@ -1,6 +1,6 @@ --- Тип: Книга -Статус: Запланировано +Статус: Прочитано Название: Война миров Автор: - Герберт Уэллс diff --git a/Knowledges/Библиотека/Книги/Моби Дик.md b/Knowledges/Библиотека/Книги/Моби Дик.md new file mode 100644 index 0000000..d9c8249 --- /dev/null +++ b/Knowledges/Библиотека/Книги/Моби Дик.md @@ -0,0 +1,41 @@ +--- +Тип: Книга +Статус: В процессе +Название: Моби Дик +Автор: + - Герман Мелвилл +Количество страниц: 635 +Прогресс: 73 +Формат: Бумажная +Обложка: Библиотека/Книги/covers/mobi-dik.jpg +Начата: 09.03.2026 +Закончена: +Оценка: +Категории: + - Классика + - Художественная литература +Ссылка: +--- + +# Моби Дик + +![[covers/mobi-dik.jpg]] + +## 📖 О книге + +Роман Германа Мелвилла (1851) — одна из вершин американской литературы, изначально отвергнутая современниками и признанная шедевром лишь посмертно. Рассказчик Измаил присоединяется к экипажу китобойца «Пекод» под командованием одержимого капитана Ахава, который жаждет мести гигантскому белому киту, оторвавшему ему ногу. Охота превращается в метафизическое противостояние человека с мировым злом — и самим собой. + +## 🧠 Ключевые темы + +- **Одержимость и саморазрушение** — Ахав жертвует кораблём, экипажем и собственной жизнью ради мести; его одержимость — архетип человека, уничтожаемого своей целью +- **Зло и его природа** — Моби Дик как символ непостижимой враждебной силы вселенной; вопрос: является ли кит воплощением зла или человек сам проецирует на него свои страхи +- **Судьба и свобода воли** — экипаж «Пекода» — срез человечества, влекомого чужой волей навстречу гибели +- **Познание и тайна** — бесчисленные отступления о китах, море, китобойном деле как попытка объять необъятное; мир неисчерпаем и непознаваем +- **Библейская образность** — имена (Измаил, Ахав, Рахиль), мотивы грехопадения, пророчества и искупления пронизывают весь текст + +## 💬 Важные цитаты + +> «Зовите меня Измаил.» + +> «Так сквозь густой туман моих смутных сомнений то здесь, то там проглядывает в моём сознании божественное наитие, воспламеняя мглу небесным лучом.» + diff --git a/Knowledges/Библиотека/Книги/Список книг.md b/Knowledges/Библиотека/Книги/Список книг.md deleted file mode 100644 index 0dceb3e..0000000 --- a/Knowledges/Библиотека/Книги/Список книг.md +++ /dev/null @@ -1,38 +0,0 @@ - -## Читаю сейчас - - -```dataviewjs -dv.table(["Название", "Автор", "Кол-во страниц", "Файл", "Обложка"], - dv.pages('"Библиотека/Книги"') - .where(p => p.Тип == "Книга" && p.Статус == "В процессе") - .map(p => [ - p.Название, - p.Автор, - p["Количество страниц"], - p.file.link, - p.Обложка ? dv.span(`![${p.Название}|100](${p.Обложка})`) : "—", - ]) -) -``` - - -## Запланировано - - -## Прочитано - - -```dataviewjs -dv.table(["Название", "Автор", "Кол-во страниц", "Файл", "Обложка"], - dv.pages('"Библиотека/Книги"') - .where(p => p.Тип == "Книга" && p.Статус == "Прочитано") - .map(p => [ - p.Название, - p.Автор, - p["Количество страниц"], - p.file.link, - p.Обложка ? dv.span(`![${p.Название}|100](${p.Обложка})`) : "—", - ]) -) -``` \ No newline at end of file diff --git a/Knowledges/Статистика/Список книг.md b/Knowledges/Статистика/Список книг.md new file mode 100644 index 0000000..41e6195 --- /dev/null +++ b/Knowledges/Статистика/Список книг.md @@ -0,0 +1,144 @@ + +## 📊 Статистика + +```dataviewjs +const books = dv.pages('"Библиотека/Книги"').where(p => p.Тип == "Книга"); +const read = books.where(p => p.Статус == "Прочитано"); +const inProgress = books.where(p => p.Статус == "В процессе"); +const planned = books.where(p => p.Статус == "Хочу прочитать" || p.Статус == "Запланировано"); +const abandoned = books.where(p => p.Статус == "Заброшена"); + +const totalPages = read.array().reduce((sum, p) => sum + (Number(p["Количество страниц"]) || 0), 0); +const rated = read.where(p => p.Оценка); +const avgRating = rated.length + ? (rated.array().reduce((s, p) => s + Number(p.Оценка), 0) / rated.length).toFixed(1) + : "—"; + +dv.table(["", ""], [ + ["📚 Всего книг", books.length], + ["✅ Прочитано", read.length], + ["📖 Читаю сейчас", inProgress.length], + ["🔖 Хочу прочитать", planned.length], + ["⛔ Заброшено", abandoned.length], + ["📄 Страниц прочитано", totalPages.toLocaleString("ru-RU")], + ["⭐ Средняя оценка", avgRating], +]); +``` + +--- + +```dataviewjs +const books = dv.pages('"Библиотека/Книги"') + .where(p => p.Тип == "Книга" && p.Статус == "В процессе"); + +if (!books.length) { + dv.paragraph("*Сейчас ничего не читаю*"); +} else { + dv.table(["Обложка", "Название", "Автор", "Прогресс", "Страниц"], + books.map(p => { + const total = Number(p["Количество страниц"]) || 0; + const done = Number(p.Прогресс) || 0; + const pct = total ? Math.round(done / total * 100) : 0; + const filled = Math.round(pct / 10); + const bar = "█".repeat(filled) + "░".repeat(10 - filled); + return [ + p.Обложка ? dv.span(`![|75](${p.Обложка})`) : "—", + p.file.link, + p.Автор ? [].concat(p.Автор).join(", ") : "—", + `\`${bar}\` ${pct}%`, + `${done} / ${total}` + ]; + }) + ); +} + +const details = document.createElement("details"); +details.setAttribute("open", ""); +const summary = document.createElement("summary"); +summary.innerHTML = `📖 Читаю сейчас (${books.length})`; +details.appendChild(summary); +Array.from(this.container.childNodes).forEach(n => details.appendChild(n)); +this.container.appendChild(details); +``` + +--- + +```dataviewjs +const fmt = f => ({ "Электронная": "📱", "Бумажная": "📗", "Аудио": "🎧" }[f] ?? ""); +const books = dv.pages('"Библиотека/Книги"') + .where(p => p.Тип == "Книга" && (p.Статус == "Хочу прочитать" || p.Статус == "Запланировано")) + .sort(p => p.Название, "asc"); + +dv.table(["Обложка", "Название", "Автор", "Страниц", "Формат", "Категория"], + books.map(p => [ + p.Обложка ? dv.span(`![|75](${p.Обложка})`) : "—", + p.file.link, + p.Автор ? [].concat(p.Автор).join(", ") : "—", + p["Количество страниц"] || "—", + fmt(p.Формат), + p.Категории ? [].concat(p.Категории).join(", ") : "—" + ]) +); + +const details = document.createElement("details"); +const summary = document.createElement("summary"); +summary.innerHTML = `🔖 Хочу прочитать (${books.length})`; +details.appendChild(summary); +Array.from(this.container.childNodes).forEach(n => details.appendChild(n)); +this.container.appendChild(details); +``` + +--- + +```dataviewjs +const star = n => n ? `⭐ ${Number(n)}` : "—"; +const fmt = f => ({ "Электронная": "📱", "Бумажная": "📗", "Аудио": "🎧" }[f] ?? f ?? "—"); +const books = dv.pages('"Библиотека/Книги"') + .where(p => p.Тип == "Книга" && p.Статус == "Прочитано") + .sort(p => Number(p.Закончена) || 0, "desc"); + +dv.table(["Обложка", "Название", "Автор", "Год", "Оценка", "Формат", "Категория"], + books.map(p => [ + p.Обложка ? dv.span(`![|75](${p.Обложка})`) : "—", + p.file.link, + p.Автор ? [].concat(p.Автор).join(", ") : "—", + p.Закончена || "—", + star(p.Оценка), + fmt(p.Формат), + p.Категории ? [].concat(p.Категории).join(", ") : "—" + ]) +); + +const details = document.createElement("details"); +const summary = document.createElement("summary"); +summary.innerHTML = `✅ Прочитано (${books.length})`; +details.appendChild(summary); +Array.from(this.container.childNodes).forEach(n => details.appendChild(n)); +this.container.appendChild(details); +``` + +--- + +```dataviewjs +const books = dv.pages('"Библиотека/Книги"') + .where(p => p.Тип == "Книга" && p.Статус == "Заброшена"); + +if (!books.length) { + dv.paragraph("*Нет заброшенных книг*"); +} else { + dv.table(["Название", "Автор", "Прочитано страниц"], + books.map(p => [ + p.file.link, + p.Автор ? [].concat(p.Автор).join(", ") : "—", + p.Прогресс || "—" + ]) + ); +} + +const details = document.createElement("details"); +const summary = document.createElement("summary"); +summary.innerHTML = `⛔ Заброшено (${books.length})`; +details.appendChild(summary); +Array.from(this.container.childNodes).forEach(n => details.appendChild(n)); +this.container.appendChild(details); +```