"""Lays a whole French novel out and writes it as one PDF.

The Python twin of the `write_french_book` example in Rust.

The twin of `write_english_book`, on a text that draws the accented letters as well
as the plain ones. It shows what a wider alphabet costs: more outlines to carry, and
metrics still stated only for the glyphs the book draws.

Neither book is a translation of the other: each is a novel of its own, and the two
are laid out by the same code, so they come out looking alike.

Its text is set the way French spaces its marks: a no-break space holds each two-part
mark and each quotation mark to the word beside it, the two hyphens the file writes a
dash as are drawn as one, and the dash a speech opens on stands off its first word.

Usage: python examples/write_french_book.py [out.pdf] [font.ttf]
"""

from __future__ import annotations

import _book
import _licence
import _out

import hqf_pdf

# The chapter titles as French sets them.
#
# The file writes them in capitals throughout, which French does not do, and the
# capitals have taken the accents with them: the file's second chapter reads `TROUVE SON
# IDEAL`. Both are undone here -- nothing else is, and the Rust twin carries the same
# list, checked letter for letter against the file.
TITLES = (
    "Dans lequel Phileas Fogg et Passepartout s'acceptent réciproquement l'un comme maître, l'autre comme domestique",
    "Où Passepartout est convaincu qu'il a enfin trouvé son idéal",
    "Où s'engage une conversation qui pourra coûter cher à Phileas Fogg",
    "Dans lequel Phileas Fogg stupéfie Passepartout, son domestique",
    "Dans lequel une nouvelle valeur apparaît sur la place de Londres",
    "Dans lequel l'agent Fix montre une impatience bien légitime",
    "Qui témoigne une fois de plus de l'inutilité des passeports en matière de police",
    "Dans lequel Passepartout parle un peu plus peut-être qu'il ne conviendrait",
    "Où la mer Rouge et la mer des Indes se montrent propices aux desseins de Phileas Fogg",
    "Où Passepartout est trop heureux d'en être quitte en perdant sa chaussure",
    "Où Phileas Fogg achète une monture à un prix fabuleux",
    "Où Phileas Fogg et ses compagnons s'aventurent à travers les forêts de l'Inde et ce qui s'ensuit",
    "Dans lequel Passepartout prouve une fois de plus que la fortune sourit aux audacieux",
    "Dans lequel Phileas Fogg descend toute l'admirable vallée du Gange sans même songer à la voir",
    "Où le sac aux bank-notes s'allège encore de quelques milliers de livres",
    "Où Fix n'a pas l'air de connaître du tout les choses dont on lui parle",
    "Où il est question de choses et d'autres pendant la traversée de Singapore à Hong-Kong",
    "Dans lequel Phileas Fogg, Passepartout, Fix, chacun de son côté, va à ses affaires",
    "Où Passepartout prend un trop vif intérêt à son maître, et ce qui s'ensuit",
    "Dans lequel Fix entre directement en relation avec Phileas Fogg",
    "Où le patron de la « Tankadère » risque fort de perdre une prime de deux cents livres",
    "Où Passepartout voit bien que, même aux antipodes, il est prudent d'avoir quelque argent dans sa poche",
    "Dans lequel le nez de Passepartout s'allonge démesurément",
    "Pendant lequel s'accomplit la traversée de l'océan Pacifique",
    "Où l'on donne un léger aperçu de San Francisco, un jour de meeting",
    "Dans lequel on prend le train express du chemin de fer du Pacifique",
    "Dans lequel Passepartout suit, avec une vitesse de vingt milles à l'heure, un cours d'histoire mormone",
    "Dans lequel Passepartout ne put parvenir à faire entendre le langage de la raison",
    "Où il sera fait le récit d'incidents divers qui ne se rencontrent que sur les rail-roads de l'Union",
    "Dans lequel Phileas Fogg fait tout simplement son devoir",
    "Dans lequel l'inspecteur Fix prend très sérieusement les intérêts de Phileas Fogg",
    "Dans lequel Phileas Fogg engage une lutte directe contre la mauvaise chance",
    "Où Phileas Fogg se montre à la hauteur des circonstances",
    "Qui procure à Passepartout l'occasion de faire un jeu de mots atroce, mais peut-être inédit",
    "Dans lequel Passepartout ne se fait pas répéter deux fois l'ordre que son maître lui donne",
    "Dans lequel Phileas Fogg fait de nouveau prime sur le marché",
    "Dans lequel il est prouvé que Phileas Fogg n'a rien gagné à faire ce tour du monde, si ce n'est le bonheur",
)

# How French spaces its marks.
#
# The two-part marks and the closing quotation mark stand off the word they close, and
# the opening quotation mark stands off the word it opens; the space is a no-break one,
# so a mark is never left alone at a line's end nor opens a line of its own.
#
# The file writes a dash as two hyphens, which is how a plain text file stands in for
# one. A speech opens on that dash and an ordinary space stands between it and the first
# word, which the line may be broken after like any other. A dash between two words is
# an aside, and keeps to both of them.
TYPOGRAPHY = _book.Typography(
    space_before=("?", "!", ";", ":", "»", "%"),
    space_after=("«",),
    dash=_book.Dash(drawn="—", opening=" "),
)

BOOK = _book.Book(
    title="Le tour du monde en quatre-vingts jours",
    author="Jules Verne",
    file="tourdumonde.txt",
    mark_before="",
    mark_after="",
    chapters=37,
    contents_title="Table des matières",
    titles=TITLES,
    typography=TYPOGRAPHY,
)


def main() -> None:
    out = _out.output_path("french_book")

    document = hqf_pdf.Document()
    document.set_license(_licence.licensed())
    handle = document.add_font(hqf_pdf.Font.from_path(_out.font_path()))

    text = BOOK.path().read_text(encoding="utf-8")
    _book.lay_out(document, handle, BOOK, text)

    data = document.to_bytes()
    out.parent.mkdir(parents=True, exist_ok=True)
    out.write_bytes(data)
    print(f"wrote {out}: {len(data)} bytes")


if __name__ == "__main__":
    main()
