From 43c5c2cbbaaa2b689880897641130f90eaa439aa Mon Sep 17 00:00:00 2001 From: YanNaingWinn Date: Sat, 20 Jun 2026 18:29:17 +0700 Subject: [PATCH 1/7] Add auto-generated PDF documentation (pdflatex) --- .github/workflows/docs.yml | 13 +++++++++++++ docs/_static/cryptnox-logo-dark.png | Bin 0 -> 3375 bytes docs/conf.py | 15 +++++++++++++++ docs/index.rst | 4 ++++ 4 files changed, 32 insertions(+) create mode 100644 docs/_static/cryptnox-logo-dark.png diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3d6dbe7..5e49793 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -33,6 +33,19 @@ jobs: - name: Generate Sphinx docs run: sphinx-build -b html docs docs/_build/html + # 4b. Install LaTeX and build the PDF (Yubico-style, pdflatex) + - name: Install LaTeX for PDF + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends \ + latexmk texlive-latex-recommended texlive-latex-extra \ + texlive-fonts-recommended tex-gyre + + - name: Build PDF (pdflatex) + run: | + sphinx-build -M latexpdf docs docs/_build + cp docs/_build/latex/cryptnox-cli.pdf docs/_build/html/cryptnox-cli.pdf + # 5. Deploy HTML documentation to GitHub Pages - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v4 diff --git a/docs/_static/cryptnox-logo-dark.png b/docs/_static/cryptnox-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccc9df3648794f3387087474939d1ab9968e745 GIT binary patch literal 3375 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 FV1g~*d;9`__ + .. toctree:: :maxdepth: 2 :caption: Contents From 79a025f4e12e61c5cef8ef2eddfb09086bf11b1a Mon Sep 17 00:00:00 2001 From: YanNaingWinn Date: Wed, 24 Jun 2026 16:17:59 +0700 Subject: [PATCH 2/7] Modified auto generated pdf --- docs/_static/cryptnox-logo-dark.png | Bin 3375 -> 31519 bytes docs/_static/cryptnox-logo.png | Bin 3467 -> 0 bytes docs/conf.py | 81 +++++++++++++++++++++++++++- docs/index.rst | 4 +- 4 files changed, 81 insertions(+), 4 deletions(-) delete mode 100644 docs/_static/cryptnox-logo.png diff --git a/docs/_static/cryptnox-logo-dark.png b/docs/_static/cryptnox-logo-dark.png index 7ccc9df3648794f3387087474939d1ab9968e745..9d1e7ec19ce4272489869bec34f97fe0e6458547 100644 GIT binary patch literal 31519 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 diff --git a/docs/conf.py b/docs/conf.py index df66806..123a097 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,11 @@ # Disable autosummary generation to prevent hangs autosummary_generate = False +# Show default args as written in source (e.g. wordlist=wordlist_english) instead +# of expanding them — the mnemonic module defaults to the full 2048-word BIP39 list, +# which otherwise floods signatures and forces near-blank pages in the PDF. +autodoc_preserve_defaults = True + templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] @@ -115,7 +120,7 @@ html_show_sphinx = False # Logo configuration -html_logo = "_static/cryptnox-logo.png" +html_logo = "_static/cryptnox-logo.svg" # Custom CSS and JS html_css_files = [ @@ -145,14 +150,86 @@ # -- Options for PDF (LaTeX) output ------------------------------------------ # Built by CI with pdflatex, same as Yubico's tech manual. Output: cryptnox-cli.pdf +today = 'June 20, 2026' # fixed doc date on the cover + latex_engine = 'pdflatex' latex_logo = '_static/cryptnox-logo-dark.png' # white logo is invisible on white PDF title page +latex_domain_indices = False # no Python Module Index in the PDF (kept in HTML) latex_documents = [ - ('index', 'cryptnox-cli.tex', 'Cryptnox CLI Documentation', author, 'manual'), + ('index', 'cryptnox-cli.tex', 'Cryptnox CLI Manual', author, 'manual'), ] latex_elements = { 'papersize': 'a4paper', 'pointsize': '11pt', 'figure_align': 'H', 'extraclassoptions': 'oneside,openany', # no blank filler pages (web PDF) + 'printindex': '', # drop the general Index from the PDF (kept in HTML) + 'fncychap': '', # no fancy chapter rules; titlesec styles chapters instead + 'preamble': r''' +% Left-align body text (ragged right instead of justified) +\usepackage[document]{ragged2e} +% Whole document in the sans font (TeX Gyre Heros) +\renewcommand{\familydefault}{\sfdefault} +% Sans-serif TOC entries +\AtBeginDocument{\addtocontents{toc}{\protect\sffamily}} +% Left-aligned chapter headings +\usepackage{titlesec} +\titleformat{\chapter}[hang]{\sffamily\bfseries\huge}{\thechapter}{1em}{} +\titlespacing*{\chapter}{0pt}{0pt}{20pt} +% Centered page header (manual title, no release) + copyright footer +\usepackage{fancyhdr} +\def\headruleskip{4pt}\def\footruleskip{4pt}% gap between header/footer text and rule +\AtBeginDocument{% + \fancypagestyle{normal}{% + \fancyhf{}% + \fancyhead[C]{\sffamily\nouppercase{Cryptnox CLI Manual}}% + \fancyfoot[L]{\sffamily\copyright{} 2026 Cryptnox SA}% + \fancyfoot[R]{\sffamily\thepage}% + \renewcommand{\headrulewidth}{0.4pt}% + \renewcommand{\footrulewidth}{0.4pt}% + }% + \fancypagestyle{plain}{% + \fancyhf{}% + \fancyfoot[L]{\sffamily\copyright{} 2026 Cryptnox SA}% + \fancyfoot[R]{\sffamily\thepage}% + \renewcommand{\headrulewidth}{0pt}% + \renewcommand{\footrulewidth}{0.4pt}% + }% + \pagestyle{normal}% +} +% Centered title page (default is right-aligned); author line removed (logo brands it) +\makeatletter +\renewcommand{\sphinxmaketitle}{% + \let\sphinxrestorepageanchorsetting\relax + \ifHy@pageanchor\def\sphinxrestorepageanchorsetting{\Hy@pageanchortrue}\fi + \hypersetup{pageanchor=false}% + \begin{titlepage}% + \let\footnotesize\small \let\footnoterule\relax + \begingroup + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% + \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}% + \endgroup + \noindent\rule{\textwidth}{1pt}\par + \begin{flushright}% + \vskip 1em% + \includegraphics[width=7cm]{cryptnox-logo-dark}\par + \vskip 2em% + {\LARGE\py@HeaderFamily \@title \par}% + \vskip 0.5em% + {\large\itshape \py@release\releaseinfo \par}% + \vfill + {\large \@date \par}% + \end{flushright}% + \@thanks + \end{titlepage}% + \setcounter{footnote}{0}% + \let\thanks\relax\let\maketitle\relax + \clearpage + \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi + \if@openright\cleardoublepage\else\clearpage\fi + \sphinxrestorepageanchorsetting +} +\makeatother +''', } diff --git a/docs/index.rst b/docs/index.rst index bdd5c8d..f27d032 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,10 +1,10 @@ Cryptnox CLI Documentation ========================== -Welcome to the technical documentation of Cryptnox CLI. - .. only:: html + Welcome to the technical documentation of Cryptnox CLI. + 📄 `Download this documentation as PDF `__ .. toctree:: From 0bc425100a0f015a4f13a22187770583f6fad4ca Mon Sep 17 00:00:00 2001 From: YanNaingWinn Date: Wed, 24 Jun 2026 19:53:12 +0700 Subject: [PATCH 3/7] Modified auto-generated PDF documentation (pdflatex) --- .github/workflows/docs.yml | 2 +- docs/_static/cryptnox-logo.svg | 15 +++++++++++++++ docs/conf.py | 5 +++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 docs/_static/cryptnox-logo.svg diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5e49793..aee9b90 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -39,7 +39,7 @@ jobs: sudo apt-get update sudo apt-get install -y --no-install-recommends \ latexmk texlive-latex-recommended texlive-latex-extra \ - texlive-fonts-recommended tex-gyre + texlive-fonts-recommended texlive-fonts-extra tex-gyre - name: Build PDF (pdflatex) run: | diff --git a/docs/_static/cryptnox-logo.svg b/docs/_static/cryptnox-logo.svg new file mode 100644 index 0000000..9fed9ce --- /dev/null +++ b/docs/_static/cryptnox-logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/docs/conf.py b/docs/conf.py index 123a097..11f4dfb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -162,12 +162,17 @@ 'papersize': 'a4paper', 'pointsize': '11pt', 'figure_align': 'H', + 'sphinxsetup': 'pre_border-radius=0pt', # sharp rectangle corners on code-block (CLI command) frames 'extraclassoptions': 'oneside,openany', # no blank filler pages (web PDF) 'printindex': '', # drop the general Index from the PDF (kept in HTML) 'fncychap': '', # no fancy chapter rules; titlesec styles chapters instead 'preamble': r''' +% CLI commands / literals (\ttfamily) in Inconsolata +\usepackage{inconsolata} % Left-align body text (ragged right instead of justified) \usepackage[document]{ragged2e} +% Drop the "(continues on next page)" / "(continued from previous page)" labels (parens included) on code blocks +\AtBeginDocument{\renewcommand*\sphinxstylecodecontinued[1]{}\renewcommand*\sphinxstylecodecontinues[1]{}} % Whole document in the sans font (TeX Gyre Heros) \renewcommand{\familydefault}{\sfdefault} % Sans-serif TOC entries From fcc278b1bf651e1d6de87cad893985f30b368c0b Mon Sep 17 00:00:00 2001 From: YanNaingWinn Date: Wed, 24 Jun 2026 20:08:32 +0700 Subject: [PATCH 4/7] Fix PDF build: handle emoji unsupported by pdflatex --- docs/conf.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 11f4dfb..9a3296f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -167,6 +167,12 @@ 'printindex': '', # drop the general Index from the PDF (kept in HTML) 'fncychap': '', # no fancy chapter rules; titlesec styles chapters instead 'preamble': r''' +% pdflatex can't render colour emoji; map the ones used in the docs to safe glyphs +\usepackage{amssymb} +\DeclareUnicodeCharacter{1F4B3}{}% credit card -> drop +\DeclareUnicodeCharacter{FE0F}{}% variation selector -> drop +\DeclareUnicodeCharacter{26A0}{\textbf{!}}% warning sign +\DeclareUnicodeCharacter{2705}{\ensuremath{\checkmark}}% check mark % CLI commands / literals (\ttfamily) in Inconsolata \usepackage{inconsolata} % Left-align body text (ragged right instead of justified) From 73784be54c0cc197f1d8364f0d849d759a464ea1 Mon Sep 17 00:00:00 2001 From: YanNaingWinn Date: Thu, 25 Jun 2026 17:59:14 +0700 Subject: [PATCH 5/7] Generate PDF cover logo from SVG at build time --- .github/workflows/docs.yml | 2 +- .gitignore | 1 + docs/_static/cryptnox-logo-dark.png | Bin 31519 -> 0 bytes docs/conf.py | 18 ++++++++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) delete mode 100644 docs/_static/cryptnox-logo-dark.png diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index aee9b90..e6e82bb 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -27,7 +27,7 @@ jobs: # 3. Install Sphinx and dependencies - name: Install Sphinx and dependencies - run: pip install sphinx sphinx-rtd-theme + run: pip install sphinx sphinx-rtd-theme cairosvg pillow # 4. Build Sphinx documentation - name: Generate Sphinx docs diff --git a/.gitignore b/.gitignore index 8909dcb..29331b5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ signature.sig cardpub.pub docs/_build/ *.lock +docs/_static/cryptnox-logo-dark.png diff --git a/docs/_static/cryptnox-logo-dark.png b/docs/_static/cryptnox-logo-dark.png deleted file mode 100644 index 9d1e7ec19ce4272489869bec34f97fe0e6458547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31519 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 Date: Fri, 26 Jun 2026 15:12:27 +0700 Subject: [PATCH 6/7] Fix CodeQL findings in docs/conf.py --- docs/conf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index d97e2c0..f385dc8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,8 @@ import cairosvg from PIL import Image as _Image _static = os.path.join(os.path.dirname(__file__), "_static") - _svg = open(os.path.join(_static, "cryptnox-logo.svg"), encoding="utf-8").read() + with open(os.path.join(_static, "cryptnox-logo.svg"), encoding="utf-8") as _f: + _svg = _f.read() _png = cairosvg.svg2png( bytestring=_svg.replace('fill="white"', 'fill="#101f2e"').encode(), output_width=1200, output_height=226, @@ -27,7 +28,7 @@ os.path.join(_static, "cryptnox-logo-dark.png"), dpi=(400, 400) ) except ImportError: - pass + pass # cairosvg/Pillow absent (HTML-only build): keep the committed dark PNG if present project = 'cryptnox-cli' copyright = '2025, Cryptnox' From 6d3dd83d0892236c04f6dba888a5d1a3b6794a90 Mon Sep 17 00:00:00 2001 From: YanNaingWinn Date: Fri, 26 Jun 2026 16:03:23 +0700 Subject: [PATCH 7/7] Raise on missing cairosvg/Pillow in docs build instead of silent pass --- dev-requirements.txt | 2 ++ docs/conf.py | 29 ++++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index ec683d3..d511bba 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -22,6 +22,8 @@ pywin32-ctypes==0.2.3; sys_platform == 'win32' Sphinx>=7.3.7 sphinx-rtd-theme>=2.0.0 sphinx-autodoc-typehints>=2.1.0 +cairosvg>=2.7.0 +Pillow>=10.0.0 setuptools==78.1.1; python_version >= '3.9' tomlkit==0.13.2; python_version >= '3.8' typing-extensions==4.13.2; python_version >= '3.8' diff --git a/docs/conf.py b/docs/conf.py index f385dc8..143b696 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,23 +12,26 @@ sys.path.insert(0, os.path.abspath("..")) # Derive the navy PDF cover logo from the white HTML SVG at build time, so only the -# SVG is a committed source asset (needs cairosvg + Pillow; skipped on HTML-only envs). +# SVG is a committed source asset (needs cairosvg + Pillow, both in the docs requirements). try: import io as _io import cairosvg from PIL import Image as _Image - _static = os.path.join(os.path.dirname(__file__), "_static") - with open(os.path.join(_static, "cryptnox-logo.svg"), encoding="utf-8") as _f: - _svg = _f.read() - _png = cairosvg.svg2png( - bytestring=_svg.replace('fill="white"', 'fill="#101f2e"').encode(), - output_width=1200, output_height=226, - ) - _Image.open(_io.BytesIO(_png)).save( - os.path.join(_static, "cryptnox-logo-dark.png"), dpi=(400, 400) - ) -except ImportError: - pass # cairosvg/Pillow absent (HTML-only build): keep the committed dark PNG if present +except ImportError as _e: + raise RuntimeError( + "Docs build requires cairosvg and Pillow to generate the PDF cover logo; " + "install them (pip install cairosvg pillow)." + ) from _e +_static = os.path.join(os.path.dirname(__file__), "_static") +with open(os.path.join(_static, "cryptnox-logo.svg"), encoding="utf-8") as _f: + _svg = _f.read() +_png = cairosvg.svg2png( + bytestring=_svg.replace('fill="white"', 'fill="#101f2e"').encode(), + output_width=1200, output_height=226, +) +_Image.open(_io.BytesIO(_png)).save( + os.path.join(_static, "cryptnox-logo-dark.png"), dpi=(400, 400) +) project = 'cryptnox-cli' copyright = '2025, Cryptnox'