diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b94443e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Build intermediates. The deliverables (.epub, .pdf, cover .png) are committed. +build/*/body.html +build/*/media/ + +node_modules +package-lock.json diff --git a/BUILDEBOOK.md b/BUILDEBOOK.md new file mode 100644 index 0000000..ea68c2d --- /dev/null +++ b/BUILDEBOOK.md @@ -0,0 +1,113 @@ +# Build brief — turn these HTML books into sellable ebooks + +Hand this whole file to Claude Code, in the folder that contains the source files. + +--- + +## Project + +Two editions of the same novel, plus a cover generator. + +| File | What it is | +|---|---| +| `faramushkhaneh.html` | Persian edition — «مردی که دخترش را فراموش کرد» | +| `the-man-who-forgot-his-daughter.html` | English edition — *The Man Who Forgot His Daughter* | +| `cover.html` | Cover generator (canvas, exports 1600×2560 PNG, FA/EN toggle) | + +**Author (both editions):** محمدپرهام پلنگ سنگدوینی / Mohammadparham Palangsangdovini + +**Deliverables:** for each language — a validated EPUB 3, a print-ready PDF, and a cover PNG. + +--- + +## Task 1 — Covers + +Open `cover.html` in a headless browser (Playwright is fine). Wait for +`document.fonts.ready` before capturing, or the Persian text will render as boxes. + +Export four PNGs by clicking the language toggle and the full-size download: + +- `cover-fa.png` — 1600×2560 +- `cover-en.png` — 1600×2560 +- plus 600×960 web versions of each for store listings + +Verify each PNG is exactly 1600×2560 and under 50 MB (Amazon's ceiling). + +--- + +## Task 2 — EPUB + +Use pandoc. Two things matter more than anything else here: + +### Persian EPUB — the part that usually breaks + +Persian will not render on Kindle, Kobo, or Apple Books unless the font is +**embedded inside the EPUB**. Do this: + +1. Download a Persian-capable font with an open licence (Vazirmatn or Noto Naskh Arabic). +2. Embed it via `--epub-embed-font`. +3. Set RTL in the CSS: `body { direction: rtl; text-align: justify; }` +4. Set `page-progression-direction="rtl"` in the OPF spine. Pandoc will not do this + itself — unzip the EPUB, patch `content.opf`, rezip with `mimetype` stored + uncompressed and first in the archive, or the file will be rejected. + +### Metadata + +Read the author from `` in each HTML file. Build an +`epub-metadata.yaml` per language with: title, author, language (`fa` / `en`), +publisher, rights, and a UUID identifier. Give each language its **own** UUID — +they are two different books in every store. + +### Structure + +The HTML uses `

` for chapter titles and `

` for the three book dividers. +Set `--toc --toc-depth=2` and make sure the generated navigation lists all 23 +chapters plus the interlude, in order. Check the interlude sits between chapter 17 +and chapter 18 — that placement is deliberate, not a mistake. + +Keep the styled elements intact: `.letter` (Dalaram's letter), `.journal` +(the interlude's diary entries), `.ledger`, `.names`, `.brk` scene breaks, and the +drop caps on `.lead`. If a reader strips the drop cap, that's acceptable; if it +strips the letter and journal styling, fix the CSS — those blocks need to read as +documents, not as body text. + +--- + +## Task 3 — PDF + +Use Chromium print-to-PDF (weasyprint mishandles RTL). Page size 6×9 inches, +0.75in margins, and add `@media print` rules so: + +- each `
` starts on a new page +- the cover, part dividers, and colophon each get their own page +- `.brk`, `.letter`, and `.journal` blocks never split across a page break +- no orphans or widows on paragraph breaks + +--- + +## Task 4 — Validate + +Run `epubcheck` on both EPUBs. Zero errors — Amazon rejects on any error, and +warnings about unusual CSS are fine to ignore. Then open both EPUBs in Calibre's +viewer and confirm by eye: + +- Persian reads right-to-left and the letters are joined (if letters appear + separated, some CSS `letter-spacing` survived — remove it, it breaks Persian script) +- the cover image is the first page +- the table of contents jumps correctly +- chapter numbering runs 1–23 with no gaps and no repeats + +--- + +## Output + +``` +build/ + fa/ faramushkhaneh.epub faramushkhaneh.pdf cover-fa.png + en/ the-man-who-forgot-his-daughter.epub ...pdf cover-en.png +``` + +Write a `Makefile` or `build.sh` so the whole thing can be re-run after any text +edit. I will be revising the manuscript, so the build has to be repeatable. + +Report back with the epubcheck output and the final file sizes. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3fa9b77 --- /dev/null +++ b/Makefile @@ -0,0 +1,67 @@ +# Thin wrapper over build.sh with per-target dependencies, so an edit to one +# edition's HTML does not rebuild the other. +# +# make both editions, then validate +# make fa en one edition +# make covers +# make check epubcheck + structural verification +# make clean + +SHELL := /usr/bin/env bash + +PANDOC ?= pandoc +NODE ?= node +EPUBCHECK ?= + +FA_SRC := src/faramushkhaneh.html +EN_SRC := src/the-man-who-forgot-his-daughter.html + +FA_EPUB := build/fa/faramushkhaneh.epub +FA_PDF := build/fa/faramushkhaneh.pdf +EN_EPUB := build/en/the-man-who-forgot-his-daughter.epub +EN_PDF := build/en/the-man-who-forgot-his-daughter.pdf + +COVERS := build/fa/cover-fa.png build/en/cover-en.png + +FONTS := assets/fonts/Vazirmatn-Regular.ttf + +export PANDOC NODE EPUBCHECK + +.PHONY: all fa en covers fonts check clean +.DEFAULT_GOAL := all + +all: fa en check + +fonts: $(FONTS) + +$(FONTS): tools/fetch-fonts.py + ./build.sh fonts + +covers: $(COVERS) + +$(COVERS): src/cover.html tools/render-cover.mjs tools/browser.mjs | fonts + ./build.sh covers + +fa: $(FA_EPUB) $(FA_PDF) + +en: $(EN_EPUB) $(EN_PDF) + +$(FA_EPUB) $(FA_PDF): $(FA_SRC) $(COVERS) \ + metadata/epub-fa.yaml assets/css/epub-fa.css \ + assets/css/print-common.css assets/css/print-fa.css \ + tools/prepare.py tools/patch-epub.py tools/render-pdf.mjs + ./build.sh fa + +$(EN_EPUB) $(EN_PDF): $(EN_SRC) $(COVERS) \ + metadata/epub-en.yaml assets/css/epub-en.css \ + assets/css/print-common.css assets/css/print-en.css \ + tools/prepare.py tools/patch-epub.py tools/render-pdf.mjs + ./build.sh en + +check: $(FA_EPUB) $(EN_EPUB) + ./build.sh check + python3 tools/verify-epub.py $(FA_EPUB) --lang fa + python3 tools/verify-epub.py $(EN_EPUB) --lang en + +clean: + rm -rf build diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bf666c --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# مردی که دخترش را فراموش کرد / The Man Who Forgot His Daughter + +Two editions of one novel by محمدپرهام پلنگ سنگدوینی / Mohammadparham +Palangsangdovini, built from HTML into sellable ebooks. + +Each edition ships as a validated EPUB 3, a 6×9in print-ready PDF, and a cover +PNG at Amazon KDP's dimensions. + +## Build + +```sh +./build.sh # everything, then validate +./build.sh fa # Persian only +./build.sh en # English only +./build.sh covers # redraw the covers +./build.sh check # epubcheck + structural verification +``` + +`make` does the same with dependency tracking, so editing one edition's HTML +rebuilds only that edition: + +```sh +make # both editions, then validate +make fa # Persian only +make clean +``` + +### Requirements + +| Tool | Why | Notes | +|---|---|---| +| `pandoc` 3.x | EPUB generation | `PANDOC=/path/to/pandoc` to override | +| `node` 18+ with `playwright` | covers and PDFs | `npm install playwright` | +| Chromium | canvas rendering, print-to-PDF | auto-detected; `CHROMIUM_PATH` to override | +| `python3` with `beautifulsoup4` | HTML restructuring | `pip install beautifulsoup4` | +| `java` + `epubcheck.jar` | validation | `EPUBCHECK=/path/to/epubcheck.jar` | + +Validation is skipped with a notice when `EPUBCHECK` is unset, so the build +still runs without it. + +Fonts download themselves into `assets/fonts/` on first build and are cached +after that. All are Open Font Licence; the licence texts sit beside them. + +## Editing the manuscript + +Edit `src/faramushkhaneh.html` or `src/the-man-who-forgot-his-daughter.html` +and re-run the build. The pipeline reads the structure out of the markup rather +than from a hard-coded list, so adding or reordering a chapter needs no change +here — as long as the existing shape holds: + +- `
` per chapter, with a `
` + and an `

