fr1: books.ruzzy.dev — читалка с ИИ (PDF/EPUB → главы, рекапы, перевод/объяснение выделенного, вопросы с RAG; Claude Code по подписке без инструментов; вход через Telegram)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
gilfanovr
2026-10-13 10:39:51 +03:00
co-authored by Claude Opus 5.5
parent 8fd84239be
commit 9aab5b3f40
19 changed files with 1455 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
{% extends "base.html" %}
{% block title %}{{ b.title }} — Книги{% endblock %}
{% block body %}
<h1>{{ b.title or b.orig }}</h1>
<p class="muted">{% if b.author %}{{ b.author }} · {% endif %}{{ b.fmt|upper }}{% if b.pages %} · {{ b.pages }} с.{% endif %}
· <a href="/book/{{ b.id }}/file" target="_blank">оригинал</a>
· <a href="/book/{{ b.id }}/recaps.md">рекапы (.md)</a>
· <a href="/search?book={{ b.id }}">поиск</a></p>
{% if b.note %}<p class="warn">{{ b.note }}</p>{% endif %}
{% if b.status in ('parsing','indexing') %}<p class="warn" id="busy" data-book="{{ b.id }}">Книга обрабатывается… страница обновится сама.</p>{% endif %}
<section class="card">
<div class="row between">
<h2>Главы</h2>
<span><button id="recap-selected" data-book="{{ b.id }}">Рекап выбранных</button>
<label class="small"><input type="checkbox" id="only-missing" checked> только без рекапа</label></span>
</div>
<ol class="toc">
{% for ch in chapters %}
<li class="lvl{{ ch.level }}" data-idx="{{ ch.idx }}">
<input type="checkbox" class="pick" value="{{ ch.idx }}" {% if ch.has_recap %}data-has="1"{% endif %}>
<a href="/book/{{ b.id }}/ch/{{ ch.idx }}">{{ ch.title }}</a>
<span class="small muted">с. {{ ch.p1 }}{% if ch.p2 != ch.p1 %}–{{ ch.p2 }}{% endif %}</span>
{% if ch.read %}<span title="прочитано">✓</span>{% endif %}
{% if ch.has_recap %}<span class="small" title="есть рекап">📝</span>{% endif %}
<span class="small state"></span>
</li>
{% endfor %}
</ol>
</section>
<section class="card">
<h2>Спросить по книге</h2>
<form class="ask" data-book="{{ b.id }}">
<textarea name="q" rows="2" placeholder="Например: чем отличается X от Y по мнению автора?"></textarea>
<div class="row"><button>Спросить</button>
<label class="small"><input type="checkbox" name="web"> проверить по интернету</label></div>
</form>
<div class="answer md"></div>
{% if qa %}<details><summary class="muted">Прошлые вопросы ({{ qa|length }})</summary>
{% for x in qa %}<div class="qa"><b>{{ x.q }}</b><div class="md">{{ x.a }}</div></div>{% endfor %}</details>{% endif %}
</section>
<details class="card"><summary>Название, автор, удаление</summary>
<form action="/book/{{ b.id }}/title" method="post" class="row">
<input name="title" value="{{ b.title or '' }}" placeholder="Название">
<input name="author" value="{{ b.author or '' }}" placeholder="Автор"><button>Сохранить</button></form>
<form action="/book/{{ b.id }}/delete" method="post" class="row">
<input name="confirm" placeholder="впиши «да», чтобы удалить книгу со всеми рекапами"><button class="danger">Удалить</button></form>
</details>
{% endblock %}