Criando e-books com o Bookmaker
08/06/08
Depois de ver o excelente resultado do livro Ruby on Rails 2.1 - O que há de novo?, uma iniciativa de Carlos Brando e Marcos Tapajós, me empolguei e empacotei todo o processo de criação em uma gem chamada Bookmaker.
Pelo que pude perceber, esse já era um projeto que estava em andamento e se eu não me adiantasse e fizesse o desenvolvimento, o Carlos provavelmente o faria. Isso está longe de ser uma competição (eu até fiz uma rídicula contribuição no Github). Na verdade, eu já estava procurando algo simples para criar PDFs mas não tinha encontrado nada.
Como funciona o Bookmaker
O Bookmaker é basedo em um gerador de PDFs chamado Prince, que converte arquivos HTMLs usando CSS-3 e toda a sua especificação para impressão. A idéia é baseada em um artigo publicado originalmente pela A List Apart chamado Printing a Book with CSS: Boom!
Embora o Prince seja pago (495USD por uma única licença de usuário), a versão gratuita disponível em http://www.princexml.com/download/ funciona muito bem e adiciona um pequeno logotipo da empresa na página inicial, que é removido quando é impresso.
Todo o texto do livro é escrito em Markdown, uma linguagem de marcação muito simples. Em breve irei adicionar suporte ao Textile, uma outra linguagem de marcação.
O usuários de Mac têm uma vantagem adicional: todo o código do livro pode ser convertido usando o Textmate, de modo que seu o syntax highlight fica semelhante ao seu tema preferido. Não custa dizer que tudo é feito automaticamente.
Instalando o Bookmaker
Como o Prince está disponível para todos os sistemas operacionais, em tese, está disponível em qualquer plataforma. Em tese. Na realidade, por pura preguiça não adicionei suporte ao Windows, mas isso provavelmente deve acontecer em futuras versões. Se você precisa deste suporte e não quer esperar, faça um fork do projeto no Github e envie um patch.
O primeiro passo é instalar o Prince. Acesse o site http://www.princexml.com/download/ e baixe a versão específica para a sua plataforma. Para àqueles que usam Mac OS X, use os comandos abaixo para fazer a instalação.
cd ~/Downloads
wget -c http://www.princexml.com/download/prince-6.0r6-macosx.tar.gz
tar xzf prince-6.0r6-macosx.tar.gz
cd prince-6.0r6-macosx
sudo sh install.sh
O projeto do Bookmaker ainda não foi aprovado no Rubyforge. Por enquanto, você pode baixar a gem em http://f.simplesideias.com.br/bookmaker-0.0.3.gem.
cd ~/Downloads
wget -c http://f.simplesideias.com.br/bookmaker-0.0.3.gem
sudo gem install bookmaker
Agora, vamos instalar a biblioteca que irá converter nossos arquivos Markdown para HTML.
sudo gem install rubigen
sudo gem install discount
sudo gem install redcloth
Se você é usuário de Mac OS X e usa o Textmate, siga os passos abaixo. Caso contrário, pule para Criando seu livro.
Vamos instalar a biblioteca de expressão regular Oniguruma, disponível em http://www.geocities.jp/kosako3/oniguruma/. Para instalá-la, execute os comandos abaixo.
cd ~/Downloads
wget -c http://www.geocities.jp/kosako3/oniguruma/archive/onig-5.9.1.tar.gz
tar zxf onig-5.9.1.tar.gz
cd onig-5.9.1
./configure
make
sudo make install
Instale também a gem Ultraviolet, responsável por converter seu código usando o Textmate.
sudo gem install ultraviolet
Criando seu livro
Para criar seu livro, execute o comando "bookmaker
Agora é hora de escrever o seu livro. Todo o o conteúdo que você escrever, deve ser colocado no diretório "text". O Bookmaker obriga você a separar o livro em capítulos, que nada mais é que um diretório com diversos arquivos Markdown ou Textile. Como o livro será organizado alfabeticamente, é necessário que você escreva uma sequência númerica para garantir a orderação.
Eventualmente, você irá querer visualizar seu livro. Para gerar um PDF, basta executar o comando "rake pdf" para criar o livro no diretório "output".
E por fim…
É isso! Se você tem sugestões, deixe um comentário. Se quiser colaborar com alguma funcionalidade ou corrigir algum erro, envie um patch pelo Github.
Update: Atualizei a versão da gem para 0.0.2. A maior atualização foi o suporte ao Textile. Adicionei também a dependência das gems Rubigen e RedCloth.
- Permalink
- Trackback
- Comentários (10)
- Ao som de: The Puppini Sisters – In The Mood
Usando arrays no Ruby
17/04/08
O Ruby tem algumas particularidades que muitas pessoas não conhecem. Algumas são especialmente úteis, como é o caso do atalho de array. Normalmente, utilizamos a seguinte sintaxe:
items = ['mac', 'linux', 'windows', 'unix']
puts items.size # returns 4
Esse formato é bastante simples, mas se você tiver muitos itens pode se tornar um pouco cansativo para se digitar. No Ruby, você também pode utilizar esta sintaxe:
items = %w[mac linux windows unix]
puts items.size # returns 4
É importante notar que você deve escapar o espaço se quiser usar um termo composto por mais de uma palavra.
items = %w[mac linux windows\ vista unix]
puts items.size # returns 4
Note que você pode usar qualquer caracter como agrupador. Veja alguns exemplos:
items = %w{mac linux windows unix}
puts items.size # returns 4
items = %w"mac linux windows unix"
puts items.size # returns 4
items = %w(mac linux windows unix)
puts items.size # returns 4
Uma dica muito simples, mas elegante!
Testando datas no Ruby
03/02/08
Estou reescrevendo o Spesa e, obviamente, ele exige uma série de cálculos com datas devido aos agendamentos. Na versão anterior, a maioria destes cálculos era feita em consultas SQL, trazendo uma complexidade um tanto quanto desnecessária, já que muito da lógica fica no banco de dados, incluindo algumas Stored Procedures.
Na nova versão toda esta lógica foi trazida para o Ruby, o que facilitou o desenvolvimento. Mas nem tudo foi fácil. Os testes exigiram um pouco de pesquisa — não mais que alguns minutos — já que testar datas é sempre um pouco mais complicado. A dificuldade está em manter a consistência, já que o resultado irá variar dependendo do dia que você executar os testes.
Devido a possibilidade de sobrecarga de métodos que o Ruby oferece, é simples e ao mesmo tempo elegante. Utilizando o código abaixo é possível forçar o método Time.now para sempre retornar uma data específica.
class Time
class << self
# Time we might be behaving as
attr_reader :mock_time
# Set new time to pretend we are.
def mock_time=(new_now)
@mock_time = new_now
end
# now() with possible augmentation
def now_with_mock_time
mock_time || now_without_mock_time
end
alias_method_chain :now, :mock_time
end
end
Adicione o código acima ao seu helper de testes, que no meu caso é "spec/spec_helper.rb", pois estou usando RSpec. Para usá-lo, basta definir uma data como sendo a atual. No exemplo abaixo estou definindo a data atual como sendo "28/02/2007".
it "should mock today method" do
mocked_today = Time.gm(2007, 2, 28)
Time.mock_time = mocked_today
mydate = Date.today
mydate.should eql(mocked_today.to_date)
end
Vi essa dica no Ruby Forum e com certeza vale o bookmark.
Update: Seguindo a dica do Tapajós, você pode usar o Mocka, mas de uma maneira diferente da explicada por ele:
Time.stubs(:now).returns(Time.gm(2008, 2, 1))
Update 2: Mais simples ainda e usando apenas o próprio RSpec:
Time.stub!(:now).and_return(Time.gm(2008, 2, 1))
- Permalink
- Trackback
- Comentários (5)
- Ao som de: Jack Johnson – Constellations
