Estrutura de Diretórios e Arquitetura
A organização do código-fonte segue as convenções clássicas de empacotamento Ruby, isolando a lógica de domínio, os binários de interface e os testes automatizados. A árvore de diretórios do projeto refatorado apresenta a seguinte topologia:
w2md-converter/
├── bin/
│ └── w2md-cli
├── lib/
│ ├── w2md/
│ │ ├── engine.rb
│ │ ├── parser.rb
│ │ ├── node_mapper.rb
│ │ ├── markup_generator.rb
│ │ └── version.rb
│ └── w2md.rb
├── spec/
│ ├── engine_spec.rb
│ └── spec_helper.rb
├── .gitignore
├── Gemfile
└── w2md-converter.gemspec
bin/: Armazena os scripts executáveis que funcionam como ponto de entrada da aplicação CLI.lib/: Contém o núcleo da biblioteca. O subdiertóriow2md/fragmenta as responsabilidades:engine.rborquestra o fluxo,parser.rblida com a leitura do arquivo binário,node_mapper.rbpercorre a árvore DOM emarkup_generator.rbemite o texto final.spec/: Diretório dedicado aos testes unitários e de integração utilizando RSpec.
Ponto de Entrada e Execução
O script localizado em bin/w2md-cli atua como a interface de linha de comando. Ele é responsável por capturar os argumentos do sistema, validar a entrada e delegar o processamento para a classe principal do motor de conversão.
#!/usr/bin/env ruby
# frozen_string_literal: true
require_relative '../lib/w2md'
module W2MD
class CLI
def self.execute(args)
if args.empty?
warn "Erro: Caminho do arquivo .docx não fornecido."
warn "Uso: w2md-cli <caminho_do_arquivo>"
exit 1
end
source_file = args.first
engine = W2MD::Engine.new(source_file)
puts engine.render_markdown
end
end
end
W2MD::CLI.execute(ARGV)
Gerenciamento de Dependências e Metadados
A configuração do ambiente e a declaração de metadados da gem são gerenciadas através do Gemfile e do arquivo de especificação .gemspec. Esta abordagem garante a reprodutibilidaed do ambiente de desenvolvimento e define as restrições de versão para as bibliotecas de parsing XML e conversão de texto.
# Gemfile
source 'https://rubygems.org'
gemspec
group :development, :test do
gem 'pry-byebug'
gem 'rubocop', require: false
end
O arquivo de especificação detalha as dependências de tempo de execução e desenvolvimento, além de configurar os caminhos de empacotamento:
# w2md-converter.gemspec
require_relative 'lib/w2md/version'
Gem::Specification.new do |spec|
spec.name = 'w2md-converter'
spec.version = W2MD::VERSION
spec.summary = 'Ferramenta para extração de conteúdo de arquivos Word para Markdown.'
spec.description = 'Converte documentos do Microsoft Word em texto formatado em Markdown, preservando a estrutura semântica.'
spec.license = 'MIT'
spec.required_ruby_version = '>= 2.7.0'
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
end
spec.bindir = 'bin'
spec.executables = ['w2md-cli']
spec.require_paths = ['lib']
spec.add_runtime_dependency 'nokogiri', '~> 1.13'
spec.add_runtime_dependency 'reverse_markdown', '~> 2.1'
spec.add_development_dependency 'rspec', '~> 3.10'
spec.add_development_dependency 'rake', '~> 13.0'
end