Saiu a nova versão do ruby-txt2tags
O que há de novo na versão 0.1.0 do ruby-txt2tags?
Prontamente falando, copiando e colando do changelog:
- Add image mark
- Add URL mark
- Add Changelog :)
- Add Ruby version requirement: '>= 2.0'
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