-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathebook-fix.sh
More file actions
executable file
·212 lines (172 loc) · 6.93 KB
/
Copy pathebook-fix.sh
File metadata and controls
executable file
·212 lines (172 loc) · 6.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#!/bin/bash
# Descompacta, edita e compacta o EPUB do ebook do livro
# Expressões Regulares http://www.piazinho.com.br
#
# Testado no OS X (BSD sed), no GNU seria sed -ri '...'
#
# Poderia ser mais eficiente, fazendo um único sed pra não ficar
# regravando todos os arquivos XHTML várias vezes, mas quem se
# importa? Funciona e é rápido mesmo assim :)
#
# Veja também o post no blog sobre este script:
# http://aurelio.net/blog/2016/02/09/sed-salva/
# Se der qualquer erro, aborte o script
set -eu
# Recebe o arquivo .pub como argumento de linha de comando
epub="$1"
test -r "$epub" || { echo "Arquivo não encontrado: $epub"; exit 1; }
# Define os nomes e pastas
pasta_epub=$(dirname "$epub")
basename_epub=$(basename "$epub" .epub)
pasta_temp="/tmp/ebook-fix"
epub_final="$pasta_epub/$basename_epub - ARRUMADO.epub"
pasta_fix="$pasta_epub/$basename_epub - ARRUMADO"
pasta_xhtml="$pasta_fix/OEBPS"
# Expande o epub (que é um ZIP) para uma pasta
rm -rf "$pasta_fix"
mkdir "$pasta_fix"
unzip -q "$epub" -d "$pasta_fix"
# Regex para o início de todas as linhas com códigos fonte
regex_base='<p class="[^>]*CodigoFonte[^>]*>'
# Arruma exceção de espaços antes do tab no início da linha
#
# Cap 9 - Java: página 139 (4ed), linha:
# texto = "0A1B2C3D4E5F";
#
# Como está no HTML:
#
# OEBPS/Miolo_ER_5ed_EPUB_2016_02_04-9.xhtml:
# <p class="_CodigoFontePrimLin1 ParaOverride-6"> 	String texto = "0A1B2C3D4E5F";</p>
#
# XXX Arrumar no InDesign
#
sed -E -i '' "s/(${regex_base}) *(	)/\1\2/g" "$pasta_xhtml"/*.xhtml
# Troca tabs no início da linha por espaços (1 tab = 3 espaços)
#
# Afeta Capítulo 9, em: Awk, C, Java, Lua, Perl, PHP PCRE, PHP POSIX, Ruby, Tcl, VBscript
#
# O máximo que achei foram 2 tabs seguidos, no "Cap 9 - C".
# Coloquei o tratamento até 3 tabs seguidos, só pra garantir.
#
# OEBPS/Miolo_ER_5ed_EPUB_2016_02_04-9.xhtml: <p class="_CodigoFonte1 ParaOverride-6">		error = regexec(&er, argv[2]+start, 1, &match, REG_NOTBOL);</p>
#
# XXX Arrumar no InDesign
#
sed -E -i '' "s/(${regex_base})			/\1 /g" "$pasta_xhtml"/*.xhtml
sed -E -i '' "s/(${regex_base})		/\1 /g" "$pasta_xhtml"/*.xhtml
sed -E -i '' "s/(${regex_base})	/\1 /g" "$pasta_xhtml"/*.xhtml
# Neste ponto, não há mais tabs no início das linhas, somente espaços.
# Ainda há tabs no meio das linhas, mas deixemos de lado por enquanto.
# Ajuste dos blocos de código-fonte, trocando vários <p>...</p>
# por um único bloco <pre>...</pre>
#
# De:
# qualquer coisa antes
# <p class="_CodigoFontePrimLin1">primeira linha do bloco</p>
# <p class="_CodigoFonte1">segunda linha do bloco</p>
# <p class="_CodigoFonte1">terceira linha do bloco</p>
# ...
# <p class="_CodigoFonte1">última linha do bloco</p>
# qualquer coisa depois
#
# Para:
# qualquer coisa antes
# <pre>
# primeira linha do bloco
# segunda linha do bloco
# terceira linha do bloco
# ...
# última linha do bloco
# <pre>
# qualquer coisa depois
#
sed_script='
### Ignorar estas
# Mais informações são encontradas em:
/<p class="_CodigoFontePrimLin1[^>]*">http:\/\/aurelio\.net\/regex/ b end
# Apendice A, Fóruns: lista de URLs
/<p class="_CodigoFontePrimLin1">http:\/\/groups\.google\.com/ b end
/<p class="_CodigoFonte1 ParaOverride-6">http:\/\/br\.groups\.yahoo\.com/ b end
/<p class="_CodigoFonte1 ParaOverride-6">http:\/\/groups\./ b end
# Apache, tabela de paths
/<p class="_CodigoFontePrimLin1 ParaOverride-20"><Files "foto.jpg"><\/p>/ b end
/<p class="_CodigoFontePrimLin1 ParaOverride-20"><FilesMatch "foto\\.jpg"><\/p>/ b end
/<p class="_CodigoFontePrimLin1 ParaOverride-20">[^<]*<span class="_Monoespacado9Negrito _idGenCharOverride-8">/ b end
/<p class="_CodigoFonte1 ParaOverride-20">[^<]*<span class="_Monoespacado9Negrito _idGenCharOverride-8">/ b end
/<p class="_CodigoFonte1 ParaOverride-20"> <\/p>/ b end
/<p class="_CodigoFonte1 ParaOverride-20">\.\.\.<\/p>/ b end
/_CodigoFonte/ {
# insere a tag <pre> no início
i \
<pre>
# inicia o loop
:fix
# remove as tags <p> e </p>
s/^[[:blank:]]*<p [^>]*>//
s/[[:blank:]]*<\/p>$//
# lê a próxima linha
n
# continua no loop se for uma linha do bloco
/_CodigoFonte/ b fix
# insere a tag </pre> no final
i \
</pre>
}
:end
'
sed -E -i '' "$sed_script" "$pasta_xhtml"/*.xhtml
# Ajuste do ajuste: Não quebra linha após o <pre>,
# pois aparece uma linha em branco no iBooks.
#
# De: Para:
# <pre> <pre>foo = 1
# foo = 1 bar = 2
# bar = 2 </pre>
# </pre>
#
sed -E -i '' '/^<pre>/ { N; s/\n//; }' "$pasta_xhtml"/*.xhtml
# Ajustes de CSS
sed_script='
# Arruma declaração incorreta de fonte
/font-family: *"Ubuntu Mono", serif/ s/serif/monospace/
# Aplica ao PRE as regras do _CodigoFonte1
s/^p._CodigoFonte1 {/pre, &/
# Remove do PRE as regras do _CodigoFonte1 que não fazem sentido
# Adiciona ao PRE regras para ficar parecido com o original
/^p._CodigoFonte1M {/ i \
pre {\
text-indent: 0;\
line-height: 1.5em;\
margin-left: 14px;\
font-size: 0.7em;\
}\
table._TabelaBasica {\
margin-top: 0.5em;\
margin-bottom: 0.5em;\
}\
'
sed -E -i '' "$sed_script" "$pasta_xhtml"/css/*
# Remove todas as referências de índice remissivo
# <a id="_idIndexMarker089"></a>
sed -E -i '' 's@<a id="_idIndexMarker[0-9]+"></a>@@g' "$pasta_xhtml"/*.xhtml
# Há 7 linhas com tags <span> no meio do <pre>
# Devem ser apagadas
# XXX Remover no InDesign
#
# $ sed -n '/<pre>/,/<\/pre>/{ /<span/p; }' *.xhtml | grep -v _Symbol
# <span class="_Monoespacado10 _idGenCharOverride-1">^ *[A-Za-z0-9_]+:(.*)$</span>
# <span class="_Monoespacado10 _idGenCharOverride-1">[0-9][0-9]:[0-9][0-9]</span>
# (?<<span class="_Monoespacado10Italico _idGenCharOverride-1">identificador</span>><<span class="_Monoespacado10Italico _idGenCharOverride-1">conteúdo</span>>)
# <span class="_Monoespacado10 _idGenCharOverride-1">(\()?[0-9]+(?(1)\))</span>
# <span class="_Monoespacado10 _idGenCharOverride-1">[A-Za-z0-9,.()%!]</span>
# <span class="CharOverride-15" xml:lang="en-US">u</span><span class="CharOverride-16" xml:lang="en-US"> GNU/Linux</span>
# <span class="CharOverride-15" xml:lang="en-US">u</span><span class="CharOverride-16" xml:lang="en-US"> BSD/</span><span class="CharOverride-16" xml:lang="en-US"></span><span class="CharOverride-16" xml:lang="en-US">Mac</span>
# Há linhas com tab no meio, pra alinhar os comentários à direita
# Tem que usar espaços, não tabs
# XXX Arrumar no InDesign
# Empacota o epub (cria o arquivo ZIP)
cd "$pasta_fix"
zip -q -r /tmp/ebook-fixed.epub *
cd "$OLDPWD"
mv /tmp/ebook-fixed.epub "$epub_final"
echo "OK. Criado o $epub_final"