Apresento: dangolino

Já fazia algum tempo que eu queria escrever meu próprio mecanismo de blogging, mas hora a preguiça, hora a falta de tempo me impediam de faze-lo e então eu acabava por protelar isso e dar atenção a outras coisas, até alguns dias atrás quando eu resolvi colocar essa minha idéia em prática.

Inicialmente eu comecei a escrever usando node.js, mas eu encontrei alguns obstáculos pelo caminho que me levaram a crer que aquela não era a tecnologia mais adequada para este tipo de app, talvez meu conhecimento em node.js é que foi o empecilho para eu continuar usando ele, sendo assim congelei o projeto usando node.js e o reiniciei usando ruby o que ao meu ver foi uma decisão muito acertada.

O que eu queria inicialmente era dispor de um meio que eu pudesse criar os templates HTML e então a partir destes gerar os arquivos HTML estáticos individualmente para cada post via linha de comando, então passei um WD40 nas minhas habilidades de programador ruby que estavam bem enferrujadinhas e mandei ver.

Status atual

Hoje o projeto permite escrever posts usando HTML puro ou usando Markdown que no momento da criação do arquivo estático é parseado e em seguida mesclado com o template.

Para os templates eu usei o mustache que é e suas próprias palavras "logic-less templates" e tem o mínimo de recursos possíveis, o que para os meus objetivos se encaixou como uma luva.

Como usar ?

Achei que não fosse perguntar. Inicialmente é preciso instalar as seguintes gems:

  • sequel (se você for usar o script de importação de posts do wordpress)
  • mustache (para os templates)
  • optiflag (para parse de parâmetros CLI)
  • ruby-mysql (também somente se for importar posts do wordpress)
  • redcarpet (para suporte ao markdown)

Após instalar as gems, você pode clonar o projeto diretamente do github:

git clone git://github.com/adlermedrado/dangolino.git

Você pode fazer o download do pacote diretamente no site do github caso não queira clonar.

É necessário fazer algumas configurações

O dangolino tem um único arquivo de configuração que é bem simples de ser entendido, então vou poupar tempo apenas colocando seu conteúdo aqui. O arquivo que deve ser editado é esse: /lib/dangolino/config/settings.yml

---
path:
    root_dir: /Users/adler/dev/projects/dangolino
    generate_dir: /Users/adler/dev/projects/dangolino/site
    template_dir: /Users/adler/dev/projects/dangolino/templates
    lib_dir: /Users/adler/dev/projects/dangolino/lib
    url: http://your-url
mysql:
    host: 127.0.0.1
    user: root
    pass: ""
    dbname: my_db

Criando os templates

Eu criei 3 templates para meu projeto:

  • index.mustache
  • post.mustache
  • all_posts.mustache

O arquivo index.mustache será usado para gerar o index.html do meu site, nele eu coloquei para que fossem listados um texto introdutório e fossem listados os quatro último posts e seu conteúdo é esse:

<html>
  <body>
      <div>Oi, seja bem vindo ao meu site :)</div>
      <div>
          <div>
            <h3>{{{date_1}}} - {{{title_1}}}</h3>
            <p>{{{link_1}}} </p>
          </div>
          <div>
            <h3>{{{date_2}}} - {{{title_2}}}</h3>
            <p>{{{link_2}}} </p>
          </div>
          <div>
            <h3>{{{date_3}}} - {{{title_4}}}</h3>
            <p>{{{link_3}}} </p>
          </div>
          <div>
            <h3>{{{date_4}}} - {{{title_4}}}</h3>
            <p>{{{link_4}}} </p>
          </div>
        </div>
      <footer>
        <p>&copy; Adler Medrado 1996-2012 | powered by <a href="http://github.com/adlermedrado/dangolino">dangolino</a> </p>
      </footer>
  </body>
</html>

O arquivo all_posts.mustache irá gerar o all_posts.html, neste arquivo serão listados todos os posts publicados até o momento:

