Skip to content

Commit 127d703

Browse files
committed
feat: aprimorar geração de eBooks e adicionar referências
- Atualiza o workflow de geração de eBooks para incluir novas opções de formatação. - Adiciona a extração e consolidação de referências no script de geração. - Cria um novo arquivo CSS para estilização do eBook em EPUB. - Corrige referências em capítulos existentes. - Gera novos arquivos PDF e EPUB com as alterações.
1 parent 8f8ea9f commit 127d703

7 files changed

Lines changed: 233 additions & 11 deletions

File tree

.github/workflows/generate-ebook.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ jobs:
4747
--pdf-engine=xelatex \
4848
--toc \
4949
--toc-depth=2 \
50-
-V geometry:margin=1in \
50+
--number-sections \
51+
-V geometry:top=2.5cm,bottom=2.5cm,left=3cm,right=2.5cm \
52+
-V linestretch=1.3 \
5153
-V documentclass=book \
5254
-V lang=pt-BR \
5355
-V mainfont="DejaVu Serif" \
@@ -62,6 +64,9 @@ jobs:
6264
-o public/downloads/livro-pog.epub \
6365
--toc \
6466
--toc-depth=2 \
67+
--number-sections \
68+
--epub-cover-image=public/images/cover/capa.jpg \
69+
--css=public/styles/ebook.css \
6570
--metadata title="Programação Orientada a Gambiarra" \
6671
--metadata author="Josenaldo Matos Filho" \
6772
--metadata lang=pt-BR

content/capitulos/requisitos/dimensao-humana.md

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Esse profissional ostenta capacidades excepcionais de produção de sistemas em
4747

4848
O que muita gente não sabe é que o Arquiteto MacGyver é um mestre no uso de geradores de POGramas, frameworks e todas as artimanhas necessárias pra criar um calhamaço de POG que pareça resolver o problema proposto. E o projeto gerado por este profissional, apesar de impressionar à primeira vista, costuma apodrecer mais rápido que que fruta em mochila de POGramador.
4949

50-
O Arquiteto MacGyver costuma ter um relacionamento dúbio com a equipe, ora atuando com fonte de inspiração para ideias pseudodisruptivas, ora atuando como fonte de inspiração para impropérios capazes de fazer o próprio Moonwalker de Curupira[^fn-nomes-capeta] corar de vergonha.
50+
O Arquiteto MacGyver costuma ter um relacionamento dúbio com a equipe, ora atuando com fonte de inspiração para ideias pseudodisruptivas, ora atuando como fonte de inspiração para impropérios capazes de fazer o próprio Moonwalker de Curupira[^fn-nomes-capeta-1] corar de vergonha.
5151

5252
## Gerente Sem Noção
5353

@@ -94,23 +94,23 @@ Obviamente que isso vira um círculo vicioso, onde mais pogs são necessárias p
9494

9595
## Intrometido Inepto
9696

97-
Pra completar a corte enviada pelo Estraga Suruba[^fn-nomes-capeta], temos o Intrometido Inepto. Essa figura aparece em diversas fases do projeto com uma única missão: se intrometer onde não é chamado para fornecer uma opinião não solicitada sobre um assunto que não domina.
97+
Pra completar a corte enviada pelo Estraga Suruba[^fn-nomes-capeta-2], temos o Intrometido Inepto. Essa figura aparece em diversas fases do projeto com uma única missão: se intrometer onde não é chamado para fornecer uma opinião não solicitada sobre um assunto que não domina.
9898

9999
O Intrometido Inepto costuma colaborar na criação de pogs ao colocar ideias perniciosas nas mentes de tomadores de decisões despreparados para lidar com essa influência danosa.
100100

101-
É esse filho do Chinelo Emborcado[^fn-nomes-capeta] que planta, na mente fértil do Gerente Sem Noção, a ideia de que seria muito útil se o sistema financeiro tivesse uma funcionalidade de geração aleatória de nomes do capeta no campo de nomes dos fornecedores.
101+
É esse filho do Chinelo Emborcado[^fn-nomes-capeta-3] que planta, na mente fértil do Gerente Sem Noção, a ideia de que seria muito útil se o sistema financeiro tivesse uma funcionalidade de geração aleatória de nomes do capeta no campo de nomes dos fornecedores.
102102

