class Formatafacil::ArtigoTarefa

Attributes

abstract[RW]
arquivo_abstract[RW]
arquivo_bibliografia[RW]
arquivo_metadados[RW]

Arquivo padrão de leitura dos metadados: metadados.yaml

arquivo_resumo[RW]
arquivo_saida_latex[RW]
arquivo_saida_pdf[RW]
arquivo_saida_yaml[RW]
arquivo_texto[RW]

conteúdo convertido

artigo[RW]
artigo_latex[RW]
bibliografia[RW]
compilador[RW]

Tarefa que pode ser encadeada para compilar o artigo para pdf

metadados[RW]
modelo[RW]
resumo[RW]
texto[RW]

Public Class Methods

new(h={}) click to toggle source

Um parâmetro obrigatório é o modelo do artigo

# File lib/formatafacil/artigo_tarefa.rb, line 46
def initialize(h={})
  @arquivo_resumo = 'resumo.md'
  @arquivo_abstract = 'abstract.md'
  @arquivo_bibliografia ='bibliografia.md'
  @arquivo_metadados = 'metadados.yaml'
  @arquivo_saida_yaml = 'artigo.yaml'
  @arquivo_saida_pdf = 'artigo.pdf'
  @arquivo_saida_latex = 'artigo.tex'
  @artigo = {}
  @artigo_latex = {}
  @metadados = {}
  h.each {|k,v| send("#{k}=",v)}
  @arquivo_texto = "#{modelo}.md"
end

Public Instance Methods

converte_artigo_para_latex() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 122
def converte_artigo_para_latex
  result = ""
  t = Formatafacil::Template.new()
  Open3.popen3("pandoc --smart --standalone --no-wrap --data-dir=#{t.directory} --template=#{modelo} -f markdown -t latex") {|stdin, stdout, stderr, wait_thr|
    pid = wait_thr.pid # pid of the started process.
    stdin.write exporta_conteudo_markdown
    stdin.close
    result = stdout.read
  }
  result
end
converte_conteudo_para_latex(conteudo) click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 134
def converte_conteudo_para_latex(conteudo)
  result = ""
  Open3.popen3("pandoc --smart -f markdown -t latex") {|stdin, stdout, stderr, wait_thr|
    pid = wait_thr.pid # pid of the started process.
    stdin.write conteudo
    stdin.close
    result = stdout.read
  }
  result.strip
end
executa() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 61
def executa
  verifica_conteudos
  unifica_metadados
  escreve_artigo_latex
  compila_pdf
  #ler_configuracao
  #executa_com_configuracao
end
exporta_conteudo_markdown() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 118
def exporta_conteudo_markdown
  "#{@texto}\n#{@metadados.to_yaml}---\n"
end
ler_configuracao() click to toggle source

Ler as configurações dos arquivos:

@arquivo_resumo

# File lib/formatafacil/artigo_tarefa.rb, line 74
def ler_configuracao
  #@artigo.merge!(YAML.load(ler_arquivo(Formatafacil::Tarefa.arquivo_configuracao)))
  #converte_parametros_para_boolean

  #@modelo = @artigo['modelo']
  if File.exist?(@arquivo_abstract) then
    @artigo['abstract'] = ler_arquivo(@arquivo_abstract)
    @artigo.merge!(ler_metadados_do_arquivo(@arquivo_abstract))
  end
  if File.exist?(@arquivo_resumo) then
    @artigo['resumo'] = ler_arquivo(@arquivo_resumo)
  end
  @artigo['bibliografia'] = ler_arquivo(@arquivo_bibliografia) if File.exist?(@arquivo_bibliografia)

  #unifica_metadados

end
ler_metadados_do_arquivo(arquivo) click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 92
def ler_metadados_do_arquivo(arquivo)
  result = {}
  meta = JSON.parse(`pandoc -t json #{arquivo}`)[0]['unMeta']
  meta.each do |k,v|
    result[k]=converte_valor_da_arvore_pandoc(v)
  end
  result
end
modelos() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 114
def modelos
  Formatafacil::Template.new().artigo_modelos
end
unifica_metadados() click to toggle source

Converte os arquivos secundários para latex, e salva junto com os blocos yaml no hash metadados.

# File lib/formatafacil/artigo_tarefa.rb, line 105
def unifica_metadados
  #salva_resumo_em_metadados
  #salva_blocos_de_metadados
  @metadados['resumo'] = converte_conteudo_para_latex(@resumo)
  @metadados['abstract'] = converte_conteudo_para_latex(@abstract)
  @metadados['bibliografia'] = converte_conteudo_para_latex(@bibliografia)
  @metadados.merge!(extrai_blocos_yaml(@abstract))
