Paulo Henrique Rodrigues Pinheiro

Um blog sobre programação para programadores!


Saiu a nova versão do ruby-txt2tags

O que há de novo na versão 0.1.0 do ruby-txt2tags?

ruby-txt2tags-avatar

Prontamente falando, copiando e colando do changelog:

Ou seja, foi melhorada a documentação e configuração, e o mais importante, foram adicionadas duas novas marcações.

A primeira, para incorporar imagens ao documento. Em HTML, uma tag <img>. A sintaxe é [URL], por exemplo, [https://paulohrpinheiro.xyz/favicon.ico].

A segunda, um pouco mais complexa, é para linkar documentos. Em HTML, uma tag <a>. A sintaxe é: [Descrição da URL URL], por exemplo, [Meu site legal https://paulohrpinheiro.xyz].

Essas inclusões causaram-me alguns problemas para implementar, especialmente porque o motor de tradução é todo baseado em expressões regulares.

Então tive uma surpresa ao colocar, numa mesma linha, essas duas tags:


[https://paulohrpinheiro.xyz/favicon.ico][Meu site legal https://paulohrpinheiro.xyz]

Pois era gerada uma saída como:


<img src="https:<em>paulohrpinheiro.xyz/favicon.ico"><a href="https:</em>paulohrpinheiro.xyz">Meu site legal</a>

Afinal, há um texto entre // e // que precisa ser marcado como em itálico, de acordo com as regras! E o programa funcionou de acordo com minhas tolas especificações...

Passei alguns dias pensando em como resolver isso. A ideia principal era parsear de forma mais descente, e abandonar as expressões regulares.

Foi então que resolvi escrever um teste pra deixar documentada a falha, e poder ir testando mais facilmente. E não é que rapidinho me veio a solução? Uma baita gambiarra, mas me fez passar o teste e não ter que rescrever, por enquanto, todo o "motor".

Decidi criar a regra de que o itálico não será aplicado, se entre as suas marcas existir ou o caractere [ ou o caractere ]. Totalmente impositivo, mas para as minhas necessidade é o que basta.

De quebra passei um bom tempo no irb brincando com expressões regulares.

A lista do que falta implementar para estar de acordo com as especificações do programa original é bem grande. Como prioridade de novas funcionalidades tenho a implementação de tabelas e listas.

E como prioridade "interna", quero melhorar o programa e deixá-lo menos macarrônico. A atual saída do RuboCop é essa:


➤ rubocop
Inspecting 13 files
..........C..

Offenses:

lib/txt2tags.rb:65:3: C: Assignment Branch Condition size for output is too high. [35.62/15]
  def output(format)
  ^^^
lib/txt2tags.rb:65:3: C: Cyclomatic complexity for output is too high. [9/6]
  def output(format)
  ^^^
lib/txt2tags.rb:65:3: C: Method has too many lines. [25/10]
  def output(format) ...
  ^^^^^^^^^^^^^^^^^^
lib/txt2tags.rb:65:3: C: Perceived complexity for output is too high. [10/7]
  def output(format)
  ^^^

13 files inspected, 4 offenses detected

Os números não mentem, está bem embaralhado o programa. Meu desconhecimento e inexperiência com Ruby contribuem para isso. Mas já melhorou muito.

Além de ir aprendendo a programar em Ruby, algo bem interessante é o aprendizado na manutenção de um sistema, especialmente de uma gem e de um projeto no github.

Importante, o programa original (implementado em Python), agora minha especificação, está em Txt2tags.

E o ruby-txt2tags pode ser encontrado em:

https://github.com/paulohrpinheiro/ruby-txt2tags