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 ao find para encontrar arquivos e não diretórios.
  • -path é um paramêtro do find 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 no sed 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.

Published in Feb 06, 2013