diff --git a/.gitignore b/.gitignore
index d96c2e8..5b0113c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ tmp.md
tmp*.png
book.tex
book.pdf
+book.epub
log/*
/.idea
.idea/
diff --git a/Makefile b/Makefile
index 36354b6..704d719 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,5 @@
+.PHONY: default clean all epub pdf tex
+
default: clean all
clean:
@@ -6,4 +8,13 @@ clean:
rm -rf book.*
all:
- python2.7 src/parseBook.py
+ python2.7 src/parseBook.py -f tex -f pdf -f epub
+
+epub:
+ python2.7 src/parseBook.py -f epub
+
+pdf:
+ python2.7 src/parseBook.py -f pdf
+
+tex:
+ python2.7 src/parseBook.py -f tex
diff --git a/appendix/02/README.md b/appendix/02/README.md
index cff6a52..a1d5a27 100644
--- a/appendix/02/README.md
+++ b/appendix/02/README.md
@@ -10,15 +10,7 @@ For printing this book you need first to parse it. For that you will need [`glsl
In **MacOSX** get sure to have [homebrew](http://brew.sh/) installed and then on your terminal do:
```bash
-brew update
-brew upgrade
-brew tap homebrew/versions
-brew install glfw3
-cd ~
-git clone http://github.com/patriciogonzalezvivo/glslViewer.git
-cd glslViewer
-make
-make install
+brew install glslviewer
```
On **Raspberry Pi** you need to get [Raspbian](https://www.raspberrypi.org/downloads/raspbian/), a Debian-based Linux distribution made for Raspberry Pi and then do:
@@ -35,16 +27,16 @@ For parsing the Markdown chapters into Latex and then into a PDF file we will us
In **MacOSX**:
-Download and Install [basictex & MacTeX-Additions] by:
+Download and Install MacTeX by:
```bash
brew cask install mactex-no-gui
```
-and then install [Pandoc](http://johnmacfarlane.net/pandoc/), Python 2 & glslViewer by:
+and then install [Pandoc](http://johnmacfarlane.net/pandoc/) and Python 2 by:
```bash
-brew install pandoc python@2 glslviewer
+brew install pandoc python@2
```
On **Raspberry Pi** (Raspbian):
@@ -63,7 +55,18 @@ For that open your terminal once again and type:
cd ~
git clone https://github.com/patriciogonzalezvivo/thebookofshaders.git
cd thebookofshaders
-make
+make clean pdf
```
If everything goes well, you will see a `book.pdf` file which you can read on your favorite device or print.
+
+#### Compile the book into an epub for use with an e-reader
+
+```bash
+cd ~
+git clone https://github.com/patriciogonzalezvivo/thebookofshaders.git
+cd thebookofshaders
+make clean epub
+```
+
+The generated `book.epub` can be used directly, or converted to a `.mobi` file for use with Kindle by using a converter, for example Calibre.
diff --git a/epub/cover.png b/epub/cover.png
new file mode 100644
index 0000000..59e8a8c
Binary files /dev/null and b/epub/cover.png differ
diff --git a/epub/cover.psd b/epub/cover.psd
new file mode 100644
index 0000000..73d7eb6
Binary files /dev/null and b/epub/cover.psd differ
diff --git a/epub/metadata.xml b/epub/metadata.xml
new file mode 100644
index 0000000..27a9414
--- /dev/null
+++ b/epub/metadata.xml
@@ -0,0 +1,5 @@
+The Book of Shaders
+en-US
+Patricio Gonzalez Vivo
+Jen Lowe
+Copyright 2015 by Patricio Gonzalez Vivo & Jen Lowe
\ No newline at end of file
diff --git a/src/parseBook.py b/src/parseBook.py
index e993ce2..e09df8d 100644
--- a/src/parseBook.py
+++ b/src/parseBook.py
@@ -4,6 +4,12 @@ import os
import os.path
import re
import subprocess
+import argparse
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-f", "--format", action='append', choices=['tex', 'pdf', 'epub'], type=str.lower, required=True)
+parser.add_argument("--skip-image-generation", help="skip image generation", action="store_true")
+args = parser.parse_args()
latexEngine = "xelatex"
@@ -12,12 +18,9 @@ outputPath = "."
if not os.path.exists(outputPath):
os.makedirs(outputPath)
-pdfBookPath = os.path.join(outputPath, "book.pdf")
-texBookPath = os.path.join(outputPath, "book.tex")
chapters = []
-
def injectShaderBlocks(_folder, _text):
rta = ""
lines = _text.split('\n')
@@ -44,7 +47,8 @@ def injectShaderBlocks(_folder, _text):
" ".join(shaderTexturePaths) + \
" -s 0.5 --headless -o " + shaderImage
print shaderCommand
- returnCode = subprocess.call(shaderCommand, shell=True)
+ if not args.skip_image_generation:
+ returnCode = subprocess.call(shaderCommand, shell=True)
rta += "![](" + shaderImage + ")\n"
elif line.find('.gif') >= 0:
gifPath = re.sub(r'\!\[.*\]\((.*\.gif)\)', r'\1', line.rstrip())
@@ -52,7 +56,8 @@ def injectShaderBlocks(_folder, _text):
pngImage = gifName + ".png"
convertCommand = "convert " + gifPath + " " + pngImage
print convertCommand
- returnCode = subprocess.call(convertCommand, shell=True)
+ if not args.skip_image_generation:
+ returnCode = subprocess.call(convertCommand, shell=True)
rta += re.sub(r'\!\[(.*)\]\((.*)\.gif\)',
r'![\1](\2-0.png)', line) + '\n'
else:
@@ -83,36 +88,33 @@ for folder in folders:
# Set up the appropriate options for the pandoc command
inputOptions = chapters
-generalOptions = ["-N", "--toc", "--standalone",
- "--preserve-tabs", "-V documentclass=scrbook", "-V papersize=a4", "-V links-as-note"]
+generalOptions = ["-N", "--toc", "--standalone",
+ "--preserve-tabs", "-V documentclass=scrbook",
+ "-V papersize=a4", "-V links-as-note"]
latexOptions = ["--pdf-engine=" + latexEngine]
-outputOptions = ["--output={0}".format(pdfBookPath)]
-pandocCommand = ["pandoc"] + outputOptions + \
- inputOptions + generalOptions + latexOptions
-
-# Print out of the chapters being built and the flags being used
-print "Generating {0} from:".format(pdfBookPath)
-for chapter in inputOptions:
- print "\t{0}".format(chapter)
-print "Using the following flags:"
-for flag in generalOptions + latexOptions:
- print "\t{0}".format(flag)
-
-# For debugging purposes, it's a good idea to generate the .tex. Errors
-# printed out through pandoc aren't as useful as those printed
-# directly from trying to build a PDF in TeXworks.
-texOutputOptions = ["--output={0}".format(texBookPath)]
-texPandocCommand = ["pandoc"] + texOutputOptions + \
- inputOptions + generalOptions + latexOptions
-returnCode = subprocess.call(texPandocCommand)
-if returnCode == 0:
- print "Successful building of {0}".format(texBookPath)
-else:
- print "Error in building of {0}".format(texBookPath)
-
-# Call pandoc
-returnCode = subprocess.call(pandocCommand)
-if returnCode == 0:
- print "Successful building of {0}".format(pdfBookPath)
-else:
- print "Error in building of {0}".format(pdfBookPath)
+
+for outputFormat in args.format:
+ bookPath = os.path.join(outputPath, "book.{0}".format(outputFormat))
+ formatOutputOptions = []
+
+ if outputFormat == 'epub':
+ formatOutputOptions = ["--epub-metadata=epub/metadata.xml",
+ "--epub-cover-image=epub/cover.png"]
+
+ outputOptions = ["--output={0}".format(bookPath)] + formatOutputOptions
+ pandocCommand = ["pandoc"] + inputOptions + outputOptions \
+ + generalOptions + latexOptions
+
+ # Print out of the chapters being built and the flags being used
+ print "Generating {0} from:".format(bookPath)
+ for chapter in inputOptions:
+ print "\t{0}".format(chapter)
+ print "Using the following flags:"
+ for flag in outputOptions + generalOptions + latexOptions:
+ print "\t{0}".format(flag)
+
+ returnCode = subprocess.call(pandocCommand)
+ if returnCode == 0:
+ print "Successful building of {0}".format(bookPath)
+ else:
+ print "Error in building of {0}".format(bookPath)