end

Private Instance Methods

compila_pdf() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 348
def compila_pdf
  @compilador.compila_artigo unless @compilador.nil?
end
converte_configuracao_para_latex() click to toggle source

Converte os arquivos de texto markdown para texto latex

# File lib/formatafacil/artigo_tarefa.rb, line 295
def converte_configuracao_para_latex
  @artigo_latex.merge!(@artigo)

  ['resumo','abstract','bibliografia'].each {|key|
    Open3.popen3("pandoc --smart -f markdown -t latex --no-wrap") {|stdin, stdout, stderr, wait_thr|
      pid = wait_thr.pid # pid of the started process.
      stdin.write @artigo[key]
      stdin.close
      @artigo_latex[key] = stdout.read
    }
  }
end
converte_parametros_para_boolean() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 277
def converte_parametros_para_boolean
  ['incluir_abstract'].each do |param|
    case @artigo[param]
    when true
      @artigo[param] = true
    when 'sim'
      @artigo[param] = true
    when 'Sim'
      @artigo[param] = true
    else
      @artigo[param] = false
    end
  end
end
converte_valor_da_arvore_pandoc(node) click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 239
def converte_valor_da_arvore_pandoc(node)
  #  {"boo_false"=>{"t"=>"MetaBool", "c"=>false}, "boo_true"=>{"t"=>"MetaBool", "c"=>true}, "nome_do_parametro"=>{"t"=>"MetaInlines", "c"=>[{"t"=>"Str", "c"=>"valor"}, {"t"=>"Space", "c"=>[]}, {"t"=>"Str", "c"=>"do"}, {"t"=>"Space", "c"=>[]}, {"t"=>"Str", "c"=>"parâmetro"}]}, "numero"=>{"t"=>"MetaString", "c"=>"15"}}
  result = nil

  case node['t']
  when "MetaString"
    result = node['c']
  when "MetaBool"
    result = node['c']
  when "MetaInlines"
    string = ""
    node['c'].each do |node|
      case node['t']
      when 'Str'
        string += node['c']
      when 'Space'
        string += " "
      end
    end
    if "sim".casecmp(string).zero?
      result = true
    elsif "não".casecmp(string).zero?
      result = false
    else
      result = string
    end
  else
    result = node
  end
  result
end
escreve_artigo_latex() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 147
def escreve_artigo_latex
  #File.open('artigo.tex', 'w'){|f| f.write('Primeira seção aqui')}
  #File.open(@arquivo_saida_latex, 'w') {|f| f.write (converte_artigo_para_latex)}
  File.open('artigo.tex', 'w') {|f| f.write (converte_artigo_para_latex)}
end
executa_com_configuracao() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 308
def executa_com_configuracao
  converte_configuracao_para_latex
  salva_configuracao_yaml_para_inclusao_em_pandoc
  executa_pandoc_salvando_latex
  executa_pdflatex
end
executa_pandoc_salvando_latex() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 315
def executa_pandoc_salvando_latex
  t = Formatafacil::Template.new()
  data_dir = t.directory

  Open3.popen3("pandoc --smart --standalone   --data-dir=#{data_dir} --template=#{modelo} -f markdown -t latex -o #{@arquivo_saida_latex}") {|stdin, stdout, stderr, wait_thr|
    pid = wait_thr.pid # pid of the started process.
    stdin.write @texto
    # yaml com metados:
    stdin.write "\n"
    stdin.write @artigo_latex.to_yaml
    stdin.write("---\n")

    stdin.close
    # stdout.read
  }
  # system "pandoc --smart -s #{@arquivo_texto} #{@arquivo_saida_yaml}  --data-dir=#{data_dir} --template=#{modelo} -f markdown -t latex -o #{@arquivo_saida_latex}"
end
executa_pdflatex() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 333
def executa_pdflatex
  #system "pdflatex #{@arquivo_saida_latex}"
  #system "pdflatex #{@arquivo_saida_latex}"
end
extrai_blocos_yaml(conteudo) click to toggle source

Returna um hash contendo os conteúdos lidos dos blocos yaml.

