class PandocAbnt::QuadroFilter
Reconhece a sintaxe de quadro e converte para o código latex de um quadro segundo o abnTeX2.
Public Instance Methods
atualiza_imagem_width(node)
click to toggle source
# File lib/pandoc_abnt/quadro_filter.rb, line 121 def atualiza_imagem_width(node) # {"t"=>"Para", "c"=>[{"t"=>"Image", "c"=>[["id", [], [["largura", "30%"]]], [{"t"=>"Str", "c"=>"Título"}], ["imagem.png", "fig:"]]}]} # node["c"][0]["c"][2] << ["width","30%"] atributos = node["c"][0]["c"][0][2] atributos.each_with_index do |att, index| if att[0] == "largura" then atributos[index][0] = "width" break end end node end
convert_to_latex(node)
click to toggle source
Converte node para latex
# File lib/pandoc_abnt/quadro_filter.rb, line 108 def convert_to_latex(node) latex_code = nil Open3.popen3("pandoc -f json -t latex --wrap=none") {|stdin, stdout, stderr, wait_thr| stdin.write(node.to_json) stdin.close # stdin, stdout and stderr should be closed explicitly in this form. latex_code = stdout.read pid = wait_thr.pid # pid of the started process. exit_status = wait_thr.value # Process::Status object returned. } latex_code end
extrai_id_titulo_do_quadro(node, apimeta)
click to toggle source
Verifica se o node (parágrafo) contém uma descrição de Quadro, e extrai o id e título.
# File lib/pandoc_abnt/quadro_filter.rb, line 86 def extrai_id_titulo_do_quadro(node, apimeta) # {"t"=>"Para","c"=>[{"t"=>"Str","c"=>"Quadro"},{"t"=>"Space"},{"t"=>"Str","c"=>"perfil:"},{"t"=>"Space"},{"t"=>"Str","c"=>"Perfil"},{"t"=>"Space"},{"t"=>"Str","c"=>"dos"},{"t"=>"Space"},{"t"=>"Str","c"=>"voluntários"},{"t"=>"Space"},{"t"=>"Str","c"=>"do"},{"t"=>"Space"},{"t"=>"Str","c"=>"experimento"}]} return nil unless quadro?(node) id = node["c"][2]["c"][0..-2] titulo_nodes = node["c"][4..-1] para = {"t" => "Para", "c" => titulo_nodes} titulo = convert_to_latex(apimeta.merge("blocks"=>[para])) return id, titulo end
filtra_json(pandoc_json_tree)
click to toggle source
# File lib/pandoc_abnt/quadro_filter.rb, line 134 def filtra_json(pandoc_json_tree) # Exemplo de código: # [{"unMeta":{}},[{"t":"Para","c":[{"t":"Image","c":[["id",[],[["width","30%"]]],[{"t":"Str","c":"Título"}],["imagem.png","fig:"]]}]},{"t":"Para","c":[{"t":"Str","c":"Fonte:"},{"t":"Space","c":[]},{"t":"Str","c":"Autor."}]}]] tree = JSON.parse(pandoc_json_tree) meta = tree["meta"] blocks = tree["blocks"] api = tree["pandoc-api-version"] filtrados = [] anterior = nil if not blocks raise ArgumentError, "Problema no argumento passado: #{pandoc_json_tree}" end blocks.each do |node| if (fonte?(node) and tabela?(anterior) and quadro?(filtrados[-2])) then tabela_latex = convert_to_latex({"blocks"=>[anterior], "pandoc-api-version" => api, "meta" => meta}) fonte_latex = convert_to_latex({"blocks"=>[node], "pandoc-api-version" => api, "meta" => meta}) id, titulo = extrai_id_titulo_do_quadro(filtrados[-2], {"pandoc-api-version" => api, "meta" => meta}) texcode = transforma_em_quadro(tabela_latex, id, titulo, fonte_latex) raw_tex = {"t"=>"RawBlock","c"=>["latex",texcode]} filtrados.pop # remove tabela filtrados.pop # remove quadro parágrafo filtrados << raw_tex else filtrados << node end anterior = node end JSON.generate({"blocks"=>filtrados, "pandoc-api-version" => api, "meta" => meta}) # result = <<-LATEX [{"unMeta":{}},[{"t":"RawBlock","c":["latex","\\begin{figure}[htbp]\n\\caption{Legenda da figura}\\label{id}\n\\begin{center}\n\\includegraphics[width=0.30000\\textwidth]{imagem.png}\n\\end{center}\n\\legend{Fonte: Autor.}\n\\end{figure}"]}]] end
fonte?(node)
click to toggle source
Verifica se node é um parágrafo que inicia com “Fonte:”
# File lib/pandoc_abnt/quadro_filter.rb, line 43 def fonte?(node) # {"t":"Para","c":[{"t":"Str","c":"Fonte:"},{"t":"Space","c":[]},{"t":"Str","c":"Autor."}]} node["t"] == "Para" and node["c"][0]["c"] == "Fonte:" end
imagem?(node)
click to toggle source
Verifica se node contém apenas uma imagem
# File lib/pandoc_abnt/quadro_filter.rb, line 49 def imagem?(node) # {"t":"Para","c":[{"t":"Image","c":[["id",[],[["width","30%"]]],[{"t":"Str","c":"Título"}],["imagem.png","fig:"]]}]} node["t"] == "Para" and node["c"][0]["t"] == "Image" end
quadro?(node)
click to toggle source
Verifica se node é um parágrafo que inicia com “Quadro id: título”
# File lib/pandoc_abnt/quadro_filter.rb, line 62 def quadro?(node) # Texto original: # Quadro perfil: Perfil dos voluntários do experimento # # Depois do parse: # # {"t"=>"Para","c"=>[{"t"=>"Str","c"=>"Quadro"},{"t"=>"Space"},{"t"=>"Str","c"=>"perfil:"},{"t"=>"Space"},{"t"=>"Str","c"=>"Perfil"},{"t"=>"Space"},{"t"=>"Str","c"=>"dos"},{"t"=>"Space"},{"t"=>"Str","c"=>"voluntários"},{"t"=>"Space"},{"t"=>"Str","c"=>"do"},{"t"=>"Space"},{"t"=>"Str","c"=>"experimento"}]} para = node["c"] node["t"] == "Para" and node["c"].length>=5 and string_contendo?("Quadro",para[0]) and space?(para[1]) and quadro_id?(para[2]) and space?(para[3]) and string?(para[4]) end
quadro_com_linhas_verticais(begin_table)
click to toggle source
Um quadro é uma tabela com linhas verticais Esse método especifica a utilização de linhas verticais entre as colunas
Exemplo de entrada: begin{longtable}[]{@{}clrc@{}} saída: begin{longtable}[]{|c|l|r|c|}
# File lib/pandoc_abnt/quadro_filter.rb, line 32 def quadro_com_linhas_verticais(begin_table) alinhamento=begin_table.match(/(?<begin>\\begin{longtable}\[.*\]){@{}(?<alinhamento>.*)@{}}/)[:alinhamento] qalign = "|" alinhamento.split("").each do |c| qalign << c + "|" end "\\begin{longtable}[]{#{qalign}}" end
quadro_id?(node)
click to toggle source
Verifica se o node_p contém um string que poderia representar o id de um quadro
Ex: {“t”=>“Str”,“c”=>“perfil2:”}
# File lib/pandoc_abnt/quadro_filter.rb, line 81 def quadro_id?(node) node["t"] == "Str" and node["c"].match(/[[:alpha:]]+\w*\:/) end
space?(node)
click to toggle source
# File lib/pandoc_abnt/quadro_filter.rb, line 98 def space?(node) node["t"] == "Space" end
string?(node)
click to toggle source
# File lib/pandoc_abnt/quadro_filter.rb, line 102 def string?(node) node["t"] == "Str" end
string_contendo?(string, node)
click to toggle source
# File lib/pandoc_abnt/quadro_filter.rb, line 74 def string_contendo?(string, node) node["t"] == "Str" and node["c"]==string end
tabela?(node)
click to toggle source
Verifica se node é uma tabela
# File lib/pandoc_abnt/quadro_filter.rb, line 56 def tabela?(node) # {"t":"Table","c":[[{"t":"Str","c":"Demonstration"},{"t":"Space"},{"t":"Str","c":"of"},{"t":"Space"},{"t":"Str","c":"simple"},{"t":"Space"},{"t":"Str","c":"table"},{"t":"Space"},{"t":"Str","c":"syntax."},{"t":"Space"},{"t":"RawInline","c":["tex","\\label{mytable}"]}],[{"t":"AlignRight"},{"t":"AlignLeft"},{"t":"AlignCenter"},{"t":"AlignDefault"}],[0,0,0,0],[[{"t":"Plain","c":[{"t":"Str","c":"Right"}]}],[{"t":"Plain","c":[{"t":"Str","c":"Left"}]}],[{"t":"Plain","c":[{"t":"Str","c":"Center"}]}],[{"t":"Plain","c":[{"t":"Str","c":"Default"}]}]],[[[{"t":"Plain","c":[{"t":"Str","c":"12"}]}],[{"t":"Plain","c":[{"t":"Str","c":"12"}]}],[{"t":"Plain","c":[{"t":"Str","c":"12"}]}],[{"t":"Plain","c":[{"t":"Str","c":"12"}]}]],[[{"t":"Plain","c":[{"t":"Str","c":"123"}]}],[{"t":"Plain","c":[{"t":"Str","c":"123"}]}],[{"t":"Plain","c":[{"t":"Str","c":"123"}]}],[{"t":"Plain","c":[{"t":"Str","c":"123"}]}]],[[{"t":"Plain","c":[{"t":"Str","c":"1"}]}],[{"t":"Plain","c":[{"t":"Str","c":"1"}]}],[{"t":"Plain","c":[{"t":"Str","c":"1"}]}],[{"t":"Plain","c":[{"t":"Str","c":"1"}]}]]]]} node["t"] == "Table" end
transforma_em_quadro(latex_code, id, titulo, fonte)
click to toggle source
# File lib/pandoc_abnt/quadro_filter.rb, line 9 def transforma_em_quadro(latex_code, id, titulo, fonte) #inicio = latex_code.lines[0..-2].join "" begin_longtable = quadro_com_linhas_verticais(latex_code.lines[0].strip) tabela_codigo_interno_begin = latex_code.lines[1..-2].join("").strip abntex_code = <<LATEX \\renewcommand\\LTcaptype{quadro} #{begin_longtable} \\caption{#{titulo.strip}\\label{#{id}}}\\tabularnewline #{tabela_codigo_interno_begin} \\caption*{#{fonte.strip}} \\end{longtable} \\renewcommand\\LTcaptype{table} LATEX abntex_code.strip end