Hackeando o Jekyll para utilizar outro diretório de posts.
Agora em bom, ou aceitável, português.
A tempos que apenas publico artigos em inglês e a razão é a mais comum, visar um público maior. Mas há diversos problemas com essa atitude sendo que o maior destes é a alienação daqueles que não dominam o inglês, então resolvi escrever artigos também em português.
Note que apesar de separar os artigos em dois domínios (br.marcovaltas.com
e
marcovaltas.com
) nem tudo será traduzido. Meu intuito não é manter todo o
site internacionalizado mas sim tentar endereçar ao público correto certos tipos
de informação, talvez isso implique em escrever artigos em ambas linguagens, mas
na verdade eu não sei como o futuro será.
Sem mais delongas, vamos ver como alterei o jekyll para publicar este site em inglês e em português.
A ausência de configuração
O jekyll possui algumas configurações mas apesar de ser uma ótima ferramenta
para a criação de sites estáticos ele anda meio abandonado. Em sua versão atual
podemos invocá-lo assim jekyll source_dir target_dir
, ou seja, podemos
utilizar um outro diretório como fonte para nosso site. No entando não é isso
que eu desejo, não tenho itenção alguma de manter cópias de arquivos CSS e etc.
O que eu precisava era algo como jekyll --posts_dir posts
mas infelizmente
essa opção não existe. Então imbuído da maior preguiça alterei o jekyll a como
há uma pilha de pull requests para o jekyll resolvi fazer a alteração com o
sed
.
Alterando os arquivos automaticamente.
Já a algum tempo que mantenho este blog dentro de um pipeline do ThoughtWorks
Go, você pode ler
mais sobre isso em outro
artigo.
Então para alterar o fluxo deste pipeline tive que alterar, ou melhor,
adicionar uma tarefa ao rake
.
Atualmente o jekyll possui em seu código duas referências ao diretório _posts
isso está hardcoded nos arquivos post.rb
e site.rb
:
jekyll-0.11.2/lib/jekyll/post.rb:34: @base = File.join(source, dir, '_posts')
jekyll-0.11.2/lib/jekyll/site.rb:156: base = File.join(self.source, dir, '_posts')
Para encontrar os arquivos e alterá-los utilizei um find
seguido de sed
, eis
um exemplo para o arquivo post.rb
:
find ./vendor/bundle -type f -name "post.rb" -path '*/gems/*/lib/jekyll*' -exec sed -i.bak \"s/'_posts'/'_posts_br'/\" {} \;
Onde:
-type f
diz aofind
para encontrar arquivos e não diretórios.-path
é um paramêtro dofind
que checa se o caminho do arquivo encontrado bate com a máscara. Uma segurança a mais para não alterar outros arquivos por engano.-i
nosed
o instrui a criar um backup do arquivo antes de alterá-lo.
Transformando isso numa tarefa do rake
temos:
desc "patch jekyll to change posts source folder"
task :patch_jekyll do
['post.rb','site.rb'].each do |file|
run_or_show "find ./vendor/bundle -type f -name '#{file}' -path '*/gems/*/lib/jekyll*' -exec sed -i.bak \"s/'_posts'/'_posts_br'/\" {} \\;"
end
end
E pronto... bom na verdade não.
Apesar do patch funcionar e o jekyll passar a ler os artigos de outro
diretório restava adptar todo o pipeline para dois fluxos diferentes.
Felizmente utilizando templates no ThoughtWorks Go é simples e com a opção
de paramêtros você pode criar clones de pipelines e utilizar os paramêtros
para alterar o comportamento das tarefas rake
.