pandoc_abnt 1.0.4 → 1.1.0.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +17 -8
- data/lib/pandoc_abnt.rb +1 -0
- data/lib/pandoc_abnt/quadro_filter.rb +156 -0
- data/lib/pandoc_abnt/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 921431824a229e948ccdfd38e1fa88723d960a30
|
4
|
+
data.tar.gz: 230daed2edf5d96681378d3a836f98458dc19dc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c37058463e763d9d3fc4d245fe2519abdf462a71f9dbe5a3a114702e8551dd9431de70577c50b54ca28ad0afa7ed3f8b401240e8e9bcc0dc6118399414a9e00
|
7
|
+
data.tar.gz: d5790e28cbb3c7be73763f0b47b8d5ff867324c8039fd64bf5d86f791863a1e92088e9220ece99b23f8b77c9c98eccff4120a07c4fe0c7abf114570961cd2aca
|
data/Rakefile
CHANGED
@@ -10,12 +10,11 @@ task :fixtures do
|
|
10
10
|
|
11
11
|
Dir.chdir("spec/fixtures/files/figuras") do
|
12
12
|
|
13
|
-
originais = ["p-fig-caption-largura-p-fonte.md"]
|
14
|
-
originais.each do |original|
|
15
|
-
system "pandoc -f markdown+raw_tex --wrap=none #{original} -o #{original.ext('.pandoc.json')}"
|
16
|
-
system "pandoc -f markdown+raw_tex --wrap=none #{original.ext('.transformacao-esperada.md')} -o #{original.ext('.transformacao-esperada.json')}"
|
17
|
-
|
18
|
-
end
|
13
|
+
#originais = ["p-fig-caption-largura-p-fonte.md"]
|
14
|
+
#originais.each do |original|
|
15
|
+
#system "pandoc -f markdown+raw_tex --wrap=none #{original} -o #{original.ext('.pandoc.json')}"
|
16
|
+
#system "pandoc -f markdown+raw_tex --wrap=none #{original.ext('.transformacao-esperada.md')} -o #{original.ext('.transformacao-esperada.json')}"
|
17
|
+
#end
|
19
18
|
|
20
19
|
end
|
21
20
|
|
@@ -71,8 +70,18 @@ task :fixtures do
|
|
71
70
|
original = "alineas-texto-sem-indentado.md"
|
72
71
|
system "pandoc -f markdown+raw_tex --wrap=none #{original} -o #{original.ext('.pandoc.json')}"
|
73
72
|
system "pandoc -f markdown+raw_tex --wrap=none #{original.ext('.transformacao-esperada.md')} -o #{original.ext('.transformacao-esperada.json')}"
|
74
|
-
|
75
|
-
|
73
|
+
end
|
74
|
+
|
75
|
+
Dir.chdir("spec/fixtures/files/quadros") do
|
76
|
+
original = "quadro-com-id-titulo-e-fonte.md"
|
77
|
+
system "pandoc -f markdown+raw_tex --wrap=none #{original} -o #{original.ext('.pandoc.json')}"
|
78
|
+
system "pandoc -f markdown+raw_tex --wrap=none #{original.ext('.transformacao-esperada.md')} -o #{original.ext('.transformacao-esperada.json')}"
|
79
|
+
|
80
|
+
system "pandoc -f markdown+raw_tex --wrap=none #{original.ext('.apenas-tabela.md')} -o #{original.ext('.apenas-tabela.json')}"
|
81
|
+
system "pandoc -f markdown+raw_tex --wrap=none #{original.ext('.apenas-tabela.md')} -o #{original.ext('.apenas-tabela.tex')}"
|
82
|
+
|
83
|
+
|
84
|
+
|
76
85
|
end
|
77
86
|
|
78
87
|
end
|
data/lib/pandoc_abnt.rb
CHANGED
@@ -0,0 +1,156 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module PandocAbnt
|
5
|
+
|
6
|
+
# Reconhece a sintaxe de quadro e converte para o código latex de um quadro segundo o abnTeX2.
|
7
|
+
class QuadroFilter
|
8
|
+
|
9
|
+
def transforma_em_quadro(latex_code, id, titulo, fonte)
|
10
|
+
#inicio = latex_code.lines[0..-2].join ""
|
11
|
+
abntex_code = <<LATEX
|
12
|
+
\\begin{quadro}
|
13
|
+
\\caption{#{titulo.strip}\\label{#{id}}}
|
14
|
+
#{latex_code.strip}
|
15
|
+
\\legend{#{fonte.strip}}
|
16
|
+
\\end{quadro}
|
17
|
+
LATEX
|
18
|
+
abntex_code.strip
|
19
|
+
end
|
20
|
+
|
21
|
+
# Verifica se node é um parágrafo que inicia com "Fonte:"
|
22
|
+
def fonte?(node)
|
23
|
+
# {"t":"Para","c":[{"t":"Str","c":"Fonte:"},{"t":"Space","c":[]},{"t":"Str","c":"Autor."}]}
|
24
|
+
node["t"] == "Para" and node["c"][0]["c"] == "Fonte:"
|
25
|
+
end
|
26
|
+
|
27
|
+
# Verifica se node contém apenas uma imagem
|
28
|
+
def imagem?(node)
|
29
|
+
# {"t":"Para","c":[{"t":"Image","c":[["id",[],[["width","30%"]]],[{"t":"Str","c":"Título"}],["imagem.png","fig:"]]}]}
|
30
|
+
|
31
|
+
node["t"] == "Para" and node["c"][0]["t"] == "Image"
|
32
|
+
end
|
33
|
+
|
34
|
+
# Verifica se node é uma tabela
|
35
|
+
def tabela?(node)
|
36
|
+
# {"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"}]}]]]]}
|
37
|
+
node["t"] == "Table"
|
38
|
+
end
|
39
|
+
|
40
|
+
# Verifica se node é um parágrafo que inicia com "Quadro #id: título"
|
41
|
+
def quadro?(node)
|
42
|
+
# Texto original:
|
43
|
+
# Quadro #perfil: Perfil dos voluntários do experimento
|
44
|
+
#
|
45
|
+
# Depois do parse:
|
46
|
+
#
|
47
|
+
# {"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"}]}
|
48
|
+
para = node["c"]
|
49
|
+
|
50
|
+
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])
|
51
|
+
end
|
52
|
+
|
53
|
+
def string_contendo?(string, node)
|
54
|
+
node["t"] == "Str" and node["c"]==string
|
55
|
+
end
|
56
|
+
|
57
|
+
# Verifica se o node_p contém um string que poderia representar o id de um quadro
|
58
|
+
#
|
59
|
+
# Ex: {"t"=>"Str","c"=>"#perfil2:"}
|
60
|
+
def quadro_id?(node)
|
61
|
+
node["t"] == "Str" and node["c"].match(/\#[[:alpha:]]+\w*\:/)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Verifica se o node (parágrafo) contém uma descrição de Quadro, e extrai o id e título.
|
65
|
+
def extrai_id_titulo_do_quadro(node, apimeta)
|
66
|
+
# {"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"}]}
|
67
|
+
return nil unless quadro?(node)
|
68
|
+
|
69
|
+
id = node["c"][2]["c"][1..-2]
|
70
|
+
titulo_nodes = node["c"][4..-1]
|
71
|
+
para = {"t" => "Para", "c" => titulo_nodes}
|
72
|
+
|
73
|
+
titulo = convert_to_latex(apimeta.merge("blocks"=>[para]))
|
74
|
+
return id, titulo
|
75
|
+
end
|
76
|
+
|
77
|
+
def space?(node)
|
78
|
+
node["t"] == "Space"
|
79
|
+
end
|
80
|
+
|
81
|
+
def string?(node)
|
82
|
+
node["t"] == "Str"
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
# Converte node para latex
|
87
|
+
def convert_to_latex(node)
|
88
|
+
latex_code = nil
|
89
|
+
Open3.popen3("pandoc -f json -t latex --wrap=none") {|stdin, stdout, stderr, wait_thr|
|
90
|
+
stdin.write(node.to_json)
|
91
|
+
stdin.close # stdin, stdout and stderr should be closed explicitly in this form.
|
92
|
+
latex_code = stdout.read
|
93
|
+
|
94
|
+
pid = wait_thr.pid # pid of the started process.
|
95
|
+
exit_status = wait_thr.value # Process::Status object returned.
|
96
|
+
}
|
97
|
+
latex_code
|
98
|
+
end
|
99
|
+
|
100
|
+
def atualiza_imagem_width(node)
|
101
|
+
# {"t"=>"Para", "c"=>[{"t"=>"Image", "c"=>[["id", [], [["largura", "30%"]]], [{"t"=>"Str", "c"=>"Título"}], ["imagem.png", "fig:"]]}]}
|
102
|
+
# node["c"][0]["c"][2] << ["width","30%"]
|
103
|
+
atributos = node["c"][0]["c"][0][2]
|
104
|
+
atributos.each_with_index do |att, index|
|
105
|
+
if att[0] == "largura" then
|
106
|
+
atributos[index][0] = "width"
|
107
|
+
break
|
108
|
+
end
|
109
|
+
end
|
110
|
+
node
|
111
|
+
end
|
112
|
+
|
113
|
+
def filtra_json(pandoc_json_tree)
|
114
|
+
# Exemplo de código:
|
115
|
+
# [{"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."}]}]]
|
116
|
+
tree = JSON.parse(pandoc_json_tree)
|
117
|
+
meta = tree["meta"]
|
118
|
+
blocks = tree["blocks"]
|
119
|
+
api = tree["pandoc-api-version"]
|
120
|
+
|
121
|
+
filtrados = []
|
122
|
+
anterior = nil
|
123
|
+
|
124
|
+
if not blocks
|
125
|
+
raise ArgumentError, "Problema no argumento passado: #{pandoc_json_tree}"
|
126
|
+
end
|
127
|
+
|
128
|
+
blocks.each do |node|
|
129
|
+
|
130
|
+
if (fonte?(node) and tabela?(anterior) and quadro?(filtrados[-2])) then
|
131
|
+
|
132
|
+
tabela_latex = convert_to_latex({"blocks"=>[anterior], "pandoc-api-version" => api, "meta" => meta})
|
133
|
+
fonte_latex = convert_to_latex({"blocks"=>[node], "pandoc-api-version" => api, "meta" => meta})
|
134
|
+
id, titulo = extrai_id_titulo_do_quadro(filtrados[-2], {"pandoc-api-version" => api, "meta" => meta})
|
135
|
+
texcode = transforma_em_quadro(tabela_latex, id, titulo, fonte_latex)
|
136
|
+
raw_tex = {"t"=>"RawBlock","c"=>["latex",texcode]}
|
137
|
+
|
138
|
+
filtrados.pop # remove tabela
|
139
|
+
filtrados.pop # remove quadro parágrafo
|
140
|
+
filtrados << raw_tex
|
141
|
+
else
|
142
|
+
filtrados << node
|
143
|
+
end
|
144
|
+
|
145
|
+
anterior = node
|
146
|
+
end
|
147
|
+
|
148
|
+
JSON.generate({"blocks"=>filtrados, "pandoc-api-version" => api, "meta" => meta})
|
149
|
+
|
150
|
+
|
151
|
+
# 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}"]}]]
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
end
|
data/lib/pandoc_abnt/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pandoc_abnt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.1.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo de Santana Medeiros Alexandre
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- lib/pandoc_abnt.rb
|
103
103
|
- lib/pandoc_abnt/figura_filter.rb
|
104
104
|
- lib/pandoc_abnt/lista_filter.rb
|
105
|
+
- lib/pandoc_abnt/quadro_filter.rb
|
105
106
|
- lib/pandoc_abnt/version.rb
|
106
107
|
- pandoc_abnt.gemspec
|
107
108
|
homepage: https://github.com/edusantana/pandoc_abnt
|
@@ -119,9 +120,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
120
|
version: '0'
|
120
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
122
|
requirements:
|
122
|
-
- - "
|
123
|
+
- - ">"
|
123
124
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
125
|
+
version: 1.3.1
|
125
126
|
requirements: []
|
126
127
|
rubyforge_project:
|
127
128
|
rubygems_version: 2.5.1
|