103-
É esse Torresmo de Prepúcio[^fn-nomes-capeta] que, num ato de covardia e prazer pelo sofrimento alheio, convence o cliente de que o sistema precisa ter a capacidade de enviar emails através de pombos-correio, caso a internet caia.
103+
É esse Torresmo de Prepúcio[^fn-nomes-capeta-4] que, num ato de covardia e prazer pelo sofrimento alheio, convence o cliente de que o sistema precisa ter a capacidade de enviar emails através de pombos-correio, caso a internet caia.
104104

105-
É esse Tempero de Miojo[^fn-nomes-capeta] que diz para o Gerente Sem Noção que a equipe vai render muito mais se for marcada uma palestra motivacional com coach quântico numa sexta feira, às 18h30. E sem lanche, pois a fome é uma motivadora muito fote.
105+
É esse Tempero de Miojo[^fn-nomes-capeta-5] que diz para o Gerente Sem Noção que a equipe vai render muito mais se for marcada uma palestra motivacional com coach quântico numa sexta feira, às 18h30. E sem lanche, pois a fome é uma motivadora muito fote.
106106

107107
Se você identificar um Intrometido Inepto junto aos tomadores de decisão associados ao seu projeto, a atitude mais correta e humana é capturar e entregar para o Ibama. Se isso não for possível, reze. Se for ateu, essa é uma boa hora pra adotar uma religião.
108108

109109
## Dobrador de problemas
110110

111111
Ao tratarmos da dimensão humana, não poderíamos deixar de mencionar um papel que pode ser assumido por qualquer um dos membros dessa pequena seita de invocação de calamidades digitais: o Dobrador de Problemas.
112112

113-
Não se sabe qual fenômeno causa essa transfiguração na criatura humana. O que se sabe é que, em qualquer momento de um projeto, o espírito do Dobrador de Problemas pode encarnar em seu avatar (que poder ser qualquer um, mas quase sempre é o gerente) e esse passa controlar os problemas da equipe com toda destreza e graciosidade do Nariz Fora da Máscara[^fn-nomes-capeta] tentando causar um pequeno apocalipse.
113+
Não se sabe qual fenômeno causa essa transfiguração na criatura humana. O que se sabe é que, em qualquer momento de um projeto, o espírito do Dobrador de Problemas pode encarnar em seu avatar (que poder ser qualquer um, mas quase sempre é o gerente) e esse passa controlar os problemas da equipe com toda destreza e graciosidade do Nariz Fora da Máscara[^fn-nomes-capeta-6] tentando causar um pequeno apocalipse.
114114

115115
Tal qual um Jesus da Desgracença, o Dobrador de Problemas pega um pequeno empecilho pra resolver e, a partir desse minúsculo pedacinho de caos, ele gera um tufão de esmerdalhamento que multiplica e joga problemas pra todos os lados, fazendo o efeito Asa de Urubu parecer um folheto de igreja que mostra uma criança loira montando um leão vegano.
116116

@@ -122,7 +122,17 @@ Quem será o próximo a ser possuído?[^fn-next-problem-bender]
122122

123123
## Notas
124124

