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)