# File lib/formatafacil/artigo_tarefa.rb, line 203
def extrai_blocos_yaml(conteudo)
  result = {}
  Open3.popen3("pandoc -t json") {|stdin, stdout, stderr, wait_thr|
    pid = wait_thr.pid # pid of the started process.
    stdin.write conteudo
    stdin.close
    meta = JSON.parse(stdout.read)[0]['unMeta']
    meta.each do |k,v|
      result[k]=converte_valor_da_arvore_pandoc(v)
    end
  }
  result
end
identifica_modelo() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 187
def identifica_modelo
  if (@modelo.nil?) then
    t = Formatafacil::Template.new()
    @modelo = t.procura_modelo_de_artigo
    if (@modelo.nil?) then
      #raise "Modelo não encontrado. Modelos disponíveis: #{t.list_names}"
      nomes_dos_arquivos = t.list_names.map { |n| "#{n}.md" }
      raise ArquivoNaoEncontradoError, "Não possível encontrar um arquivo de artigo: #{nomes_dos_arquivos}. Crie o arquivo com o nome do modelo apropriado e tente novamente."
    end
  end
  @arquivo_texto = "#{@modelo}.md"
end
ler_arquivo(arquivo) click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 271
def ler_arquivo(arquivo)
  result = ""
  File.open(arquivo, 'r') { |f| result = f.read }
  result
end
salva_blocos_de_metadados() click to toggle source
# File lib/formatafacil/artigo_tarefa.rb, line 218
def salva_blocos_de_metadados
  [@resumo].each {|texto|
    Open3.popen3("pandoc -t json -f markdown") {|stdin, stdout, stderr, wait_thr|
      pid = wait_thr.pid # pid of the started process.
      stdin.write texto

      stdin.close

      conteudo = stdout.read
      meta = JSON.parse(conteudo)[0]['unMeta']
      puts "\nMeta: #{meta}"
      puts "\nmetadados: #{@metadados}"
      meta.each do |k,v|
        #result[k]=converte_valor_da_arvore_pandoc(v)
        #@metadados[k] = converte_valor_da_arvore_pandoc(v)
        @metadados[k] = v
      end
    }
  }
end
salva_configuracao_yaml_para_inclusao_em_pandoc() click to toggle source

Precisa gerar arquivos com quebra de linha antes e depois porque pandoc utiliza

# File lib/formatafacil/artigo_tarefa.rb, line 340
def salva_configuracao_yaml_para_inclusao_em_pandoc
  File.open(@arquivo_saida_yaml, 'w'){ |file|
    file.write("\n")
    file.write @artigo_latex.to_yaml
    file.write("---\n")
  }
end
verifica_conteudos() click to toggle source

Se não houver conteúdos, tentar ler dos arquivos correspondentes

# File lib/formatafacil/artigo_tarefa.rb, line 154
def verifica_conteudos
  identifica_modelo
  File.open(@arquivo_texto, 'r') {|f| @texto = f.read} if @texto.nil?

  begin
    File.open(@arquivo_resumo, 'r') {|f| @resumo = f.read } if @resumo.nil?
  rescue Errno::ENOENT => e
    raise Formatafacil::ArquivoNaoEncontradoError, "Não possível encontrar o arquivo 'resumo.md'. Crie o arquivo com o nome apropriado e tente novamente."
  end
  begin
    File.open(@arquivo_abstract, 'r') { |f| @abstract = f.read } if @abstract.nil?
  rescue Errno::ENOENT => e
    raise Formatafacil::ArquivoNaoEncontradoError, "Não possível encontrar o arquivo 'abstract.md'. Crie o arquivo com o nome apropriado e tente novamente."
  end
  begin
    File.open(@arquivo_bibliografia, 'r') {|f| @bibliografia = f.read} if @bibliografia.nil?
  rescue Errno::ENOENT
    raise Formatafacil::ArquivoNaoEncontradoError, "Não possível encontrar o arquivo 'bibliografia.md'. Crie o arquivo com o nome apropriado e tente novamente."
  end
  begin
    if @metadados.empty? then
      File.open(@arquivo_metadados, 'r') do |f|
        metadados_lido = YAML.load(f.read)
        @metadados = if metadados_lido.nil? or !metadados_lido then {} else metadados_lido end
      end
    end
  rescue Errno::ENOENT
    raise Formatafacil::ArquivoNaoEncontradoError, "Não possível encontrar o arquivo '#{@arquivo_metadados}'. Crie o arquivo com o nome apropriado e tente novamente."
  rescue Psych::SyntaxError
    raise Formatafacil::MetadadosError, "Erro no arquivo 'metadados.yaml'. Atualize o arquivo e tente novamente."
  end
end