1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #!/usr/bin/env python3
- # SPDX-License-Identifier: MIT
- """
- A Python script to generate a single PDF document with all the `tldr` pages. It works by generating
- intermediate HTML files from existing md files using Python-markdown, applying desired formatting
- through CSS, and finally rendering them as PDF. There is no LaTeX dependency for generating the PDF.
- """
- import os
- import sys
- import glob
- import re
- import markdown
- import argparse
- from datetime import datetime
- from weasyprint import HTML
- def main(loc, colorscheme):
- # Checking correctness of path
- if not os.path.isdir(loc):
- print("Invalid directory. Please try again!", file=sys.stderr)
- sys.exit(1)
- # Set up css style sheets
- csslist = ["basic.css"]
- if colorscheme != "basic":
- csslist.append(colorscheme + ".css")
- # A string that stores all pages in HTML format
- html = (
- '<!doctype html><html><head><meta charset="utf-8"></head>'
- + "<body><h1 class=title-main>tldr pages</h1>"
- + "<h4 class=title-sub>Simplified and community-driven man pages</h4>"
- + "<h6 class=title-sub><em><small>Generated on "
- + datetime.now().strftime("%c")
- + "</small></em></h6>"
- + '<p style="page-break-before: always" ></p>'
- )
- # Writing names of all directories inside 'pages' to a list
- for operating_sys in sorted(os.listdir(loc)):
- # Required string to create directory title pages
- html += (
- "<h2 class=title-dir>"
- + operating_sys.capitalize()
- + "</h2>"
- + '<p style="page-break-before: always" ></p>'
- )
- # Conversion of Markdown to HTML string
- for page_number, md in enumerate(
- sorted(glob.glob(os.path.join(loc, operating_sys, "*.md"))), start=1
- ):
- with open(md, "r") as inp:
- text = inp.readlines()
- for line in text:
- if re.match(r"^>", line):
- line = line[:0] + "####" + line[1:]
- html += markdown.markdown(line)
- html += '<p style="page-break-before: always" ></p>'
- print(f"Rendered page {page_number} of the directory {operating_sys}")
- html += "</body></html>"
- # Writing the PDF to disk
- print("\nConverting all pages to PDF...")
- HTML(string=html).write_pdf("tldr-pages.pdf", stylesheets=csslist)
- if os.path.exists("tldr-pages.pdf"):
- print("\nCreated tldr-pages.pdf in the current directory!\n")
- if __name__ == "__main__":
- # Parsing the arguments
- parser = argparse.ArgumentParser(
- prog="tldr-pages-to-pdf",
- description="A Python script to generate a single PDF document with all the `tldr` pages.",
- )
- parser.add_argument("dir_path", help="Path to the 'pages' directory")
- parser.add_argument(
- "-c",
- "--color",
- choices=["solarized-light", "solarized-dark", "basic"],
- default="basic",
- help="Color scheme of the PDF",
- )
- args = parser.parse_args()
- main(args.dir_path, args.color)
|