diff --git a/.gitignore b/.gitignore
index 72364f9..b34c01a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -87,3 +87,5 @@ ENV/
# Rope project settings
.ropeproject
+
+tmp/
diff --git a/docs/00-prefacio.md b/docs/00-prefacio.md
index 22e7cb8..c3a7a91 100644
--- a/docs/00-prefacio.md
+++ b/docs/00-prefacio.md
@@ -46,9 +46,9 @@ Esta edição de _Pense em Python_ tem as seguintes novidades:
* Acrescentei algumas seções e mais detalhes sobre a web, para ajudar os principiantes a executar o Python em um navegador, e não ter que lidar com a instalação do programa até que seja necessário.
-* Para “Módulo turtle” na página 63 troquei meu próprio pacote gráfico turtle, chamado Swampy, para um módulo Python mais padronizado, turtle, que é mais fácil de instalar e mais eficiente.
+* Para [“Módulo turtle”](./04-caso-interface.md#42---módulo-turtle) troquei meu próprio pacote gráfico turtle, chamado Swampy, para um módulo Python mais padronizado, turtle, que é mais fácil de instalar e mais eficiente.
-* Acrescentei um novo capítulo chamado “Extra”, que introduz alguns recursos adicionais do Python, não estritamente necessários, mas às vezes práticos.
+* Acrescentei um novo capítulo chamado [“Extra”](./19-extra.md), que introduz alguns recursos adicionais do Python, não estritamente necessários, mas às vezes práticos.
Espero que goste de trabalhar com este livro, e que ele o ajude a aprender a programar e pensar, pelo menos um pouquinho, como um cientista da computação.
@@ -81,7 +81,7 @@ Exibe textos que devem ser substituídos por valores fornecidos pelos usuários
## Uso do código dos exemplos (de acordo com a política da O'Reilly)
-Há material suplementar (exemplos de código, exercícios etc.) disponível para baixar em http://www.greenteapress.com/thinkpython2/code.
+Há material suplementar (exemplos de código, exercícios etc.) disponível para baixar em [http://www.greenteapress.com/thinkpython2/code](http://www.greenteapress.com/thinkpython2/code).
Este livro serve para ajudar você a fazer o que precisa. Em geral, se o livro oferece exemplos de código, você pode usá-los nos seus programas e documentação. Não é preciso entrar em contato conosco para pedir permissão, a menos que esteja reproduzindo uma porção significativa do código. Por exemplo, escrever um programa que use vários pedaços de código deste livro não exige permissão. Vender ou distribuir um CD-ROM de exemplos dos livros da O’Reilly exige permissão. Responder a uma pergunta citando este livro e reproduzindo exemplos de código não exige permissão. Incorporar uma quantidade significativa de exemplos de código deste livro na documentação do seu produto exige permissão.
@@ -97,13 +97,13 @@ Temos uma página web para este livro na qual incluímos erratas, exemplos e qua
* Página da edição em português
- http://www.novatec.com.br/catalogo/7522508-pense-em-python
+ [http://www.novatec.com.br/catalogo/7522508-pense-em-python](http://www.novatec.com.br/catalogo/7522508-pense-em-python)
* Página da edição original em inglês
- http://bit.ly/think-python_2E
+ [http://bit.ly/think-python_2E](http://bit.ly/think-python_2E)
-Para obter mais informações sobre os livros da Novatec, acesse nosso site em http://www.novatec.com.br.
+Para obter mais informações sobre os livros da Novatec, acesse nosso site em [http://www.novatec.com.br](http://www.novatec.com.br).
## Agradecimentos
diff --git a/docs/02-vars-expr-instr.md b/docs/02-vars-expr-instr.md
index 4b2daa7..0be2e03 100644
--- a/docs/02-vars-expr-instr.md
+++ b/docs/02-vars-expr-instr.md
@@ -30,7 +30,7 @@ O caractere de sublinhar (\_) pode aparecer em um nome. Muitas vezes é usado em
Se você der um nome ilegal a uma variável, recebe um erro de sintaxe:
-```
+```python
>>> 76trombones = 'big parade'
SyntaxError: invalid syntax
>>> more@ = 1000000
diff --git a/docs/09-caso-palavras.md b/docs/09-caso-palavras.md
index 26ba080..31c13c6 100644
--- a/docs/09-caso-palavras.md
+++ b/docs/09-caso-palavras.md
@@ -88,7 +88,7 @@ Escreva uma função chamada `is_abecedarian` que retorne `True` se as letras nu
## 9.3 - Busca
-Todos os exercícios na seção anterior têm algo em comum; eles podem ser resolvidos com o modelo de busca que vimos em “Buscando”, na página 123. O exemplo mais simples é:
+Todos os exercícios na seção anterior têm algo em comum; eles podem ser resolvidos com o modelo de busca que vimos em [Buscando](./08-strings.md#86---buscando). O exemplo mais simples é:
```python
def has_no_e(word):
diff --git a/ebooks/PenseEmPython2e.epub b/ebooks/PenseEmPython2e.epub
new file mode 100644
index 0000000..98f9ee6
Binary files /dev/null and b/ebooks/PenseEmPython2e.epub differ
diff --git a/ebooks/metadata.xml b/ebooks/metadata.xml
new file mode 100644
index 0000000..898792d
--- /dev/null
+++ b/ebooks/metadata.xml
@@ -0,0 +1,4 @@
+Pense em Python
+Allen Downey
+Creative Commons
+pt-BR
\ No newline at end of file
diff --git a/util/epub.py b/util/epub.py
new file mode 100755
index 0000000..29a767b
--- /dev/null
+++ b/util/epub.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+
+from glob import glob
+import shutil
+import subprocess
+import os
+
+
+URL_REPO = 'https://github.com/PenseAllen/PensePython2e/raw/master'
+
+
+def _project_path():
+ return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+def _get_path(p):
+ return os.path.join(_project_path(), p)
+
+
+def _fix_images_url(files, tmp_dir):
+ """ Corrige as urls das imagens.
+ Por algum motivo o pandoc não estava conseguindo baixar as imagens
+ do site para embedar no epub. Com esse código eu gero arquivos
+ temporários com as essas referências acertadas para a mesma imagem
+ dentro do projeto.
+ """
+ os.makedirs(tmp_dir)
+ fixed_files = []
+ fixed_path = os.path.relpath(_project_path())
+ for fp in files:
+ file_name = os.path.split(fp)[1]
+ output = os.path.join(tmp_dir, file_name)
+ with open(fp) as input_file:
+ fixed_str = input_file.read().replace(URL_REPO, fixed_path)
+ with open(output, 'w') as output_file:
+ output_file.write(fixed_str)
+ fixed_files.append(output)
+ return fixed_files
+
+
+def main():
+ glob_filter = _get_path('docs/*.md')
+ capa = _get_path('img/Capa_PenseEmPython332x461-borda.png')
+ metadata = _get_path('ebooks/metadata.xml')
+ output = _get_path('ebooks/PenseEmPython2e.epub')
+ files = glob(glob_filter)
+ files.sort()
+ files.pop()
+ tmp_dir = _get_path('tmp')
+ files = _fix_images_url(files, tmp_dir)
+ # Monta os argumentos do pandoc
+ args = ['pandoc', '--epub-cover-image=' + capa, '--epub-metadata=' + metadata]
+ args.extend(files)
+ args.append('-o')
+ args.append(output)
+ # Executa o pandoc
+ subprocess.call(args)
+ # Remove arquivos temporários
+ shutil.rmtree(tmp_dir)
+ print('Gerado epub em', output)
+
+
+if __name__ == '__main__':
+ main()