<html>
    <body>
      <h1>Lista de todos os meus posts publicados</h1>
      <p>Enjoy :)</p>
      {{#posts}}
      <div>
        <h2>{{{date}}} - {{{title}}}</h3>
        <p>{{{link}}} </p>
        <p><a class="btn btn-small" href="{{{link}}}">ler post &raquo;</a></p>
      </div>
      {{/posts}}
      <footer>
        <p>&copy; Adler Medrado 1996-2012 | powered by <a href="http://github.com/adlermedrado/dangolino">dangolino</a></p>
      </footer>
  </body>
</html>

E por fim, o arquivo post.mustache irá gerar o arquivo de cada post individualmente; Exemplo: Este post chama-se Apresento o Dangolino então o nome do arquivo gerado será apresento-o-dangolino.html:

<html>
  <body>
      <div>
            <h1>{{{post_title}}}</h1>
      </div>
      <div>
            {{{post_content}}}
            <p>Post date: {{{post_date_published}}}</p>         
      </div>
      <footer>
        <p>&copy; Adler Medrado 1996-2012 | powered by <a href="http://github.com/adlermedrado/dangolino">dangolino</a> </p>
      </footer>
    </div>
  </body>
</html>

Pronto. Só isso.

Se você criar estes 3 templates e configurar o settings.yml você já poderá começar usar o dangolino se você quiser. Além desses arquivos, o dangolino gera também um arquivo de RSS :-)

Gerando...

Para gerar o arquivo basta executar um simples comando:

ruby dangolino.rb -year 2012 -month 05 -file ~/site/dango.markdown -link apresento-o-dangolino -title "Apresento: dangolino" -format markdown

Para importar os posts que estão no wordpress:

ruby dangolino-import.rb

O que falta?

Eu ainda quero implementar algumas funcionalidades nele, melhorar pontos do código afim de torna-lo mais genérico, escrever os testes unitários, importar do wordpress.com (hoje só importo de wordpress local), posterous e implementar maneiras que tornem o deploy dos arquivos gerados e/ou modificados a cada novo post mais simples e também automatizados, nesse último caso eu tenho algumas idéias para fazer o deploy usando capistrano, git e rsync, com o tempo espero implementar tudo isso e muito mais.

Porque você fez isso?

Como já me perguntaram isso mais de uma vez desde que comecei a comentar com algumas pessoas sobre o projeto, eu resolvi acrescentar este bloco de texto neste post. Se já existe jekyll, wordpress, posterous, etc., porque diabos eu escrevi o meu? A resposta é simples: Porque eu posso e porque eu quero. :-)

Eu escrevi porque eu quero tornar o processo de gerenciamento dos meus blogs o mais simples possível, como eu já tenho o ambiente ruby configurado no meu computador, isso não é problema para mim e como os arquivos gerados são todos HTML puro fica fácil de eu colocar o site aonde eu quiser além de tornar o processo de backup mais simples por se tratarem apenas de um monte de arquivos.

Considerações finais

Bom, é isso pessoal. Esse é um projeto que eu criei para mim, por isso pode ser que se você tentar experimenta-lo ele não sirva em nada para suas necessidades, nesse caso você pode tentar outras alternativas ou fazer um fork e adapta-lo às suas necessidades. Eu escrevi este post para mostrar o meu novo xodó pra galera e pra compartilhar com quem interessar possa.

Ah, outra pergunta que me fizeram é: "O que é dangolino? De onde você tirou esse nome?" - Bom, meu filho mais novo se chama Dan e eu sempre o chamo pelo apelido de dangolino e na hora que eu criei o projeto no github eu precisava de um nome e o primeiro que me veio a cabeça na hora foi esse. No final deu certo porque tanto o Dan menino quanto o dangolino app, são dois dos meus xodós. :D

Esse aqui é o dangolino (Dan) de verdade :)

Esse é o dangolino de verdade

Links úteis
  1. Arquivo markdown usado para gerar este post
  2. http://github.com/adlermedrado/dangolino
  3. http://mustache.github.com/
  4. http://optiflag.rubyforge.org/
  5. https://github.com/tanoku/redcarpet
  6. http://sequel.rubyforge.org/

Post date: 02/05/2012 - 16:18:16