"""Выгрузка каталога: Markdown, HTML с поиском, JSON, CSV.""" from __future__ import annotations import csv import html import json from datetime import datetime from pathlib import Path from . import config, db def fetch_all(con) -> list[dict]: rows = con.execute( "SELECT d.id, d.title, d.author, d.year, d.pages, d.ext, d.size, d.lang," " d.kind, d.folder, d.rel_path, d.path, d.description, d.theses," " d.keywords, d.scanned, d.error, u.keywords AS user_keywords" " FROM docs d LEFT JOIN user_keywords u ON u.path = d.path" " ORDER BY d.folder, d.title").fetchall() out = [] for r in rows: d = dict(r) d["theses"] = json.loads(d["theses"] or "[]") d["keywords"] = json.loads(d["keywords"] or "[]") d["user_keywords"] = json.loads(d["user_keywords"] or "[]") out.append(d) return out def _size(n: int) -> str: for unit in ("Б", "КБ", "МБ", "ГБ"): if n < 1024: return "%.0f %s" % (n, unit) n /= 1024.0 return "%.1f ТБ" % n # -------------------------------------------------------------------------- # Markdown # -------------------------------------------------------------------------- def to_markdown(docs: list[dict], root: str, path: Path) -> Path: by_folder: dict[str, list[dict]] = {} for d in docs: by_folder.setdefault(d["folder"], []).append(d) lines = [ "# Каталог библиотеки", "", "Источник: `%s` " % root, "Документов: **%d**, разделов: **%d** " % (len(docs), len(by_folder)), "Составлен: %s" % datetime.now().strftime("%d.%m.%Y %H:%M"), "", "## Разделы", "", ] for folder in sorted(by_folder): anchor = folder.lower().replace(" ", "-").replace("\\", "-").replace(".", "") lines.append("- [%s](#%s) — %d" % (folder, anchor, len(by_folder[folder]))) lines.append("") for folder in sorted(by_folder): lines += ["", "## %s" % folder, ""] for d in sorted(by_folder[folder], key=lambda x: (x["title"] or "").lower()): head = "### %s" % (d["title"] or d["rel_path"]) lines.append(head) facts = [d["ext"].lstrip("."), d["kind"] or ""] if d["author"]: facts.append(d["author"]) if d["year"]: facts.append(str(d["year"])) if d["pages"]: facts.append("%d с." % d["pages"]) facts.append(_size(d["size"])) if d["scanned"]: facts.append("скан") lines.append("*%s*" % " · ".join(f for f in facts if f)) lines.append("") lines.append(d["description"] or "") if d["theses"]: lines.append("") lines.append("**Тезисы:**") for t in d["theses"]: lines.append("- %s" % t) if d["keywords"]: lines.append("") lines.append("**Ключевые слова:** %s" % ", ".join(d["keywords"])) if d["user_keywords"]: lines.append("") lines.append("**Свои ключевые слова:** %s" % ", ".join(d["user_keywords"])) lines.append("") lines.append("`%s`" % d["rel_path"]) lines.append("") path.parent.mkdir(parents=True, exist_ok=True) path.write_text("\n".join(lines), encoding="utf-8") return path # -------------------------------------------------------------------------- # HTML с поиском # -------------------------------------------------------------------------- HTML_TEMPLATE = """