` inside `
` +- `
` for the three book dividers +- the interlude carries `class="chapter midbreak"` + +`tools/verify-epub.py` re-checks chapter numbering, the interlude's position, +and the navigation after every build, so a mistake in the markup surfaces as a +failed check rather than as a broken store upload. + +## Layout + +``` +src/ the two editions and the cover generator (the manuscript) +assets/css/ EPUB and print stylesheets +assets/fonts/ downloaded OFL fonts + their licences +metadata/ per-edition EPUB metadata, each with its own fixed UUID +tools/ build steps, each runnable on its own +build/ output: fa/ and en/ +``` + +## Notes on the two formats + +**EPUB.** Persian is embedded with Vazirmatn, Noto Naskh Arabic and Noto +Nastaliq Urdu, because no major reader ships a Persian face. Right-to-left is +declared through `dir` attributes and the OPF spine's +`page-progression-direction`, not through CSS — EPUB 3.3 forbids the CSS +`direction` property, and epubcheck rejects it. + +**PDF.** Rendered by Chromium rather than weasyprint, which mishandles +Arabic-script shaping and bidi. + +**No drop cap in the Persian edition.** A floated `::first-letter` lifts the +initial letter out of its word; in Arabic script that destroys the joined form, +so «هر» would set as «ه» plus a stranded «ر». The English edition keeps its +drop cap. diff --git a/assets/css/epub-en.css b/assets/css/epub-en.css new file mode 100644 index 0000000..ab854fb --- /dev/null +++ b/assets/css/epub-en.css @@ -0,0 +1,374 @@ +/* English edition — EPUB 3 stylesheet. + * + * The English text would survive on reader defaults; the embedded faces are here + * to keep the edition looking like the same book as its Persian twin. + */ + +@font-face { + font-family: "EB Garamond"; + font-weight: 400; + font-style: normal; + src: url("../fonts/EBGaramond-Regular.ttf"); +} +@font-face { + font-family: "EB Garamond"; + font-weight: 500; + font-style: normal; + src: url("../fonts/EBGaramond-Medium.ttf"); +} +@font-face { + font-family: "EB Garamond"; + font-weight: 400; + font-style: italic; + src: url("../fonts/EBGaramond-Italic.ttf"); +} +@font-face { + font-family: "Cormorant Garamond"; + font-weight: 400; + font-style: normal; + src: url("../fonts/CormorantGaramond-Regular.ttf"); +} +@font-face { + font-family: "Cormorant Garamond"; + font-weight: 600; + font-style: normal; + src: url("../fonts/CormorantGaramond-SemiBold.ttf"); +} +@font-face { + font-family: "Cormorant Garamond"; + font-weight: 400; + font-style: italic; + src: url("../fonts/CormorantGaramond-Italic.ttf"); +} +@font-face { + font-family: "Inter"; + font-weight: 300; + font-style: normal; + src: url("../fonts/Inter-Light.ttf"); +} +@font-face { + font-family: "Inter"; + font-weight: 400; + font-style: normal; + src: url("../fonts/Inter-Regular.ttf"); +} +@font-face { + font-family: "Inter"; + font-weight: 600; + font-style: normal; + src: url("../fonts/Inter-SemiBold.ttf"); +} + +html, +body { + text-align: justify; + margin: 0; + padding: 0; +} + +body { + font-family: "EB Garamond", Georgia, serif; + font-size: 1em; + line-height: 1.6; + color: #151c24; + padding: 0 0.6em; + hyphens: auto; + -webkit-hyphens: auto; +} + +p { + margin: 0 0 1.05em; + text-indent: 0; + widows: 2; + orphans: 2; +} + +/* ── Headings ─────────────────────────────────────────── */ + +h1, +h2 { + font-family: "Cormorant Garamond", Georgia, serif; + font-weight: 400; + text-align: center; + page-break-after: avoid; + break-after: avoid; + line-height: 1.3; +} + +/* The separator only exists so the generated navigation reads + "Chapter One — Nights"; on the page the two halves stack. */ +.numsep { + display: none; +} + +.front-h, +.chapter-h { + page-break-before: always; + break-before: page; + margin: 2.4em 0 2em; +} + +.chapter-num, +.front-name { + display: block; + font-family: "Inter", sans-serif; + font-weight: 300; + font-size: 0.62em; + letter-spacing: 0.18em; + text-transform: uppercase; + color: #8a7340; + margin-bottom: 1em; +} + +.chapter-title { + display: block; + font-size: 1.9em; + line-height: 1.25; + color: #151c24; +} + +.front-name { + font-size: 0.8em; + color: #8a7340; +} + +/* ── Part dividers ────────────────────────────────────── */ + +.part-h { + page-break-before: always; + break-before: page; + margin: 3.4em 0 1.2em; +} + +.part-label { + display: block; + font-family: "Inter", sans-serif; + font-weight: 300; + font-size: 0.6em; + letter-spacing: 0.22em; + text-transform: uppercase; + color: #8a7340; + margin-bottom: 1.2em; +} + +.part-name { + display: block; + font-size: 2.6em; + line-height: 1.2; + color: #8e6b1c; +} + +.part-mark { + display: block; + width: 54px; + height: auto; + margin: 1.4em auto 1.2em; +} + +.part-note { + text-align: center; + font-family: "Inter", sans-serif; + font-weight: 300; + font-size: 0.85em; + color: #6b7581; + margin: 0 0 3em; +} + +/* ── Front and back matter ────────────────────────────── */ + +.epigraph { + margin: 3.5em auto; + text-align: center; +} + +.epigraph p { + font-family: "Cormorant Garamond", Georgia, serif; + font-style: italic; + font-size: 1.25em; + line-height: 1.6; + color: #414b55; + text-align: center; +} + +.epigraph .src { + font-family: "Inter", sans-serif; + font-size: 0.72em; + letter-spacing: 0.16em; + text-transform: uppercase; + color: #7a8590; +} + +.colophon, +.the-end { + page-break-before: always; + break-before: page; + text-align: center; + margin-top: 4em; + font-family: "Inter", sans-serif; + font-weight: 300; + font-size: 0.85em; + line-height: 2; + color: #414b55; +} + +.colophon p, +.the-end p { + text-align: center; +} + +.the-end h4 { + font-family: "Cormorant Garamond", Georgia, serif; + font-weight: 400; + font-size: 2em; + color: #8e6b1c; + margin: 0 0 0.5em; +} + +/* ── Ornaments and scene breaks ───────────────────────── */ + +.orn { + width: 46px; + height: 1px; + background: #b8801e; + margin: 1.6em auto; +} + +/* The screen edition drew the accent from a CSS custom property; EPUB readers + cannot be relied on for those, so the part accent arrives as a real class. */ +.brk { + text-align: center; + margin: 2em 0; + font-size: 0.62em; + letter-spacing: 1.2em; + text-indent: 1.2em; + color: #b8801e; + page-break-inside: avoid; + break-inside: avoid; +} + +.brk.p1 { + color: #b8801e; +} +.brk.p2 { + color: #2a5766; +} +.brk.p3 { + color: #8e2f24; +} + +/* ── Drop cap ─────────────────────────────────────────── */ + +.lead::first-letter { + font-family: "Cormorant Garamond", Georgia, serif; + font-size: 3.1em; + line-height: 0.9; + float: left; + color: #b8801e; + padding-right: 0.06em; +} + +/* ── Documents inside the story ───────────────────────── */ +/* These four blocks have to read as objects — a letter, a diary, a ledger line, + a list of names — not as body text. They stay whole across page breaks. */ + +.letter { + background: #e6e0d3; + border: 1px solid rgba(138, 110, 50, 0.3); + padding: 1.4em 1.2em; + margin: 1.8em 0; + font-size: 1em; + line-height: 1.75; + color: #2c2a21; + page-break-inside: avoid; + break-inside: avoid; +} + +.letter p { + margin: 0 0 1em; +} + +.letter .sign { + text-align: right; + font-family: "Inter", sans-serif; + font-size: 0.78em; + color: #6b6450; + margin: 0; +} + +.journal { + border-left: 2px solid #b8801e; + padding: 0 0 0 1em; + margin: 1.6em 0; + font-size: 0.97em; + line-height: 1.75; + color: #414b55; + page-break-inside: avoid; + break-inside: avoid; +} + +.journal p { + margin: 0 0 0.9em; +} + +.ledger { + background: #e6e0d3; + border-left: 2px solid #b8801e; + padding: 0.85em 1.1em; + margin: 1.7em 0; + font-family: "Inter", sans-serif; + font-size: 0.85em; + line-height: 1.8; + color: #414b55; + page-break-inside: avoid; + break-inside: avoid; +} + +.names { + margin: 1.4em 0; + page-break-inside: avoid; + break-inside: avoid; +} + +.names ul { + list-style: none; + padding: 0; + margin: 0; + text-align: center; + font-family: "Inter", sans-serif; + font-size: 0.92em; + line-height: 2.1; + color: #414b55; +} + +.names li { + text-align: center; +} + +.names .me { + color: #8e2f24; + font-weight: 600; +} + +/* ── The interlude ────────────────────────────────────── */ +/* Set apart from the chapters around it. Reader themes routinely override + background colour, so the interlude leans on rules and colour it can keep. */ + +.midbreak-h .chapter-title, +.midbreak-h .chapter-num { + color: #8a6a24; +} + +.midbreak { + border-top: 1px solid rgba(138, 110, 50, 0.4); + border-bottom: 1px solid rgba(138, 110, 50, 0.4); + padding: 1.6em 0; + margin: 0 0 2em; +} + +.midbreak .journal { + border-left-color: #8a6a24; +} + +.midbreak .lead::first-letter { + color: #8a6a24; +} diff --git a/assets/css/epub-fa.css b/assets/css/epub-fa.css new file mode 100644 index 0000000..d93be2e --- /dev/null +++ b/assets/css/epub-fa.css @@ -0,0 +1,369 @@ +/* Persian edition — EPUB 3 stylesheet. + * + * Two rules here are load-bearing rather than cosmetic: + * + * 1. Every face is declared against a font file embedded in the EPUB. Kindle, + * Kobo and Apple Books ship no Persian face of their own; without these the + * book renders as empty boxes. + * 2. Nothing anywhere sets letter-spacing. In Arabic script, letter-spacing + * pulls the glyphs out of their joined forms and the text stops being + * readable. The screen stylesheet used it on a few labels; those uses are + * deliberately not carried over. + * + * Right-to-left is NOT set here. EPUB 3.3 forbids the CSS `direction` property + * in a style sheet (epubcheck CSS-001), so direction is carried by the `dir` + * attribute on each XHTML root and by page-progression-direction in the OPF — + * both applied by tools/patch-epub.py after pandoc runs. + */ + +@font-face { + font-family: "Vazirmatn"; + font-weight: 300; + font-style: normal; + src: url("../fonts/Vazirmatn-Light.ttf"); +} +@font-face { + font-family: "Vazirmatn"; + font-weight: 400; + font-style: normal; + src: url("../fonts/Vazirmatn-Regular.ttf"); +} +@font-face { + font-family: "Vazirmatn"; + font-weight: 700; + font-style: normal; + src: url("../fonts/Vazirmatn-Bold.ttf"); +} +@font-face { + font-family: "Noto Naskh Arabic"; + font-weight: 400; + font-style: normal; + src: url("../fonts/NotoNaskhArabic-Regular.ttf"); +} +@font-face { + font-family: "Noto Naskh Arabic"; + font-weight: 700; + font-style: normal; + src: url("../fonts/NotoNaskhArabic-Bold.ttf"); +} +@font-face { + font-family: "Noto Nastaliq Urdu"; + font-weight: 400; + font-style: normal; + src: url("../fonts/NotoNastaliqUrdu-Regular.ttf"); +} + +html, +body { + text-align: justify; + margin: 0; + padding: 0; +} + +body { + font-family: "Noto Naskh Arabic", serif; + font-size: 1em; + line-height: 2.05; + color: #151c24; + padding: 0 0.6em; + /* Persian has no hyphenation dictionary worth relying on; justify alone. */ + hyphens: none; + -webkit-hyphens: none; +} + +p { + margin: 0 0 1.15em; + text-indent: 0; + widows: 2; + orphans: 2; +} + +/* ── Headings ─────────────────────────────────────────── */ + +h1, +h2 { + font-family: "Vazirmatn", sans-serif; + font-weight: 400; + text-align: center; + page-break-after: avoid; + break-after: avoid; + line-height: 1.9; +} + +/* The separator only exists so the generated navigation reads + "فصل یک — مشتریِ ساعت سه"; on the page the two halves stack. */ +.numsep { + display: none; +} + +.front-h, +.chapter-h { + page-break-before: always; + break-before: page; + margin: 2.4em 0 2em; +} + +.chapter-num, +.front-name { + display: block; + font-family: "Vazirmatn", sans-serif; + font-weight: 300; + font-size: 0.72em; + color: #8a7340; + margin-bottom: 0.6em; +} + +.chapter-title { + display: block; + font-family: "Noto Nastaliq Urdu", serif; + font-size: 1.5em; + line-height: 2.1; + color: #151c24; +} + +.front-name { + font-size: 1.1em; + color: #8a7340; +} + +/* ── Part dividers ────────────────────────────────────── */ + +.part-h { + page-break-before: always; + break-before: page; + margin: 3.4em 0 1.2em; +} + +.part-label { + display: block; + font-family: "Vazirmatn", sans-serif; + font-weight: 300; + font-size: 0.7em; + color: #8a7340; + margin-bottom: 0.8em; +} + +.part-name { + display: block; + font-family: "Noto Nastaliq Urdu", serif; + font-size: 2em; + line-height: 2; + color: #8e6b1c; +} + +.part-mark { + display: block; + width: 54px; + height: auto; + margin: 1.4em auto 1.2em; +} + +.part-note { + text-align: center; + font-family: "Vazirmatn", sans-serif; + font-weight: 300; + font-size: 0.85em; + color: #6b7581; + margin: 0 0 3em; +} + +/* ── Front and back matter ────────────────────────────── */ + +.epigraph { + margin: 3.5em auto; + text-align: center; +} + +.epigraph p { + font-family: "Noto Nastaliq Urdu", serif; + font-size: 1.05em; + line-height: 2.6; + color: #414b55; + text-align: center; +} + +.epigraph .src { + font-family: "Vazirmatn", sans-serif; + font-size: 0.78em; + color: #7a8590; +} + +.colophon, +.the-end { + page-break-before: always; + break-before: page; + text-align: center; + margin-top: 4em; + font-family: "Vazirmatn", sans-serif; + font-weight: 300; + font-size: 0.9em; + line-height: 2.3; + color: #414b55; +} + +.colophon p, +.the-end p { + text-align: center; +} + +.the-end h4 { + font-family: "Noto Nastaliq Urdu", serif; + font-weight: 400; + font-size: 1.7em; + color: #8e6b1c; + margin: 0 0 0.6em; +} + +/* ── Ornaments and scene breaks ───────────────────────── */ + +.orn { + width: 46px; + height: 1px; + background: #b8801e; + margin: 1.6em auto; +} + +/* The screen edition drew the accent from a CSS custom property; EPUB readers + cannot be relied on for those, so the part accent arrives as a real class. */ +.brk { + text-align: center; + margin: 2em 0; + font-size: 0.8em; + color: #b8801e; + page-break-inside: avoid; + break-inside: avoid; +} + +.brk.p1 { + color: #b8801e; +} +.brk.p2 { + color: #2a5766; +} +.brk.p3 { + color: #8e2f24; +} + +/* ── Opening paragraph ────────────────────────────────── */ + +/* Deliberately not a drop cap. A floated ::first-letter lifts the initial + letter out of its word, and in Arabic script that destroys the joined form: + «هر» would set as «ه» followed by a stranded «ر». The opening paragraph is + marked by size instead. */ +.lead { + font-size: 1.06em; +} + +/* ── Dialogue ─────────────────────────────────────────── */ + +.said { + margin: 0 0 1.15em; +} + +/* ── Documents inside the story ───────────────────────── */ +/* These four blocks have to read as objects — a letter, a diary, a ledger line, + a list of names — not as body text. They stay whole across page breaks. */ + +.letter { + background: #e6e0d3; + border: 1px solid rgba(138, 110, 50, 0.3); + padding: 1.4em 1.2em; + margin: 1.8em 0; + font-family: "Noto Naskh Arabic", serif; + font-size: 0.97em; + line-height: 1.95; + color: #2c2a21; + page-break-inside: avoid; + break-inside: avoid; +} + +.letter p { + margin: 0 0 1em; +} + +.letter .sign { + text-align: left; + font-family: "Vazirmatn", sans-serif; + font-size: 0.82em; + color: #6b6450; + margin: 0; +} + +.journal { + border-right: 2px solid #b8801e; + padding: 0 1em 0 0; + margin: 1.6em 0; + font-family: "Noto Naskh Arabic", serif; + font-size: 0.95em; + line-height: 1.95; + color: #414b55; + page-break-inside: avoid; + break-inside: avoid; +} + +.journal p { + margin: 0 0 0.9em; +} + +.ledger { + background: #e6e0d3; + border-right: 2px solid #b8801e; + padding: 0.85em 1.1em; + margin: 1.7em 0; + font-family: "Vazirmatn", sans-serif; + font-size: 0.88em; + line-height: 1.85; + color: #414b55; + page-break-inside: avoid; + break-inside: avoid; +} + +.names { + margin: 1.4em 0; + page-break-inside: avoid; + break-inside: avoid; +} + +.names ul { + list-style: none; + padding: 0; + margin: 0; + text-align: center; + font-family: "Vazirmatn", sans-serif; + font-size: 0.95em; + line-height: 2.1; + color: #414b55; +} + +.names li { + text-align: center; +} + +.names .me { + color: #8e2f24; + font-weight: 700; +} + +/* ── The interlude ────────────────────────────────────── */ +/* Set apart from the chapters around it. Reader themes routinely override + background colour, so the interlude leans on rules and colour it can keep. */ + +.midbreak-h .chapter-title, +.midbreak-h .chapter-num { + color: #8a6a24; +} + +.midbreak { + border-top: 1px solid rgba(138, 110, 50, 0.4); + border-bottom: 1px solid rgba(138, 110, 50, 0.4); + padding: 1.6em 0; + margin: 0 0 2em; +} + +.midbreak .journal { + border-right-color: #8a6a24; +} + +.midbreak .lead { + color: #414b55; +} diff --git a/assets/css/print-common.css b/assets/css/print-common.css new file mode 100644 index 0000000..006fafc --- /dev/null +++ b/assets/css/print-common.css @@ -0,0 +1,169 @@ +/* Print interior, 6x9in trim — rules shared by both editions. + * + * Injected on top of each source file's own screen stylesheet, so this only has + * to undo what the screen needs (viewport-height covers, wide measure, screen + * type sizes) and add what paper needs (page breaks, widow/orphan control, + * blocks that refuse to split). + * + * Text block is 4.5 x 7.5in: 6x9 less 0.75in margins on every side. + */ + +@page { + size: 6in 9in; + margin: 0.75in; +} + +@media print { + html, + body { + background: #fff !important; + } + + /* The screen measure is set for a browser window; on a 4.5in text block the + page box is the measure. */ + .wrap { + max-width: none !important; + padding: 0 !important; + margin: 0 !important; + } + + p { + orphans: 3; + widows: 3; + } + + /* ── Page breaks ────────────────────────────────────── */ + + .cover, + .part, + .chapter, + .end { + page-break-before: always; + break-before: page; + } + + /* The first page must not be preceded by a blank one. */ + .cover { + page-break-before: avoid; + break-before: avoid; + page-break-after: always; + break-after: page; + } + + .chapter-head, + h1, + h2, + h3, + h4 { + page-break-after: avoid; + break-after: avoid; + } + + /* The chapter number and the chapter title are two elements inside one head. + Without this they can land on opposite sides of a page break, leaving a + stranded "CHAPTER SIXTEEN" on a page of its own. */ + .chapter-head { + page-break-inside: avoid; + break-inside: avoid; + } + + /* ── Blocks that must stay whole ────────────────────── */ + + .brk, + .letter, + .journal, + .ledger, + .names, + .epigraph { + page-break-inside: avoid; + break-inside: avoid; + } + + /* ── Full-page designed spreads ─────────────────────── */ + /* Cover, part dividers, the interlude and the closing page are dark by design. + Chromium drops background paint in print unless told otherwise. */ + + .cover, + .part, + .midbreak, + .end { + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + } + + .cover, + .part, + .end, + .epigraph { + height: 7.5in; + min-height: 0 !important; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 0 !important; + overflow: hidden; + } + + /* Two screen-only textures. The rain is a 1px repeating gradient that turns + into banding at print resolution. The shelf is positioned at 44% of a + full-viewport cover; once the cover is squeezed to 7.5in that band lands + across the title. Both are decorative. */ + .rain, + .shelf { + display: none !important; + } + + /* The cover's breathing glow is an animation; on paper it is a still. */ + .glow { + animation: none !important; + width: 170px !important; + height: 170px !important; + } + + .cover-frame { + inset: 0.12in !important; + } + + .vial-wrap svg { + width: 74px !important; + height: auto !important; + } + + .cover-foot { + margin-top: 1.4rem !important; + } + + .epigraph { + background: #fff !important; + } + + .chapter { + padding: 0 !important; + } + + /* The interlude is the one chapter set on a dark ground. Without an inset the + pale text runs flush to the edge of the panel and reads as clipped, so it + keeps the horizontal padding the other chapters give up. */ + .midbreak { + padding: 0.3in 0.28in !important; + } + + .chapter-head { + margin-bottom: 1.5rem !important; + padding-top: 0.25in; + } + + /* The colophon is the last .chapter and carries no heading of its own; it + still gets a page to itself. */ + .chapter:last-of-type { + page-break-before: always; + break-before: page; + } + + /* Screen-only affordances. */ + .toc a { + text-decoration: none; + color: inherit; + } +} diff --git a/assets/css/print-en.css b/assets/css/print-en.css new file mode 100644 index 0000000..321685b --- /dev/null +++ b/assets/css/print-en.css @@ -0,0 +1,34 @@ +/* English edition — print interior. Loaded after print-common.css. */ + +@media print { + html, + body { + font-size: 10.5pt; + line-height: 1.45; + } + + /* Latin script takes the drop cap without trouble; it just needs to be sized + for a 4.5in measure rather than a browser window. */ + .lead::first-letter { + font-size: 3em; + line-height: 0.84; + } + + .cover-title { + font-size: 2.9rem !important; + } + + .part h2 { + font-size: 2.1rem !important; + } + + .chapter h3 { + font-size: 1.5rem !important; + } + + .letter, + .journal, + .ledger { + font-size: 0.94em; + } +} diff --git a/assets/css/print-fa.css b/assets/css/print-fa.css new file mode 100644 index 0000000..4929a12 --- /dev/null +++ b/assets/css/print-fa.css @@ -0,0 +1,46 @@ +/* Persian edition — print interior. Loaded after print-common.css. */ + +@media print { + html, + body { + font-size: 10.5pt; + line-height: 1.95; + } + + /* The screen edition opens each chapter with a floated ::first-letter drop + cap. That works in Latin script and breaks Persian: the initial letter is + lifted out of the word, so «هر» sets as «ه» plus a stranded «ر» and the + joined form is lost. Cancelled here — the opening paragraph is marked by + size instead, which costs nothing and keeps the word intact. */ + .lead::first-letter, + .midbreak .lead::first-letter { + float: none !important; + font-family: inherit !important; + font-size: inherit !important; + line-height: inherit !important; + margin: 0 !important; + color: inherit !important; + } + + .lead { + font-size: 1.06em; + } + + .cover-title { + font-size: 2.9rem !important; + } + + .part h2 { + font-size: 2.1rem !important; + } + + .chapter h3 { + font-size: 1.45rem !important; + } + + .letter, + .journal, + .ledger { + font-size: 0.94em; + } +} diff --git a/assets/fonts/CormorantGaramond-Italic.ttf b/assets/fonts/CormorantGaramond-Italic.ttf new file mode 100644 index 0000000..29d4135 Binary files /dev/null and b/assets/fonts/CormorantGaramond-Italic.ttf differ diff --git a/assets/fonts/CormorantGaramond-Regular.ttf b/assets/fonts/CormorantGaramond-Regular.ttf new file mode 100644 index 0000000..3fab5e0 Binary files /dev/null and b/assets/fonts/CormorantGaramond-Regular.ttf differ diff --git a/assets/fonts/CormorantGaramond-SemiBold.ttf b/assets/fonts/CormorantGaramond-SemiBold.ttf new file mode 100644 index 0000000..2fc889a Binary files /dev/null and b/assets/fonts/CormorantGaramond-SemiBold.ttf differ diff --git a/assets/fonts/EBGaramond-Italic.ttf b/assets/fonts/EBGaramond-Italic.ttf new file mode 100644 index 0000000..f1e9b8c Binary files /dev/null and b/assets/fonts/EBGaramond-Italic.ttf differ diff --git a/assets/fonts/EBGaramond-Medium.ttf b/assets/fonts/EBGaramond-Medium.ttf new file mode 100644 index 0000000..4dcc32e Binary files /dev/null and b/assets/fonts/EBGaramond-Medium.ttf differ diff --git a/assets/fonts/EBGaramond-Regular.ttf b/assets/fonts/EBGaramond-Regular.ttf new file mode 100644 index 0000000..db375c8 Binary files /dev/null and b/assets/fonts/EBGaramond-Regular.ttf differ diff --git a/assets/fonts/Inter-Light.ttf b/assets/fonts/Inter-Light.ttf new file mode 100644 index 0000000..3c64d3f Binary files /dev/null and b/assets/fonts/Inter-Light.ttf differ diff --git a/assets/fonts/Inter-Regular.ttf b/assets/fonts/Inter-Regular.ttf new file mode 100644 index 0000000..399a6e0 Binary files /dev/null and b/assets/fonts/Inter-Regular.ttf differ diff --git a/assets/fonts/Inter-SemiBold.ttf b/assets/fonts/Inter-SemiBold.ttf new file mode 100644 index 0000000..67fda28 Binary files /dev/null and b/assets/fonts/Inter-SemiBold.ttf differ diff --git a/assets/fonts/NotoNaskhArabic-Bold.ttf b/assets/fonts/NotoNaskhArabic-Bold.ttf new file mode 100644 index 0000000..3b4ae25 Binary files /dev/null and b/assets/fonts/NotoNaskhArabic-Bold.ttf differ diff --git a/assets/fonts/NotoNaskhArabic-Regular.ttf b/assets/fonts/NotoNaskhArabic-Regular.ttf new file mode 100644 index 0000000..5c803d7 Binary files /dev/null and b/assets/fonts/NotoNaskhArabic-Regular.ttf differ diff --git a/assets/fonts/NotoNastaliqUrdu-Regular.ttf b/assets/fonts/NotoNastaliqUrdu-Regular.ttf new file mode 100644 index 0000000..ff187e6 Binary files /dev/null and b/assets/fonts/NotoNastaliqUrdu-Regular.ttf differ diff --git a/assets/fonts/OFL-CormorantGaramond.txt b/assets/fonts/OFL-CormorantGaramond.txt new file mode 100644 index 0000000..507d70f --- /dev/null +++ b/assets/fonts/OFL-CormorantGaramond.txt @@ -0,0 +1,93 @@ +Copyright 2015 the Cormorant Project Authors (github.com/CatharsisFonts/Cormorant) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/OFL-EBGaramond.txt b/assets/fonts/OFL-EBGaramond.txt new file mode 100644 index 0000000..c1ec5e1 --- /dev/null +++ b/assets/fonts/OFL-EBGaramond.txt @@ -0,0 +1,93 @@ +Copyright 2017 The EB Garamond Project Authors (https://github.com/octaviopardo/EBGaramond12) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/OFL-Inter.txt b/assets/fonts/OFL-Inter.txt new file mode 100644 index 0000000..21f6aff --- /dev/null +++ b/assets/fonts/OFL-Inter.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/OFL-NotoNaskhArabic.txt b/assets/fonts/OFL-NotoNaskhArabic.txt new file mode 100644 index 0000000..d4e1705 --- /dev/null +++ b/assets/fonts/OFL-NotoNaskhArabic.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Noto Project Authors (https://github.com/notofonts/arabic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/OFL-NotoNastaliqUrdu.txt b/assets/fonts/OFL-NotoNastaliqUrdu.txt new file mode 100644 index 0000000..38833b0 --- /dev/null +++ b/assets/fonts/OFL-NotoNastaliqUrdu.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Noto Project Authors (https://github.com/notofonts/nastaliq) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/OFL-Vazirmatn.txt b/assets/fonts/OFL-Vazirmatn.txt new file mode 100644 index 0000000..be66b38 --- /dev/null +++ b/assets/fonts/OFL-Vazirmatn.txt @@ -0,0 +1,93 @@ +Copyright 2015 The Vazirmatn Project Authors (https://github.com/rastikerdar/vazirmatn) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/Vazirmatn-Bold.ttf b/assets/fonts/Vazirmatn-Bold.ttf new file mode 100644 index 0000000..7ed5b72 Binary files /dev/null and b/assets/fonts/Vazirmatn-Bold.ttf differ diff --git a/assets/fonts/Vazirmatn-Light.ttf b/assets/fonts/Vazirmatn-Light.ttf new file mode 100644 index 0000000..a71f578 Binary files /dev/null and b/assets/fonts/Vazirmatn-Light.ttf differ diff --git a/assets/fonts/Vazirmatn-Regular.ttf b/assets/fonts/Vazirmatn-Regular.ttf new file mode 100644 index 0000000..917c205 Binary files /dev/null and b/assets/fonts/Vazirmatn-Regular.ttf differ diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..a16a395 --- /dev/null +++ b/build.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +# Build both editions from src/ into build/. +# +# ./build.sh everything +# ./build.sh covers covers only +# ./build.sh fa Persian EPUB + PDF +# ./build.sh en English EPUB + PDF +# ./build.sh check epubcheck + structural verification +# ./build.sh verify structural verification only +# +# Safe to re-run after any edit to the source HTML — every step overwrites its +# own output and nothing is incremental except the font download. + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$ROOT" + +PANDOC="${PANDOC:-pandoc}" +EPUBCHECK="${EPUBCHECK:-}" # path to epubcheck.jar; skipped when unset +NODE="${NODE:-node}" + +FA_FONTS=(Vazirmatn-Light Vazirmatn-Regular Vazirmatn-Bold + NotoNaskhArabic-Regular NotoNaskhArabic-Bold NotoNastaliqUrdu-Regular) +EN_FONTS=(EBGaramond-Regular EBGaramond-Medium EBGaramond-Italic + CormorantGaramond-Regular CormorantGaramond-SemiBold CormorantGaramond-Italic + Inter-Light Inter-Regular Inter-SemiBold) + +say() { printf '\n\033[1m%s\033[0m\n' "$*"; } + +need() { + command -v "$1" >/dev/null 2>&1 || { + echo "error: $1 not found on PATH" >&2 + exit 1 + } +} + +fonts() { + say "Fonts" + python3 tools/fetch-fonts.py +} + +covers() { + say "Covers" + need "$NODE" + "$NODE" tools/render-cover.mjs +} + +# Covers are an input to both EPUBs; re-rendering them on every edition build +# would keep retriggering make. Only draw them when they are missing. +covers_once() { + if [ -s build/fa/cover-fa.png ] && [ -s build/en/cover-en.png ]; then + say "Covers" + echo " = already rendered (run './build.sh covers' to redraw)" + else + covers + fi +} + +# epub +epub() { + local lang="$1" src="$2" name="$3" + shift 3 + local fonts=("$@") + + local out="build/$lang" + local target="$out/$name.epub" + local dir="ltr" + [ "$lang" = "fa" ] && dir="rtl" + + python3 tools/prepare.py --lang "$lang" --src "$src" --out "$out" + + local embed=() + for f in "${fonts[@]}"; do embed+=("--epub-embed-font=assets/fonts/$f.ttf"); done + + "$PANDOC" "$out/body.html" \ + --from=html \ + --to=epub3 \ + --metadata-file="metadata/epub-$lang.yaml" \ + --css="assets/css/epub-$lang.css" \ + --epub-cover-image="$out/cover-$lang.png" \ + "${embed[@]}" \ + --toc --toc-depth=2 \ + --split-level=2 \ + --resource-path="$out:." \ + --output="$target" + + # Pandoc cannot write page-progression-direction or the per-document dir + # attribute, and EPUB 3.3 forbids setting direction from CSS. + python3 tools/patch-epub.py "$target" --dir "$dir" +} + +pdf() { + local lang="$1" src="$2" name="$3" + need "$NODE" + "$NODE" tools/render-pdf.mjs --lang "$lang" --src "$src" --out "build/$lang/$name.pdf" +} + +edition_fa() { + say "Persian edition" + epub fa src/faramushkhaneh.html faramushkhaneh "${FA_FONTS[@]}" + pdf fa src/faramushkhaneh.html faramushkhaneh +} + +edition_en() { + say "English edition" + epub en src/the-man-who-forgot-his-daughter.html the-man-who-forgot-his-daughter "${EN_FONTS[@]}" + pdf en src/the-man-who-forgot-his-daughter.html the-man-who-forgot-his-daughter +} + +check() { + say "Validation" + if [ -z "$EPUBCHECK" ]; then + echo " EPUBCHECK is not set — skipping. Point it at epubcheck.jar to validate:" + echo " EPUBCHECK=/path/to/epubcheck.jar ./build.sh check" + return 0 + fi + need java + local status=0 + for f in build/fa/faramushkhaneh.epub build/en/the-man-who-forgot-his-daughter.epub; do + echo "--- $f" + java -jar "$EPUBCHECK" "$f" || status=1 + done + return $status +} + +verify() { + say "Structure" + python3 tools/verify-epub.py build/fa/faramushkhaneh.epub --lang fa + python3 tools/verify-epub.py build/en/the-man-who-forgot-his-daughter.epub --lang en +} + +manifest() { + say "Output" + find build -type f \( -name '*.epub' -o -name '*.pdf' -o -name '*.png' \) \ + | sort | while read -r f; do + printf ' %-58s %s\n' "$f" "$(du -h "$f" | cut -f1)" + done +} + +case "${1:-all}" in + fonts) fonts ;; + covers) fonts; covers ;; + fa) fonts; covers_once; edition_fa; manifest ;; + en) fonts; covers_once; edition_en; manifest ;; + check) check; verify ;; + verify) verify ;; + all) + need "$PANDOC" + fonts + covers + edition_fa + edition_en + check + verify + manifest + ;; + *) + echo "usage: $0 [all|fonts|covers|fa|en|check|verify]" >&2 + exit 2 + ;; +esac diff --git a/build/en/cover-en-600x960.png b/build/en/cover-en-600x960.png new file mode 100644 index 0000000..afec2b1 Binary files /dev/null and b/build/en/cover-en-600x960.png differ diff --git a/build/en/cover-en.png b/build/en/cover-en.png new file mode 100644 index 0000000..0082421 Binary files /dev/null and b/build/en/cover-en.png differ diff --git a/build/en/the-man-who-forgot-his-daughter.epub b/build/en/the-man-who-forgot-his-daughter.epub new file mode 100644 index 0000000..d8e16d4 Binary files /dev/null and b/build/en/the-man-who-forgot-his-daughter.epub differ diff --git a/build/en/the-man-who-forgot-his-daughter.pdf b/build/en/the-man-who-forgot-his-daughter.pdf new file mode 100644 index 0000000..d01916f Binary files /dev/null and b/build/en/the-man-who-forgot-his-daughter.pdf differ diff --git a/build/fa/cover-fa-600x960.png b/build/fa/cover-fa-600x960.png new file mode 100644 index 0000000..c35d4a1 Binary files /dev/null and b/build/fa/cover-fa-600x960.png differ diff --git a/build/fa/cover-fa.png b/build/fa/cover-fa.png new file mode 100644 index 0000000..b05ae9a Binary files /dev/null and b/build/fa/cover-fa.png differ diff --git a/build/fa/faramushkhaneh.epub b/build/fa/faramushkhaneh.epub new file mode 100644 index 0000000..a319c59 Binary files /dev/null and b/build/fa/faramushkhaneh.epub differ diff --git a/build/fa/faramushkhaneh.pdf b/build/fa/faramushkhaneh.pdf new file mode 100644 index 0000000..d55021f Binary files /dev/null and b/build/fa/faramushkhaneh.pdf differ diff --git a/metadata/epub-en.yaml b/metadata/epub-en.yaml new file mode 100644 index 0000000..8f9832e --- /dev/null +++ b/metadata/epub-en.yaml @@ -0,0 +1,24 @@ +--- +title: + - type: main + text: The Man Who Forgot His Daughter +creator: + - role: author + text: Mohammadparham Palangsangdovini + file-as: Palangsangdovini, Mohammadparham +lang: en +dir: ltr +publisher: Faramushkhaneh +rights: © 2026 Mohammadparham Palangsangdovini. All rights reserved. +description: A novel about a shop that buys memories, and the man who stands behind its counter. +subject: + - Fiction + - Literary Fiction +date: 2026-08-12 +# Each edition is a separate work in every store, so it carries its own identifier. +# This value is deliberately fixed: regenerating it would republish the book as a +# different title on every build. +identifier: + - scheme: uuid + text: b3f28ad0-34f2-46d7-9a89-32e7a4506bd6 +... diff --git a/metadata/epub-fa.yaml b/metadata/epub-fa.yaml new file mode 100644 index 0000000..e1acae8 --- /dev/null +++ b/metadata/epub-fa.yaml @@ -0,0 +1,24 @@ +--- +title: + - type: main + text: مردی که دخترش را فراموش کرد +creator: + - role: author + text: محمدپرهام پلنگ سنگدوینی + file-as: پلنگ سنگدوینی، محمدپرهام +lang: fa +dir: rtl +publisher: فراموشخانه +rights: © ۲۰۲۶ محمدپرهام پلنگ سنگدوینی. تمام حقوق محفوظ است. +description: رمانی دربارهٔ مغازه‌ای که خاطره می‌خرد، و مردی که پشت پیشخوانش ایستاده. +subject: + - داستان + - رمان فارسی +date: 2026-08-12 +# Each edition is a separate work in every store, so it carries its own identifier. +# This value is deliberately fixed: regenerating it would republish the book as a +# different title on every build. +identifier: + - scheme: uuid + text: c954efa8-3cd7-4f45-a0da-40afdfc17375 +... diff --git a/package.json b/package.json new file mode 100644 index 0000000..af2047f --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "motion": "^13.1.0" + } +} diff --git a/src/cover.html b/src/cover.html new file mode 100644 index 0000000..068e291 --- /dev/null +++ b/src/cover.html @@ -0,0 +1,340 @@ + + + + + +جلد کتاب — مردی که دخترش را فراموش کرد + + + + + + + +

جلد کتاب — ۱۶۰۰ × ۲۵۶۰ پیکسل

+ +
+ +
+ + + +
+ +
+ +
+ +
+ + +
+ +

فایل خروجی دقیقاً اندازهٔ استاندارد آمازون KDP و گام‌رود است. سه حالت رنگی را امتحان کن و هرکدام را خواستی دانلود کن.

+ + + + diff --git a/src/faramushkhaneh.html b/src/faramushkhaneh.html new file mode 100644 index 0000000..d006b8e --- /dev/null +++ b/src/faramushkhaneh.html @@ -0,0 +1,1502 @@ + + + + + +مردی که دخترش را فراموش کرد — محمدپرهام پلنگ سنگدوینی + + + + + + + + + + +
+
+
+ + + +
+
+ +
+ +
رمان
+

مردی که
دخترش را
فراموش کرد

+
+

محمدپرهام پلنگ سنگدوینی

+

هرچه بخواهی از یاد ببری، از تو می‌خریماما یکی باید حملش کند

+
فراموشخانه · کوچهٔ سنگی
+
+ + +
+
+

«آدم‌ها زیر آفتاب تحمل می‌کنند، پسرم.
زیر باران کم می‌آورند.»

+
دلارام فیروز
+
+
+ + +
+
+
+
فهرست
+
+
+
+

پیش‌درآمد

+

دفتر اول — مغازه‌دار

+
    +
  1. مشتریِ ساعت سه
  2. سه قانون
  3. شب‌ها
  4. +
  5. عشقی که فروخته نمی‌شود
  6. زنی که آمد بچه‌اش را بفروشد
  7. +
  8. دختری که آمد چیزی پس بخرد
  9. آنچه در دفتر نیست
  10. +
+

دفتر دوم — دختر

+
    +
  1. نه‌سالگی
  2. خانه‌ای با دو غایب
  3. شانزده‌سالگی
  4. +
  5. پنجشنبه‌ها
  6. تصمیم
  7. +
+

دفتر سوم — معامله

+
    +
  1. جناب فرهود
  2. آقای شکوهی نام خودش را گم می‌کند
  3. طبقهٔ زیرزمین
  4. +
  5. نامهٔ دلارام فیروز
  6. آنچه سوگند می‌داند
  7. +
+

میان‌پرده — شش صفحه

+
    +
  1. خانهٔ خیابان یازدهم
  2. شبی که شیشه‌ها شکستند
  3. بهای بازگشت
  4. +
  5. آخرین معامله
  6. چهار ماه
  7. مردی که هر روز می‌آید
  8. +
+
+
+
+ + +
+
+
+
پیش‌درآمد
+
+
+

هر شهری یک مغازه دارد که آدرسش را بلند نمی‌گویند.

+

نه از سر بدجنسی — از سر شرم. آدرس فراموشخانه را زیر گوش می‌گویند، آن هم به کسی که آن‌قدر داغان شده باشد که شرم دیگر برایش خرج نداشته باشد. می‌گویند: آخر کوچهٔ سنگی، بعد از خیاطی، دری چوبی که زنگ ندارد. در می‌زنی. مردی می‌آید. هرچه بخواهی از یاد ببری، از تو می‌خرد.

+

و طرف مقابل می‌خندد. همه اولش می‌خندند.

+

بعد شبی می‌رسد که ساعت سه‌ونیم بامداد چشم باز می‌کند، و پیش از آنکه به خودش فرصت فکر کردن بدهد، می‌بیند کفش‌هایش را پوشیده است.

+

این کتاب دربارهٔ آن مغازه نیست.

+

دربارهٔ کسی است که پشت پیشخوان می‌ایستد.

+
+
+ + +
+ +
دفتر اول
+

مغازه‌دار

+
شیشه پر است
+
+ + +
+
+
+
فصل یک
+

مشتریِ ساعت سه

+
+
+ +

باران که می‌آمد، کار و بار نریمان سکه بود.

+

این را خودش کشف نکرده بود. خانم فیروز، مغازه‌دار پیش از او، همان ماه‌های اول گفته بود و بعد مرده بود و جمله مانده بود. نریمان او را فقط یک تابستان شناخت؛ اما بعضی جمله‌ها از خود آدم بیشتر عمر می‌کنند.

+

آن روز از صبح باران می‌آمد. نریمان پشت پیشخوان نشسته بود و شیشه‌های خالی را با پارچه‌ای که سی سال قدمت داشت برق می‌انداخت. مغازه بزرگ نبود — چهار در پنج، سقفی بلند، دیوارهایی که تا آخرین سانتیمتر قفسه بودند. روی قفسه‌ها، ردیف پشت ردیف، هزاران شیشهٔ کوچک با درپوش چوبی. بعضی روشن، به رنگ چای کم‌رنگ. بعضی تیره. و چندتایی آن بالا، آن‌قدر سیاه که نور را می‌خوردند و پس نمی‌دادند.

+

زنگولهٔ بالای در تکان خورد. آقای شکوهی بود، با چتری که یک پره‌اش شکسته بود و برای همین شانهٔ چپش همیشه خیس می‌ماند.

+

«سلام آقا نریمان. خوبی؟»

+

«خوبم. شما؟»

+

«نه.» چتر را کنار در گذاشت. «یه چیزی دارم. کوچیکه.»

+

«همیشه کوچیکه.»

+

روی چهارپایهٔ مقابل پیشخوان نشست و انگشت‌هایش را در هم قفل کرد؛ مردی پنجاه‌وچند ساله با صورتی که انگار همیشه وسط یک معذرت‌خواهی گیر کرده بود.

+

«دیروز تو اتوبوس یه خانمی بلند شد جاشو بهم داد. فکر کرد پیرم.»

+

نریمان منتظر ماند.

+

«نشستم.» شکوهی به دست‌هایش نگاه کرد. «همین. نشستم و تا آخر خط برنگشتم نگاهش کنم. بیست‌وچهار ساعته دارم به این فکر می‌کنم که نشستم.»

+

«می‌دونین که این چیزی نیست.»

+

«برای تو چیزی نیست.»

+

نریمان نفس کشید. هفتهٔ سوم پیاپی بود. هفتهٔ پیش: زنگ خانهٔ همسایه را زده بود و در نرفته بود و تا شب عذاب کشیده بود. هفتهٔ قبل‌تر: در عروسی خواهرزاده‌اش، وسط آواز، فالش خوانده بود و همه شنیده بودند.

+

«یه شیشهٔ کوچیک.» اسکناس‌های مچاله را روی پیشخوان گذاشت. «قیمتشو خودت بگو.»

+

مغازه پول نمی‌گرفت؛ پول می‌داد. اما شکوهی از روز اول اصرار داشت برعکسش کند و نریمان دیگر بحث نمی‌کرد.

+
+

اتاق پشتی هیچ نداشت جز دو صندلی روبه‌روی هم، میزی کوتاه، و شیشه‌ای خالی روی میز.

+

«بگین.»

+

و شکوهی گفت. زن، اتوبوس، شانهٔ خیس، شرم.

+

نریمان گوش داد — نه آن گوش دادنی که آدم‌ها در مهمانی بلدند؛ آن یکی. آن که خانم فیروز اسمش را گذاشته بود بلعیدن: باید آن‌قدر کامل بشنوی که در سینهٔ صاحبش جایی برای خاطره باقی نماند. باید صحنه را طوری در خودت بسازی که مال تو شود. باید بوی اتوبوس را بشنوی. باید شرم مردی را که نمی‌شناسی، مثل شرم خودت، در گلویت حس کنی.

+

وقتی حرف تمام شد، بخاری کم‌رنگ از دهان شکوهی بیرون آمد، در هوا چرخید، و آرام در شیشه نشست؛ مثل شبنمی که یادش رفته باشد کجا باید بنشیند.

+

نریمان درپوش را گذاشت.

+

شکوهی لحظه‌ای ساکت ماند. بعد سر بلند کرد و لبخند زد — لبخند سبکِ آدمی که کوله‌اش را زمین گذاشته.

+

«عجب بارونی.»

+

«آره.»

+

«خب. من برم. کاری نداری؟»

+

رفت. چتر شکسته را هم برد.

+

نریمان شیشه را به قفسهٔ سمت چپ برد، ردیف چهارم، جایی که شیشه‌های آقای شکوهی کنار هم چیده شده بودند.

+

سی‌وهفت‌تا.

+

نگاهشان کرد: سی‌وهفت تکهٔ کوچک از مردی که هر هفته لبخندزنان از این در بیرون می‌رفت و هر بار کمی کمتر از خودش را با خودش می‌برد.

+
+
+ + +
+
+
+
فصل دو
+

سه قانون

+
+
+ +

پسر بیست‌وچند ساله بود، از آن‌هایی که هرچه عصبانی‌ترند مؤدب‌تر می‌شوند.

+

«شنیدم شما می‌تونین کمک کنین.»

+

«بشین.»

+

نشست. پالتویش را در نیاورد.

+

«چقدر طول می‌کشه؟»

+

«بستگی داره. اول قانون‌ها.»

+

«قانون؟»

+

نریمان سه انگشت بالا آورد؛ عادتی که مثل خود مغازه از خانم فیروز به ارث برده بود.

+

«یک: فقط خاطرهٔ خودت رو می‌تونی بفروشی. خاطرهٔ پدرت، بچه‌ت، معشوقه‌ت — نه. حتی اگه خودتم توش باشی.»

+

انگشت دوم.

+

«دو، و این مهم‌ترینه: خاطره ریشه داره. مثل چغندر نیست که از خاک بکشیش بیرون و بقیهٔ زمین سر جاش بمونه. مثل ریشهٔ درخته. وقتی می‌کشیش، هرچی بهش چسبیده میاد. تو می‌گی می‌خوام روزی که فلانی ولم کرد یادم بره؛ من درش میارم و ممکنه با خودش کل اون آدمو ببره. اسمش، صداش، سه سالی که با هم بودین، آهنگی که با هم گوش می‌دادین. ممکنم هست فقط همون یه روز بره. از قبل معلوم نیست. هیچ‌وقت معلوم نیست.»

+

پسر خندید؛ خندهٔ خشک. «یعنی قمار.»

+

«یعنی جراحی. با چشم بسته.»

+

«سه؟»

+

نریمان انگشت سوم را پایین آورد و کف دست‌ها را روی پیشخوان گذاشت.

+

«سه: معامله برگشت نداره. هیچ‌وقت. هیچ‌کس. اینو دوبار بشنو، چون آدم‌ها این یکی رو باور نمی‌کنن تا وقتی دیر بشه.»

+

پسر مدتی قفسه‌ها را نگاه کرد.

+

«اونا چی‌ان؟»

+

«مال بقیه.»

+

«نگهشون می‌داری؟»

+

«مجبورم.»

+

«چرا نمی‌ریزیشون تو فاضلاب؟»

+

«چون اون‌وقت شهر پر می‌شه از آدم‌هایی که وسط خیابون گریه‌شون می‌گیره و نمی‌دونن چرا.»

+
+

پسر به اتاق پشتی آمد. نشست. و گفت.

+

از برادرش گفت. از روزی که فهمید برادر بزرگ‌ترش سال‌ها به اسم او از پدرشان پول می‌گرفته. از نگاه پدر، که وقتی حقیقت را شنید عوض نشد — و همین عوض‌نشدن بود که کمرش را شکست.

+

نریمان بلعید.

+

بخار این‌بار غلیظ‌تر بیرون آمد؛ کش‌دار، مثل دودی که نمی‌خواهد اتاق را ترک کند. ته شیشه نشست و لایه‌ای تیره ساخت.

+

پسر پلک زد. «تموم شد؟»

+

«آره.»

+

بلند شد، تا دم در رفت، بعد ایستاد و برگشت. صورتش عوض شده بود.

+

«ببخشید... من چرا اومدم اینجا؟»

+

«یه معامله کردیم.»

+

«چه معامله‌ای؟» و بعد، با صدایی که ناگهان بچگانه شده بود: «من برادر داشتم؟»

+

نریمان جواب نداد.

+

پسر شانه بالا انداخت، دستی به پیشانی کشید و زیر باران رفت. سبک. رها. خالی.

+

نریمان شیشه را برداشت. سنگین بود. ریشه‌دار بود. یک برادر کامل، با سی سالش، با تولدها و دعواها و شب‌های بی‌خوابی‌اش، حالا در چهار سانتیمتر شیشه جا شده بود.

+

آن شب نریمان خواب برادری را دید که هرگز نداشت.

+

و صبح که بیدار شد، چند ثانیه طول کشید تا یادش بیاید که ندارد.

+
+
+ + +
+
+
+
فصل سه
+

شب‌ها

+
+
+ +

روزها مغازه‌دار بود. شب‌ها انبار.

+

این را هیچ‌کس به او نگفته بود؛ سال دوم خودش فهمید. خاطره‌ها در شیشه نمی‌مانند. نشت می‌کنند، مثل بویی که از در بستهٔ آشپزخانه بیرون می‌زند. و کسی که طبقهٔ بالای این مغازه بخوابد، هر شب مهمان آدم‌هایی است که هرگز ندیده.

+

شب‌های خوب هم بود.

+

عروسی زنی در سال ۶۲ که کفشش را جا گذاشته بود و تمام شب پابرهنه رقصیده بود. مردی که دوچرخه‌سواری یاد می‌گرفت و پدرش پشت زین را رها کرده بود و او تا آخر کوچه نفهمیده بود. دختری که اولین بار در عمرش دریا را دیده بود و از ترس جیغ کشیده بود و بعد خندیده بود و هر دو صدا در یک نفس جا شده بود.

+

نریمان این‌ها را دوست داشت. بی‌آنکه به کسی بگوید، برای بعضی شیشه‌ها جای بهتری روی قفسه انتخاب می‌کرد.

+

اما شب‌های بد بیشتر بودند.

+

روشش را پیدا کرده بود: بیدار می‌شد، آب می‌خورد، پنجره را باز می‌کرد و بلند می‌گفت: «این مال من نیست.»

+

گاهی جواب می‌داد. گاهی نه.

+

صبح‌ها آینه چیزی می‌گفت که دوست نداشت بشنود. پنجاه‌ودو ساله بود و شصت‌وپنج نشان می‌داد. موهایش از شقیقه به بالا سفید نشده بود — خاکستری شده بود؛ رنگ چیزی که سوخته.

+

خانم فیروز هم آخرش همین شکلی شده بود.

+
+

بالای یکی از قفسه‌ها، بیرون از دسترس، دفتر معاملات بود: سیاه، جلدچرمی، قطور. نریمان هفته‌ای یک‌بار بازش می‌کرد، اسم‌ها را می‌خواند، شیشه‌ها را تطبیق می‌داد. کار بیهوده‌ای بود؛ کسی از او حساب نمی‌خواست. اما آدمی که چیزی برای فراموش نکردن ندارد، دنبال تشریفات می‌گردد.

+

و چیزی در آن دفتر بود که سال‌ها آزارش می‌داد.

+

میان صفحهٔ ۲۰۷ و ۲۰۸، شش صفحه بریده شده بود.

+

نه کنده‌شده — بریده. با تیغ. صاف. کار کسی که نمی‌خواسته معلوم شود چیزی برداشته.

+

نریمان انگشت روی لبهٔ بریدگی می‌کشید و هر بار یک فکر مسخره به سرش می‌زد:

+

این کار خودم بوده.

+

بعد دفتر را می‌بست، پایین می‌رفت، کرکره را بالا می‌داد و منتظر باران می‌ماند.

+
+
+ + +
+
+
+
فصل چهار
+

عشقی که فروخته نمی‌شود

+
+
+ +

خانم مروارید هفته‌ای دو بار می‌آمد و هرگز چیزی نمی‌فروخت.

+

هفتاد ساله بود، همیشه روسری یاسی داشت، و همیشه شیرینی می‌آورد تا نریمان تعارف کند و او بگوید «نه بابا، قندم» و بعد بخورد.

+

«آقا نریمان. تصمیمو گرفتم.»

+

«باشه.»

+

«این دفعه جدی گرفتم.»

+

«همیشه جدیه.»

+

نشست. دست‌های چروکیده را روی زانو گذاشت.

+

«شونزده ساله رفته. شونزده سال. صبح که بیدار می‌شم دستمو دراز می‌کنم اون‌ور تخت. شونزده ساله. مثل احمق‌ها.» خندید. «می‌خوام دیگه دوستش نداشته باشم. خسته شدم.»

+

نریمان چای ریخت. لیوان را جوری گذاشت که دستهٔ لیوان سمت دست راست پیرزن باشد؛ کاری که دو سال بود بی‌آنکه دربارهٔ‌اش حرفی بزنند انجام می‌داد.

+

«فقط عشقشو ببر. بقیه‌شو نگه دار. خاطره‌ها بمونه، فقط اون تیکه‌ای که درد می‌کنه رو بردار.»

+

«خانم مروارید، صد بار گفتم. اون تیکه‌ای که درد می‌کنه، همونیه که دوستش داری. دوتا نیست. یه چیزه.»

+

«خب پس همه‌شو ببر.»

+

«مطمئنی؟»

+

«آره.»

+

«پس بیا اتاق پشتی.»

+

بلند شد. سه قدم رفت. بعد ایستاد — همان‌جا که همیشه می‌ایستاد، جایی که تختهٔ کف زمین صدا می‌داد — و به سقف نگاه کرد.

+

«اسمش که یادم می‌ره؟»

+

«احتمالاً.»

+

«صداش؟»

+

«احتمالاً.»

+

«اون شبی که تو ایستگاه جا موندیم و تا صبح تو سالن انتظار حرف زدیم و گفت اگه هیچ قطاری نیاد من ناراحت نمی‌شم؟»

+

نریمان جواب نداد.

+

خانم مروارید برگشت. نشست. چایش را برداشت.

+

«چایت خوش‌رنگه امروز.»

+

«ممنون.»

+

«هفتهٔ دیگه میام.»

+

«می‌دونم.»

+

و همیشه، بعد از رفتنش، نریمان مدتی به در بسته نگاه می‌کرد و به این فکر می‌کرد که تنها آدم سالم این شهر همین پیرزنی است که هفته‌ای دو بار می‌آید تا از فروختن پشیمان شود.

+

و بعد به این فکر می‌کرد که خودش، احتمالاً، سالم نیست.

+
+
+ + + +
+
+
+
فصل پنج
+

زنی که آمد بچه‌اش را بفروشد

+
+
+ +

سی‌ودو ساله بود و شبیه کسی بود که چند هفته است نخوابیده و دیگر برایش مهم نیست که معلوم است.

+

ایستاده حرف زد. ننشست. نریمان دو بار تعارف کرد و بار سوم بی‌خیال شد؛ بعضی آدم‌ها اگر بنشینند می‌شکنند و خودشان این را می‌دانند.

+

«می‌خوام پسرمو فراموش کنم.»

+

نریمان دستش را از روی پارچه برنداشت.

+

«چند وقته؟»

+

«چهل‌ودو روز.»

+

چهل‌ودو روز. نه «یک ماه و نیم». آدم‌هایی که می‌شمارند، هنوز وسط ماجرا هستند.

+

«بشینین.»

+

«نمی‌خوام بشینم. می‌خوام کارو بکنین و برم.»

+

نریمان سه انگشت را بالا آورد و قانون‌ها را گفت. تا رسید به دوم، زن حرفش را قطع کرد.

+

«ریشه یعنی چی؟»

+

«یعنی اگه بگی می‌خوام روز تشییع یادم بره، ممکنه کل بچه‌تو ببره. اسمش. صداش. چهار سالی که داشتینش. عکس‌هاش تو گوشیتون می‌مونه و شما نمی‌دونین این بچه کیه.»

+

زن نگاهش کرد. لبخند نزد، اما چیزی در صورتش شبیه لبخند شد.

+

«خب؟»

+

«چی خب؟»

+

«فکر کردین این تهدیده؟» صدایش بالا نرفت. «آقا، من چهل‌ودو روزه صبح‌ها قبل از اینکه چشمم باز شه یادم میاد. هر روز صبح، دو ثانیه، حالم خوبه. بعد یادم میاد. می‌فهمین؟ من روزی یه بار بچه‌مو از دست می‌دم.»

+

مغازه ساکت بود.

+

«شما دارین بهم می‌گین ممکنه همه‌شو ببرین. من دارم بهتون می‌گم لطفاً ببرین.»

+
+

نریمان مدتی طولانی ساکت ماند. بعد کاری کرد که سال‌ها بود نمی‌کرد: از پشت پیشخوان بیرون آمد و روی چهارپایه نشست، هم‌قدِ زنی که ایستاده بود.

+

«یه چیزی رو باید بدونین.» گفت. «اون دو ثانیه‌ای که صبح‌ها حالتون خوبه — اون مال بچه‌تونه. اون خودِ اونه. اگه ببرمش، اون دو ثانیه هم می‌ره.»

+

«خوبه.»

+

«نه، خوب نیست. چون بعدش صبح‌ها بیدار می‌شین و حالتون خوب نیست و دلیلشو نمی‌دونین. اسمش می‌شه افسردگی. می‌رین دکتر و دکتر می‌پرسه اتفاقی افتاده و شما می‌گین نه.»

+

زن پلک زد.

+

«درد بی‌دلیل بدتر از درد بادلیله. اینو من نمی‌گم؛ دوهزارتا شیشهٔ اون بالا می‌گن.»

+

سکوت.

+

و بعد زن، برای اولین بار، نشست. آرام. مثل کسی که پاهایش دیگر قرار نبود نگهش دارند.

+

«پس چیکار کنم؟»

+

و نریمان — مغازه‌دار فراموشخانه، مردی که بیست سال بود کارش خریدن بود — گفت:

+

«هیچی. صبر کنین. یه سال، دو سال. اون دو ثانیه یه روز می‌شه پنج دقیقه. بعد نیم روز. تموم نمی‌شه، ولی جا باز می‌کنه.»

+

«شما از کجا می‌دونین؟»

+

نریمان دهانش را باز کرد تا جواب بدهد و فهمید جوابی ندارد؛ نه از این جهت که نمی‌دانست — از این جهت که وقتی دنبال منبعِ این دانستن گشت، پشت آن شیشهٔ مات چیزی تکان خورد و کنار رفت.

+

«نمی‌دونم.» گفت. «ولی می‌دونم.»

+
+

زن رفت. در که بسته شد، نریمان مدتی به چهارپایهٔ خالی نگاه کرد.

+

شب، بالای پله‌ها، یک فکر آمد سراغش که تا صبح ولش نکرد: بیست سال بود که هزار نفر آمده بودند و هزار بار او گفته بود «بشین» و «بگو» و «تموم شد». امروز اولین باری بود که کسی را برگردانده بود.

+

و به‌جای سبکی، چیزی شبیه شرم حس می‌کرد.

+

انگار امروز، بعد از بیست سال، فهمیده بود که هزار نفر قبلی را می‌شد برگرداند.

+
+
+ + +
+
+
+
فصل شش
+

دختری که آمد چیزی پس بخرد

+
+
+ +

چهاردهم آذر بود که در باز شد و او آمد.

+

بیست‌ونه ساله. کوتاه‌قد. کاپشن نظامی گشادی که اندازه‌اش نبود و بوی مردانه می‌داد. موهایش را محکم بسته بود — از آن بستن‌هایی که آدم پیش از دعوا می‌کند.

+

«بفرمایید.»

+

مستقیم آمد جلوی پیشخوان. به قفسه‌ها نگاه نکرد. کسی که برای اولین بار وارد این مغازه می‌شود، همیشه به قفسه‌ها نگاه می‌کند.

+

«اومدم یه چیزی بخرم.»

+

«اینجا نمی‌فروشیم. فقط می‌خریم.»

+

«می‌دونم.»

+

«پس چی می‌خوای؟»

+

«یه خاطره رو پس بگیرم.»

+

نریمان نشست و پارچه را روی پیشخوان گذاشت.

+

«قانون سوم رو شنیدی؟»

+

«همه قانون سوم رو شنیدن.»

+

«پس جوابمو می‌دونی.»

+

دختر از جیب کاپشن کاغذی درآورد؛ تاخورده، پوسیده، لبه‌ها از بس دست‌به‌دست شده بود نرم شده بودند. با خودکار آبی رویش نوشته بودند:

+
فراموشخانه — کوچهٔ سنگی، بعد از خیاطی. در چوبی.
+

«این خط مادرمه.»

+

نریمان به کاغذ نگاه کرد و نه به دختر.

+

«بیست سال پیش اومد اینجا. یه چیزی فروخت. می‌خوام بخرمش.»

+

«اگه مادرت فروخته، فقط خودش می‌تونه—»

+

«مادرم داره می‌میره.»

+

صدایش بالا نرفت. صاف ماند، که بدتر بود.

+

«چهار ماه، شاید کمتر. یه چیزی فروخت که نباید می‌فروخت و بیست ساله دارم می‌بینم از تو داره می‌پوسه بی‌آنکه بدونه چرا. می‌خوام قبل از رفتنش پسش بگیره.»

+

«چی فروخته؟»

+

مکث کرد. برای اولین بار چیزی در فکش لرزید.

+

«خواهرمو.»

+

باران روی شیشه می‌کوبید.

+

«اسمش نازلی بود. شش سالش بود، من نه سالم. تصادف شد، مادرم اومد اینجا و گفت می‌خوام روز تصادفو فراموش کنم.» نفس کشید. «ریشه‌ش کل نازلی رو برد.»

+

مشت نریمان روی پیشخوان بسته شد.

+

«زنی که بچه‌شو گم کرده باشه گریه می‌کنه. مادر من گریه نمی‌کنه. مادر من بیست ساله عکس نازلی رو تو کشو پیدا می‌کنه و می‌گه این بچه کیه، چقدر شبیه توئه.» آب دهانش را قورت داد. «و هر بار من باید انتخاب کنم بگم یا نگم. و هر بار نمی‌گم. چون اگه بگم فقط یه بار داغ‌دار می‌شه — دوباره از اول. اونم تو چهار ماه آخر عمرش.»

+

سکوت طولانی شد. آن نوع سکوتی که در آن آدم صدای گذشتن ماشین‌های خیابان اصلی را می‌شنود.

+

«اسم مادرت؟»

+

«فرشته آذرنگ.»

+

نریمان بلند شد و به طرف نردبان رفت. «برو خونه. فردا بیا.»

+

«یعنی قبول—»

+

«یعنی برو خونه.»

+

دختر تا چارچوب در رفت. ایستاد. دستش روی دستگیره ماند.

+

«اسم من سوگنده.»

+

و رفت.

+
+

در که بسته شد، مغازه ساکت ماند.

+

نریمان دستش را روی پلهٔ نردبان گذاشت و متوجه شد لب‌هایش دارند تکان می‌خورند. داشت اسم را تکرار می‌کرد. آرام، پشت سر هم، مثل کسی که کلمه‌ای به زبان بیگانه را مزه‌مزه می‌کند تا بفهمد چرا در دهانش آشناست.

+

سوگند. سوگند. سوگند.

+

هیچ چیز نیامد.

+

و این هیچ‌چیز، بعد از بیست سال، اولین بار بود که دردش گرفت.

+
+
+ + +
+
+
+
فصل هفت
+

آنچه در دفتر نیست

+
+
+ +

آن شب دفتر را باز کرد و رفت به سال ۱۳۸۳.

+

آذرنگ، فرشته. صفحهٔ ۲۰۶. با خط ریز و مورب خانم فیروز:

+
۲۹ بهمن ۸۳ — آذرنگ، فرشته. ۳۴ ساله.
«روز تصادف.»
ریشهٔ عمیق. هشدار داده شد. اصرار کرد.
قفسهٔ ۹، ردیف ۲.
+

نردبان را برد به قفسهٔ نه. ردیف دو را از اول تا آخر گشت. دوبار. سه‌بار.

+

نبود.

+

و جای خالی هم نبود؛ شیشه‌ها به هم چسبیده بودند، مرتب، انگار هرگز چیزی آنجا نبوده. کسی که نمی‌دانست، هرگز نمی‌فهمید.

+

برگشت سراغ دفتر. ورق زد. صفحهٔ ۲۰۷. بعد شش لبهٔ بریده. بعد ۲۱۴.

+

میان ۲۹ بهمن ۸۳ و ۱۹ خرداد ۸۴، چهار ماه از تاریخ این مغازه با تیغ برداشته شده بود.

+

نریمان دفتر را بست و به دست‌هایش نگاه کرد.

+

خانم فیروز تابستان ۸۴ مرده بود. و نریمان از ۸۴ اینجا بود.

+

یک سؤال ساده در سرش شکل گرفت. سؤالی که هر آدمی روی زمین در نصف ثانیه جوابش را می‌دهد.

+

من قبلش کجا بودم؟

+

روی پلهٔ اول نشست.

+

می‌دانست چطور نان بپزد، پس یک‌جایی یاد گرفته بود. می‌دانست چطور با بچه حرف بزند، پس یک‌جایی بچه‌ای بوده. زبان بلد بود، شهر را بلد بود، اسم خیابان‌ها را بلد بود.

+

اما وقتی می‌خواست پیش از سال ۸۴ را به یاد بیاورد، چیزی مثل شیشهٔ مات جلو می‌آمد. نه سیاهی — شیشهٔ مات. پشتش چیزی بود. حرکت می‌کرد.

+

بیست دقیقه فکر کرد.

+

و بعد کاری کرد که بیست سال نکرده بود: بلند شد، رفت جلوی آینهٔ کوچک بالای دستشویی مغازه ایستاد، و از خودش پرسید:

+

«تو کی هستی؟»

+

مردی خاکستری در آینه نگاهش کرد و جوابی نداشت.

+
+
+ + +
+ +
دفتر دوم
+

دختر

+
بیست سالی که کسی ندید
+
+ + +
+
+
+
فصل هشت
+

نه‌سالگی

+
+
+ +

صبح‌ها بوی نان می‌آمد و این یعنی همه‌چیز سر جایش است.

+

سوگند این را از مادرش یاد نگرفته بود؛ خودش کشف کرده بود. سال‌ها بعد، وقتی از او می‌پرسیدند کِی فهمیدی که خانه‌تان خراب شده، می‌گفت: آن صبحی که رفتم پایین و بوی نان نمی‌آمد.

+

چهار ماه از تصادف گذشته بود.

+

در آن چهار ماه، خانه یاد گرفته بود چطور دور یک اسم راه برود بی‌آنکه پایش به آن بخورد. کسی نازلی نمی‌گفت. اتاق نازلی می‌شد «اون اتاق». کفش‌های نازلی رفته بودند، اما جای کفش‌ها روی جاکفشی مانده بود؛ یک مستطیل تمیز روی چوب غبارگرفته.

+

سوگند نه سالش بود و بلد شده بود گریه نکند، چون دیده بود گریه‌کردنش مادرش را از پا می‌اندازد. یاد گرفته بود شب‌ها زیر پتو، بی‌صدا، با مشت جلوی دهانش. یاد گرفته بود صبح‌ها صورتش را با آب سرد بشوید تا قرمزی چشم‌ها برود.

+

نه سالش بود و رژیم شغلی داشت: نگهبان.

+
+

و پدرش، در آن چهار ماه، ساکت شده بود.

+

نه از آن سکوت‌های ترسناک. سکوت مهربان. می‌نشست، گوش می‌داد، سر تکان می‌داد. مشقش را نگاه می‌کرد. یک بار برایش قایق کاغذی درست کرد و توی جوی آب انداخت و تا سر کوچه دنبالش دویدند.

+

سوگند بعدها فهمید آن قایق، آخرین چیزی بود که پدرش برای دخترش ساخت.

+

آن هفته پدر چند بار دیر آمد خانه. یک شب لباسش خیس بود. یک شب کاغذی در جیبش بود که سوگند ندید و مادرش دید و چیزی نگفت.

+
+

و بعد آن صبح آمد.

+

سوگند از پله‌ها پایین رفت. بوی نان نمی‌آمد. آشپزخانه روشن بود و پدرش وسط آشپزخانه ایستاده بود، با پیراهن دیشب، و به قوری نگاه می‌کرد؛ همان‌طور که آدم به وسیله‌ای نگاه می‌کند که نمی‌داند مال کیست.

+

«سلام بابا.»

+

پدرش برگشت.

+

و نگاهش کرد.

+

سوگند تمام عمرش سعی کرد آن نگاه را برای کسی توصیف کند و نتوانست. بدجنس نبود. سرد نبود. اگر سرد بود، تحمل‌کردنی‌تر می‌شد. آن نگاه مؤدب بود. نگاه مردی که در مهمانی به بچهٔ صاحب‌خانه لبخند می‌زند.

+

پدرش لبخند زد و گفت:

+

«سلام دخترم. مامانت کجاست؟»

+

و بعد، وقتی مادر از راهرو آمد، رو کرد به او و با همان لبخند، با همان صدای معمولی، همان صدایی که با آن قصه می‌گفت و شوخی می‌کرد، پرسید:

+

«فرشته... این بچه کیه؟»

+
+

چیزی که در آن لحظه شکست، صدا نداشت.

+

سوگند بعدها هزار بار این صحنه را در سرش پخش کرد و هر بار روی یک جزئیات دیگر ایستاد. روی اینکه شیر آب باز مانده بود. روی اینکه مادرش دستش را به لبهٔ کابینت گرفت و ناخنش شکست و تا یک ماه آن ناخن شکسته بود و کسی درستش نکرد. روی اینکه خودش، نه‌ساله، اولین چیزی که به ذهنش رسید این بود که حتماً کار اشتباهی کردم.

+

بچه‌ها همیشه فکر می‌کنند تقصیر خودشان است. این نه از حماقت است؛ از این است که ترجیح می‌دهند دنیایی داشته باشند که در آن، اگر خوب باشی، اتفاق بد نمی‌افتد.

+

سوگند آن روز به مدرسه نرفت.

+

در راهرو نشست و از لای در نگاه کرد که مادرش عکس‌ها را می‌آورد و جلوی پدرش می‌گذارد و پدرش با احترام و علاقه‌ای وحشتناک نگاهشان می‌کند و می‌گوید: «چه دختر بامزه‌ایه.»

+

پدرش دو هفته ماند.

+

دو هفته‌ای که سوگند تمامش را صرف یک نقشه کرد: اگر آن‌قدر شبیه دختری بشوم که او یادش رفته، شاید یادش بیاید. موهایش را همان‌طور بست که در عکس‌ها بود. همان لباس را پوشید. رفت جلویش و اسمش را گفت، بلند، دوبار.

+

پدرش دستی روی سرش کشید — مثل کسی که به گربهٔ همسایه دست می‌کشد — و گفت: «آفرین.»

+

شب چهاردهم، پدرش رفت.

+

سوگند بیدار بود. صدای در را شنید. تا پنجره دوید و دید که مردی در انتهای کوچه، زیر تیر چراغ برق، ایستاده و بالا را نگاه می‌کند؛ نه پنجرهٔ او را — سقف را، آسمان را، چیزی را که آنجا نبود.

+

بعد رفت.

+

سوگند تا صبح پشت پنجره ماند، چون فکر می‌کرد اگر بس نکند، اگر یک ثانیه هم چشم برندارد، شاید مرد برگردد.

+

این اولین شبِ نگهبانی‌اش بود.

+

بیست سال طول کشید.

+
+
+ + +
+
+
+
فصل نه
+

خانه‌ای با دو غایب

+
+
+ +

مادرش به همه گفت که پدر مرده است.

+

سوگند هیچ‌وقت تصحیحش نکرد. یازده سالش بود که فهمید چرا: چون «مرده» یک کلمه است که مردم بلدند با آن چه کار کنند. برایش شکلات می‌آورند، سرشان را تکان می‌دهند، بعد از شش ماه فراموش می‌کنند و زندگی ادامه پیدا می‌کند. اما «رفت و مرا نشناخت» کلمه‌ای نیست که کسی بلد باشد با آن چه کند. آدم‌ها فقط می‌ترسند و فاصله می‌گیرند.

+

پس سوگند یاد گرفت دروغ مادرش را حمل کند. این هم شغل دومش شد.

+
+

مادرش، فرشته آذرنگ، زن عجیبی شده بود.

+

نه دیوانه. برعکس: بیش از حد عادی. سر کار می‌رفت، غذا می‌پخت، قبض‌ها را می‌داد، عید خانه‌تکانی می‌کرد. اگر کسی از بیرون نگاه می‌کرد می‌گفت زنی است که با شرافت از یک مصیبت عبور کرده.

+

ولی یک جای کارش خالی بود، مثل اتاقی در خانه که دیوارش را کشیده باشند رویش.

+

مثلاً وقتی چهار تا تخم‌مرغ می‌شکست برای سه نفری که دیگر سه نفر نبودند. مثلاً وقتی جلوی کفش‌فروشی می‌ایستاد و به کفش‌های بچگانه نگاه می‌کرد و بعد سرش را تکان می‌داد و می‌گفت «حواسم پرت شد». مثلاً وقتی موقع خواب دستش را دراز می‌کرد و چراغ اتاقی را که کسی در آن نبود خاموش می‌کرد.

+

سوگند به این‌ها می‌گفت جای پا. نازلی رفته بود، اما جای پایش در مادرش مانده بود؛ و مادرش هر روز، بی‌آنکه بداند، در آن‌ها پا می‌گذاشت و لنگ می‌زد.

+
+

یک بار — سیزده ساله بود — طاقت نیاورد.

+

عکس را از کشو درآورد و روی میز آشپزخانه گذاشت. عکسِ دو دختر روی پله‌های حیاط، یکی بزرگ‌تر با لبخند نصفه، یکی کوچک‌تر با کفش چپ در دست.

+

«مامان، این کیه؟»

+

مادرش نگاه کرد. خم شد. با انگشت روی صورت بچهٔ کوچک‌تر کشید.

+

«چه بچهٔ نازیه.» گفت. «چقدر شبیه توئه. دخترخالته؟»

+

و سوگند دهانش را باز کرد.

+

و بست.

+

و آن شب، برای اولین بار بعد از چهار سال، مثل بچه‌ها گریه کرد — نه از غم، از خشم — و بعد صورتش را شست و عکس را برد و در کشو گذاشت، سر جای اولش، زیر شناسنامه‌ها.

+

آن شب یک تصمیم گرفت که تا بیست‌ونه سالگی همراهش ماند:

+

من یادم می‌ماند. به‌جای هر سه‌تاشان.

+

و مثل هر تصمیم بزرگی که آدم در سیزده‌سالگی می‌گیرد، این یکی هم شکل عشق داشت و کار زندان را می‌کرد.

+
+
+ + +
+
+
+
فصل ده
+

شانزده‌سالگی

+
+
+ +

کاغذ را تصادفی پیدا کرد، پشت قاب عکس عروسی.

+

خط مادرش بود. سه کلمه و یک آدرس. کوچهٔ سنگی، بعد از خیاطی، در چوبی.

+

سوگند شانزده ساله بود و باهوش‌تر از آن که فکر کند این یک آدرس معمولی است، چون آدم آدرس خیاطی را پشت قاب عکس عروسی‌اش قایم نمی‌کند.

+

سه هفته طول کشید تا کوچه را پیدا کند. آن روزها هنوز باید از آدم‌ها می‌پرسیدی، و آدم‌ها وقتی اسم آن مغازه را می‌شنیدند یک جور خاصی نگاهت می‌کردند: نصف دلسوزی، نصف اینکه چه زود.

+

پنجشنبه، ساعت پنج بعدازظهر، رسید سر کوچه.

+

و ایستاد.

+

مغازه ته کوچه بود. چراغش روشن بود. پشت شیشهٔ بخارگرفته، یک نفر پشت پیشخوان تکان می‌خورد.

+

سوگند شروع کرد به راه رفتن. بیست قدم. پانزده. ده.

+

و بعد مرد سرش را بلند کرد.

+

موهایش خاکستری بود. لاغرتر شده بود. اما فک، اما شانه‌ها، اما آن حرکتی که با شست به گوشهٔ ابرو می‌کرد وقتی فکر می‌کرد—

+

سوگند سر جایش خشک شد.

+

سه متر با در فاصله داشت.

+

و در آن سه متر، در همان چند ثانیه، تمام آن چیزی که از نه‌سالگی تا آن روز ساخته بود فرو ریخت. چون تا آن روز، پدرش یک ماجرا بود. یک بی‌عدالتی. چیزی که در سرش با آن حرف می‌زد و در سرش جوابش را می‌داد و همیشه در آن گفت‌وگوها، آخرش، پدر می‌فهمید و پشیمان می‌شد و بغلش می‌کرد.

+

اما این مرد پشت شیشه، ماجرا نبود. یک آدم بود که داشت لیوان می‌شست.

+

و اگر در می‌زد، آن آدم برمی‌گشت و می‌گفت: بفرمایید؟

+

سوگند بعدها فکر کرد که آدم‌ها معمولاً از حقیقت نمی‌ترسند. از این می‌ترسند که حقیقت را امتحان کنند و ببازند و بعد دیگر حتی امیدِ نتیجهٔ دیگر را هم نداشته باشند. تا وقتی در نزده‌ای، هر دو جواب ممکن است.

+

برگشت.

+

تا سر خیابان راه رفت، سوار اتوبوس شد، ته اتوبوس نشست، و تا خانه گریه کرد؛ آرام، رو به شیشه، طوری که هیچ‌کس نفهمد.

+

و همان شب، پشت جلد دفتر ریاضی‌اش، با خودکار آبی نوشت:

+
پنجشنبه. چراغ روشن بود.
+
+
+ + +
+
+
+
فصل یازده
+

پنجشنبه‌ها

+
+
+ +

سیزده سال طول کشید. یعنی ششصد و چند پنجشنبه.

+

مسیرش همیشه یکی بود: اتوبوس تا میدان، پیاده تا خیابان اصلی، بعد کوچهٔ سنگی. تا نبش کوچه می‌آمد، به دیوار تکیه می‌داد، و نگاه می‌کرد که چراغ روشن است یا نه.

+

اگر روشن بود، ده دقیقه می‌ماند و برمی‌گشت.

+

اگر خاموش بود، بیشتر می‌ماند.

+

هیچ‌وقت در نزد.

+
+

در آن سیزده سال، سوگند بزرگ شد؛ همان‌طور که آدم‌ها در حاشیهٔ یک انتظار بزرگ می‌شوند. دانشگاه رفت و نصفه رها کرد. در دو جا کار کرد. یک بار عاشق شد و پسر بعد از یک سال گفت «تو یه جاییت همیشه اینجا نیست» و راست می‌گفت و سوگند نتوانست بگوید آن جا کجاست.

+

دوستانش می‌گفتند باید بروی جلو. می‌گفتند بابات مُرده — چون همه فکر می‌کردند مرده — می‌گفتند نمی‌شه که تا آخر عمر.

+

و سوگند سر تکان می‌داد و پنجشنبه می‌رفت سر کوچه.

+

گاهی از خودش بدش می‌آمد. گاهی برای خودش توضیح می‌ساخت: می‌روم چون باید مطمئن باشم زنده است، چون یک روز مادرم می‌پرسد، چون شاید یک روز حالش بد شود و کسی نباشد.

+

هیچ‌کدام راست نبود.

+

حقیقت ساده‌تر و بی‌آبروتر بود: تا وقتی آن چراغ روشن بود، سوگند دختر یک نفر بود. کسی در این شهر بود که — هرچند نمی‌دانست — پدرش حساب می‌شد. اگر در می‌زد و آن مرد نمی‌شناختش، این آخرین ذره هم می‌رفت.

+

پس نمی‌زد. و می‌آمد. و باز نمی‌زد.

+

آدم می‌تواند سیزده سال از یک زخم تغذیه کند، به شرطی که هرگز نگذارد ببندد.

+
+

یک پنجشنبه — بیست‌ودو ساله بود — چراغ خاموش بود و در نیمه‌باز.

+

سوگند تا دم در رفت. صدای شکستن چیزی از داخل آمد و بعد صدای مردی که فحش داد.

+

فحش نمی‌داد. پدرش هیچ‌وقت فحش نمی‌داد.

+

سوگند ایستاد و به این فکر کرد که آن مرد داخل، بیست سال است دارد کسی می‌شود که او نمی‌شناسد. که همان‌قدر که پدرش او را از دست داده، او هم دارد کسی را از دست می‌دهد که هر پنجشنبه می‌آید سراغش. که شاید هر دویشان دارند یک آدم مرده را نگه می‌دارند.

+

برگشت.

+

و آن هفته، برای اولین بار، در دفترش ننوشت.

+
+
+ + +
+
+
+
فصل دوازده
+

تصمیم

+
+
+ +

آبان بود که مادرش گفت چیزی نیست.

+

سوگند بلد بود مادرش کِی می‌گوید چیزی نیست. همان لحنی که با آن گفته بود بابا مرده.

+

دو هفته بعد، در راهروی یک بیمارستان، پزشکی جوان با مهربانی خسته‌ای برایش توضیح داد که چقدر وقت مانده. سوگند سر تکان داد، تشکر کرد، رفت پایین، در پارکینگ ایستاد و بیست دقیقه به یک ستون بتنی نگاه کرد.

+

بعد اتوبوس گرفت و رفت خانه و شام درست کرد.

+
+

آن شب مادرش سر میز نشسته بود و برنج را با چنگال جابه‌جا می‌کرد.

+

«سوگند.»

+

«جانم.»

+

«یه چیزی هست که نمی‌دونم چیه.»

+

سوگند دستش از حرکت ایستاد.

+

«یه چیزی گم کردم.» مادرش به بشقاب نگاه می‌کرد. «نمی‌دونم چی. ولی هست. مثل وقتی از خونه میای بیرون و مطمئنی یه چیزی رو جا گذاشتی و هرچی فکر می‌کنی یادت نمیاد چی.» سرش را بلند کرد و لبخند زد؛ لبخندی که سوگند بیست سال بود می‌دیدش و هر بار یک تکه از او را می‌کند. «بیست ساله دارم از خونه میام بیرون، مادر.»

+

سوگند بلند شد، ظرف‌ها را برد آشپزخانه، شیر آب را باز کرد تا صدا بدهد، و همان‌جا، رو به دیوار، دستش را گذاشت جلوی دهانش.

+

چهار ماه.

+

یعنی مادرش قرار بود با آن جای خالی بمیرد. یعنی آخرین فکر آن زن، در آخرین اتاق، این بود که یک چیزی را جا گذاشته و هرگز نفهمید چه.

+

و سوگند تنها کسی روی زمین بود که می‌دانست چه.

+
+

آن شب تا صبح روی زمین اتاقش نشست و کاغذ تاخورده را از پشت قاب درآورد.

+

سیزده سال بود که همراهش بود. لبه‌هایش نرم شده بود.

+

و برای اولین بار، مسئله دیگر پدرش نبود.

+

این تفاوت را باید می‌فهمید تا بتواند از خانه بیرون برود: سیزده سال، هر پنجشنبه، برای خودش رفته بود. برای آن ذرهٔ دختربودن. و به همین دلیل هیچ‌وقت نتوانسته بود در بزند — چون هرچه از خودت بخواهی، ترس هم از خودت می‌آید.

+

اما این‌بار برای خودش نمی‌رفت.

+

سوگند صبح موهایش را بست. محکم. کاپشن پدرش را — تنها چیزی که از او مانده بود، و آن هم فقط چون در جالباسی جا مانده بود — پوشید.

+

و رفت.

+

سر کوچه، همان جای همیشگی، به دیوار تکیه داد.

+

چراغ روشن بود.

+

سوگند نگاه کرد و برای بار سیصدوچندم فکر کرد که می‌تواند برگردد. که هنوز دیر نشده. که تا در نزده، هر دو جواب ممکن است.

+

بعد از دیوار جدا شد و راه افتاد.

+

بیست قدم. پانزده. ده. سه.

+

دستش را بالا آورد.

+

و در زد.

+
+
+ + + +
+ +
دفتر سوم
+

معامله

+
شیشه تقریباً خالی است
+
+ + +
+
+
+
فصل سیزده
+

جناب فرهود

+
+
+ +

مردی که فردایش آمد چتر نداشت و خیس هم نبود؛ راننده‌اش تا دم در آورده بودش.

+

کت‌وشلوار خاکستری، ساعت گران، و آن نوع خوش‌رویی که آدم را می‌ترساند چون هیچ‌وقت خاموش نمی‌شد.

+

«آقای نریمان صدر. بالاخره.» دست دراز کرد. «فرهود. کیوان فرهود.»

+

نریمان دست نداد. «مشتری‌این؟»

+

«شریک.» دور مغازه چرخید. «خدای من. چندتاست؟»

+

«نمی‌شمرم.»

+

«چرا؟»

+

«چون عدد نیستن.»

+

فرهود خندید و به پیشخوان تکیه داد.

+

«می‌دونی مشکل اینجا چیه؟ مقیاس نداره. روزی چند مشتری داری؟ سه‌تا؟ و باید ساعت‌ها بشینی گوش بدی. حیفه. تو معدن طلا داری و با قاشق چایخوری می‌کَنی.»

+

«پیشنهادت؟»

+

«شعبه. سیستم. اپراتور آموزش‌دیده.» دست‌هایش را باز کرد. «هر شهر یکی. تعرفهٔ مشخص: خاطرهٔ سبک، متوسط، سنگین. بیمه طرف قرارداد بشه. کی تو این مملکت درد نداره؟ همه دارن. ما فقط داریم خدمات می‌دیم.»

+

«شیشه‌ها کجا می‌ره؟»

+

«انبار مرکزی. من روش نگهداری بهتری دارم. صنعتی. سردخونه. تو با نردبون چوبی کار می‌کنی، مرد.»

+

«کی نگهشون می‌داره؟»

+

«گفتم که، انبار—»

+

«نه.» نریمان بلند شد. «کی؟ کدوم آدم؟ اینا تو شیشه نمی‌مونن. نشت می‌کنن. یکی باید شب‌ها بالا سرشون بخوابه و خوابشونو ببینه. من دوهزارتا دارم؛ نگاه کن به من. صد هزارتا رو کی می‌خوابه؟»

+

لبخند فرهود سر جایش ماند، اما چیزی پشتش تکان خورد.

+

«جالبه. این قسمتشو نشنیده بودم.»

+

«چون کسی رو نداشتی که ازش بپرسی.»

+

فرهود مدتی به قفسه‌ها نگاه کرد. بعد چیزی گفت که نریمان انتظارش را نداشت.

+

«من هفت بار رفتم.»

+

«کجا؟»

+

«جاهایی مثل اینجا. تو کشورهای مختلف. آدمایی که ادعا می‌کردن بلدن.» ساعتش را صاف کرد؛ اولین حرکت غیرحرفه‌ای‌اش. «هیچ‌کدوم نتونستن. یه چیزی هست که نوزده ساله دارم حملش می‌کنم و هیچ‌کس نتونسته ازم بگیردش.»

+

«چون بلد نبودن؟»

+

«چون—» لبخندش برگشت، سفت‌تر از قبل. «شاید بعضی چیزا رو نمی‌شه گفت. و چیزی که نگی، فروخته نمی‌شه.»

+

نریمان نگاهش کرد. برای اولین بار، این مرد شبیه مشتری‌ها شده بود.

+

«می‌تونم بشینم پای حرفت. مجانی.»

+

«نه.» فرهود کارتش را روی پیشخوان گذاشت. «من نیومدم اینجا مشتری بشم. اومدم صاحب بشم.» تا در رفت. «فکراتو بکن. من صبورم — تا یه حدی.»

+

رفت.

+

نریمان کارت را برنداشت. عصر که سوگند آمد، کارت هنوز همان‌جا بود.

+
+
+ + +
+
+
+
فصل چهارده
+

آقای شکوهی نام خودش را گم می‌کند

+
+
+ +

پنجشنبه بود که شکوهی آمد و نتوانست بگوید چه می‌خواهد بفروشد.

+

روی چهارپایه نشست، انگشت‌ها را قفل کرد، دهانش را باز کرد و بست.

+

«یه چیزی بود.»

+

«اشکال نداره.»

+

«نه، یه چیزی بود. مهم بود. تو راه یادم بود.» با کف دست به پیشانی زد. «لعنتی.»

+

«آقای شکوهی. اسم شما چیه؟»

+

نگاهش کرد. لبخند زد؛ همان لبخند معذرت‌خواهانه. «چه سؤال مسخره‌ای.»

+

«بگین.»

+

و آقای شکوهی دهانش را باز کرد، و چیزی نیامد.

+

سکوتی که آمد، سکوت اتاق عمل بود.

+

نریمان از پشت پیشخوان بیرون آمد، کنارش نشست، دست روی شانهٔ خیسش گذاشت — همان شانهٔ چپ، همان چتر شکسته.

+

«اسم شما کامران شکوهیه. متولد تیر. تو ادارهٔ ثبت کار می‌کردین و بازنشسته شدین. یه خواهرزاده دارین که عروسیش پنج سال پیش بود و شما اونجا آواز خوندین.»

+

«آره.» تندتند سر تکان داد، مثل کسی که به قایق چنگ می‌زند. «آره. کامران. کامران.»

+

«از هفتهٔ دیگه دیگه نیاین.»

+

نگاهش کرد.

+

«جدی می‌گم. دیگه ازتون چیزی نمی‌خرم.»

+

«چرا؟»

+

نریمان به قفسهٔ سمت چپ اشاره کرد. ردیف چهارم.

+

«اونا شرم‌های شما نیستن، آقای شکوهی. اونا خودِ شمان. هر آدمی از هزارتا لحظهٔ خجالت‌آور ساخته شده. اون شرم‌ها چسبیه که آدمو به آدمای دیگه وصل می‌کنه؛ برای همینه که وجود دارن. اگه همه‌شو در بیاری، چیزی که می‌مونه آدم نیست. یه اتاق خالیه.»

+

شکوهی مدتی سی‌وهفت شیشه را نگاه کرد.

+

«می‌شه پسشون بگیرم؟»

+

و نریمان — که هزار بار این سؤال را شنیده بود و هزار بار یک جواب داده بود — این‌بار مکث کرد.

+

«نه.»

+

مرد بلند شد. چتر شکسته را برداشت.

+

«خداحافظ آقای... ببخشید، اسم شما چی بود؟»

+

«نریمان.»

+

«خداحافظ آقا نریمان.»

+

در که بسته شد، نریمان به کارت ویزیت روی پیشخوان نگاه کرد، بعد به قفسه‌ها، بعد به دست‌های خودش.

+

چند هفته پیش، وقتی آن زن را برگردانده بود، برای اولین بار از خودش پرسیده بود که این مغازه دارد به آدم‌ها کمک می‌کند یا آرام‌آرام می‌خوردشان. آن سؤال از آن روز نرفته بود؛ فقط منتظر مانده بود تا کسی نام خودش را گم کند و برگردد.

+

و بعد فکر سردتری آمد: اگر شکوهی سی‌وهفت‌تا فروخت و اسمش را گم کرد، من که دوهزارتا خوابیده‌ام چه گم کرده‌ام؟

+
+
+ + +
+
+
+
فصل پانزده
+

طبقهٔ زیرزمین

+
+
+ +

دریچه زیر فرش بود و بیست سال بود بازش نکرده بود.

+

خانم فیروز، هفتهٔ آخر، با انگشت به آن اشاره کرده بود: «اون پایین چیزهاییه که نباید فروخته می‌شد. نرو تا وقتی مجبور نشدی. اون‌وقت خودت می‌فهمی.»

+

چراغ‌قوه را روشن کرد و پایین رفت.

+

سرد بود. بوی خاک و چوب کهنه. و ته فضا، یک قفسهٔ کوچک. فقط یکی. با پارچهٔ سفیدی رویش.

+

پارچه را کنار زد.

+

این شیشه‌ها برچسب داشتند. برچسب واقعی. با اسم.

+
    +
  • دلارام فیروز
  • +
  • رحیم دستغیب
  • +
  • مینو صفار
  • +
  • فرشته آذرنگ
  • +
  • نریمان صدر
  • +
+

قلبش ایستاد و بعد، با تأخیر، دوباره راه افتاد.

+

اسم خودش. با خط خانم فیروز.

+

شیشه را برداشت. سنگین بود — سنگین‌تر از هر چیزی که تا حالا در دست گرفته بود. مایع درونش سیاه نبود؛ طلایی بود. طلایی کدر، مثل عسلی که سال‌ها مانده باشد.

+

کنارش لوله‌ای کاغذی بود، بسته با نخ. روی نخ برچسبی: برای هر کس که این را پیدا کرد.

+

نریمان روی پلهٔ زیرزمین نشست و نخ را باز کرد.

+
+
+ + +
+
+
+
فصل شانزده
+

نامهٔ دلارام فیروز

+
+
+ +
+

هر که هستی، حالا فهمیده‌ای که چیزی از تو کم است.

+

پس کوتاه می‌نویسم. مغازه‌دار فراموشخانه انتخاب نمی‌شود. ساخته می‌شود.

+

این مغازه قانون چهارمی دارد که به مشتری نمی‌گوییم، چون اگر بگوییم دیگر کسی نمی‌آید: هر خاطره‌ای که فروخته می‌شود، باید کسی حملش کند. ما دلال نیستیم. ما اسکله‌ایم. بار روی ما خالی می‌شود.

+

و کسی که بار هزار نفر را برمی‌دارد، باید جای خالی داشته باشد. آدمِ پر ظرفیت ندارد. برای همین مغازه‌دار همیشه کسی است که خودش، یک بار، سنگین‌ترین چیزش را فروخته و نمی‌داند چه فروخته است.

+

من هم فروختم. سال ۵۴. سی سال است هر صبح برای کسی که نمی‌دانم کیست دلم تنگ می‌شود. گاهی وسط کار می‌ایستم و به در نگاه می‌کنم. نمی‌دانم منتظر کی‌ام.

+

شیشه‌ای که اسم خودت رویش است، همان چیزی است که فروختی. مال توست. حق داری برش داری. اما بدان:

+

اگر پسش بگیری، دیگر مغازه‌دار نیستی. کسی که پر است نمی‌تواند بلعنده باشد. همان روز باید در را ببندی.

+

و در این شهر هزار نفرند که شب‌هایشان به این بسته است که یکی، جایی، بارشان را روی دوش دارد. اگر در بسته شود، خاطره‌ای که نگهدارنده ندارد برمی‌گردد سراغ صاحبش. یک‌جا. بی‌هشدار. تصورش را بکن: زنی که چهل سال پیش بچه‌اش را فروخت تا زنده بماند، یک بعدازظهر ساده، وسط نان خریدن، همه‌اش را پس بگیرد.

+

من نتوانستم. سی سال شیشه‌ام را نگاه کردم و برنداشتم. نمی‌گویم کار درستی کردم. می‌گویم نتوانستم.

+

یک چیز دیگر، و بعد تنهایت می‌گذارم.

+

روزی کسی می‌آید و می‌خواهد خاطرهٔ آدم دیگری را پس بگیرد. ممکن است. اما رایگان نیست؛ قانون این مغازه دادوستد است، نه بخشش. برای بازگشتِ یک خاطره، کسی باید هم‌وزنش چیزی بدهد. و آن کس، صاحب خاطره نیست — کسی است که می‌خواهدش.

+

به او همین را بگو، بعد ساکت شو و بگذار خودش تصمیم بگیرد. تو حق نداری این تصمیم را برای کسی بگیری.

+

من یک بار گرفتم. برای مردی که خیلی جوان بود و خیلی داغان و آمده بود یک روز بارانی را بفروشد. دیدم چه چیزی به ریشه‌اش چسبیده. دیدم و نگفتم، چون فکر کردم دارم رحم می‌کنم.

+

و تا امروز خودم را نبخشیده‌ام.

+

دلارام فیروز — مرداد ۱۳۸۴

+
+ +

نریمان نامه را دوبار خواند.

+

بعد شیشهٔ اسم خودش را در نور چراغ‌قوه بالا آورد. مایع طلایی آرام تکان خورد؛ مثل کسی که در خواب پهلو عوض می‌کند.

+

مردی که خیلی جوان بود.

+

دستش دور شیشه محکم شد.

+

و بعد باز شد.

+

بالا آمد. دریچه را بست. فرش را انداخت. رفت پشت پیشخوان و تا صبح نشست، و تمام آن شب یک چیز را فهمید و از فهمیدنش نتوانست فرار کند: کسی که بیست سال بار این شهر را برداشته بود، خودش یک بار جایی چیزی گذاشته و رفته بود.

+
+
+ + +
+
+
+
فصل هفده
+

آنچه سوگند می‌داند

+
+
+ +

صبح، ساعت هفت، سوگند در زد.

+

نریمان در را باز کرد. لباس دیروز تنش بود.

+

«چیزی پیدا کردی؟»

+

«بشین.»

+

شیشه‌ای را روی پیشخوان گذاشت. برچسب: فرشته آذرنگ.

+

سوگند دست دراز کرد و نگه داشت، انگار شیشه داغ باشد.

+

«خواهرت اینجاست.»

+

«همه‌ش؟»

+

«همه‌ش.»

+

نفس عمیقی کشید. «چقدر؟»

+

«پول نیست.»

+

«پس چی؟»

+

نریمان قانون را گفت، همان‌طور که خانم فیروز نوشته بود: خاطره برمی‌گردد اگر کسی که می‌خواهدش هم‌وزنش بدهد. نه پول. نه سال عمر. خاطره در برابر خاطره. و وزن بی‌رحم است: نازلیِ شش‌ساله با تمام شش سالش، سنگین‌ترین چیزی است که در این مغازه هست.

+

«یه چیز دیگه هم هست.» گفت. «و این یکی رو باید خوب بفهمی.»

+

«بگو.»

+

«تو بیست ساله نازلی رو یادته. بیست ساله می‌تونستی بشینی جلوی مادرت و همه‌شو تعریف کنی. چرا نکردی؟»

+

«چون می‌ترسیدم.»

+

«نه.» نریمان سر تکان داد. «چون فایده نداشت. صد بارم تعریف می‌کردی، مادرت فقط یه قصه می‌شنید. مثل قصهٔ بچهٔ همسایه. غصه می‌خورد و می‌رفت.» انگشتش را روی شیشه گذاشت. «چیزی که تو مغازه در میاد، با حرف زدنِ معمولی برنمی‌گرده. فقط یه چیز می‌تونه برش گردونه: کسی که خودش حاملشه بشینه و بگه.»

+

سوگند به شیشه نگاه کرد و کم‌کم فهمید.

+

«یعنی اول باید بیاد تو من.»

+

«آره.»

+

«و بعد که برای مادرم گفتم...»

+

«از تو می‌ره.» صدایش پایین آمد. «حمل کردن یعنی همین. یه نفر داره. دو نفر نه. اگه بدیش به مادرت، مالِ مادرت می‌شه و دیگه مال تو نیست.»

+

مغازه ساکت شد.

+

«پس من نازلی رو هم از دست می‌دم.»

+

«آره.»

+

«یعنی من باید چی بدم؟»

+

«چیزی به همون سنگینی.»

+

«سنگین‌ترین چیز من خود نازلیه.»

+

«می‌دونم.»

+

سوگند بلند شد، رفت کنار پنجره، مدتی کوچه را نگاه کرد. از این‌طرف شیشه، کوچه کوچک‌تر به نظر می‌رسید.

+

«یه چیز دیگه هم هست که سنگینه.»

+

«چی؟»

+

برگشت. و نگاهش، برای اولین بار در این چند روز، مستقیم در چشم‌های نریمان نشست.

+

«بابام.»

+

نریمان تکان نخورد.

+

«بابام تو اون تصادف نمرد. زنده موند.» صدایش همان صافیِ ترسناک را داشت. «چهار ماه بعدش گم شد. نه اینکه فرار کرده باشه — گم شد. من نه سالم بود و یه روز صبح رفتم تو آشپزخونه و دیدم بابام وایساده داره منو نگاه می‌کنه؛ همون‌جوری که آدم بچهٔ همسایه رو نگاه می‌کنه.»

+

صدای چکهٔ ناودان از بیرون می‌آمد.

+

«از مادرم پرسید این بچه کیه.»

+

نریمان دستش را روی پیشخوان گذاشت تا نلرزد.

+

«دو هفته موند. بعد رفت. مادرم بیست سال گفت مرده. نه سالم بود ولی احمق نبودم. شونزده سالگی پیداش کردم.» مکث. «سیزده ساله هفته‌ای یه بار میام تو این کوچه و از دور نگاه می‌کنم چراغ مغازه روشنه یا نه.»

+

نریمان چشم بست.

+

و در تاریکی پشت پلک‌هایش، برای اولین بار در بیست سال، چیزی از پشت آن شیشهٔ مات حرکت کرد؛ نه تصویر، نه صدا — یک وزن. وزن چیزی روی شانه. وزن بچه‌ای که خوابش برده و باید تا اتاق بردش.

+

«اسم من سوگند صدره.»

+

باران گرفت.

+

«و شما پدر منی.»

+
+

نریمان چشم باز کرد.

+

و کاری کرد که سوگند در هیچ‌کدام از آن سیصد پنجشنبه تصورش را نکرده بود. نه گریه کرد، نه انکار کرد، نه بغلش کرد.

+

بلند شد، رفت پشت پیشخوان، دفتر سیاه را آورد، گذاشت جلوی سوگند و بازش کرد روی صفحه‌ای که شش لبهٔ بریده داشت.

+

«بهار ۸۴.» انگشتش را روی بریدگی کشید. «یه نفر این چهار ماه رو از تاریخ این مغازه بریده. با تیغ.»

+

سوگند به کاغذ بریده نگاه کرد.

+

«چرا داری اینو نشونم می‌دی؟»

+

«چون می‌خوام بدونی با کی داری معامله می‌کنی.» صدایش خالی بود. «من نمی‌دونم پدرتم. حرفتو باور می‌کنم، ولی نمی‌دونم. برای من تو یه مشتری‌ای که یه چیزی می‌خواد و یه چیزی داره.» انگشتش روی صفحه ماند. «و این آدمی که این صفحه‌ها رو بریده، احتمالاً من بودم. یعنی من قبلاً یه بار چیزی رو ازت گرفتم و روش سرپوش گذاشتم.»

+

سکوت.

+

«پس اگه اومدی اینجا که ازم چیزی بگیری که آدم‌ها به پدرشون می‌گن، من ندارم.» گفت. «فقط اینو دارم: مغازه‌ای که کار می‌کنه.»

+

و سوگند — که سیزده سال با آن کاغذ تاخورده در جیبش راه رفته بود — سرش را تکان داد و گفت:

+

«همینو می‌خوام.»

+
+

آن شب سوگند نرفت.

+

بی‌آنکه دربارهٔ‌اش حرف بزنند، رفت بالا و روی تشک اضافه‌ای که بیست سال بود کسی رویش نخوابیده بود دراز کشید. نریمان چیزی نگفت. صبح، دو لیوان چای روی پیشخوان بود.

+

آدم‌ها همیشه با کلمه به هم نزدیک نمی‌شوند. گاهی فقط یک لیوان اضافه است.

+
+
+ + + +
+
+
+
میان‌پرده
+

شش صفحه

+
+
+ +

این شش صفحه را هیچ‌کس نخواند. نه نریمان، نه سوگند. دلارام فیروز آن‌ها را برید و سوزاند، اما پیش از سوزاندن، عین‌شان را در دفترچهٔ خودش نوشت؛ و آن دفترچه تا امروز در جایی است که کسی نگاه نمی‌کند.

+

پس فقط ما می‌دانیم.

+
+ +
+

۲۹ بهمن ۸۳. زنی آمد. سی‌وچهار ساله. آذرنگ. بچه‌اش را چهارراه بلوار برده. می‌خواست روز تصادف را بفروشد.

+

هشدار دادم. مثل همیشه. گفتم ریشه دارد. گفت می‌دانم. گفتم ممکن است خود بچه را ببرد. گفت اگر ببرد، خدا را شکر.

+

گرفتم. ریشه‌اش تا بن رفت. بچه کامل آمد بیرون؛ شش سال، تر و تمیز، مثل درختی که با خاکش بکَنی.

+

زن از در که رفت بیرون، سبک بود. سبک‌ترین آدمی که امسال دیده‌ام.

+

و من ایستادم و به شیشه نگاه کردم و به خودم گفتم: خب، کارَت را کردی.

+
+ +

و بعد، سه ماه و نیم چیزی ننوشت. دفترچه خالی است. فقط یک خط، وسط اسفند، بی‌تاریخ: امشب باز خواب آن بچه را دیدم. کفش چپش دستش بود.

+
+ +
+

۱۱ اردیبهشت ۸۴. مردی آمد. جوان. سی‌وچند. اسمش را گفت: صدر. هفته‌ای است که هر شب می‌آید سر کوچه و برمی‌گردد؛ دیده‌امش. امشب آمد تو.

+

گفت زنش نه — دخترش. گفت بچه‌ام جلوی چشمم رفت. گفت من رانندگی می‌کردم.

+

این را چهار بار گفت. من رانندگی می‌کردم.

+

گفت نمی‌خواهم بمیرم و نمی‌توانم زندگی کنم و یک راه سوم می‌خواهم.

+

قانون‌ها را گفتم. تا دوم که رسیدم، حرفم را قطع کرد و گفت هرچه می‌خواهد ببرد.

+

و من — و این را می‌نویسم چون باید یک جا نوشته شود — نگاه کردم و ریشه را دیدم.

+

سی سال است این کار را می‌کنم. من ریشه را پیش از کندن می‌بینم؛ مثل ماما که پیش از تولد می‌فهمد بچه چرخیده.

+

به روزِ او که نگاه کردم، دیدم یک دختربچه به آن چسبیده. محکم. با تمام وزنش.

+

و من فکر کردم همان بچه است. همان که رفته.

+

فکر کردم: خدایا، این مرد دارد بچهٔ مرده‌اش را می‌فروشد و هیچ‌کس در دنیا از این ضرر نمی‌کند.

+

فکر کردم دارم رحم می‌کنم.

+

گرفتم.

+
+ +

در دفترچه، بعد از این، خط‌ها لرزان‌تر می‌شود.

+ +
+

۱۹ خرداد ۸۴. امروز فهمیدم.

+

مرد سه هفته است اینجا کار می‌کند. جایی برای رفتن نداشت. کمکم می‌کند، قفسه‌ها را مرتب می‌کند، و شب‌ها بالا می‌خوابد و صبح‌ها می‌گوید خواب آدم‌های غریبه را دیده و می‌خندد؛ خنده‌ای که هنوز نمی‌داند چیست.

+

امروز زنی آمد شیشه‌اش را که نه، سراغ نشانی‌ای را بگیرد؛ خانمی از همان محله. حرف که می‌زد گفت طفلکی آن خانم آذرنگ، هم بچه‌اش رفت هم شوهرش گذاشت رفت، حالا مانده با آن دختر بزرگه تنها.

+

گفتم: دختر بزرگه؟

+

گفت: نه ساله. سوگند.

+

دفتر را باز کردم. ۲۹ بهمن، آذرنگ. ۱۱ اردیبهشت، صدر. یک خانه. یک تصادف. دو معامله. و من هر دو را خودم گرفته‌ام.

+

و آن دختربچه‌ای که به ریشهٔ آن مرد چسبیده بود و من فکر کردم مرده است—

+

زنده بود.

+

زنده است.

+

و امروز صبح، در خانه‌ای در این شهر، از خواب بیدار شد و پدرش نشناختش، و من این کار را کردم.

+
+ +

در حاشیهٔ همین صفحه، با مدادی که فشار زیاد رویش آمده و کاغذ را کنده، یک جمله هست:

+

سی سال قانون دوم را برای مردم خواندم و امروز فهمیدم قانون دوم برای من نوشته شده بود.

+
+ +
+

۲۱ خرداد. دو شب فکر کردم. سه راه دارم.

+

یک: شیشه‌اش را بدهم و بگویم. اما آن‌وقت مردی که بچه‌اش را زیر گرفته، همه‌اش را یک‌جا پس می‌گیرد، و من او را دیده‌ام؛ آن شب اولی که سر کوچه ایستاده بود دیده‌ام. برنمی‌گردد. این کار قتل است، با شیشه.

+

دو: هیچ نگویم و بگذارم برود. اما کجا برود؟ مردی که نمی‌داند چه گم کرده، تا آخر عمر می‌گردد.

+

سه: نگهش دارم.

+

راه سوم را انتخاب کردم و می‌دانم که برای خودم انتخاب کردم، نه برای او. چون من پیر شده‌ام و این مغازه یکی را می‌خواهد و او خالی است و خالی‌ها را همین‌جا نگه می‌دارند.

+

پس بگذار روشن بنویسم، چون کسی این را نخواهد خواند و لااقل کاغذ بداند:

+

من از این مرد یک دختر گرفتم، و بعد او را استخدام کردم که تا آخر عمرش پشت پیشخوانی بایستد که آن دختر در آن گم شده.

+

صفحه‌ها را می‌برم. اگر روزی دفتر را بخواند، نباید نخ را پیدا کند.

+

و شیشه‌اش را می‌گذارم پایین، جایی که خودم سی سال است شیشهٔ خودم را نگاه می‌کنم و برنمی‌دارم.

+

شاید او شجاع‌تر از من باشد.

+

شاید هم نه. اکثرمان نیستیم.

+
+ +

آخرین چیزی که دلارام فیروز در آن دفترچه نوشت، شش هفته پیش از مرگش بود و ربطی به هیچ‌کدام این‌ها نداشت — یا داشت.

+

یک روز دختری می‌آید و چیزی می‌خواهد که ما نداریم. آن روز دیگر من نیستم. امیدوارم هرکه پشت پیشخوان است، راستش را بگوید. هرچه هم که باشد.

+
+
+ + +
+
+
+
فصل هجده
+

خانهٔ خیابان یازدهم

+
+
+ +

آن شب نریمان کرکره را پایین کشید و کاری کرد که بیست سال نکرده بود: از کوچهٔ سنگی بیرون رفت و به مقصدی رفت که مغازه نبود.

+

نشانی را از دفتر برداشته بود. کنار اسم فرشته آذرنگ، با خط ریز خانم فیروز.

+

چهل دقیقه پیاده رفت. باران بند آمده بود و آسفالت بوی چیزی می‌داد که آدم را به گذشته‌ای می‌برد که مال خودش نیست.

+

خانه، خانه‌ای دو طبقه در انتهای یک خیابان معمولی بود، با نردهٔ آبی و یک درخت توت که نصفش را هرس کرده بودند.

+

نریمان آن‌طرف خیابان ایستاد.

+
+

مدتی طولانی چیزی نشد.

+

او آنجا ایستاد و به یک خانه نگاه کرد و منتظر ماند که چیزی در سینه‌اش اتفاق بیفتد.

+

هیچ اتفاقی نیفتاد.

+

خانه، خانه بود. نرده آبی بود. درخت هرس‌شده بود.

+

و نریمان صدر، ایستاده در پیاده‌روی روبه‌روی خانه‌ای که — اگر آن دختر راست می‌گفت — بیست سال پیش صبحانه‌اش را در آن خورده بود، هیچ حس نکرد.

+

این را باید فهمید تا فهمید بعدش چه کرد: درد نبود. نبودِ درد بود. مثل اینکه دستت را روی اجاق بگذاری و هیچ نشود، و همان هیچ‌نشدن، خبر بدهد که چیزی در تو مرده.

+
+

ساعت نزدیک نه بود که چراغ اتاق بالا روشن شد.

+

زنی جلوی پنجره آمد. لاغر. روسری به سر. پرده را کنار زد و بیرون را نگاه کرد؛ نه به او — به بالا، به آسمان، به چیزی که آنجا نبود.

+

نریمان صورتش را دید.

+

و باز هیچ.

+

نه اسمی آمد، نه بویی، نه صدایی. یک زن ناشناس پشت یک پنجرهٔ ناشناس، که ظاهراً همسر او بوده، و ظاهراً روزی صبح‌ها کنارش بیدار می‌شده.

+

زن پرده را انداخت. چراغ خاموش شد.

+

و نریمان همان‌جا ماند.

+
+

در راه برگشت، همه‌چیز را در سرش کنار هم گذاشت؛ آرام، مثل کسی که بار یک وانت را می‌بندد.

+

دختری بیست‌ونه ساله سیزده سال سر یک کوچه ایستاده بود.

+

زنی داشت با یک جای خالی می‌مرد.

+

و او، مردی که وسط این دو نفر بود، هیچ نداشت. نه خاطره‌ای، نه اشکی، نه حتی حق شریک‌شدن در این عزا.

+

سوگند فکر می‌کرد آمده پدرش را پس بگیرد. اما پدری در کار نبود که پس گرفته شود؛ فقط مردی بود که تصادفاً همان بدن را داشت.

+

و همین — دقیقاً همین — بود که تصمیم را گرفت.

+

چون مردی که چیزی برای احساس‌کردن ندارد، لااقل می‌تواند کاری بکند. و کاری که او می‌توانست بکند، در تمام دنیا فقط یک نفر می‌توانست بکند: پشت آن پیشخوان بایستد و یک خواهر شش‌ساله را از قفسهٔ نه پایین بیاورد.

+

وقتی به کوچهٔ سنگی رسید، ساعت از یک گذشته بود.

+

چراغ مغازه روشن بود. سوگند بیدار مانده بود.

+

نریمان لحظه‌ای سر کوچه ایستاد و به آن چراغ نگاه کرد — همان‌طور که یک نفر دیگر، سیزده سال، هر پنجشنبه ایستاده بود.

+

و بعد راه افتاد و در را باز کرد.

+
+
+ + +
+
+
+
فصل نوزده
+

شبی که شیشه‌ها شکستند

+
+
+ +

آن‌ها را نریمان صدا نزد. فرهود خودش آمد؛ شب، با چهار نفر و یک کامیونت.

+

«یه بار پرسیدم. مؤدبانه.» پشت سرش مردها جعبه‌های خالی را می‌آوردند تو. «جواب ندادی. من صبورم، نه صبور. فرق دارن.»

+

«اینا وسیله نیستن.»

+

«نگفتم وسیله. گفتم موجودی.»

+

سوگند از پلهٔ طبقهٔ بالا پایین آمد. «برو بیرون.»

+

فرهود نگاهش کرد. «دخترته؟»

+

نریمان چیزی نگفت. نمی‌توانست بگوید.

+

بعد همه‌چیز سریع شد.

+

یکی از مردها نردبان را کشید و نردبان به قفسهٔ هفت خورد. سه شیشه از ردیف بالا افتاد.

+

صدای شکستن آن‌قدر معمولی بود که یک لحظه هیچ‌کس نترسید.

+

بعد بخار بلند شد.

+

اول کم‌رنگ. بعد پرحجم. و بعد اتاق پر شد از چیزی که هوا نبود؛ یک وزن، یک فشار، یک صدای بی‌صدا.

+

مردی که نردبان را کشیده بود وسط مغازه ایستاد و شروع کرد به گریه — بلند، بی‌شرم، مثل بچه‌ای که گم شده باشد. «مامان؟ مامان؟»

+

یکی دیگر روی زانو افتاد و دست‌ها را جلوی صورتش گرفت و تکرار کرد: «من نبودم. من نبودم. من نبودم.»

+

فرهود عقب رفت. رنگش پریده بود. «این چه کوفتیه؟»

+

«این همون چیزیه که می‌خواستی صنعتیش کنی.» نریمان جلو آمد. «اینا آدمای مُرده‌ن که برگشتن. اینا شرم و ترس و عشق آدماییه که همین الان اون بیرون دارن راحت زندگی می‌کنن. یه شیشه شکست، جناب فرهود. یه شیشه.»

+

فرهود به مردهایش نگاه کرد. بعد به قفسه‌ها. هزارها.

+

و بعد کاری کرد که نریمان بعدها فهمید عاقلانه‌ترین کار عمر آن مرد بود: برگشت و رفت.

+

دم در ایستاد. بی‌آنکه سر بچرخاند گفت:

+

«نوزده سال حملش کردم. حالا فهمیدم چرا هیچ‌کس نتونست ازم بگیردش.»

+

و رفت.

+

سوگند مردها را یکی‌یکی از بازو گرفت و تا کوچه کشید، جایی که هوا هوا بود.

+
+

برگشت. نریمان وسط بخار ایستاده بود و نفس می‌کشید — عمیق، آرام، مثل کسی که دارد کاری می‌کند.

+

«چیکار می‌کنی؟»

+

«جمعشون می‌کنم.» صدایش خش داشت. «اگه نبلعمشون، تا صبح می‌رن تو کوچه.»

+

«اینا مال تو نیست.»

+

نریمان نگاهش کرد و — برای اولین بار — خندید؛ خندهٔ کوچکی که سوگند فکر نمی‌کرد روی این صورت جا شود.

+

«دخترجان، هیچ‌کدوم اینا هیچ‌وقت مال من نبوده.»

+

سه ساعت طول کشید.

+

سوگند تمام سه ساعت روی پله نشست و نگاه کرد. دید که مردی وسط اتاق ایستاده و مادرِ یک غریبه را می‌بلعد. دید که شانه‌هایش پایین می‌آید. دید که یک بار زانویش تا خورد و دستش را به قفسه گرفت و بعد صاف ایستاد و ادامه داد.

+

وقتی تمام شد، آسمان داشت خاکستری می‌شد. نریمان لبهٔ پیشخوان را گرفته بود تا سرپا بماند. سوگند بازویش را گرفت و کمکش کرد بنشیند، و در همان لحظه دید که دست‌های این مرد، دست‌های مردی پنجاه‌ودو ساله، در عرض یک شب دست‌های پیرمردی شده‌اند.

+

«چند وقت دیگه می‌تونی این کارو بکنی؟»

+

نریمان به سقف نگاه کرد و جواب نداد.

+

و همین جواب بود.

+
+
+ + +
+
+
+
فصل بیست
+

بهای بازگشت

+
+
+ +

سه روز بعد، دو طرف میز اتاق پشتی نشستند.

+

شیشهٔ فرشته آذرنگ وسط میز بود و شیشه‌ای خالی کنارش.

+

نریمان قانون را کامل گفت. بی هیچ نرمی. همان‌طور که خانم فیروز خواسته بود: بگو، بعد ساکت شو.

+

«می‌خوای نازلی برگرده به مادرت. وزنش بیست سال و شش سالِ یه بچه‌ست. تنها چیزی که به همون وزنه و مال خودته—»

+

«می‌دونم چیه.»

+

«بگو.»

+

سوگند به شیشهٔ خالی نگاه کرد.

+

«تو.»

+

«بیست سالی که هفته‌ای یه بار اومدی این کوچه.» صدایش را ثابت نگه داشت. «تمام اون شب‌ها. آشپزخونه، نه سالگی. شونزده سالگی که پیدام کردی. کینه‌ت. امیدت. اینکه اصلاً بابا داری. همه‌ش می‌ره. و ریشه‌ش ممکنه چیزای دیگه‌ای هم ببره که هیچ‌کدوممون نمی‌دونیم.»

+

«و نازلی؟»

+

«نازلی هم، شبی که بدیش به مادرت.» نریمان دست‌هایش را روی میز گذاشت. «سوگند، بشمار. تو داری هر دوتاشونو می‌دی. آخرش تو می‌مونی و یه مغازه.»

+

سوگند مدتی طولانی به شیشهٔ خالی نگاه کرد.

+

«مادرم چی می‌مونه براش؟»

+

«همه‌چی. چهار ماه.»

+

«خب پس حساب درسته.»

+

«و تو؟»

+

«من چی؟»

+

«تو یادت میاد؟»

+

اینجا جایی بود که نباید دروغ می‌گفت.

+

«شیشهٔ من پایینه. اگه برش دارم همه‌چی برمی‌گرده. تو رو یادم میاد.» نفس کشید. «ولی اون‌وقت دیگه نمی‌تونم مغازه‌دار باشم. و اگه نباشم، هزار نفر تو این شهر یه روز صبح، وسط نون خریدن، همهٔ چیزایی که فروختن می‌ریزه سرشون.»

+

«پس یکی باید پشت این پیشخون بمونه.»

+

«آره.»

+

«یکی که خالی باشه.»

+

«آره.»

+

سکوت طولانی شد. باران، مثل تمام این کتاب، می‌آمد.

+

«بابا.»

+

نریمان چشم بست. اولین باری بود که این کلمه را می‌شنید و آخرین باری بود که می‌شنید، و هر دو می‌دانستند.

+

«می‌دونی چرا بیست سال اومدم؟» گفت سوگند. «اولش فکر می‌کردم برای اینکه یه روز منو بشناسی. بعد فهمیدم نه. اومدم چون تنها کسی که تو دنیا نازلی رو یادش بود من بودم. و می‌ترسیدم بمیرم و اون کامل تموم بشه.» شیشه را برداشت. «حالا مادرم می‌تونه یادش بمونه. چهار ماه. ولی یادش می‌مونه.»

+

«و تو منو یادت نمی‌مونه.»

+

«تو بیست ساله منو یادت نیست.» لبخند زد؛ و لبخندش، برای یک ثانیه، شبیه لبخند خانم مروارید بود. «فقط داریم بی‌حساب می‌شیم.»

+

نریمان دست‌هایش را روی میز گذاشت. پیر بودند. خیلی پیرتر از پنجاه‌ودو سال.

+

«این معاملهٔ خیلی بدیه، سوگند.»

+

«همهٔ معامله‌های این مغازه بدن.» بلند شد و به هزار شیشه نگاه کرد؛ هزار آدم، هزار شب که یکی باید بخوابدشان. «ولی یکی باید انجامشون بده.»

+

و بعد، آرام‌تر:

+

«یه چیزی ازت می‌خوام.»

+

«بگو.»

+

«بعدش... یه چیزی دربارهٔ من بهم بگو. هر روز. مهم نیست باور کنم یا نه.» شانه بالا انداخت، انگار چیز کوچکی خواسته باشد. «فقط نذار هیچ‌کس هیچ‌وقت کاملاً تموم شه. اینو یاد گرفتم از بیست سال وایسادن سر یه کوچه.»

+

نریمان نگاهش کرد.

+

«قول می‌دم.»

+
+
+ + +
+
+
+
فصل بیست‌ویک
+

آخرین معامله

+
+
+ +

ساعت پنج بعدازظهر بود.

+

اول شیشهٔ فرشته آذرنگ. سوگند نشست، درپوش را برداشت، و بویی بلند شد که تمام اتاق را پر کرد: بوی کلاس اول دبستان، بوی موی خیس بچه، بوی یک بعدازظهر بهاری در سال ۸۳.

+

نریمان بلعیدن را برعکس کرد؛ کاری که هرگز نکرده بود و خانم فیروز فقط یک بار توضیحش داده بود. به‌جای آنکه گوش بدهی، بگو. کلمه به کلمه. بی کم، بی سانسور، بی مهربانی. آن‌قدر کامل بگو که خاطره جا عوض کند.

+

و گفت.

+

نازلی را گفت. تولد شش‌سالگی و کیک با دو رنگ روبان. صدایی که «س» را کامل ادا نمی‌کرد. عادت مسخره‌اش که همیشه کفش چپ را اول می‌پوشید. آن بازی احمقانه‌ای که با خواهر بزرگ‌ترش داشتند و هیچ‌کس دیگر قاعده‌اش را نمی‌فهمید.

+

و بعد، بی‌رحم، خود روز را: چهارراه، باران، صدای ترمز، و بعد سکوتی که بیست سال طول کشید.

+

سوگند گریه نکرد. مشت‌هایش را روی میز گذاشته بود و می‌گذاشت بیاید تو.

+

وقتی تمام شد، شیشه خالی بود و سوگند نازلی را داشت — نه فقط سهم خودش؛ سهم مادرش را هم. حالا او حاملش بود، تا وقتی برساندش به فرشته آذرنگ.

+
+

بعد نوبت دومی شد.

+

«آماده‌ای؟»

+

«نه.» لبخند زد. «شروع کن.»

+

و نریمان شروع نکرد.

+

دستش روی شیشهٔ خالی ماند و برنداشتش. سوگند منتظر ماند. یک دقیقه گذشت.

+

«نمی‌کنم.»

+

«چی؟»

+

«نمی‌کنم.» شیشه را هل داد کنار. «بیست سال هزار نفر اومدن اینجا و من یه بارم نگفتم نه. امروز می‌گم.»

+

سوگند بلند شد. «تو حق نداری—»

+

«می‌دونم که حق ندارم.» صدایش بلند شد؛ اولین باری بود که سوگند این صدا را از او می‌شنید. «قانون این مغازه‌ست: تصمیمو خودت می‌گیری. خانم فیروز نوشته و راست نوشته. ولی من قانون رو دارم می‌شکنم، چون یه چیزی رو می‌دونم که تو نمی‌دونی.»

+

«چی؟»

+

«من می‌دونم اون‌ور این معامله چه شکلیه.» به قفسه‌ها اشاره کرد. «من بیست ساله دارم آدمایی رو نگاه می‌کنم که سبک از این در می‌رن بیرون. همه‌شون فکر می‌کنن دارن یه بار زمین می‌ذارن. هیچ‌کدوم نمی‌فهمن که دارن خودشونو زمین می‌ذارن.» به او نگاه کرد. «تو الان تنها آدمی هستی تو این مغازه که چیزی داره. من ندارم. مادرت نداره. نازلی که اصلاً نیست. فقط تو.»

+

سکوت.

+

«پس بشین سر جات و بذار مادرت با همون جای خالی بمیره. آدم‌ها همیشه با جای خالی می‌میرن. این فاجعه نیست. این زندگیه.»

+
+

سوگند مدتی طولانی ایستاد.

+

بعد کاری کرد که نریمان انتظارش را نداشت: خم شد، شیشهٔ خالی را از روی میز برداشت، و گذاشتش وسط، دقیقاً همان‌جا که بود.

+

«یه سؤال ازت می‌پرسم.» گفت. «راستشو بگو، بعدش هرچی گفتی همون می‌شه.»

+

«بپرس.»

+

«اگه جای من بودی چیکار می‌کردی؟»

+

و نریمان صدر، مردی که بیست سال بود پشت این پیشخوان می‌ایستاد و به آدم‌ها می‌گفت که خاطره ریشه دارد، دهانش را باز کرد تا بگوید نمی‌دانم.

+

و نتوانست.

+

چون جواب را می‌دانست. جوابش بیست سال پیش، در یک شب بارانی، پشت همین در ایستاده بود و بعد آمده بود تو.

+

«همین کارو می‌کردم.» گفت.

+

«پس بردار.»

+

نریمان شیشه را برداشت.

+

و شروع کرد به گفتن.

+

از نه‌سالگی. از آشپزخانه‌ای که بوی نان نمی‌داد. از مردی که او را مثل بچهٔ همسایه نگاه کرد و مؤدب بود، و اینکه مؤدب‌بودنش بدترین قسمتش بود. از قایق کاغذی. از شبی که پشت پنجره ماند تا صبح. از سیزده‌سالگی و عکس روی میز آشپزخانه. از شانزده‌سالگی و سه متری که نتوانست برود. از تمام پنجشنبه‌ها؛ از پنجشنبه‌های بارانی، از پنجشنبه‌ای که مریض بود و باز رفت، از پنجشنبه‌ای که چراغ خاموش بود و تا صبح نخوابید. از پسری که گفت یه جاییت همیشه اینجا نیست. از وقتی تصمیم گرفت متنفر باشد و نتوانست. از فامیلی‌اش که همیشه صدر مانده بود و هرگز عوضش نکرده بود، حتی وقتی می‌توانست.

+

بخار بلند شد؛ غلیظ، طلایی، آن‌قدر که سایه‌شان روی دیوار تکان خورد.

+

در شیشه نشست.

+

نریمان درپوش را نگذاشت. شیشه را برداشت، به دهانش نزدیک کرد، و — چون قانون همین بود، چون یکی باید حملش می‌کرد — نوشید.

+
+

و در همان ثانیه، در همان یک ثانیه، دو چیز اتفاق افتاد.

+

سوگند سر بلند کرد، به مرد روبه‌رویش نگاه کرد، و ندانست کیست.

+

و نریمان صدر، برای اولین بار در بیست سال، دخترش را شناخت.

+

نه از راه شیشهٔ زیرزمین؛ آن هنوز آن پایین بود، زیر پارچهٔ سفید، دست‌نخورده. از این راه شناخت: بیست سال عشق یک‌طرفهٔ دختری که هفته‌ای یک بار می‌آمد و فقط نگاه می‌کرد چراغ روشن است یا نه، حالا در سینهٔ او بود.

+

می‌دانست چقدر دوستش داشته‌اند. تک‌تک پنجشنبه‌ها را می‌دانست. می‌دانست که یک بار، شانزده‌سالگی، سه متر مانده بود.

+

و کسی که این عشق را ساخته بود، آن‌طرف میز نشسته بود و مؤدبانه می‌پرسید:

+

«ببخشید... من چرا اینجام؟»

+

نریمان دهانش را باز کرد. صدایش بیرون نیامد.

+

بار دوم آمد:

+

«تو مغازه‌دار جدیدی.»

+
+
+ + +
+
+
+
فصل بیست‌ودو
+

چهار ماه

+
+
+ +

همان شب سوگند رفت خانهٔ مادرش، چون در دفتر مغازه نوشته شده بود که باید برود.

+

خط خودش بود. کاغذی که در جیب کاپشن پیدا کرده بود، تاخورده، لبه‌ها نرم:

+
امشب برو پیش مامان. هرچی تو سرت هست دربارهٔ نازلی، بهش بگو. تا آخرش. نترس.
— خودت
+

در طول راه سعی کرد بفهمد چرا این یادداشت را نوشته و چرا سرش پر است از خاطرات خواهری که — می‌دانست — بیست سال بود درباره‌اش با کسی حرف نزده. اما نمی‌ترسید. آدم وقتی خودش برای خودش نامه می‌نویسد، یک جور اعتمادی هست که توضیح نمی‌خواهد.

+
+

مادرش روی مبل بود، با پتوی روی زانو، و تلویزیون بی‌صدا روشن بود.

+

«مامان.»

+

«جانم.»

+

سوگند کنارش نشست. عکس را از کشو درآورد و روی میز گذاشت. دو دختر روی پله‌های حیاط. یکی بزرگ‌تر با لبخند نصفه. یکی کوچک‌تر با کفش چپ در دست.

+

«می‌خوام یه چیزی بگم و می‌خوام تا آخرش گوش بدی.»

+

و گفت.

+

از تولد شش‌سالگی گفت. از کیک با دو رنگ روبان. از صدایی که «س» را کامل ادا نمی‌کرد. از کفش چپ. از آن بازی احمقانه‌ای که هیچ‌کس قاعده‌اش را نمی‌فهمید.

+

و بعد، چون یادداشت گفته بود تا آخرش، از چهارراه گفت. از باران. از صدای ترمز.

+

مادرش اول گیج نگاه می‌کرد؛ مثل کسی که در زبان بیگانه‌ای نشسته باشد.

+

بعد دستش رفت روی عکس.

+

بعد چیزی در صورتش جابه‌جا شد — نه یک‌باره؛ آرام، مثل آبی که زیر در می‌آید.

+

و بعد فرشته آذرنگ، پنجاه‌وچهار ساله، برای اولین بار در بیست سال، اسم دختر کوچکش را گفت.

+

و بعد شکست.

+
+

آن شب طولانی بود.

+

سوگند تا صبح کنارش نشست. مادرش گریه می‌کرد و می‌ایستاد و می‌پرسید و باز گریه می‌کرد. یک بار عصبانی شد و پرسید چرا زودتر نگفتی و سوگند جوابی نداشت. یک بار خندید — از آن خنده‌های وسط گریه — چون یادش آمد که نازلی از پیاز متنفر بود و مثل بازیگرهای تئاتر ادای غش‌کردن درمی‌آورد.

+

نزدیک صبح، آرام شد. عکس در دستش بود.

+

«چهار ماه.» گفت.

+

«چهار ماه.»

+

«کمه.»

+

«آره.»

+

مادرش سرش را به شانهٔ او تکیه داد.

+

«ولی از هیچی بیشتره.»

+
+

فرشته آذرنگ صد و نوزده روز بعد مرد؛ در خانهٔ خودش، صبح، با دخترش کنارش.

+

در آن صد و نوزده روز، چیزی را انجام داد که سوگند بعدها فهمید تنها دلیل واقعی این تمام ماجرا بوده: سوگواری کرد. با تمام بدنش. بی‌آبرو و کامل. اسم بچه‌اش را بلند گفت. برایش گریه کرد. برای آدم‌های فامیل تعریفش کرد. یک روز حتی خندید و گفت «چه شیطون بود.»

+

و روز آخر، وقتی دیگر حرف زدن سخت شده بود، دست سوگند را گرفت و گفت:

+

«دوتا داشتم.»

+

همین. سه کلمه.

+

و سوگند دست مادرش را فشرد و گفت «می‌دونم، مامان» — و نمی‌دانست. سه ماه بود که نمی‌دانست. اما یاد گرفته بود که وقتی کسی چیزی را حمل می‌کند، بی‌آنکه بفهمی کمکش کنی.

+

سوگند بیرون آمد و در راهروی خانه ایستاد.

+

عکس هنوز روی مبل بود. برش داشت. دو دختر روی پله‌های حیاط؛ یکی بزرگ‌تر با لبخند نصفه، یکی کوچک‌تر با کفشی در دست.

+

به بچهٔ کوچک‌تر نگاه کرد.

+

و منتظر ماند.

+

هیچ نیامد. نه اسمی، نه صدایی، نه آن بازی احمقانه‌ای که چند ماه پیش هنوز قاعده‌اش را بلد بود. فقط بچه‌ای در یک عکس قدیمی، که خیلی شبیه او بود.

+

آن شب — شبِ صد و نوزدهم، در آشپزخانهٔ آن خانه — سوگند حرفش را تمام کرده بود و نازلی از او رفته بود؛ همان‌طور که قرار بود برود، همان‌طور که یک نفر جلوتر برایش گفته بود.

+

و مادرش، تا آخرین روز، دوتا داشت.

+
+
+ + +
+
+
+
فصل بیست‌وسه
+

مردی که هر روز می‌آید

+
+
+ +

مغازه چهار ماه بعد از آن بعدازظهر باز شد؛ هفتهٔ بعد از خاک‌سپاری فرشته آذرنگ.

+

در آن چهار ماه کرکره پایین بود و هر روز صبح، دختری کلید می‌انداخت، شیشه‌ها را گردگیری می‌کرد، و بعد می‌رفت خانه‌ای در خیابان یازدهم تا کنار مادرش بنشیند. مغازه صبر کرد. مغازه‌ها بلدند صبر کنند.

+

پشت پیشخوان دختری بیست‌ونه ساله می‌نشیند، با کاپشن نظامی گشاد و موهایی که محکم بسته. سه قانون را حفظ است. نردبان چوبی را یاد گرفته. شب‌ها خواب آدم‌های ناشناس را می‌بیند و صبح‌ها پنجره را باز می‌کند و می‌گوید: «این مال من نیست.»

+

خانم مروارید هفته‌ای دو بار می‌آید، شیرینی می‌آورد، می‌گوید این‌بار تصمیمش را گرفته، و نمی‌گیرد. سوگند بی‌آنکه بداند چرا، لیوان چای را جوری می‌گذارد که دسته‌اش سمت دست راست پیرزن باشد.

+

آقای شکوهی گاهی می‌آید، مؤدب، با چتر شکسته، و می‌پرسد آیا قبلاً همدیگر را دیده‌اند. سوگند می‌گوید بله، آقای کامران شکوهی، شما مشتری قدیمی این مغازه‌اید. و او خوشحال می‌شود که یک نفر اسمش را می‌داند.

+
+

هفتهٔ دوم، سوگند دریچهٔ زیر فرش را پیدا کرد.

+

پایین رفت. پارچهٔ سفید را کنار زد. برچسب‌ها را خواند. پنج اسم.

+

روی آخری انگشتش ماند.

+

نریمان صدر.

+

فامیلی خودش بود. مکث کرد و منتظر ماند ببیند چیزی می‌آید یا نه — همان‌طور که آدم روی یک زخم قدیمی فشار می‌دهد تا ببیند هنوز درد دارد.

+

چیزی نیامد.

+

شانه بالا انداخت. در این شهر هزارتا صدر هست.

+

پارچه را برگرداند و بالا آمد.

+
+

و هر روز، ساعت پنج بعدازظهر، مردی می‌آید.

+

پیر است. موهایش خاکستری است؛ رنگ چیزی که سوخته. از سر کوچه دو چای می‌خرد، یکی را روی پیشخوان می‌گذارد و می‌گوید بفرمایید.

+

اولش سوگند فکر کرد مشتری است. بعد فکر کرد ولگرد است. حالا دیگر فکر نمی‌کند؛ فقط چای را برمی‌دارد.

+

مرد روی چهارپایه می‌نشیند و شروع می‌کند به حرف زدن. همیشه دربارهٔ یک نفر.

+

«یه دختر داشتم.» می‌گوید. «دوتا داشتم، فکر کنم. یکیشون یه چیزی با کفشش بود — نه. اون یکی رفته. اون یکی رو دیگه ندارم.» می‌خندد؛ خنده‌ای که ته آن چیزی نیست. «ببخشید. یکیشو گم کردم و نمی‌دونم کدوم.»

+

«اشکالی نداره.»

+

«اسمش سوگند بود. یه بار، نه سالش بود، صبح اومد تو آشپزخونه و من...» همیشه اینجا مکث می‌کند. «من نشناختمش.»

+

«چرا؟»

+

«چون احمق بودم. چون فکر می‌کردم می‌شه درد رو از آدم جدا کرد و آدم سر جاش بمونه.»

+

سوگند چایش را می‌نوشد.

+

«هفته‌ای یه بار میومد تو این کوچه.» مرد به در نگاه می‌کند. «بیست سال. فقط نگاه می‌کرد چراغ روشنه یا نه. هیچ‌وقت در نزد.»

+

«چرا نزد؟»

+

«چون می‌ترسید.»

+

«از چی؟»

+

مرد سر بلند می‌کند و به دختر پشت پیشخوان نگاه می‌کند — به دخترش، که نمی‌داند دختر اوست — و لبخند می‌زند؛ لبخندی که دیگر هیچ‌کس در این شهر معنایش را نمی‌فهمد.

+

«از اینکه در بزنه و من بگم: شما؟»

+

سکوت.

+

«شما هر روز میاین اینجا و دربارهٔ اون حرف می‌زنین.» می‌گوید سوگند. «چرا؟»

+

«چون تنها کسی که تو دنیا یادش هست، منم.» چای را برمی‌دارد. «و می‌ترسم بمیرم و اون کامل تموم بشه.»

+

سوگند مدتی نگاهش می‌کند. چیزی در سینه‌اش تکان می‌خورد که اسمی برایش ندارد و فردا هم نخواهد داشت، و پس‌فردا هم؛ ولی هر روز ساعت پنج، دوباره تکان می‌خورد.

+

«اسمش چی بود؟» می‌پرسد. «گفتین ولی حواسم نبود.»

+

و مرد، انگار که سؤال بزرگی از او پرسیده باشند، صاف می‌نشیند و با دقت، مثل کسی که چیز باارزشی را روی میز می‌گذارد، می‌گوید:

+

«سوگند.»

+

«اسم قشنگیه.»

+

«آره.» سر تکان می‌دهد. «آره، هست.»

+
+

بیرون باران می‌گیرد. یعنی فردا کار و بار سکه است.

+

مرد بلند می‌شود، لیوان خالی را روی پیشخوان می‌گذارد، و می‌رود طرف در.

+

«فردا میاین؟»

+

و مرد، همان‌طور که چتر را باز می‌کند، بی‌آنکه برگردد، می‌گوید:

+

«هر روز میام.»

+
+
+ +
+
+
+

+ مردی که دخترش را فراموش کرد
+ نوشتهٔ محمدپرهام پلنگ سنگدوینی

+ تمام حقوق این اثر برای نویسنده محفوظ است. +

+
+
+ +
+

پایان

+

فراموشخانه

+
+ + + diff --git a/src/the-man-who-forgot-his-daughter.html b/src/the-man-who-forgot-his-daughter.html new file mode 100644 index 0000000..3bb2ef4 --- /dev/null +++ b/src/the-man-who-forgot-his-daughter.html @@ -0,0 +1,1231 @@ + + + + + +The Man Who Forgot His Daughter — Mohammadparham Palangsangdovini + + + + + + + + + +
+
+
+
+ +
+
A NOVEL
+

The Man Who
Forgot His
Daughter

+
+

MOHAMMADPARHAM PALANGSANGDOVINI

+

Whatever you want to forget, we will buy from you + — but someone has to carry it

+
THE FORGETTING HOUSE · STONE LANE
+
+ +
+
+

“People endure under the sun, my boy.
It's under the rain that they give in.”

+
Dalaram Firouz
+
+
+ +
+
+
Contents
+
+

Prologue

+

Book One — The Shopkeeper

+
  1. The Three O'Clock Customer
  2. Three Rules
  3. Nights
  4. +
  5. A Love That Will Not Be Sold
  6. The Woman Who Came to Sell Her Son
  7. +
  8. The Girl Who Came to Buy Something Back
  9. What Is Not in the Ledger
+

Book Two — The Daughter

+
  1. Nine
  2. A House with Two Absences
  3. Sixteen
  4. +
  5. Thursdays
  6. The Decision
+

Book Three — The Trade

+
  1. Mr. Farhoud
  2. Mr. Shokouhi Loses His Own Name
  3. +
  4. The Cellar
  5. Dalaram Firouz's Letter
  6. What Sogand Knows
+

Interlude — Six Pages

+
  1. The House on Eleventh Street
  2. The Night the Vials Broke
  3. +
  4. The Price of Return
  5. The Last Transaction
  6. Four Months
  7. +
  8. The Man Who Comes Every Day
+
+
+
+ +
+
+
Prologue
+

Every city has a shop whose address nobody says out loud.

+

Not out of malice — out of shame. The address of the Forgetting House is passed in a murmur, and only to someone already wrecked enough that shame has stopped costing them anything. They say: the end of Stone Lane, past the tailor's, a wooden door with no bell. You knock. A man comes. Whatever you want to forget, he will buy from you.

+

And the listener laughs. Everyone laughs, at first.

+

Then comes a night when they open their eyes at half past three, and before they can give themselves time to think, they find their shoes already on.

+

This book is not about that shop.

+

It is about the man who stands behind the counter.

+
+
+ +
+ +
Book One

The Shopkeeper

+
The vial is full
+
+ +
+
+
Chapter One
+

The Three O'Clock Customer

+

When it rained, Nariman did good business.

+

He hadn't worked that out himself. Mrs. Firouz, the shopkeeper before him, had said it in those first months, and then she had died, and the sentence had stayed. Nariman knew her for a single summer; but some sentences outlive the person who made them.

+

That day it had rained since morning. Nariman sat behind the counter polishing empty vials with a cloth thirty years old. The shop was not large — four metres by five, a high ceiling, walls that were shelving to their last centimetre. And on the shelves, row behind row, thousands of small vials with wooden stoppers. Some pale as weak tea. Some dark. And a few, high up, so black they ate the light and gave nothing back.

+

The bell above the door shifted. It was Mr. Shokouhi, with an umbrella that had one broken rib, which was why his left shoulder was always wet.

+

“Evening, Nariman. All right?”

+

“I'm all right. You?”

+

“No.” He set the umbrella by the door. “I've got something. Small one.”

+

“It's always a small one.”

+

He sat on the stool facing the counter and locked his fingers together — a man in his fifties with a face permanently stuck halfway through an apology.

+

“Yesterday on the bus a woman stood up and gave me her seat. She thought I was old.”

+

Nariman waited.

+

“I sat down.” Shokouhi looked at his hands. “That's all. I sat down and I didn't look at her again until the end of the line. I've been thinking about it for twenty-four hours. That I sat down.”

+

“You know that's nothing.”

+

“It's nothing to you.”

+

Nariman breathed out. Three weeks running now. Last week: he'd rung a neighbour's bell and not run away and then felt sick about it until dark. The week before: at his niece's wedding, mid-song, he had gone flat and everyone had heard.

+

“One small vial.” Shokouhi laid crumpled notes on the counter. “You name the price.”

+

The shop did not take money; it paid it. But Shokouhi had insisted on reversing that from the first day, and Nariman had stopped arguing.

+
+

The back room held nothing but two chairs facing each other, a low table, and an empty vial on the table.

+

“Go on.”

+

And Shokouhi went on. The woman, the bus, the wet shoulder, the shame.

+

Nariman listened — not the listening people manage at parties; the other one. The one Mrs. Firouz had called swallowing. You have to hear it so completely that no room is left for the memory in the chest of the man who owns it. You have to build the scene inside yourself until it becomes yours. You have to smell the bus. You have to feel a stranger's shame in your own throat, like your own.

+

When he had finished, a pale vapour left Shokouhi's mouth, turned once in the air, and settled quietly into the vial, like dew that had forgotten where it was supposed to fall.

+

Nariman put in the stopper.

+

Shokouhi sat still a moment. Then he lifted his head and smiled — the light smile of a man who has set down his pack.

+

“Some rain.”

+

“Yes.”

+

“Right. I'll be off. You need anything?”

+

He left. He took the broken umbrella too.

+

Nariman carried the vial to the left-hand shelf, fourth row, where Mr. Shokouhi's vials stood side by side.

+

Thirty-seven of them.

+

He looked at them: thirty-seven small pieces of a man who walked out of that door smiling every week, and every week carried a little less of himself home.

+
+
+ +
+
+
Chapter Two
+

Three Rules

+

The young man was in his twenties, one of those who get more polite the angrier they are.

+

“I heard you can help.”

+

“Sit.”

+

He sat. He kept his coat on.

+

“How long does it take?”

+

“Depends. Rules first.”

+

“Rules?”

+

Nariman raised three fingers — a habit inherited, like the shop itself, from Mrs. Firouz.

+

“One: you can only sell your own memory. Your father's, your child's, your lover's — no. Not even if you're in it.”

+

Second finger.

+

“Two, and this is the one that matters: a memory has roots. It isn't a beetroot you pull out of the ground and the rest of the field stays where it was. It's a tree root. When you pull, everything attached comes with it. You say, I want to forget the day she left me. I take it out, and it may take the whole woman with it. Her name, her voice, the three years you had, the song you played. Or it may take only that one day. There's no telling beforehand. There never is.”

+

The young man laughed, dry. “So it's a gamble.”

+

“It's surgery. With your eyes shut.”

+

“Three?”

+

Nariman lowered the third finger and set both palms on the counter.

+

“Three: there are no returns. Not ever. Not for anyone. Hear that twice, because people don't believe this one until it's too late.”

+

The young man looked at the shelves a while. “What are they?”

+

“Other people's.”

+

“You keep them?”

+

“I have to.”

+

“Why not pour them down the drain?”

+

“Because then the city fills up with people who start crying in the street and don't know why.”

+
+

The young man came into the back room. He sat. And he told it.

+

He told it about his brother. About the day he learned his older brother had spent years taking money from their father in his name. About his father's face, which did not change when it heard the truth — and it was that not-changing that had broken him.

+

Nariman swallowed it.

+

The vapour came out thicker this time; slow, stringy, like smoke unwilling to leave a room. It settled at the bottom of the vial in a dark layer.

+

The young man blinked. “Is that it?”

+

“That's it.”

+

He stood, went to the door, stopped, turned back. His face had changed.

+

“Sorry — why did I come here?”

+

“We made a transaction.”

+

“What transaction?” And then, in a voice gone suddenly childish: “Did I have a brother?”

+

Nariman did not answer.

+

The young man shrugged, pressed a hand to his forehead, and walked out into the rain. Light. Free. Empty.

+

Nariman picked up the vial. It was heavy. It had roots. An entire brother, with his thirty years, his birthdays and his arguments and his sleepless nights, now fitted into four centimetres of glass.

+

That night Nariman dreamed of a brother he had never had.

+

And in the morning it took him a few seconds to remember that he didn't.

+
+
+ +
+
+
Chapter Three
+

Nights

+

By day he was a shopkeeper. By night he was a warehouse.

+

Nobody had told him this; he worked it out in the second year. Memories do not stay in glass. They seep, the way a smell comes out from under a shut kitchen door. And whoever sleeps in the room above this shop is every night the host of people he has never met.

+

There were good nights, too.

+

A woman's wedding in 1983, where she left her shoes somewhere and danced barefoot until dawn. A man learning to ride a bicycle whose father let go of the saddle and who didn't notice until the end of the street. A girl seeing the sea for the first time, screaming in fright and then laughing, both sounds fitting into one breath.

+

Nariman was fond of these. Without telling anyone, he chose better places on the shelf for certain vials.

+

But the bad nights were more.

+

He had found his method: wake, drink water, open the window and say out loud, “This is not mine.”

+

Sometimes it worked. Sometimes not.

+

In the mornings the mirror told him something he did not want to hear. He was fifty-two and looked sixty-five. The hair above his temples had not gone white — it had gone grey; the colour of a thing that has burned.

+

Mrs. Firouz had ended up looking like that too.

+
+

High on one of the shelves, out of reach, sat the ledger: black, leather-bound, thick. Once a week Nariman opened it, read the names, matched vials to entries. It was pointless work; nobody audited him. But a man with nothing of his own to remember goes looking for ceremony.

+

And there was something in that ledger that had bothered him for years.

+

Between page 207 and page 208, six pages had been cut out.

+

Not torn — cut. With a blade. Straight. The work of someone who did not want it noticed that anything had been taken.

+

Nariman would run a finger along the cut edge, and every time the same absurd thought arrived:

+

I did this.

+

Then he would shut the ledger, go downstairs, raise the shutter, and wait for rain.

+
+
+ +
+
+
Chapter Four
+

A Love That Will Not Be Sold

+

Mrs. Morvarid came twice a week and never sold anything.

+

She was seventy, always in a lilac headscarf, and always brought pastries so that Nariman would offer her one and she could say “oh no, my blood sugar” and then eat it.

+

“Nariman. I've decided.”

+

“All right.”

+

“I mean it this time.”

+

“You always mean it.”

+

She sat. Laid her creased hands on her knees.

+

“Sixteen years he's been gone. Sixteen. I wake up and put my hand out to the other side of the bed. Sixteen years of that. Like an idiot.” She laughed. “I want to stop loving him. I'm tired.”

+

Nariman poured tea. He set the glass down with the handle towards her right hand — something he had done for two years without either of them mentioning it.

+

“Just take the love. Keep the rest. Let me have the memories, only take the part that hurts.”

+

“Mrs. Morvarid, I've said it a hundred times. The part that hurts is the part that loves him. They're not two things. They're one thing.”

+

“Then take all of it.”

+

“You're sure?”

+

“Yes.”

+

“Then come into the back room.”

+

She stood. Took three steps. Then stopped — at the same spot she always stopped, where the floorboard creaked — and looked at the ceiling.

+

“Will I forget his name?”

+

“Probably.”

+

“His voice?”

+

“Probably.”

+

“The night we got stranded at the station and talked in the waiting room until morning, and he said that if no train ever came he wouldn't mind?”

+

Nariman did not answer.

+

Mrs. Morvarid came back. Sat down. Picked up her tea.

+

“Good colour on this today.”

+

“Thank you.”

+

“I'll come next week.”

+

“I know.”

+

And always, after she left, Nariman would look at the shut door and think that the only sane person in this city was the old woman who came twice a week in order to change her mind.

+

And then he would think that he himself, probably, was not.

+
+
+ +
+
+
Chapter Five
+

The Woman Who Came to Sell Her Son

+

She was thirty-two and looked like someone who had not slept in weeks and had stopped caring that it showed.

+

She spoke standing. She would not sit. Nariman offered twice and gave up on the third; some people, if they sit, will come apart, and they know it.

+

“I want to forget my son.”

+

Nariman did not take his hand off the cloth.

+

“How long?”

+

“Forty-two days.”

+

Forty-two days. Not about six weeks. People who are still counting are still inside it.

+

“Sit down.”

+

“I don't want to sit down. I want you to do it so I can go.”

+

Nariman raised three fingers and gave her the rules. At the second she cut him off.

+

“What does roots mean?”

+

“It means if you say, take the day of the funeral, it may take the whole child. His name. His voice. The four years you had him. His photographs stay in your phone and you don't know who the boy is.”

+

She looked at him. She did not smile, but something in her face did the work of one.

+

“And?”

+

“And what?”

+

“Did you think that was a threat?” Her voice did not rise. “Sir. For forty-two days, every morning, before my eyes open, I remember. Every morning, for two seconds, I'm fine. Then I remember. Do you understand? I lose my child once a day.”

+

The shop was quiet.

+

“You're telling me you might take all of it. I'm telling you: please take all of it.”

+
+

Nariman was silent a long time. Then he did something he had not done in years: he came out from behind the counter and sat on the stool, level with a woman who was standing.

+

“There's something you should know,” he said. “Those two seconds in the morning when you're fine — those belong to your son. Those are him. If I take him, they go too.”

+

“Good.”

+

“No, it isn't good. Because afterwards you'll wake up and you won't be fine and you won't know why. They'll call it depression. You'll go to a doctor and the doctor will ask whether something happened, and you'll say no.”

+

She blinked.

+

“Pain with no cause is worse than pain with one. That isn't me talking. That's two thousand vials on that wall.”

+

Silence.

+

And then, for the first time, she sat down. Slowly. Like someone whose legs had stopped agreeing to hold her.

+

“So what do I do?”

+

And Nariman — the shopkeeper of the Forgetting House, a man whose trade for twenty years had been buying — said:

+

“Nothing. Wait. A year. Two. Those two seconds will become five minutes. Then half a day. It doesn't end, but it makes room.”

+

“How would you know?”

+

Nariman opened his mouth to answer and found he had none — not because he didn't know, but because when he went looking for where the knowing came from, something moved behind that frosted glass and slid away.

+

“I don't know,” he said. “But I know.”

+
+

She left. When the door shut, Nariman looked at the empty stool for a while.

+

That night, upstairs, a thought came and would not leave him until morning: for twenty years a thousand people had come, and a thousand times he had said sit and tell me and it's done. Today was the first time he had sent anyone away.

+

And instead of lightness, what he felt was something like shame.

+

As though today, after twenty years, he had understood that the thousand before her could also have been sent away.

+
+
+ +
+
+
Chapter Six
+

The Girl Who Came to Buy Something Back

+

It was the fourteenth of December when the door opened and she came in.

+

Twenty-nine. Short. An oversized army jacket that was not her size and smelled of a man. Her hair pulled back hard — the way people tie it before a fight.

+

“Can I help you.”

+

She came straight to the counter. She did not look at the shelves. Everyone entering this shop for the first time looks at the shelves.

+

“I've come to buy something.”

+

“We don't sell here. We only buy.”

+

“I know.”

+

“Then what do you want?”

+

“A memory. Back.”

+

Nariman sat down and laid the cloth on the counter.

+

“Have you heard the third rule?”

+

“Everyone's heard the third rule.”

+

“Then you know my answer.”

+

She took a piece of paper from her jacket pocket; folded, worn, its edges soft from years of handling. Written on it in blue ballpoint:

+
The Forgetting House — Stone Lane, past the tailor's. Wooden door.
+

“That's my mother's handwriting.”

+

Nariman looked at the paper and not at the girl.

+

“She came here twenty years ago. She sold something. I want to buy it.”

+

“If your mother sold it, only she can—”

+

“My mother is dying.”

+

Her voice did not rise. It stayed flat, which was worse.

+

“Four months, maybe less. She sold something she shouldn't have and for twenty years I've watched it rot her from the inside while she has no idea why. I want her to have it back before she goes.”

+

“What did she sell?”

+

She paused. For the first time something shifted in her jaw.

+

“My sister.”

+

Rain struck the window.

+

“Her name was Nazli. She was six. I was nine. There was an accident, and my mother came here and said, take the day of the accident.” She breathed. “The roots took all of Nazli.”

+

Nariman's fist closed on the counter.

+

“A woman who has lost her child cries. My mother doesn't cry. For twenty years my mother has found Nazli's photograph in a drawer and said, who's this little one, doesn't she look like you.” She swallowed. “And every time I have to decide whether to tell her. And every time I don't. Because if I tell her, she only grieves once — from the beginning, again. In the last four months of her life.”

+

The silence went long. The kind in which you can hear cars on the main road.

+

“Your mother's name?”

+

“Fereshteh Azarang.”

+

Nariman stood and went towards the ladder. “Go home. Come tomorrow.”

+

“Does that mean—”

+

“It means go home.”

+

The girl went to the doorframe. Stopped. Her hand stayed on the handle.

+

“My name is Sogand.”

+

And she left.

+
+

When the door shut, the shop stayed quiet.

+

Nariman put a hand on the rung of the ladder and noticed that his lips were moving. He was repeating the name. Slowly, over and over, like a man tasting a word in a foreign language, trying to work out why it sits so easily in his mouth.

+

Sogand. Sogand. Sogand.

+

Nothing came.

+

And that nothing, after twenty years, was the first one that hurt.

+
+
+ +
+
+
Chapter Seven
+

What Is Not in the Ledger

+

That night he opened the ledger and went back twenty years.

+

Azarang, Fereshteh. Page 206. In Mrs. Firouz's small slanted hand:

+
18 February — Azarang, Fereshteh. 34.
“The day of the accident.”
Deep root. Warned. Insisted.
Shelf 9, row 2.
+

He took the ladder to shelf nine and searched row two from one end to the other. Twice. Three times.

+

It was not there.

+

And there was no gap either; the vials sat flush against one another, tidy, as though nothing had ever stood between them. Someone who did not know would never have seen it.

+

He went back to the ledger. Turned. Page 207. Then six cut edges. Then 214.

+

Between February and June of that year, four months of this shop's history had been removed with a blade.

+

Nariman closed the ledger and looked at his hands.

+

Mrs. Firouz had died that summer. And Nariman had been here since that summer.

+

A simple question formed in his head. The kind any person on earth answers in half a second.

+

Where was I before?

+

He sat down on the bottom rung.

+

He knew how to bake bread, so somewhere he had learned. He knew how to talk to a child, so somewhere he had been one. He had a language, he had a city, he knew the names of the streets.

+

But when he tried to reach anything before that summer, something like frosted glass came forward. Not blackness — frosted glass. There was something behind it. It moved.

+

He thought about it for twenty minutes.

+

And then he did what he had not done in twenty years: he stood, went to the small mirror above the shop's washbasin, and asked himself:

+

“Who are you?”

+

A grey man in the glass looked back and had no answer.

+
+
+ +
+ +
Book Two

The Daughter

+
Twenty years nobody watched
+
+ +
+
+
Chapter Eight
+

Nine

+

In the mornings there was the smell of bread, and that meant everything was where it should be.

+

Sogand had not learned this from her mother; she had discovered it herself. Years later, when people asked when she had known her house was broken, she would say: the morning I came downstairs and there was no smell of bread.

+

Four months had passed since the accident.

+

In those four months the house had learned to walk around a name without touching it. Nobody said Nazli. Nazli's room became that room. Nazli's shoes were gone, but the place where they had stood remained on the shoe rack: a clean rectangle on dusty wood.

+

Sogand was nine and had learned not to cry, because she had seen that her crying took her mother's legs out from under her. She had learned to do it at night, under the blanket, silently, a fist against her mouth. She had learned to wash her face in cold water in the morning so the red would leave her eyes.

+

She was nine and she had a profession: sentry.

+
+

And her father, in those four months, had gone quiet.

+

Not a frightening quiet. A kind one. He would sit, listen, nod. He looked over her homework. Once he folded her a paper boat and put it in the gutter and they ran after it to the end of the street.

+

Sogand understood later that the boat was the last thing her father ever made for his daughter.

+

That week he came home late several times. One night his clothes were wet. One night there was a piece of paper in his pocket that Sogand did not see and her mother did, and said nothing about.

+
+

And then that morning came.

+

Sogand went down the stairs. There was no smell of bread. The kitchen light was on and her father was standing in the middle of the room in last night's shirt, looking at the teapot the way a man looks at an object when he isn't sure whose it is.

+

“Morning, Dad.”

+

Her father turned.

+

And looked at her.

+

Sogand spent her whole life trying to describe that look to someone and never managed it. It was not cruel. It was not cold. If it had been cold it would have been easier to bear. That look was polite. The look a man gives the host's child at a party.

+

Her father smiled and said:

+

“Morning, sweetheart. Where's your mum?”

+

And then, when her mother came in from the hall, he turned to her and with the same smile, in the same ordinary voice — the voice he told stories in, the voice he joked in — asked:

+

“Fereshteh. Whose child is this?”

+
+

What broke in that moment made no sound.

+

Sogand replayed the scene a thousand times afterwards and each time stopped on a different detail. On the tap being left running. On her mother gripping the counter edge and tearing a fingernail, and the nail staying torn for a month because nobody fixed it. On the fact that the first thing that came to her own nine-year-old mind was: I must have done something wrong.

+

Children always think it's their fault. This is not stupidity; it is that they would rather live in a world where, if you are good, nothing bad happens.

+

She did not go to school that day.

+

She sat in the hallway and watched through the gap in the door as her mother brought out photographs and set them in front of her father, and her father looked at them with a terrible respect and interest and said, “What a funny little thing she is.”

+

Her father stayed two weeks.

+

Two weeks that Sogand spent entirely on a plan: if I make myself enough like the girl he's forgotten, maybe he'll remember. She tied her hair the way it was in the photographs. She wore the same clothes. She stood in front of him and said her name, loudly, twice.

+

Her father put a hand on her head — the way you pat a neighbour's cat — and said, “Good girl.”

+

On the fourteenth night, her father left.

+

Sogand was awake. She heard the door. She ran to the window and saw a man at the end of the street, under the lamp, standing and looking up; not at her window — at the roof, at the sky, at something that wasn't there.

+

Then he went.

+

Sogand stayed at the window until morning, because she thought that if she didn't stop, if she didn't look away for even a second, the man might come back.

+

This was the first night of her watch.

+

It lasted twenty years.

+
+
+ +
+
+
Chapter Nine
+

A House with Two Absences

+

Her mother told everyone that her father had died.

+

Sogand never corrected her. She was eleven when she understood why: because dead is a word people know what to do with. They bring you sweets, they shake their heads, and after six months they forget and life goes on. But he left and did not know me is not a word anyone knows what to do with. People simply get frightened and step back.

+

So Sogand learned to carry her mother's lie. That became her second profession.

+
+

Her mother, Fereshteh Azarang, had become a strange woman.

+

Not mad. The opposite: excessively ordinary. She went to work, cooked, paid the bills, cleaned the house for New Year. Anyone looking from outside would have said here is a woman who has come through a catastrophe with dignity.

+

But something in her was hollow, like a room in a house they've bricked over.

+

The way she cracked four eggs for three people who were no longer three. The way she stopped outside the shoe shop and looked at children's shoes and then shook her head and said I was miles away. The way, at bedtime, she reached out and switched off the light in a room where nobody was.

+

Sogand called these footprints. Nazli was gone, but her footprints had stayed inside her mother; and every day, without knowing, her mother stepped into them and limped.

+
+

Once — she was thirteen — she couldn't stand it.

+

She took the photograph out of the drawer and put it on the kitchen table. Two girls on the steps of a yard, the older one with half a smile, the younger with her left shoe in her hand.

+

“Mum. Who's this?”

+

Her mother looked. Leaned closer. Ran a finger over the smaller face.

+

“What a sweet little thing,” she said. “She looks so like you. Is she your cousin?”

+

And Sogand opened her mouth.

+

And closed it.

+

And that night, for the first time in four years, she cried like a child — not from grief, from rage — and then washed her face and took the photograph and put it back in the drawer, in exactly its place, under the identity papers.

+

That night she made a decision that stayed with her until she was twenty-nine:

+

I will remember. On behalf of all three of them.

+

And like every large decision a person makes at thirteen, it had the shape of love and did the work of a prison.

+
+
+ +
+
+
Chapter Ten
+

Sixteen

+

She found the paper by accident, behind the frame of the wedding photograph.

+

Her mother's handwriting. Three words and an address. Stone Lane, past the tailor's, wooden door.

+

Sogand was sixteen and too clever to think it was an ordinary address, because nobody hides the address of a tailor behind their wedding photograph.

+

It took three weeks to find the lane. In those days you still had to ask people, and when people heard the name of that shop they looked at you a particular way: half pity, half so soon?

+

Thursday, five in the afternoon, she reached the top of the lane.

+

And stopped.

+

The shop was at the far end. Its light was on. Behind the fogged glass, someone moved behind a counter.

+

Sogand began to walk. Twenty paces. Fifteen. Ten.

+

And then the man lifted his head.

+

His hair had gone grey. He was thinner. But the jaw, but the shoulders, but that movement he made with his thumb at the corner of his eyebrow when he was thinking—

+

Sogand froze where she stood.

+

Three metres from the door.

+

And in those three metres, in those few seconds, everything she had built since she was nine collapsed. Because until that day her father had been a story. An injustice. Something she argued with in her head and answered in her head, and always, at the end of those conversations, he understood and was sorry and put his arms around her.

+

But this man behind the glass was not a story. He was a person washing a glass.

+

And if she knocked, that person would turn around and say: Can I help you?

+

Sogand thought, later, that people are not usually afraid of the truth. They are afraid of testing it and losing, and then not even having the hope of a different answer left. As long as you haven't knocked, both answers are possible.

+

She turned back.

+

She walked to the main road, got on a bus, sat at the back, and cried all the way home; quietly, facing the window, so that nobody would know.

+

And that night, on the back cover of her maths exercise book, she wrote in blue ballpoint:

+
Thursday. The light was on.
+
+
+ +
+
+
Chapter Eleven
+

Thursdays

+

It took thirteen years. Which is to say six hundred and some Thursdays.

+

The route was always the same: bus to the square, on foot to the main road, then Stone Lane. She came as far as the corner, leaned against the wall, and looked to see whether the light was on.

+

If it was on, she stayed ten minutes and went home.

+

If it was off, she stayed longer.

+

She never knocked.

+
+

In those thirteen years Sogand grew up, the way people grow up in the margin of a large waiting. She started university and left it half-finished. She worked in two places. Once she fell in love and after a year the man said part of you is never here, and he was right, and Sogand could not tell him where that part was.

+

Her friends said she should move on. They said your father's dead — because everyone thought he was — they said you can't do this forever.

+

And Sogand nodded and on Thursday went to the corner of the lane.

+

Sometimes she despised herself for it. Sometimes she built explanations: I go because I need to know he's alive, because one day my mother will ask, because one day he might collapse and there'd be nobody.

+

None of it was true.

+

The truth was simpler and more shameful: as long as that light was on, Sogand was somebody's daughter. There was a man in this city who — though he didn't know it — counted as her father. If she knocked and he did not know her, that last grain would go too.

+

So she didn't knock. And she came. And she didn't knock.

+

A person can feed off a wound for thirteen years, provided they never let it close.

+
+

One Thursday — she was twenty-two — the light was off and the door was ajar.

+

Sogand went as far as the doorway. From inside came the sound of something breaking, and then a man swearing.

+

He didn't swear. Her father never swore.

+

Sogand stood there and thought that the man inside had spent twenty years becoming someone she did not know. That as much as her father had lost her, she was losing someone too — someone who came every Thursday for him. That perhaps both of them were keeping a dead man alive.

+

She turned back.

+

And that week, for the first time, she wrote nothing in her book.

+
+
+ +
+
+
Chapter Twelve
+

The Decision

+

It was November when her mother said it was nothing.

+

Sogand knew exactly when her mother said it's nothing. It was the tone she had used to say your father is dead.

+

Two weeks later, in a hospital corridor, a young doctor explained with tired kindness how much time was left. Sogand nodded, thanked him, went down to the car park, and looked at a concrete pillar for twenty minutes.

+

Then she took the bus home and made dinner.

+
+

That night her mother sat at the table pushing rice around with a fork.

+

“Sogand.”

+

“Yes.”

+

“There's something and I don't know what it is.”

+

Sogand's hand stopped moving.

+

“I've lost something.” Her mother was looking at her plate. “I don't know what. But it's there. Like when you leave the house and you're certain you've forgotten something and however hard you think you can't remember what.” She lifted her head and smiled — the smile Sogand had been watching for twenty years, the one that took a piece of her every time. “I've been leaving the house for twenty years, love.”

+

Sogand got up, carried the plates to the kitchen, ran the tap so it would make noise, and stood facing the wall with a hand over her mouth.

+

Four months.

+

Which meant her mother was going to die with that hollow in her. Which meant that woman's last thought, in her last room, would be that she had left something behind and never learned what.

+

And Sogand was the only person alive who knew what.

+
+

That night she sat on her bedroom floor until dawn and took the folded paper out from behind the frame.

+

Thirteen years it had been with her. The edges had gone soft.

+

And for the first time, the question was no longer her father.

+

She had to understand that difference before she could leave the house: for thirteen years, every Thursday, she had gone for herself. For that grain of being somebody's daughter. And that was exactly why she had never been able to knock — because when a thing is for you, the fear comes from you too.

+

This time it was not for her.

+

In the morning Sogand tied her hair back. Hard. She put on her father's jacket — the only thing left of him, and that only because it had been forgotten on a hook.

+

And she went.

+

At the corner of the lane, in the usual place, she leaned against the wall.

+

The light was on.

+

Sogand looked at it and thought, for the six-hundred-and-somethingth time, that she could still turn back. That it wasn't too late. That until you knock, both answers are possible.

+

Then she pushed off the wall and started walking.

+

Twenty paces. Fifteen. Ten. Three.

+

She raised her hand.

+

And knocked.

+
+
+ +
+ +
Book Three

The Trade

+
The vial is almost empty
+
+ +
+
+
Chapter Thirteen
+

Mr. Farhoud

+

The man who came the next day had no umbrella and was not wet; his driver had brought him to the door.

+

Grey suit, expensive watch, and the kind of affability that frightens people because it never switches off.

+

“Mr. Nariman Sadr. At last.” He put out a hand. “Farhoud. Kayvan Farhoud.”

+

Nariman did not take it. “Are you a customer?”

+

“A partner.” He turned around the shop. “Good God. How many are there?”

+

“I don't count them.”

+

“Why not?”

+

“Because they aren't numbers.”

+

Farhoud laughed and leaned on the counter.

+

“Do you know what's wrong with this place? It doesn't scale. How many customers a day? Three? And you have to sit and listen to each one for hours. It's a waste. You're sitting on a gold mine and mining it with a teaspoon.”

+

“And your proposal?”

+

“Branches. Systems. Trained operators.” He opened his hands. “One in every city. A published tariff: light memory, medium, heavy. Get the insurers on board. Who in this country isn't in pain? Everyone. We'd only be providing a service.”

+

“Where do the vials go?”

+

“Central storage. I have better preservation methods. Industrial. Cold rooms. You're working with a wooden ladder, man.”

+

“Who keeps them?”

+

“I told you, the ware—”

+

“No.” Nariman stood. “Who? Which person? These don't stay in the glass. They seep. Somebody has to sleep above them at night and dream them. I have two thousand; look at me. Who sleeps a hundred thousand?”

+

Farhoud's smile stayed where it was, but something behind it moved.

+

“Interesting. I hadn't heard that part.”

+

“Because you had nobody to ask.”

+

Farhoud looked at the shelves for a while. Then he said something Nariman had not expected.

+

“I've been seven times.”

+

“Where?”

+

“Places like this. In several countries. People who claimed they knew how.” He straightened his watch; his first unprofessional movement. “None of them could. There's something I've been carrying for nineteen years and nobody has been able to take it off me.”

+

“Because they didn't know how?”

+

“Because—” his smile came back, harder than before, “—perhaps some things can't be said. And what you can't say can't be sold.”

+

Nariman looked at him. For the first time, the man had come to resemble a customer.

+

“I could sit and listen. No charge.”

+

“No.” Farhoud laid his card on the counter. “I didn't come here to be a customer. I came to be the owner.” He went to the door. “Think it over. I'm patient — up to a point.”

+

He left.

+

Nariman did not pick up the card. When Sogand came that evening, it was still lying there.

+
+
+ +
+
+
Chapter Fourteen
+

Mr. Shokouhi Loses His Own Name

+

It was a Thursday when Shokouhi came in and could not say what he wanted to sell.

+

He sat on the stool, locked his fingers, opened his mouth and shut it.

+

“There was something.”

+

“It's all right.”

+

“No, there was something. It mattered. I had it on the way here.” He struck his forehead with the flat of his hand. “Damn it.”

+

“Mr. Shokouhi. What's your name?”

+

He looked up. He smiled; the apologetic one. “What a ridiculous question.”

+

“Say it.”

+

And Mr. Shokouhi opened his mouth, and nothing came.

+

The silence that followed was the silence of an operating theatre.

+

Nariman came out from behind the counter, sat beside him, put a hand on his wet shoulder — the left one, the broken umbrella.

+

“Your name is Kamran Shokouhi. You were born in July. You worked at the registry office and you retired. You have a niece whose wedding was five years ago, and you sang at it.”

+

“Yes.” He nodded fast, like a man grabbing at a boat. “Yes. Kamran. Kamran.”

+

“Don't come again from next week.”

+

He looked at him.

+

“I mean it. I won't buy anything from you again.”

+

“Why?”

+

Nariman pointed at the left-hand shelf. Fourth row.

+

“Those aren't your embarrassments, Mr. Shokouhi. Those are you. Every person is made of a thousand humiliating moments. Those moments are the glue that fastens a man to other men; that's what they're for. Take them all out and what's left isn't a person. It's an empty room.”

+

Shokouhi looked at the thirty-seven vials for a while.

+

“Could I have them back?”

+

And Nariman — who had heard that question a thousand times and given one answer a thousand times — paused.

+

“No.”

+

The man stood. Took the broken umbrella.

+

“Goodbye, Mr. — sorry. What was your name?”

+

“Nariman.”

+

“Goodbye, Nariman.”

+

When the door shut, Nariman looked at the business card on the counter, then at the shelves, then at his own hands.

+

A few weeks ago, when he had turned that woman away, he had asked himself for the first time whether this shop helped people or slowly ate them. The question had not left since; it had only been waiting for someone to lose his own name and come back.

+

And then a colder thought arrived: if Shokouhi sold thirty-seven and lost his name, what have I lost, who have slept two thousand?

+
+
+ +
+
+
Chapter Fifteen
+

The Cellar

+

The hatch was under the rug and he had not opened it in twenty years.

+

Mrs. Firouz, in her last week, had pointed at it: “Down there are the things that should never have been sold. Don't go until you have to. When you have to, you'll know.”

+

He switched on the torch and went down.

+

It was cold. The smell of earth and old wood. And at the far end, one small shelf. Only one. With a white cloth over it.

+

He drew the cloth aside.

+

These vials had labels. Real ones. With names.

+
    +
  • Dalaram Firouz
  • Rahim Dastgheib
  • Minoo Saffar
  • +
  • Fereshteh Azarang
  • Nariman Sadr
  • +
+

His heart stopped, and then, late, started again.

+

His own name. In Mrs. Firouz's hand.

+

He picked the vial up. It was heavy — heavier than anything he had ever held. The liquid inside was not black; it was gold. Dull gold, like honey left standing for years.

+

Beside it lay a roll of paper tied with string. On the string, a label: For whoever finds this.

+

Nariman sat down on the cellar step and untied it.

+
+
+ +
+
+
Chapter Sixteen
+

Dalaram Firouz's Letter

+
+

Whoever you are, you have understood by now that something is missing from you.

+

So I shall be brief. The shopkeeper of the Forgetting House is not chosen. He is made.

+

This shop has a fourth rule that we do not tell the customers, because if we did, nobody would come: every memory that is sold must be carried by someone. We are not brokers. We are the quay. The load is set down on us.

+

And a person who takes up the load of a thousand others must have an empty place in him. A full man has no capacity. That is why the shopkeeper is always someone who once sold the heaviest thing he had and does not know what it was.

+

I sold too. Thirty years ago. Every morning I wake missing someone I cannot name. Sometimes I stop in the middle of work and look at the door. I don't know who I am waiting for.

+

The vial with your own name on it is the thing you sold. It is yours. You have the right to take it. But know this:

+

If you take it back, you are no longer the shopkeeper. A man who is full cannot swallow. You would have to shut the door that same day.

+

And there are a thousand people in this city whose nights depend on somebody, somewhere, carrying their load. If the door shuts, a memory with no keeper goes back to its owner. All of it. Without warning. Imagine it: a woman who sold her child forty years ago so that she could go on living, getting it all back on an ordinary afternoon, halfway through buying bread.

+

I could not. For thirty years I looked at my vial and did not take it. I am not saying I did right. I am saying I could not.

+

One more thing, and then I will leave you alone.

+

One day someone will come and want another person's memory back. It is possible. But it is not free; the law of this shop is trade, not mercy. For a memory to return, someone must give something of equal weight. And that someone is not the owner of the memory — it is the person who wants it.

+

Tell them exactly that, then be quiet and let them decide. You have no right to make that decision for anyone.

+

I made it once. For a man who was very young and very wrecked and had come to sell one rainy day. I saw what was clinging to the root of it. I saw, and I said nothing, because I believed I was being merciful.

+

And I have not forgiven myself to this day.

+

Dalaram Firouz

+
+

Nariman read the letter twice.

+

Then he held the vial with his own name up in the torchlight. The gold liquid shifted slowly; like someone turning over in their sleep.

+

A man who was very young.

+

His hand tightened around the glass.

+

And then it opened.

+

He came up. Shut the hatch. Put back the rug. Went behind the counter and sat until morning, and all that night he understood one thing and could not run from it: the man who had carried this city's load for twenty years had once, somewhere, put something down and walked away.

+
+
+ +
+
+
Chapter Seventeen
+

What Sogand Knows

+

At seven in the morning, Sogand knocked.

+

Nariman opened the door in yesterday's clothes.

+

“Did you find anything?”

+

“Sit.”

+

He set a vial on the counter. The label: Fereshteh Azarang.

+

Sogand reached out and stopped, as though the glass were hot.

+

“Your sister is here.”

+

“All of her?”

+

“All of her.”

+

She took a long breath. “How much?”

+

“It isn't money.”

+

“Then what?”

+

Nariman gave her the rule, exactly as Mrs. Firouz had written it. A memory returns if the person who wants it gives something of equal weight. Not money. Not years of life. Memory against memory. And the weight is merciless: Nazli at six, with all six of her years, is the heaviest thing in this shop.

+

“So what am I supposed to give?”

+

“Something that weighs the same.”

+

“The heaviest thing I have is Nazli.”

+

“I know.”

+

Sogand stood, went to the window, looked at the lane for a while. From this side of the glass the lane seemed smaller.

+

“There's another thing that's heavy.”

+

“What?”

+

She turned. And for the first time in these few days her eyes went straight into his.

+

“My father.”

+

Nariman did not move.

+

“My father didn't die in that accident. He survived.” Her voice kept its terrible flatness. “Four months later he got lost. Not ran away — lost. I was nine and one morning I went into the kitchen and my father was standing there looking at me the way you look at a neighbour's child.”

+

Outside, the drip of the gutter.

+

“He asked my mother whose child I was.”

+

Nariman put a hand on the counter so that it would not shake.

+

“He stayed two weeks. Then he left. For twenty years my mother said he was dead. I was nine but I wasn't stupid. I found him when I was sixteen.” A pause. “For thirteen years I've come to this lane once a week and looked from the corner to see whether the light was on.”

+

Nariman shut his eyes.

+

And in the dark behind his eyelids, for the first time in twenty years, something moved behind the frosted glass; not a picture, not a sound — a weight. The weight of something on a shoulder. The weight of a child who has fallen asleep and has to be carried to her room.

+

“My name is Sogand Sadr.”

+

The rain came on.

+

“And you are my father.”

+
+

Nariman opened his eyes.

+

And did something that in none of those six hundred Thursdays Sogand had imagined. He did not weep, or deny it, or take her in his arms.

+

He stood, went behind the counter, brought the black ledger, set it in front of her and opened it to the page with six cut edges.

+

“Spring, twenty years ago.” He ran a finger along the cut. “Somebody took four months out of this shop's history. With a blade.”

+

Sogand looked at the severed paper.

+

“Why are you showing me this?”

+

“Because I want you to know who you're dealing with.” His voice was hollow. “I don't know that I'm your father. I believe you, but I don't know. To me you're a customer who wants something and has something.” His finger stayed on the page. “And the person who cut these pages was probably me. Which means I already took something from you once and then covered it over.”

+

Silence.

+

“So if you came here for the thing people get from their fathers, I don't have it,” he said. “I only have this: a shop that works.”

+

And Sogand — who had walked thirteen years with that folded paper in her pocket — nodded and said:

+

“That's what I want.”

+
+

That night Sogand did not leave.

+

Without either of them discussing it, she went upstairs and lay down on the spare mattress nobody had slept on in twenty years. Nariman said nothing. In the morning there were two glasses of tea on the counter.

+

People do not always come close to one another with words. Sometimes it is only an extra glass.

+
+
+ +
+
+
Interlude
+

Six Pages

+

Nobody read these six pages. Not Nariman, not Sogand. Dalaram Firouz cut them out and burned them, but before she burned them she copied them into a notebook of her own; and that notebook is still, to this day, somewhere nobody looks.

+

So only we know.

+
+
+

18 February. A woman came. Thirty-four. Azarang. Her child was taken at the boulevard crossroads. She wanted to sell the day of the accident.

+

I warned her. As always. I said it has roots. She said I know. I said it may take the child herself. She said if it does, thank God.

+

I took it. The root went all the way down. The child came out whole; six years of her, clean, like a tree lifted with its soil.

+

When the woman went out of that door she was light. The lightest person I have seen this year.

+

And I stood and looked at the vial and said to myself: well, you did your job.

+
+

Then, for three and a half months, she wrote nothing. The notebook is empty. Only one line, mid-March, undated: Dreamed of that child again. Her left shoe was in her hand.

+
+
+

1 May. A man came. Young. Thirty-something. He gave his name: Sadr. For a week now he has come to the top of the lane at night and turned back; I have seen him. Tonight he came in.

+

He said not his wife — his daughter. He said my child went in front of my eyes. He said I was driving.

+

He said that four times. I was driving.

+

He said I don't want to die and I can't live and I want a third option.

+

I gave him the rules. When I reached the second he cut me off and said let it take whatever it takes.

+

And I — and I write this because it has to be written somewhere — looked, and saw the root.

+

Thirty years I have done this. I see the root before the pulling; the way a midwife knows the child has turned.

+

When I looked at his day, I saw a little girl clinging to it. Hard. With her whole weight.

+

And I thought it was the same child. The one who had gone.

+

I thought: God, this man is selling his dead child and not one soul in the world loses by it.

+

I thought I was being merciful.

+

I took it.

+
+

After this, in the notebook, the writing grows unsteadier.

+
+

9 June. Today I understood.

+

The man has worked here three weeks. He had nowhere to go. He helps me, he tidies the shelves, he sleeps upstairs and in the mornings says he dreamed of strangers and laughs; a laugh he does not yet know the meaning of.

+

Today a woman came, not for a vial — for directions; a lady from that same neighbourhood. Talking, she said: poor Mrs. Azarang, lost her child and then her husband walked out on her, and now she's alone with the older girl.

+

I said: the older girl?

+

She said: nine years old. Sogand.

+

I opened the ledger. 18 February, Azarang. 1 May, Sadr. One house. One accident. Two transactions. And I took both of them myself.

+

And the little girl who was clinging to that man's root, whom I took for dead—

+

She was alive.

+

She is alive.

+

And this morning, in a house in this city, she woke and her father did not know her, and I did that.

+
+

In the margin of that same page, in pencil pressed so hard it has torn the paper, there is one sentence:

+

Thirty years I read the second rule aloud to other people, and today I understood that the second rule was written for me.

+
+
+

11 June. Two nights of thinking. I have three roads.

+

One: give him the vial and tell him. But then a man who ran over his own child gets all of it back at once, and I have seen him; I saw him that first night at the top of the lane. He would not come back from it. That road is murder, with glass.

+

Two: say nothing and let him go. But go where? A man who does not know what he has lost spends the rest of his life searching.

+

Three: keep him.

+

I have chosen the third, and I know I chose it for myself and not for him. Because I am old and this shop wants somebody and he is empty, and the empty ones are kept here.

+

So let me write it plainly, since nobody will read this and at least the paper should know:

+

I took a daughter from this man, and then I employed him to stand for the rest of his life behind the counter she was lost inside.

+

I will cut the pages. If he ever reads the ledger, he must not find the thread.

+

And I will put his vial downstairs, where I have looked at my own for thirty years and not taken it.

+

Perhaps he will be braver than I was.

+

Perhaps not. Most of us are not.

+
+

The last thing Dalaram Firouz wrote in that notebook was six weeks before her death, and had nothing to do with any of this — or everything.

+

One day a girl will come and ask for something we do not have. I will not be here. I hope whoever is behind the counter tells her the truth. Whatever it costs.

+
+
+ +
+
+
Chapter Eighteen
+

The House on Eleventh Street

+

That night Nariman pulled down the shutter and did something he had not done in twenty years: he walked out of Stone Lane towards a destination that was not the shop.

+

He had taken the address from the ledger. Beside Fereshteh Azarang's name, in Mrs. Firouz's small hand.

+

He walked forty minutes. The rain had stopped and the asphalt gave off a smell that carries a man back into a past that isn't his.

+

The house was two storeys at the end of an ordinary street, with a blue railing and a mulberry tree cut back to half itself.

+

Nariman stood on the far side of the road.

+
+

For a long time nothing happened.

+

He stood there and looked at a house and waited for something to occur in his chest.

+

Nothing occurred.

+

The house was a house. The railing was blue. The tree was cut back.

+

And Nariman Sadr, standing on the pavement opposite a house where — if the girl was telling the truth — he had eaten breakfast twenty years ago, felt nothing at all.

+

This is the thing to understand about what he did next: it was not pain. It was the absence of pain. Like putting your hand on a hotplate and having nothing happen, and the nothing tells you something in you has died.

+
+

It was almost nine when the upstairs light came on.

+

A woman came to the window. Thin. A headscarf. She drew the curtain aside and looked out; not at him — upward, at the sky, at something that wasn't there.

+

Nariman saw her face.

+

And again, nothing.

+

No name came, no smell, no voice. An unknown woman at an unknown window, who had apparently been his wife, and beside whom he had apparently once woken in the mornings.

+

She let the curtain fall. The light went out.

+

And Nariman stayed where he was.

+
+

On the way back he set it all out in his head; slowly, like a man roping down a load.

+

A woman of twenty-nine had stood at the top of a lane for thirteen years.

+

A woman was dying with a hollow in her.

+

And he, the man standing between the two of them, had nothing. No memory, no tears, not even the right to a share in the mourning.

+

Sogand thought she had come to get her father back. But there was no father to be got back; only a man who happened to have the same body.

+

And that — exactly that — was what decided it.

+

Because a man with nothing to feel can at least still do something. And the thing he could do, out of everyone in the world, only one person could do: stand behind that counter and bring a six-year-old sister down from shelf nine.

+

When he reached Stone Lane it was past one.

+

The shop light was on. Sogand had stayed awake.

+

Nariman stopped for a moment at the top of the lane and looked at that light — the way somebody else had stood and looked at it, every Thursday, for thirteen years.

+

Then he walked down and opened the door.

+
+
+ +
+
+
Chapter Nineteen
+

The Night the Vials Broke

+

Nariman did not call them. Farhoud came on his own; at night, with four men and a small truck.

+

“I asked once. Politely.” Behind him the men were carrying in empty crates. “You didn't answer. I'm patient, not patient. They're different.”

+

“These aren't goods.”

+

“I didn't say goods. I said stock.”

+

Sogand came down the stairs. “Get out.”

+

Farhoud looked at her. “Your daughter?”

+

Nariman said nothing. He could not say it.

+

Then everything happened fast.

+

One of the men dragged the ladder and the ladder struck shelf seven. Three vials fell from the top row.

+

The sound of breaking was so ordinary that for a second nobody was frightened.

+

Then the vapour rose.

+

Pale at first. Then thick. And then the room filled with something that was not air; a weight, a pressure, a soundless sound.

+

The man who had pulled the ladder stood in the middle of the shop and began to cry — loudly, shamelessly, like a child who has been lost. “Mum? Mum?”

+

Another dropped to his knees and put his hands over his face and repeated, “It wasn't me. It wasn't me. It wasn't me.”

+

Farhoud backed away. He had gone white. “What the hell is this?”

+

“This is the thing you wanted to industrialise.” Nariman came forward. “These are dead people, come back. This is the shame and the fear and the love of people who are out there right now living comfortably. One vial broke, Mr. Farhoud. One.

+

Farhoud looked at his men. Then at the shelves. Thousands.

+

And then he did what Nariman later understood was the single wisest act of that man's life: he turned and left.

+

At the door he stopped. Without turning his head he said:

+

“Nineteen years I've carried it. Now I know why nobody could take it off me.”

+

And he was gone.

+

Sogand took the men by the arm one at a time and pulled them out into the lane, where the air was air.

+
+

She came back. Nariman was standing in the vapour, breathing — deep, slow, like a man doing work.

+

“What are you doing?”

+

“Collecting them.” His voice had a rasp in it. “If I don't swallow them, they'll be out in the lane by morning.”

+

“These aren't yours.”

+

Nariman looked at her and — for the first time — laughed; a small laugh Sogand had not thought that face could hold.

+

“My girl. Not one of them ever was.”

+

It took three hours.

+

Sogand sat on the stair for all three and watched. She watched a man stand in the middle of a room and swallow a stranger's mother. She watched his shoulders come down. She watched one knee give and his hand go out to the shelf and then watched him straighten and go on.

+

When it was over the sky was going grey. Nariman was holding the counter edge to stay upright. Sogand took his arm and helped him sit, and in that moment saw that this man's hands, the hands of a man of fifty-two, had become an old man's hands in a single night.

+

“How much longer can you do this?”

+

Nariman looked at the ceiling and did not answer.

+

And that was the answer.

+
+
+ +
+
+
Chapter Twenty
+

The Price of Return

+

Three days later they sat on either side of the table in the back room.

+

Fereshteh Azarang's vial stood in the middle, and an empty one beside it.

+

Nariman gave her the rule in full. Without softening. Exactly as Mrs. Firouz had asked: say it, then be quiet.

+

“You want Nazli back for your mother. She weighs twenty years and the six years of a child. The only thing you own that weighs the same—”

+

“I know what it is.”

+

“Say it.”

+

Sogand looked at the empty vial. “You.”

+

“There's one more thing,” he said. “And you need to understand this one properly.”

+

“Go on.”

+

“You've remembered Nazli for twenty years. For twenty years you could have sat down in front of your mother and told her all of it. Why didn't you?”

+

“Because I was afraid.”

+

“No.” Nariman shook his head. “Because it wouldn't have worked. You could have told her a hundred times and your mother would only have heard a story. Like a story about a neighbour's child. She'd have been sad, and she'd have gone on. What comes out in this shop doesn't go back with ordinary talking. Only one thing can put it back: someone who is carrying it sits down and tells it.”

+

Sogand looked at the vial and slowly understood.

+

“So first it has to come into me.”

+

“Yes.”

+

“And then, once I've told my mother—”

+

“It leaves you.” His voice dropped. “That's what carrying means. One person has it. Not two. If you give it to your mother, it becomes hers, and it stops being yours.”

+

The shop went quiet.

+

“So I lose Nazli as well.”

+

“Yes.”

+

“And the twenty years I came to this lane once a week,” he went on, keeping his voice level. “All those nights. The kitchen, at nine years old. Sixteen, when you found me. Your hatred. Your hope. The fact of having a father at all. All of it goes. And the root may take other things neither of us knows about.”

+

“And Nazli?”

+

“Nazli too, the night you give her to your mother.” Nariman put his hands on the table. “Sogand, count it. You're giving both of them. At the end you'll be left with a shop.”

+

Sogand looked at the empty vial for a long time.

+

“And my mother gets what?”

+

“Everything. Four months.”

+

“Then it adds up.”

+
+

The silence went long. It was raining, as it does throughout this book.

+

“Dad.”

+

Nariman shut his eyes. It was the first time he had heard the word, and the last time he would, and they both knew it.

+

“Do you know why I came for twenty years?” she said. “At first I thought it was so that one day you'd know me. Then I understood it wasn't. I came because I was the only person in the world who remembered Nazli. And I was afraid I'd die and she would end completely.” She picked up the vial. “Now my mother can hold her. Four months. But she'll hold her.”

+

“And you won't remember me.”

+

“You haven't remembered me for twenty years.” She smiled; and for a second the smile looked like Mrs. Morvarid's. “We're only settling up.”

+

Nariman laid his hands flat on the table. They were old. Far older than fifty-two.

+

“This is a very bad transaction, Sogand.”

+

“Every transaction in this shop is bad.” She stood and looked at a thousand vials; a thousand people, a thousand nights somebody has to sleep. “But somebody has to make them.”

+

And then, more quietly:

+

“I want one thing from you.”

+

“Name it.”

+

“Afterwards — tell me something about me. Every day. It doesn't matter whether I believe you.” She shrugged, as though asking for something small. “Just don't let anyone end completely. That's what I learned from thirteen years at the top of a lane.”

+

Nariman looked at her.

+

“I promise.”

+
+
+ +
+
+
Chapter Twenty-One
+

The Last Transaction

+

It was five in the afternoon.

+

Fereshteh Azarang's vial first. Sogand sat, took out the stopper, and a smell rose that filled the whole room: the smell of the first year of school, the smell of a child's wet hair, the smell of a spring afternoon twenty years ago.

+

Nariman reversed the swallowing; a thing he had never done, which Mrs. Firouz had explained to him only once. Instead of listening, speak. Word by word. Nothing left out, nothing softened, no kindness. Say it so completely that the memory changes hands.

+

And he said it.

+

He said Nazli. The sixth birthday and the cake with two colours of ribbon. The voice that couldn't quite manage its S. The ridiculous habit of always putting the left shoe on first. The stupid game she played with her older sister, whose rules nobody else could follow.

+

And then, mercilessly, the day itself: the crossroads, the rain, the sound of the brakes, and then the silence that lasted twenty years.

+

Sogand did not cry. She kept her fists on the table and let it come in.

+

When it was finished the vial was empty and Sogand had Nazli — not only her own share; her mother's too. She was the carrier now, until she could get her to Fereshteh Azarang.

+
+

Then it was the second one's turn.

+

“Ready?”

+

“No.” She smiled. “Start.”

+

And Nariman did not start.

+

His hand stayed on the empty vial and did not lift it. Sogand waited. A minute passed.

+

“I won't do it.”

+

“What?”

+

“I won't do it.” He pushed the vial aside. “A thousand people have come here in twenty years and not once did I say no. Today I'm saying it.”

+

Sogand stood. “You have no right—”

+

“I know I have no right.” His voice rose; it was the first time Sogand had heard that voice from him. “It's the law of this shop: you make the decision. Mrs. Firouz wrote it and she was right to. But I'm breaking the law, because I know something you don't.”

+

“What?”

+

“I know what the other side of this transaction looks like.” He gestured at the shelves. “Twenty years I've watched people walk out of that door light. Every one of them thinks they're setting down a load. Not one of them understands they're setting down themselves.” He looked at her. “Right now you're the only person in this shop who has anything. I don't. Your mother doesn't. Nazli isn't here at all. Only you.”

+

Silence.

+

“So sit down and let your mother die with the hollow in her. People always die with a hollow in them. It isn't a catastrophe. It's a life.”

+
+

Sogand stood there a long time.

+

Then she did something he had not expected: she leaned over, picked the empty vial up off the table, and set it back in the middle, exactly where it had been.

+

“I'm going to ask you one question,” she said. “Answer it honestly, and whatever you say, that's what we do.”

+

“Ask.”

+

“If you were me, what would you do?”

+

And Nariman Sadr, a man who for twenty years had stood behind this counter telling people that memory has roots, opened his mouth to say I don't know.

+

And could not.

+

Because he knew the answer. His answer had stood outside this same door on a rainy night twenty years ago, and then had come inside.

+

“I'd do the same thing,” he said.

+

“Then pick it up.”

+

Nariman picked up the vial.

+
+

And she began to tell it.

+

From nine years old. From a kitchen with no smell of bread. From a man who looked at her like a neighbour's child and was polite, and how the politeness was the worst part. From the paper boat. From the night she stayed at the window until morning. From thirteen, and the photograph on the kitchen table. From sixteen, and the three metres she couldn't cross. From all the Thursdays; the wet ones, the one when she was ill and went anyway, the one when the light was off and she didn't sleep. From the man who said part of you is never here. From deciding to hate him and failing. From the surname that had stayed Sadr, even when she could have changed it.

+

The vapour rose; thick, gold, enough to move their shadows on the wall.

+

It settled in the glass.

+

Nariman did not put in the stopper. He lifted the vial, brought it to his mouth, and — because that was the law, because somebody had to carry it — drank.

+
+

And in that same second, in that one second, two things happened.

+

Sogand raised her head, looked at the man across the table, and did not know who he was.

+

And Nariman Sadr, for the first time in twenty years, knew his daughter.

+

Not by way of the vial in the cellar; that was still down there, under the white cloth, untouched. He knew her this way: twenty years of the one-sided love of a girl who came once a week and only looked to see whether a light was on, was now inside his chest.

+

He knew how much he had been loved. He knew every single Thursday. He knew that once, at sixteen, she had got within three metres.

+

And the person who had made that love was sitting across the table asking politely:

+

“Sorry — why am I here?”

+

Nariman opened his mouth. No sound came.

+

The second time it came:

+

“You're the new shopkeeper.”

+
+
+ +
+
+
Chapter Twenty-Two
+

Four Months

+

That night Sogand went to her mother's house, because the shop's ledger said she had to.

+

It was her own handwriting. A piece of paper she had found in her jacket pocket, folded, its edges soft:

+
Tonight, go to Mum. Everything in your head about Nazli — tell her. All of it. Don't be afraid.
— You
+

On the way she tried to work out why she had written it, and why her head was full of memories of a sister she knew — somehow — she had not spoken about to anyone in twenty years. But she was not afraid. When a person writes a letter to themselves, there is a kind of trust in it that needs no explaining.

+
+

Her mother was on the sofa with a blanket over her knees, the television on with the sound off.

+

“Mum.”

+

“Yes, love.”

+

Sogand sat beside her. She took the photograph out of the drawer and put it on the table. Two girls on the steps of a yard. The older with half a smile. The younger with her left shoe in her hand.

+

“I'm going to tell you something, and I want you to listen to the end.”

+

And she told it.

+

She told her about the sixth birthday. About the cake with two colours of ribbon. About the voice that couldn't quite manage its S. About the left shoe. About the stupid game nobody else could follow.

+

And then, because the note had said all of it, she told her about the crossroads. The rain. The sound of the brakes.

+

Her mother looked bewildered at first; like someone sitting inside a foreign language.

+

Then her hand went onto the photograph.

+

Then something rearranged itself in her face — not all at once; slowly, like water coming under a door.

+

And then Fereshteh Azarang, fifty-four years old, for the first time in twenty years, said her younger daughter's name.

+

And then she broke.

+
+

It was a long night.

+

Sogand sat with her until morning. Her mother wept and stopped and asked and wept again. Once she got angry and asked why she hadn't been told sooner, and Sogand had no answer. Once she laughed — one of those laughs that come in the middle of crying — because she had remembered that Nazli hated onions and used to fake a theatrical fainting fit over them.

+

Towards dawn she went quiet. The photograph was in her hand.

+

“Four months,” she said.

+

“Four months.”

+

“That's not much.”

+

“No.”

+

Her mother leaned her head on her shoulder.

+

“It's more than nothing.”

+
+

Fereshteh Azarang died a hundred and nineteen days later; in her own house, in the morning, with her daughter beside her.

+

In those hundred and nineteen days she did the thing that Sogand later understood had been the entire point: she grieved. With her whole body. Shamelessly and completely. She said her child's name out loud. She wept for her. She described her to the relatives. One day she even laughed and said, what a little devil she was.

+

And on the last day, when speaking had become difficult, she took Sogand's hand and said:

+

“I had two.”

+

That was all. Three words.

+

And Sogand pressed her mother's hand and said, I know, Mum — and did not know. She had not known for three months. But she had learned that when somebody is carrying something, you help them without needing to understand it.

+
+

Sogand came out and stood in the hallway of the house.

+

The photograph was still on the sofa. She picked it up. Two girls on the steps of a yard; the older with half a smile, the younger with a shoe in her hand.

+

She looked at the smaller child.

+

And waited.

+

Nothing came. No name, no voice, not the stupid game whose rules she had still known a few months ago. Only a child in an old photograph, who looked very like her.

+

That night — the hundred and nineteenth, in the kitchen of that house — Sogand had finished speaking and Nazli had gone out of her; exactly as she was meant to, exactly as someone had told her in advance that she would.

+

And her mother, to the last day, had two.

+
+
+ +
+
+
Chapter Twenty-Three
+

The Man Who Comes Every Day

+

The shop opened four months after that afternoon; the week after Fereshteh Azarang was buried.

+

For those four months the shutter stayed down, and every morning a young woman turned the key, dusted the vials, and then went to a house on Eleventh Street to sit beside her mother. The shop waited. Shops know how to wait.

+

Behind the counter now sits a woman of twenty-nine, in an oversized army jacket, her hair pulled back hard. She has the three rules by heart. She has learned the wooden ladder. At night she dreams of strangers, and in the mornings she opens the window and says, “This is not mine.”

+

Mrs. Morvarid comes twice a week, brings pastries, says she has decided this time, and does not. Without knowing why, Sogand sets the tea glass down with the handle towards the old woman's right hand.

+

Mr. Shokouhi comes sometimes, polite, with a broken umbrella, and asks whether they have met before. Sogand says yes, Mr. Kamran Shokouhi, you're an old customer of this shop. And he is pleased that somebody knows his name.

+
+

In her second week, Sogand found the hatch under the rug.

+

She went down. Drew aside the white cloth. Read the labels. Five names.

+

Her finger stopped on the last one.

+

Nariman Sadr.

+

Her own surname. She paused and waited to see whether anything would come — the way a person presses an old scar to check whether it still hurts.

+

Nothing came.

+

She shrugged. There are a thousand Sadrs in this city.

+

She put the cloth back and went up.

+
+

And every day, at five in the afternoon, a man comes.

+

He is old. His hair is grey; the colour of a thing that has burned. He buys two teas at the top of the lane, sets one on the counter and says, here you are.

+

At first Sogand thought he was a customer. Then she thought he was a vagrant. Now she does not think anything; she just takes the tea.

+

The man sits on the stool and starts to talk. Always about one person.

+

“I had a daughter,” he says. “Two, I think. One of them had something to do with a shoe — no. That one's gone. I don't have that one any more.” He laughs; a laugh with nothing under it. “Sorry. I lost one of them and I don't know which.”

+

“It's all right.”

+

“Her name was Sogand. Once, when she was nine, she came into the kitchen in the morning and I—” He always stops here. “I didn't know her.”

+

“Why not?”

+

“Because I was a fool. Because I thought you could take the pain out of a person and leave the person where they were.”

+

Sogand drinks her tea.

+

“She used to come to this lane once a week,” the man says, looking at the door. “Thirteen years. She only looked to see whether the light was on. She never knocked.”

+

“Why not?”

+

“Because she was afraid.”

+

“Of what?”

+

The man lifts his head and looks at the young woman behind the counter — at his daughter, who does not know she is his daughter — and smiles; a smile whose meaning nobody in this city can read any more.

+

“That she'd knock and I'd say: can I help you?

+

Silence.

+

“You come here every day and talk about her,” Sogand says. “Why?”

+

“Because I'm the only person left in the world who remembers her.” He picks up his tea. “And I'm afraid I'll die and she'll end completely.”

+

Sogand looks at him a while. Something shifts in her chest that she has no name for, and will have no name for tomorrow, or the day after; but every day at five it shifts again.

+

“What was her name?” she asks. “You said it, but I wasn't listening.”

+

And the man, as though he has been asked something enormous, sits up straight and says it carefully, the way you set down a valuable thing on a table:

+

“Sogand.”

+

“That's a lovely name.”

+

“Yes.” He nods. “Yes, it is.”

+
+

Outside, the rain starts. Which means tomorrow will be busy.

+

The man stands, puts the empty glass on the counter, and goes to the door.

+

“Will you come tomorrow?”

+

And the man, opening his umbrella, without turning round, says:

+

“Every day.”

+
+
+ +
+
+
+

+ The Man Who Forgot His Daughter
+ by Mohammadparham Palangsangdovini

+ All rights reserved by the author. +

+
+
+ +
+

The End

+

THE FORGETTING HOUSE

+
+ + + diff --git a/tools/browser.mjs b/tools/browser.mjs new file mode 100644 index 0000000..f461377 --- /dev/null +++ b/tools/browser.mjs @@ -0,0 +1,27 @@ +// Shared Chromium launcher. +// +// Playwright insists on the exact browser revision its npm package was built +// against. When the machine already ships a Chromium (CI images usually do), +// pointing at that binary is both faster and avoids a version-pin standoff. +// Set CHROMIUM_PATH to override; otherwise we probe the usual locations and +// fall back to whatever Playwright downloaded for itself. + +import { chromium } from 'playwright'; +import { existsSync } from 'node:fs'; + +const CANDIDATES = [ + process.env.CHROMIUM_PATH, + '/opt/pw-browsers/chromium', + '/usr/bin/chromium', + '/usr/bin/chromium-browser', + '/usr/bin/google-chrome', +].filter(Boolean); + +export function chromiumPath() { + return CANDIDATES.find((p) => existsSync(p)); +} + +export function launch(options = {}) { + const executablePath = chromiumPath(); + return chromium.launch(executablePath ? { ...options, executablePath } : options); +} diff --git a/tools/fetch-fonts.py b/tools/fetch-fonts.py new file mode 100755 index 0000000..bb29d3e --- /dev/null +++ b/tools/fetch-fonts.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +"""Fetch the OFL fonts both editions need, as TTF, into assets/fonts/. + +Idempotent: files already on disk are left alone, so re-running the build is cheap. +Everything here is Open Font Licence, which is what lets us embed it in a sold ebook. +""" +import re +import sys +import urllib.request +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +OUT = ROOT / "assets" / "fonts" + +# A UA with no advertised woff/woff2 support makes the Google Fonts API hand back +# plain TTF — pandoc's --epub-embed-font and fontconfig both want real font files, +# and an IE-era UA gets you EOT instead. This path serves one face per request, so +# each entry below pins a single weight/style rather than a whole family. +UA = "Mozilla/5.0 (X11; Linux x86_64)" +API = "https://fonts.googleapis.com/css2?family={}&display=swap" + +WANTED = { + # Persian edition + "Vazirmatn-Light.ttf": "Vazirmatn:wght@300", + "Vazirmatn-Regular.ttf": "Vazirmatn:wght@400", + "Vazirmatn-Bold.ttf": "Vazirmatn:wght@700", + "NotoNaskhArabic-Regular.ttf": "Noto+Naskh+Arabic:wght@400", + "NotoNaskhArabic-Bold.ttf": "Noto+Naskh+Arabic:wght@700", + "NotoNastaliqUrdu-Regular.ttf": "Noto+Nastaliq+Urdu:wght@400", + # English edition + "EBGaramond-Regular.ttf": "EB+Garamond:ital,wght@0,400", + "EBGaramond-Medium.ttf": "EB+Garamond:ital,wght@0,500", + "EBGaramond-Italic.ttf": "EB+Garamond:ital,wght@1,400", + "CormorantGaramond-Regular.ttf": "Cormorant+Garamond:ital,wght@0,400", + "CormorantGaramond-SemiBold.ttf": "Cormorant+Garamond:ital,wght@0,600", + "CormorantGaramond-Italic.ttf": "Cormorant+Garamond:ital,wght@1,400", + "Inter-Light.ttf": "Inter:wght@300", + "Inter-Regular.ttf": "Inter:wght@400", + "Inter-SemiBold.ttf": "Inter:wght@600", +} + +# The OFL requires its text to travel with the fonts, and these fonts are +# embedded in a book that gets sold, so the licences ship in assets/fonts/. +LICENCES = { + "OFL-Vazirmatn.txt": "vazirmatn", + "OFL-NotoNaskhArabic.txt": "notonaskharabic", + "OFL-NotoNastaliqUrdu.txt": "notonastaliqurdu", + "OFL-EBGaramond.txt": "ebgaramond", + "OFL-CormorantGaramond.txt": "cormorantgaramond", + "OFL-Inter.txt": "inter", +} +LICENCE_URL = "https://raw.githubusercontent.com/google/fonts/main/ofl/{}/OFL.txt" + +SRC = re.compile(r"src:\s*url\(([^)]+)\)") + + +def fetch(url, text=False): + req = urllib.request.Request(url, headers={"User-Agent": UA}) + with urllib.request.urlopen(req, timeout=60) as r: + data = r.read() + return data.decode("utf-8") if text else data + + +def main(): + OUT.mkdir(parents=True, exist_ok=True) + missing = [] + for name, query in WANTED.items(): + target = OUT / name + if target.exists() and target.stat().st_size > 0: + print(f" = {name} (cached)") + continue + match = SRC.search(fetch(API.format(query), text=True)) + if not match: + missing.append(f"{name} ({query})") + continue + target.write_bytes(fetch(match.group(1))) + print(f" + {name} ({target.stat().st_size // 1024} KB)") + + for name, family in LICENCES.items(): + target = OUT / name + if target.exists() and target.stat().st_size > 0: + continue + try: + target.write_bytes(fetch(LICENCE_URL.format(family))) + print(f" + {name}") + except Exception as exc: # noqa: BLE001 - a missing licence is worth naming + missing.append(f"{name} ({exc})") + + if missing: + print("\nCould not resolve:\n " + "\n ".join(missing), file=sys.stderr) + return 1 + print(f"Fonts ready in {OUT.relative_to(ROOT)}/") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/patch-epub.py b/tools/patch-epub.py new file mode 100755 index 0000000..934e10c --- /dev/null +++ b/tools/patch-epub.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +"""Apply the direction settings pandoc will not write, then repackage the EPUB. + +Pandoc emits a correct EPUB 3 but leaves two things undone for a right-to-left +book, and EPUB 3.3 will not let you fix either one from the stylesheet (the CSS +`direction` property is banned outright — epubcheck CSS-001): + + * `page-progression-direction="rtl"` on the OPF spine, which is what tells a + reader to page backwards and put the spine on the right + * `dir="rtl"` on every XHTML root element, which is what actually lays the + text out right-to-left + +Repackaging matters as much as the patch: `mimetype` has to be the first entry +in the archive and stored uncompressed, or the file is rejected as not an EPUB. +Python's zipfile will happily write a valid-looking archive that no store +accepts, so the order and compression are set explicitly below. + +Usage: tools/patch-epub.py build/fa/faramushkhaneh.epub --dir rtl +""" +import argparse +import re +import shutil +import sys +import tempfile +import zipfile +from pathlib import Path + +SPINE = re.compile(r"]*>") +HTML_TAG = re.compile(r"]*>") + + +def patch_spine(opf: Path, direction: str) -> bool: + text = opf.read_text(encoding="utf-8") + match = SPINE.search(text) + if not match: + raise SystemExit(f"{opf}: no element found") + tag = match.group(0) + if "page-progression-direction" in tag: + new = re.sub( + r'page-progression-direction="[^"]*"', + f'page-progression-direction="{direction}"', + tag, + ) + else: + new = tag[:-1].rstrip() + f' page-progression-direction="{direction}">' + if new == tag: + return False + opf.write_text(text.replace(tag, new, 1), encoding="utf-8") + return True + + +def patch_html_dir(path: Path, direction: str) -> bool: + text = path.read_text(encoding="utf-8") + match = HTML_TAG.search(text) + if not match: + return False + tag = match.group(0) + if re.search(r'\bdir="[^"]*"', tag): + new = re.sub(r'\bdir="[^"]*"', f'dir="{direction}"', tag) + else: + new = tag[:-1].rstrip() + f' dir="{direction}">' + if new == tag: + return False + path.write_text(text.replace(tag, new, 1), encoding="utf-8") + return True + + +def repackage(root: Path, target: Path) -> None: + mimetype = root / "mimetype" + if not mimetype.exists(): + raise SystemExit(f"{root}: no mimetype file to store first") + + files = sorted(p for p in root.rglob("*") if p.is_file() and p != mimetype) + with zipfile.ZipFile(target, "w") as zf: + # First entry, stored, no extra fields — this is what identifies the file + # as an EPUB before anything else in the archive is read. + zf.write(mimetype, "mimetype", compress_type=zipfile.ZIP_STORED) + for path in files: + zf.write(path, str(path.relative_to(root)), compress_type=zipfile.ZIP_DEFLATED) + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("epub", type=Path) + ap.add_argument("--dir", dest="direction", choices=["rtl", "ltr"], required=True) + args = ap.parse_args() + + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + with zipfile.ZipFile(args.epub) as zf: + zf.extractall(root) + + opfs = list(root.rglob("*.opf")) + if not opfs: + raise SystemExit(f"{args.epub}: no .opf found") + for opf in opfs: + patch_spine(opf, args.direction) + + touched = sum( + patch_html_dir(p, args.direction) + for p in sorted(root.rglob("*.xhtml")) + sorted(root.rglob("*.html")) + ) + + staged = Path(tmp + ".epub") + repackage(root, staged) + shutil.move(str(staged), args.epub) + + size = args.epub.stat().st_size / 1024 / 1024 + print( + f" ~ {args.epub} page-progression-direction={args.direction}, " + f"dir on {touched} documents, {size:.2f} MB" + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/prepare.py b/tools/prepare.py new file mode 100755 index 0000000..0df8800 --- /dev/null +++ b/tools/prepare.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python3 +"""Rewrite an edition's HTML into the semantic shape pandoc's EPUB writer wants. + +The source files are designed for the screen: one long scroll of
s, a +hand-written contents page, a full-bleed cover, and chapter headings split across +a
and an

. None of that survives contact with an +EPUB reader intact, so this script: + + * drops the screen cover and the hand-written contents page (the EPUB gets a + real cover image and a real generated nav) + * folds "Chapter One" + "The Three O'Clock Customer" into one heading, so the + navigation reads the way a reader expects + * promotes part dividers to

and chapters to

, which is what makes + --toc-depth=2 list every chapter (the source's

would fall below it) + * lifts the decorative part-divider SVGs out to real image files, so the XHTML + stays valid instead of carrying raw un-namespaced through + * pushes the per-part accent class down onto the elements that use it, because + EPUB readers cannot be trusted with CSS custom properties + * keeps .letter, .journal, .ledger, .names, .brk and .lead exactly as they are + +Usage: tools/prepare.py --lang fa --src src/faramushkhaneh.html --out build/fa +""" +import argparse +import re +import sys +from pathlib import Path + +from bs4 import BeautifulSoup + +# Heading text for the front-matter section that has a chapter-num but no

. +# Everything else is discovered from the markup itself. +PART_CLASS = re.compile(r"^p[123]$") + + +def classes(tag): + return tag.get("class", []) if hasattr(tag, "get") else [] + + +def accent_of(section): + """The p1/p2/p3 class that decides this section's accent colour.""" + for c in classes(section): + if PART_CLASS.match(c): + return c + return None + + +def strip_inline_styles(node): + """Inline styles reference CSS variables that will not exist in the EPUB.""" + for tag in node.find_all(style=True): + del tag["style"] + if node.has_attr("style"): + del node["style"] + + +def propagate_accent(node, accent): + """Give .orn and .brk their accent colour as a real class, not a variable.""" + if not accent: + return + for tag in node.find_all(class_=["orn", "brk"]): + tag["class"] = list(tag.get("class", [])) + [accent] + + +def unwrap_wraps(node): + for w in node.find_all("div", class_="wrap"): + w.unwrap() + + +def fix_names_lists(soup, node): + """
    and
  • lose their classes in pandoc's AST + (lists and list items carry no attributes), so move the hooks somewhere that + survives: a wrapper div and an inner span.""" + for ul in node.find_all("ul", class_="names"): + ul["class"] = [c for c in ul.get("class", []) if c != "names"] + if not ul["class"]: + del ul["class"] + for li in ul.find_all("li", class_="me"): + span = soup.new_tag("span") + span["class"] = ["me"] + for child in list(li.contents): + span.append(child.extract()) + li.append(span) + del li["class"] + wrapper = soup.new_tag("div") + wrapper["class"] = ["names"] + ul.wrap(wrapper) + + +def heading(soup, level, parts, extra_classes): + """A heading whose text reads well in the navigation ("Chapter One — Nights") + but stacks on two lines on the page itself, via a separator span the + stylesheet hides.""" + h = soup.new_tag(f"h{level}") + h["class"] = extra_classes + for i, (cls, text) in enumerate(parts): + if i: + sep = soup.new_tag("span") + sep["class"] = ["numsep"] + sep.string = " — " + h.append(sep) + span = soup.new_tag("span") + span["class"] = [cls] + span.string = text + h.append(span) + return h + + +def text_of(tag): + return tag.get_text(" ", strip=True) if tag else "" + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--lang", required=True) + ap.add_argument("--src", required=True, type=Path) + ap.add_argument("--out", required=True, type=Path) + args = ap.parse_args() + + src = BeautifulSoup(args.src.read_text(encoding="utf-8"), "html.parser") + + media = args.out / "media" + media.mkdir(parents=True, exist_ok=True) + + out = BeautifulSoup( + '\n', + "html.parser", + ) + html = out.find("html") + html["lang"] = args.lang + html["dir"] = "rtl" if args.lang == "fa" else "ltr" + title = src.find("title") + head = out.find("head") + if title: + t = out.new_tag("title") + t.string = title.get_text(strip=True) + head.append(t) + body = out.find("body") + + part_index = 0 + counts = {"part": 0, "chapter": 0, "front": 0} + + for section in src.find("body").find_all("section", recursive=False): + cls = classes(section) + + # The screen cover is replaced by the real cover image. + if "cover" in cls: + continue + # The hand-written contents page is replaced by the generated nav. + if section.find("div", class_="toc"): + continue + + strip_inline_styles(section) + accent = accent_of(section) + + if "epigraph" in cls: + div = out.new_tag("div") + div["class"] = ["epigraph"] + for child in list(section.find("div", class_="wrap").contents): + div.append(child.extract()) + body.append(div) + continue + + if "part" in cls: + part_index += 1 + counts["part"] += 1 + svg = section.find("svg") + label = text_of(section.find("div", class_="label")) + name = text_of(section.find("h2")) + note = text_of(section.find("div", class_="note")) + + body.append(heading(out, 1, [("part-label", label), ("part-name", name)], ["part-h"])) + if svg: + # Raw without a namespace makes epubcheck fail; a real .svg + # file referenced by is valid everywhere and keeps the art. + svg["xmlns"] = "http://www.w3.org/2000/svg" + path = media / f"part-{part_index}.svg" + path.write_text(str(svg), encoding="utf-8") + img = out.new_tag("img", src=f"media/{path.name}", alt="") + img["class"] = ["part-mark"] + body.append(img) + if note: + p = out.new_tag("p") + p["class"] = ["part-note"] + p.string = note + body.append(p) + continue + + if "end" in cls: + div = out.new_tag("div") + div["class"] = ["the-end"] + for child in list(section.contents): + div.append(child.extract()) + body.append(div) + continue + + # Everything left is a .chapter section: prologue, a numbered chapter, + # the interlude, or the colophon. + head_div = section.find("div", class_="chapter-head") + wrap = section.find("div", class_="wrap") + + if head_div is None: + # Colophon — no heading of its own, so it rides along after the last + # chapter and is pushed onto a fresh page by the stylesheet. + div = out.new_tag("div") + div["class"] = ["colophon"] + source = wrap or section + strip_inline_styles(source) + for child in list(source.contents): + div.append(child.extract()) + body.append(div) + continue + + num = text_of(head_div.find("div", class_="chapter-num")) + h3 = head_div.find("h3") + head_div.extract() + + if h3 is None: + # Prologue: a front-matter unit, so it sits at part level. + counts["front"] += 1 + body.append(heading(out, 1, [("front-name", num)], ["front-h"])) + else: + counts["chapter"] += 1 + extra = ["chapter-h"] + if "midbreak" in cls: + extra.append("midbreak-h") + body.append( + heading(out, 2, [("chapter-num", num), ("chapter-title", text_of(h3))], extra) + ) + + unwrap_wraps(section) + propagate_accent(section, accent) + fix_names_lists(out, section) + + holder = body + if "midbreak" in cls: + # The interlude is set as a dark spread; keep a hook the CSS can scope to. + holder = out.new_tag("div") + holder["class"] = ["midbreak"] + body.append(holder) + + for child in list(section.contents): + holder.append(child.extract()) + + args.out.mkdir(parents=True, exist_ok=True) + target = args.out / "body.html" + target.write_text(str(out), encoding="utf-8") + print( + f" + {target} " + f"{counts['part']} parts, {counts['chapter']} chapter-level headings, " + f"{counts['front']} front-matter headings" + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/render-cover.mjs b/tools/render-cover.mjs new file mode 100644 index 0000000..a528ed7 --- /dev/null +++ b/tools/render-cover.mjs @@ -0,0 +1,91 @@ +// Render src/cover.html's canvas to PNG for both languages. +// +// The page draws into a 1600x2560 canvas once webfonts are ready; we drive the +// same language toggle a human would click, then pull the canvas out with +// toDataURL instead of going through the browser's download plumbing. +// +// Usage: node tools/render-cover.mjs [--theme night|ember|ash] + +import { launch } from './browser.mjs'; +import { mkdir, writeFile } from 'node:fs/promises'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const themeArg = process.argv.indexOf('--theme'); +const THEME = themeArg > -1 ? process.argv[themeArg + 1] : 'night'; + +const EDITIONS = [ + { lang: 'fa', dir: 'build/fa', name: 'cover-fa' }, + { lang: 'en', dir: 'build/en', name: 'cover-en' }, +]; + +const FULL = { w: 1600, h: 2560 }; +const WEB = { w: 600, h: 960 }; + +/** Width/height straight out of the PNG IHDR, so we verify the file, not our intent. */ +function pngSize(buf) { + if (buf.readUInt32BE(0) !== 0x89504e47) throw new Error('not a PNG'); + return { w: buf.readUInt32BE(16), h: buf.readUInt32BE(20) }; +} + +async function canvasPng(page, w, h) { + const dataUrl = await page.evaluate(({ w, h }) => { + const c = document.getElementById('c'); + if (c.width === w && c.height === h) return c.toDataURL('image/png'); + const t = document.createElement('canvas'); + t.width = w; + t.height = h; + const tx = t.getContext('2d'); + tx.imageSmoothingEnabled = true; + tx.imageSmoothingQuality = 'high'; + tx.drawImage(c, 0, 0, w, h); + return t.toDataURL('image/png'); + }, { w, h }); + return Buffer.from(dataUrl.slice('data:image/png;base64,'.length), 'base64'); +} + +async function save(buf, path, expect) { + const got = pngSize(buf); + if (got.w !== expect.w || got.h !== expect.h) { + throw new Error(`${path}: expected ${expect.w}x${expect.h}, got ${got.w}x${got.h}`); + } + const mb = buf.length / 1024 / 1024; + // Amazon KDP rejects cover uploads above 50 MB. + if (mb > 50) throw new Error(`${path}: ${mb.toFixed(1)} MB exceeds the 50 MB store ceiling`); + await mkdir(dirname(path), { recursive: true }); + await writeFile(path, buf); + console.log(` + ${path.replace(ROOT + '/', '')} ${got.w}x${got.h} ${mb.toFixed(2)} MB`); +} + +const browser = await launch(); +try { + const page = await browser.newPage({ viewport: { width: 900, height: 1200 } }); + await page.goto(pathToFileURL(resolve(ROOT, 'src/cover.html')).href, { waitUntil: 'load' }); + + // The page's own boot() awaits document.fonts.ready before its first draw. + // Waiting for a painted pixel means we never capture a half-drawn canvas, and + // never capture Persian rendered as tofu boxes. + await page.waitForFunction(async () => { + await document.fonts.ready; + const c = document.getElementById('c'); + return c && c.getContext('2d').getImageData(0, 0, 1, 1).data[3] !== 0; + }, null, { timeout: 60_000 }); + + if (THEME !== 'night') { + await page.click(`.sw[data-theme="${THEME}"]`); + } + + for (const ed of EDITIONS) { + // cover.html boots in Persian; one click on the toggle switches to English. + const current = await page.evaluate(() => lang); + if (current !== ed.lang) { + await page.click('#lang'); + await page.waitForFunction((want) => lang === want, ed.lang); + } + await save(await canvasPng(page, FULL.w, FULL.h), resolve(ROOT, ed.dir, `${ed.name}.png`), FULL); + await save(await canvasPng(page, WEB.w, WEB.h), resolve(ROOT, ed.dir, `${ed.name}-600x960.png`), WEB); + } +} finally { + await browser.close(); +} diff --git a/tools/render-pdf.mjs b/tools/render-pdf.mjs new file mode 100644 index 0000000..794b9b7 --- /dev/null +++ b/tools/render-pdf.mjs @@ -0,0 +1,100 @@ +// Print an edition's source HTML to a 6x9in interior PDF via Chromium. +// +// Chromium rather than weasyprint: weasyprint mishandles Arabic-script shaping +// and bidi, which is exactly what the Persian edition is made of. +// +// The source files pull their webfonts from Google Fonts. We block that and +// serve the same families from assets/fonts instead, so a build produces the +// same PDF whether or not the machine has network, and never falls back to a +// system face that lacks Persian glyphs. +// +// Usage: node tools/render-pdf.mjs --lang fa --src src/faramushkhaneh.html \ +// --out build/fa/faramushkhaneh.pdf + +import { launch } from './browser.mjs'; +import { mkdir, readFile, stat } from 'node:fs/promises'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..'); + +function arg(name, fallback) { + const i = process.argv.indexOf(`--${name}`); + return i > -1 ? process.argv[i + 1] : fallback; +} + +const LANG = arg('lang'); +const SRC = resolve(ROOT, arg('src')); +const SHEETS = ['assets/css/print-common.css', `assets/css/print-${LANG}.css`]; +const OUT = resolve(ROOT, arg('out')); + +// family, weight, style, file — mirrors what each edition's CSS asks for. +const FACES = { + fa: [ + ['Vazirmatn', 300, 'normal', 'Vazirmatn-Light.ttf'], + ['Vazirmatn', 400, 'normal', 'Vazirmatn-Regular.ttf'], + ['Vazirmatn', 600, 'normal', 'Vazirmatn-Bold.ttf'], + ['Vazirmatn', 700, 'normal', 'Vazirmatn-Bold.ttf'], + ['Noto Naskh Arabic', 400, 'normal', 'NotoNaskhArabic-Regular.ttf'], + ['Noto Naskh Arabic', 500, 'normal', 'NotoNaskhArabic-Regular.ttf'], + ['Noto Naskh Arabic', 700, 'normal', 'NotoNaskhArabic-Bold.ttf'], + ['Noto Nastaliq Urdu', 400, 'normal', 'NotoNastaliqUrdu-Regular.ttf'], + ['Noto Nastaliq Urdu', 700, 'normal', 'NotoNastaliqUrdu-Regular.ttf'], + ], + en: [ + ['EB Garamond', 400, 'normal', 'EBGaramond-Regular.ttf'], + ['EB Garamond', 500, 'normal', 'EBGaramond-Medium.ttf'], + ['EB Garamond', 400, 'italic', 'EBGaramond-Italic.ttf'], + ['Cormorant Garamond', 400, 'normal', 'CormorantGaramond-Regular.ttf'], + ['Cormorant Garamond', 600, 'normal', 'CormorantGaramond-SemiBold.ttf'], + ['Cormorant Garamond', 400, 'italic', 'CormorantGaramond-Italic.ttf'], + ['Inter', 300, 'normal', 'Inter-Light.ttf'], + ['Inter', 400, 'normal', 'Inter-Regular.ttf'], + ['Inter', 600, 'normal', 'Inter-SemiBold.ttf'], + ], +}; + +function fontFaceCss(lang) { + return FACES[lang] + .map(([family, weight, style, file]) => { + const url = pathToFileURL(resolve(ROOT, 'assets/fonts', file)).href; + return `@font-face{font-family:"${family}";font-weight:${weight};font-style:${style};` + + `font-display:block;src:url("${url}") format("truetype");}`; + }) + .join('\n'); +} + +const browser = await launch(); +try { + const page = await browser.newPage(); + + // Cut off the remote font sources; the local @font-face block below stands in. + await page.route('**://fonts.googleapis.com/**', (r) => r.abort()); + await page.route('**://fonts.gstatic.com/**', (r) => r.abort()); + + await page.goto(pathToFileURL(SRC).href, { waitUntil: 'load' }); + await page.addStyleTag({ content: fontFaceCss(LANG) }); + for (const sheet of SHEETS) { + await page.addStyleTag({ content: await readFile(resolve(ROOT, sheet), 'utf-8') }); + } + + // emulateMedia makes the @media print rules apply to layout before we measure, + // and document.fonts.ready then reflects the real, embedded faces. + await page.emulateMedia({ media: 'print' }); + await page.evaluate(() => document.fonts.ready); + + await mkdir(dirname(OUT), { recursive: true }); + await page.pdf({ + path: OUT, + width: '6in', + height: '9in', + margin: { top: '0.75in', right: '0.75in', bottom: '0.75in', left: '0.75in' }, + printBackground: true, + preferCSSPageSize: false, + }); + + const { size } = await stat(OUT); + console.log(` + ${OUT.replace(ROOT + '/', '')} ${(size / 1024 / 1024).toFixed(2)} MB`); +} finally { + await browser.close(); +} diff --git a/tools/verify-epub.py b/tools/verify-epub.py new file mode 100755 index 0000000..5e3b44e --- /dev/null +++ b/tools/verify-epub.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 +"""Check the things a human would otherwise have to confirm by eye in a reader. + +Covers the acceptance list for both editions: the cover is the first page, every +navigation link resolves to a real target, chapter numbering runs 1-23 with no +gap and no repeat, the interlude sits between 17 and 18, right-to-left is +actually declared, and — for Persian — no letter-spacing survived anywhere, +since that is what silently breaks joined Arabic script. + +Usage: tools/verify-epub.py build/fa/faramushkhaneh.epub --lang fa +""" +import argparse +import posixpath +import re +import sys +import zipfile +from pathlib import PurePosixPath + +ORDINALS = { + "fa": [ + "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه", "ده", + "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", + "هجده", "نوزده", "بیست", "بیست‌ویک", "بیست‌ودو", "بیست‌وسه", + ], + "en": [ + "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", + "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", + "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty-One", + "Twenty-Two", "Twenty-Three", + ], +} +INTERLUDE = {"fa": "میان‌پرده", "en": "Interlude"} +CHAPTER_WORD = {"fa": "فصل", "en": "Chapter"} + +NAV_LINK = re.compile(r']+href="([^"]+)"[^>]*>(.*?)', re.S) +CHAPTER_NUM = re.compile(r'(.*?)', re.S) +ID_ATTR = re.compile(r'\bid="([^"]+)"') +TAGS = re.compile(r"<[^>]+>") + + +class Report: + def __init__(self): + self.failures = [] + + def check(self, ok, label, detail=""): + print(f" {'PASS' if ok else 'FAIL'} {label}" + (f" — {detail}" if detail else "")) + if not ok: + self.failures.append(label) + + +def text_of(fragment): + return TAGS.sub("", fragment).strip() + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("epub") + ap.add_argument("--lang", required=True, choices=["fa", "en"]) + args = ap.parse_args() + lang = args.lang + r = Report() + + print(f"\n{args.epub} ({lang})") + with zipfile.ZipFile(args.epub) as zf: + names = zf.namelist() + read = lambda n: zf.read(n).decode("utf-8") + + # mimetype must be the first entry and stored uncompressed. + info = zf.infolist()[0] + r.check( + info.filename == "mimetype" and info.compress_type == zipfile.ZIP_STORED, + "mimetype is first and uncompressed", + f"{info.filename}, compress_type={info.compress_type}", + ) + + opf_name = next(n for n in names if n.endswith(".opf")) + opf = read(opf_name) + opf_dir = PurePosixPath(opf_name).parent + + want_dir = "rtl" if lang == "fa" else "ltr" + r.check( + f'page-progression-direction="{want_dir}"' in opf, + f'spine declares page-progression-direction="{want_dir}"', + ) + + # Cover: first spine item, and a cover image in the manifest. + spine = re.search(r"", opf, re.S).group(0) + first = re.search(r']+idref="([^"]+)"', spine).group(1) + r.check("cover" in first.lower(), "first spine item is the cover", first) + r.check( + 'properties="cover-image"' in opf, + "manifest marks a cover image", + next((n for n in names if "cover" in n.lower() and n.endswith(".png")), "none"), + ) + + # Every nav link resolves to a real document, and to a real id when anchored. + nav_name = next(n for n in names if n.endswith("nav.xhtml")) + nav = read(nav_name) + nav_dir = PurePosixPath(nav_name).parent + broken = [] + for href, _ in NAV_LINK.findall(nav): + if href.startswith("#"): + continue + path, _, frag = href.partition("#") + target = str(PurePosixPath(nav_dir) / path) + if target not in names: + broken.append(href) + elif frag and f'id="{frag}"' not in read(target): + broken.append(href) + r.check(not broken, "every navigation link resolves", f"{len(broken)} broken: {broken[:3]}") + + # Chapter numbering, in reading order, from the spine. + order = re.findall(r']+idref="([^"]+)"', spine) + hrefs = dict(re.findall(r']+id="([^"]+)"[^>]+href="([^"]+)"', opf)) + hrefs.update(dict( + (m.group(2), m.group(1)) + for m in re.finditer(r']+href="([^"]+)"[^>]+id="([^"]+)"', opf) + )) + seen = [] + for idref in order: + href = hrefs.get(idref) + if not href: + continue + target = str(PurePosixPath(opf_dir) / href) + if target not in names or target == nav_name: + continue + for num in CHAPTER_NUM.findall(read(target)): + seen.append(text_of(num)) + + expected = [f"{CHAPTER_WORD[lang]} {w}" for w in ORDINALS[lang]] + chapters = [s for s in seen if s != INTERLUDE[lang]] + r.check( + chapters == expected, + "chapters run 1-23 in order, no gaps or repeats", + f"{len(chapters)} found" + ("" if chapters == expected else f"; got {chapters[:3]}…"), + ) + r.check(seen.count(INTERLUDE[lang]) == 1, "exactly one interlude") + if INTERLUDE[lang] in seen: + i = seen.index(INTERLUDE[lang]) + r.check( + seen[i - 1] == expected[16] and seen[i + 1] == expected[17], + "interlude sits between chapter 17 and chapter 18", + f"{seen[i-1]} / {INTERLUDE[lang]} / {seen[i+1]}", + ) + + # Direction on the documents themselves. + docs = [n for n in names if n.endswith(".xhtml")] + missing_dir = [] + for n in docs: + tag = re.search(r"]*>", read(n)) + if not tag or f'dir="{want_dir}"' not in tag.group(0): + missing_dir.append(n) + r.check( + not missing_dir, + f'every document carries dir="{want_dir}"', + f"{len(docs) - len(missing_dir)}/{len(docs)}", + ) + + # Fonts: declared in CSS and actually present in the archive. + css_name = next(n for n in names if n.endswith(".css")) + css = read(css_name) + css_dir = PurePosixPath(css_name).parent + refs = re.findall(r'url\("([^"]+)"\)', css) + absent = [u for u in refs if posixpath.normpath(posixpath.join(str(css_dir), u)) not in names] + r.check( + refs and not absent, + "every @font-face file is embedded", + f"{len(refs)} faces" + (f"; missing {absent}" if absent else ""), + ) + + if lang == "fa": + # letter-spacing is what silently breaks joined Persian script. + offenders = [ + line.strip() + for line in css.splitlines() + if "letter-spacing" in line and not line.strip().startswith("*") + ] + r.check(not offenders, "no letter-spacing in the Persian stylesheet", str(offenders[:2])) + r.check("direction:" not in css, "no CSS direction property (EPUB 3.3 forbids it)") + + if r.failures: + print(f"\n{len(r.failures)} check(s) failed") + return 1 + print(" all checks passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main())