Skip to content

Commit

Permalink
Rework PDF script (tldr-pages#3654)
Browse files Browse the repository at this point in the history
  • Loading branch information
zlatanvasovic authored Dec 17, 2019
1 parent d77f8bc commit e2ae506
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 177 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ npm-debug.log
# hosted at https://tldr-pages.github.io/assets/index.json
pages/index.json
index.json

# Generated PDF pages
scripts/pdf/*.html
scripts/pdf/tldr.pdf
21 changes: 5 additions & 16 deletions scripts/pdf/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,38 +11,27 @@ This directory contains the script and related resources to generate a PDF copy
## Highlights

- No LaTeX dependencies for generating the PDF.

- 3 available color-schemes- *Basic*, *Solarized Light* and *Solarized Dark*. More can be added easily through CSS.

- 3 available color-schemes: *Basic*, *Solarized Light* and *Solarized Dark*. More can be added easily through CSS.

## Requirements

The PDF is generated by first converting the markdown files to HTML, and then rendering those HTML files as PDF. It depends on the following libraries:

#### Python-Markdown
The PDF is generated by first converting the markdown files to HTML, and then rendering those HTML files as PDF. It depends on `markdown` and `weasyprint` libraries. To install the dependencies, run:

pip3 install markdown

#### WeasyPrint
pip3 install -r requirements.txt

pip3 install WeasyPrint

Make sure OS specific dependencies for WeasyPrint are installed by following the instructions [here](http://weasyprint.readthedocs.io/en/latest/install.html).

## Usage

Generating the PDF is as simple as running

python3 render.py <path-to-pages-directory> -c <color-scheme>
Complete information about the arguments can be viewed by running

Complete information about the arguments can be viewed by running

python3 render.py --help

The color-schemes that can be specified are

* `solarized-light`
* `solarized-dark`



38 changes: 19 additions & 19 deletions scripts/pdf/basic.css
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
@font-face {
font-family: 'PT_Serif-Web-Regular';
src: url('PT_Serif-Web-Regular.ttf') format('truetype');
font-family: "PT Serif";
src: url("pt-serif-web-regular.ttf") format("truetype");
}

p {
margin-left: 2.5em;
margin-left: 2.5em;
}

code {
color: darkslategrey;
color: darkslategrey;
}

h1, h4, h2, ul {
font-family: "PT_Serif-Web-Regular";
h1, h2, h4, ul {
font-family: "PT Serif";
}

h1.titlemain {
text-align: center;
margin-top: 6em;
font-size: 350%;
.title-main {
text-align: center;
margin-top: 6em;
font-size: 350%;
}

h4.titlesub {
text-align: center;
font-size: 120%;
color: darkslategrey;
.title-sub {
text-align: center;
font-size: 120%;
color: darkslategrey;
}

h2.titledir {
text-align: center;
margin-top: 8.2em;
font-size: 300%;
}
.title-dir {
text-align: center;
margin-top: 8.2em;
font-size: 300%;
}
File renamed without changes.
169 changes: 86 additions & 83 deletions scripts/pdf/render.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#!/usr/bin/env python3

#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.
# 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
Expand All @@ -15,108 +15,111 @@

def main(loc, colorscheme):

oslist = []
allmd = []
group = []
ap = []
oslist = []
allmd = []
group = []
ap = []

#Checking correctness of path
if not os.path.isdir(loc):
print("Invalid directory. Please try again!", file = sys.stderr)
sys.exit(1)
# Checking correctness of path
if not os.path.isdir(loc):
print("Invalid directory. Please try again!", file = sys.stderr)
sys.exit(1)

#Writing names of all directories inside 'pages' to a list
for os_dir in os.listdir(loc):
oslist.append(os_dir)
# Writing names of all directories inside 'pages' to a list
for os_dir in os.listdir(loc):
oslist.append(os_dir)

oslist.sort()
oslist.sort()

#Required strings to create intermediate HTML files
header = "<html><head><link rel=stylesheet type=text/css href=" + colorscheme + ".css></head><body>\n"
footer = "</body></html>"
title_content = "<h1 class=titlemain>tldr pages</h1><h4 class=titlesub>Simplified and community driven man pages</h4></body></html>"
# Required strings to create intermediate HTML files
header = '<!doctype html><html><head><meta charset="utf-8"><link rel="stylesheet" href="basic.css">'
if colorscheme != "basic":
header += '<link rel="stylesheet" href="' + colorscheme + '.css"></head><body>\n'
header += "</head><body>\n"
footer = "</body></html>"
title_content = "<h1 class=title-main>tldr pages</h1><h4 class=title-sub>Simplified and community-driven man pages</h4></body></html>"

#Creating title page
with open("title.html", 'w') as f:
f.write(header + title_content)
# Creating title page
with open("title.html", "w") as f:
f.write(header + title_content)

group.append(HTML('title.html').render())
group.append(HTML("title.html").render())

for operating_sys in oslist:
for operating_sys in oslist:

i = 1
i = 1

#Required string to create directory title pages
dir_title = "<h2 class=titledir>" + operating_sys.capitalize() + "</h2></body></html>"
# Required string to create directory title pages
dir_title = "<h2 class=title-dir>" + operating_sys.capitalize() + "</h2></body></html>"

#Creating directory title page for current directory
with open("dir_title.html", 'w') as os_html:
os_html.write(header + dir_title)

group.append(HTML('dir_title.html').render())
# Creating directory title page for current directory
with open("dir_title.html", "w") as os_html:
os_html.write(header + dir_title)

#Creating a list of all md files in the current directory
for temp in glob.glob(os.path.join(loc, operating_sys, '*.md')):
allmd.append(temp)
group.append(HTML("dir_title.html").render())

#Sorting all filenames in the directory, to maintain the order of the PDF
allmd.sort()
# Creating a list of all md files in the current directory
for temp in glob.glob(os.path.join(loc, operating_sys, "*.md")):
allmd.append(temp)

#Conversion of md to HTML
for md in allmd:
# Sorting all filenames in the directory, to maintain the order of the PDF
allmd.sort()

with open(md, "r") as inp:
text = inp.readlines()
# Conversion of Markdown to HTML
for md in allmd:

with open("htmlout.html", "w") as out:
out.write(header)
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)
out.write(html)
out.write(footer)
with open("htmlout.html", "w") as out:
out.write(header)

group.append(HTML('htmlout.html').render())
print("Rendered page {} of the directory {}".format(str(i), operating_sys))
i += 1

allmd.clear()
for line in text:
if re.match(r'^>', line):
line = line[:0] + '####' + line[1:]
html = markdown.markdown(line)
out.write(html)
out.write(footer)

#Merging all the documents into a single PDF
for doc in group:
for p in doc.pages:
ap.append(p)
group.append(HTML("htmlout.html").render())
print("Rendered page {} of the directory {}".format(str(i), operating_sys))
i += 1

#Writing the PDF to disk, preserving metadata of first tldr page
group[2].copy(ap).write_pdf('tldr.pdf')
allmd.clear()

if os.path.exists("tldr.pdf"):
print("\nCreated tldr.pdf in the current directory!\n")
# Merging all the documents into a single PDF
for doc in group:
for p in doc.pages:
ap.append(p)

#Removing unnecessary intermediate files
try:
os.remove("htmlout.html")
os.remove("title.html")
os.remove("dir_title.html")
except OSError:
print("Error removing temporary file(s)")
# Writing the PDF to disk, preserving metadata of first tldr page
group[2].copy(ap).write_pdf('tldr.pdf')

if os.path.exists("tldr.pdf"):
print("\nCreated tldr.pdf in the current directory!\n")

if __name__ == '__main__':
# Removing unnecessary intermediate files
try:
os.remove("htmlout.html")
os.remove("title.html")
os.remove("dir_title.html")
except OSError:
print("Error removing temporary file(s)")

#Unless specified otherwise by the user, this is the default colorscheme
colorscheme = "basic"

#Parsing the arguments
parser = argparse.ArgumentParser()
parser.add_argument("dir_path", help = "Path to tldr 'pages' directory")
parser.add_argument("-c", choices=["solarized-light", "solarized-dark"], help="Color scheme of the PDF")
args = parser.parse_args()

loc = args.dir_path
if args.c == "solarized-light" or args.c == "solarized-dark":
colorscheme = args.c

main(loc, colorscheme)
if __name__ == "__main__":

# Unless specified otherwise by the user, this is the default colorscheme
colorscheme = "basic"

# Parsing the arguments
parser = argparse.ArgumentParser()
parser.add_argument("dir_path", help = "Path to tldr 'pages' directory")
parser.add_argument("-c", choices=["solarized-light", "solarized-dark"], help="Color scheme of the PDF")
args = parser.parse_args()

loc = args.dir_path
if args.c == "solarized-light" or args.c == "solarized-dark":
colorscheme = args.c

main(loc, colorscheme)
2 changes: 2 additions & 0 deletions scripts/pdf/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
markdown
weasyprint
35 changes: 5 additions & 30 deletions scripts/pdf/solarized-dark.css
Original file line number Diff line number Diff line change
@@ -1,40 +1,15 @@
@font-face {
font-family: 'PT_Serif-Web-Regular';
src: url('PT_Serif-Web-Regular.ttf') format('truetype');
}

p {
margin-left: 2.5em;
}

code {
color: #b58900;
color: #b58900;
}

h1, h2, h4, ul {
font-family: "PT_Serif-Web-Regular";
color: #93a1a1;
color: #93a1a1;
}

body {
background-color: #002b36;
background-color: #002b36;
}


h1.titlemain {
text-align: center;
margin-top: 6em;
font-size: 350%;
}

h4.titlesub {
text-align: center;
font-size: 120%;
color: #b58900;
.title-sub {
color: #b58900;
}

h2.titledir {
text-align: center;
margin-top: 8.2em;
font-size: 300%;
}
Loading

0 comments on commit e2ae506

Please sign in to comment.