125-
[^fn-nomes-capeta]: Moonwalker de Curupira é um dos nomes do Virose Bacteriana, do Discurso Epistemológico, do Farofa Doce, do Azuado, do Pai da Mentira, do Filho do Presidente, do Fede a 17... Para mais nomes, visite [Invocador de Nomes do Capeta](https://invocapiroto.com.br)
125+
[^fn-nomes-capeta-1]: Moonwalker de Curupira é um dos nomes do Virose Bacteriana, do Discurso Epistemológico, do Farofa Doce, do Azuado, do Pai da Mentira, do Filho do Presidente, do Fede a 17... Para mais nomes, visite [Invocador de Nomes do Capeta](https://invocapiroto.com.br)
126+
127+
[^fn-nomes-capeta-2]: Estraga Suruba é outro nome do capeta. Ver nota 1.
128+
129+
[^fn-nomes-capeta-3]: Chinelo Emborcado é outro nome do capeta. Ver nota 1.
130+
131+
[^fn-nomes-capeta-4]: Torresmo de Prepúcio é outro nome do capeta. Ver nota 1.
132+
133+
[^fn-nomes-capeta-5]: Tempero de Miojo é outro nome do capeta. Ver nota 1.
134+
135+
[^fn-nomes-capeta-6]: Nariz Fora da Máscara é outro nome do capeta. Ver nota 1.
126136

127137
[^fn-next-problem-bender]: Certeza que é o gerente. É sempre o gerente.
128138

public/downloads/livro-pog.epub

275 KB
Binary file not shown.

public/downloads/livro-pog.pdf

27.3 KB
Binary file not shown.

public/styles/ebook.css

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
/* EPUB Custom Stylesheet for Programação Orientada a Gambiarra */
2+
3+
/* Body and Typography */
4+
body {
5+
font-family: Georgia, "Times New Roman", serif;
6+
line-height: 1.6;
7+
margin: 1em;
8+
text-align: justify;
9+
}
10+
11+
/* Headings */
12+
h1 {
13+
font-size: 2em;
14+
margin-top: 1.5em;
15+
margin-bottom: 0.8em;
16+
page-break-before: always;
17+
text-align: center;
18+
font-weight: bold;
19+
}
20+
21+
h2 {
22+
font-size: 1.5em;
23+
margin-top: 1.2em;
24+
margin-bottom: 0.6em;
25+
font-weight: bold;
26+
}
27+
28+
h3 {
29+
font-size: 1.2em;
30+
margin-top: 1em;
31+
margin-bottom: 0.5em;
32+
font-weight: bold;
33+
}
34+
35+
/* Paragraphs */
36+
p {
37+
margin: 0.8em 0;
38+
text-indent: 1.5em;
39+
}
40+
41+
/* First paragraph after heading - no indent */
42+
h1 + p,
43+
h2 + p,
44+
h3 + p {
45+
text-indent: 0;
46+
}
47+
48+
/* Lists */
49+
ul, ol {
50+
margin: 1em 0;
51+
padding-left: 2em;
52+
}
53+
54+
li {
55+
margin: 0.5em 0;
56+
}
57+
58+
/* Blockquotes */
59+
blockquote {
60+
margin: 1em 2em;
61+
padding: 0.5em 1em;
62+
border-left: 3px solid #666;
63+
font-style: italic;
64+
background-color: #f5f5f5;
65+
}
66+
67+
/* Code */
68+
code {
69+
font-family: "Courier New", Courier, monospace;
70+
background-color: #f5f5f5;
71+
padding: 0.2em 0.4em;
72+
border-radius: 3px;
73+
}
74+
75+
pre {
76+
background-color: #f5f5f5;
77+
padding: 1em;
78+
overflow-x: auto;
79+
border-radius: 5px;
80+
margin: 1em 0;
81+
}
82+
83+
pre code {
84+
background-color: transparent;
85+
padding: 0;
86+
}
87+
88+
/* Links */
89+
a {
90+
color: #0066cc;
91+
text-decoration: none;
92+
}
93+
94+
a:hover {
95+
text-decoration: underline;
96+
}
97+
98+
/* Images */
99+
img {
100+
max-width: 100%;
101+
height: auto;
102+
display: block;
103+
margin: 1em auto;
104+
}
105+
106+
/* Footnotes */
107+
.footnote {
108+
font-size: 0.9em;
109+
vertical-align: super;
110+
}
111+
112+
.footnotes {
113+
margin-top: 2em;
114+
padding-top: 1em;
115+
border-top: 1px solid #ccc;
116+
font-size: 0.9em;
117+
}
118+
119+
/* Tables */
120+
table {
121+
border-collapse: collapse;
122+
width: 100%;
123+
margin: 1em 0;
124+
}
125+
126+
th, td {
127+
border: 1px solid #ddd;
128+
padding: 0.5em;
129+
text-align: left;
130+
}
131+
132+
th {
133+
background-color: #f5f5f5;
134+
font-weight: bold;
135+
}
136+
137+
/* Page breaks */
138+
.page-break {
139+
page-break-after: always;
140+
}
141+
142+
/* Strong and emphasis */
143+
strong {
144+
font-weight: bold;
145+
}
146+
147+
em {
148+
font-style: italic;
149+
}
150+
151+
/* Horizontal rules */
152+
hr {
153+
border: none;
154+
border-top: 1px solid #ccc;
155+
margin: 2em 0;
156+
}

scripts/docker-generate.sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ if [ "$FORMAT" == "pdf" ] || [ "$FORMAT" == "all" ]; then
3131
--pdf-engine=xelatex \
3232
--toc \
3333
--toc-depth=2 \
34-
-V geometry:margin=1in \
34+
--number-sections \
35+
-V geometry:top=2.5cm,bottom=2.5cm,left=3cm,right=2.5cm \
36+
-V linestretch=1.3 \
3537
-V documentclass=book \
3638
-V lang=pt-BR \
3739
-V mainfont="DejaVu Serif" \
@@ -53,6 +55,10 @@ if [ "$FORMAT" == "epub" ] || [ "$FORMAT" == "all" ]; then
5355
-o /workspace/downloads/livro-pog.epub \
5456
--toc \
5557
--toc-depth=2 \
58+
--number-sections \
59+
--epub-cover-image=/workspace/images/cover/capa.jpg \
60+
--epub-embed-font=/workspace/styles/ebook.css \
61+
--css=/workspace/styles/ebook.css \
5662
--metadata title="Programação Orientada a Gambiarra" \
5763
--metadata author="Josenaldo Matos Filho" \
5864
--metadata lang=pt-BR

scripts/generate-ebook.js

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,24 +57,55 @@ function fixImagePaths(content) {
5757
return content.replace(/!\[([^\]]*)\]\(\/images\//g, '![$1](./images/');
5858
}
5959

60+
// Extract references from content (without removing)
61+
function extractReferences(content) {
62+
// Match from "## Referências" to the next "##" (not "###") or "[^" or end
63+
const referencesMatch = content.match(/## Referências\s*\n([\s\S]*?)(?=\n## [^#]|\n\[^[^\]]|$)/);
64+
if (referencesMatch && referencesMatch[1].trim()) {
65+
// Clean up the references section
66+
return referencesMatch[1].trim().replace(/^---+\s*$/gm, ''); // Remove horizontal rules
67+
}
68+
return null;
69+
}
70+
6071
// Generate combined markdown
6172
function generateCombinedMarkdown() {
6273
const chapters = getChapters();
6374
let combinedContent = '';
75+
const allReferences = [];
6476

65-
// Add title page
77+
// Add title page with metadata
6678
combinedContent += '---\n';
6779
combinedContent += 'title: Programação Orientada a Gambiarra\n';
80+
combinedContent += 'subtitle: Um Guia Definitivo sobre a Arte da Gambiarra no Desenvolvimento de Software\n';
6881
combinedContent += 'author: Josenaldo Matos Filho\n';
82+
combinedContent += 'date: 2024\n';
6983
combinedContent += 'lang: pt-BR\n';
84+
combinedContent += 'rights: © 2024 Josenaldo Matos Filho. Licenciado sob CC BY-NC-SA 4.0\n';
85+
combinedContent += 'description: |\n';
86+
combinedContent += ' Um livro satírico sobre as gambiarras no desenvolvimento de software,\n';
87+
combinedContent += ' explorando técnicas, princípios e padrões da POGramação.\n';
88+
combinedContent += 'keywords: [programação, gambiarra, humor técnico, padrões de projeto, desenvolvimento de software]\n';
89+
combinedContent += 'publisher: Auto-publicado\n';
7090
combinedContent += '---\n\n';
7191

7292
// Add each chapter
7393
chapters.forEach((chapter, index) => {
7494
console.log(`Adding chapter ${index + 1}/${chapters.length}: ${chapter.title} (${chapter.path})`);
7595

96+
let chapterContent = chapter.content;
97+
98+
// Extract and collect references (keep them in chapter)
99+
const references = extractReferences(chapterContent);
100+
if (references) {
101+
allReferences.push({
102+
chapter: chapter.title,
103+
references: references
104+
});
105+
}
106+
76107
combinedContent += `# ${chapter.title}\n\n`;
77-
combinedContent += fixImagePaths(chapter.content);
108+
combinedContent += fixImagePaths(chapterContent);
78109
combinedContent += '\n\n';
79110

80111
// Add page break for PDF
@@ -83,10 +114,24 @@ function generateCombinedMarkdown() {
83114
}
84115
});
85116

117+
// Add consolidated references at the end if any exist
118+
if (allReferences.length > 0) {
119+
combinedContent += '\\newpage\n\n';
120+
combinedContent += '# Bibliografia Consolidada\n\n';
121+
combinedContent += 'Esta seção consolida todas as referências citadas ao longo do livro, organizadas por capítulo.\n\n';
122+
123+
allReferences.forEach(ref => {
124+
combinedContent += `## ${ref.chapter}\n\n`;
125+
combinedContent += ref.references;
126+
combinedContent += '\n\n';
127+
});
128+
}
129+
86130
// Write combined file
87131
fs.writeFileSync(OUTPUT_FILE, combinedContent, 'utf-8');
88132
console.log(`\nGenerated combined markdown: ${OUTPUT_FILE}`);
89133
console.log(`Total chapters: ${chapters.length}`);
134+
console.log(`References consolidated: ${allReferences.length} chapters`);
90135
}
91136

92137
// Run

0 commit comments

Comments
 (0)