The image fixes left two problems of navigation. Image handling was
spread across `extract.rs` (300 lines of normalization) and
`epub/images.rs` (download, re-encode, markup rewriting, plus generic
HTML helpers that comments, world and x4 were all reaching into a
module named "images" to borrow). And `epub/build.rs` had grown to
1,148 lines of code covering cover rendering, ten askama templates,
every chapter renderer and the zip assembly.
New homes:
- `src/html.rs` — markup helpers that do not care what the markup is
about: tag scanning, attribute parsing, entity decoding, escaping,
XHTML fixups, reading a fragment as text. Previously scattered between
`epub/images.rs` and `extract.rs`.
- `src/images/` — one module per stage of an article's images, in the
order they run: `normalize` (make `<img>` usable, pre-readability),
`refs` (what an article references), `fetch` + `encode` (download and
re-encode per edition), `embed` (point the markup at what shipped).
- `src/epub/{cover,chapters,build}.rs` — the cover, the chapter
renderers, and the ordering plus assembly that puts them together.
`epub/fixtures.rs` takes the shared test issue, which was a public
module wedged inside `build.rs`.
- `src/curate/profile/themes.rs` — a 260-line keyword table that sat in
the middle of the profile logic.
`curate::html_to_text` is renamed `prompt_text`: it is a different
function from `html::html_to_text` (collapses whitespace, no DOM, sized
for prompt budgets) and sharing a name with it was a trap.
Largest module drops from 1,148 code lines to 828, and no file mixes
two subjects. Behaviour is unchanged: 231 lib tests plus 25 integration
tests green, and the real-world audit over issues 1–3 still reports 214
images referenced, 214 shown, 0 placeholders, 0 orphaned assets.
`image_audit` gains `--epub-out DIR`, which writes a readable EPUB of
the audited articles so images can be checked on a device.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
37 lines
1.1 KiB
Rust
37 lines
1.1 KiB
Rust
//! `daily-epub` — a personalized daily newspaper as an EPUB (spec §1, §2).
|
|
//!
|
|
//! The crate ships both a library and a thin `daily-epub` binary. Everything the
|
|
//! pipeline does lives here so that integration tests can drive the stages
|
|
//! directly (see `tests/e2e_pipeline.rs`) instead of shelling out to the binary.
|
|
//!
|
|
//! Pipeline order (spec §2), all of it wired in [`crate::pipeline`]:
|
|
//!
|
|
//! ```text
|
|
//! Miniflux ingest → dedupe → extraction → persist → social enrichment
|
|
//! → pre-filter → LLM scoring → selection → comments → editorial
|
|
//! → world briefing → EPUB build (standard + X4) → XTC → publish → report
|
|
//! ```
|
|
|
|
pub mod auth;
|
|
pub mod comments;
|
|
pub mod config;
|
|
pub mod curate;
|
|
pub mod db;
|
|
pub mod dedupe;
|
|
pub mod epub;
|
|
pub mod extract;
|
|
pub mod html;
|
|
pub mod http;
|
|
pub mod images;
|
|
pub mod miniflux;
|
|
pub mod pipeline;
|
|
pub mod publish;
|
|
pub mod report;
|
|
pub mod server;
|
|
pub mod social;
|
|
pub mod types;
|
|
pub mod world;
|
|
|
|
/// `CARGO_PKG_VERSION`, printed in the colophon and the OPDS generator tag.
|
|
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|