rsyntaxtree 0.8.2 → 0.8.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4606912993b73a0aafb6b6be73cbad23109df14ee1509c6c686c61990acff33c
4
- data.tar.gz: 073a6ecee37e7ce9aa67c329aee75da916dcac4a2cce101f4389cad85e82ed65
3
+ metadata.gz: b25b4f9bf189bb33a19980c2cd6247a93ae2dd14df820eaa9e991425fa56b0dd
4
+ data.tar.gz: '0646683a124670135b38f5d93667cac8140a96d74c352d6bb28483cec93e3ee8'
5
5
  SHA512:
6
- metadata.gz: 569d8c208901a62379792019b9cd528e0a4ffff5c237c30c40244b70502a1852f3921d78f69e6b868ac2fa5096cf6ef1d550795dc74bce160951b3d610d30cc9
7
- data.tar.gz: d15c6e7481e277621b32003a93356f146e3e22bda6c23730889aac5f08d1192b28e5d0dd92681326aff3249f6470fe3c17a91507a17c01c40e7960554a2b72af
6
+ metadata.gz: 0dc8fdc7c0b9c4181ed50372eeebc41d75bccaf4c81db63a79da218918c0c71d70fd0fa9e6df9e8f6e46d52c4153b0934577a76fbdc03d90e23d28bda6a37811
7
+ data.tar.gz: c65b56bef0deb983be7cd81e914834de1536c07633c3709a642eedf2d3b461344d4a2ddfc0beae0f85ac0a954cf895472459919b2cf317ea2f26b633309a1f1a
File without changes
File without changes
@@ -25,10 +25,10 @@ class Element
25
25
  @indent = 0 # Drawing offset
26
26
  # content = content.strip
27
27
  if /\A.+\^\z/ =~ content.strip
28
- @content = content.gsub("^"){""} # The actual element content
28
+ @content = content.gsub("^"){""}.strip # The actual element content
29
29
  @triangle = true # draw triangle instead of stright bar when in auto mode
30
30
  else
31
- @content = content.gsub("^"){""} # The actual element content
31
+ @content = content.gsub("^"){""}.strip # The actual element content
32
32
  @triangle = false # draw triangle instead of stright bar when in auto mode
33
33
  end
34
34
  # workaround to save "[A [B [C] [D] ] [E [F] [G [H] [J] ] ] ]"
@@ -32,8 +32,8 @@ class Graph
32
32
  # Calculate image dimensions
33
33
  @e_height = font_size + @m[:e_padd] * 2
34
34
  h = @e_list.get_level_height
35
- w = calc_level_width(0)
36
- @width = w + @m[:b_side] * 2
35
+ w = calc_level_width(0)
36
+ @width = w
37
37
  @height = h * @e_height + (h-1) * (@m[:v_space] + font_size) + @m[:b_topbot] * 2
38
38
 
39
39
  # Initialize the image and colors
@@ -50,7 +50,7 @@ class Graph
50
50
  @col_leaf = "black"
51
51
  @col_trace = "black"
52
52
  end
53
-
53
+
54
54
  @main_height = img_get_txt_height("l", font, font_size)
55
55
  @sub_size = (font_size * SUBSCRIPT_CONST)
56
56
  @sub_space_width = img_get_txt_width("l", font, @sub_size)
@@ -58,12 +58,11 @@ class Graph
58
58
 
59
59
  def img_get_txt_metrics(text, font, font_size, multiline)
60
60
 
61
- # background = Image.new(500, 250)
62
61
  background = Image.new(1, 1)
63
62
 
64
63
  gc = Draw.new
65
64
  gc.annotate(background, 0, 0, 0, 0, text) do |gc|
66
- gc.font = font
65
+ gc.font = font
67
66
  gc.pointsize = font_size
68
67
  gc.gravity = CenterGravity
69
68
  gc.stroke = 'none'
@@ -110,9 +109,10 @@ class Graph
110
109
  e = @e_list.get_first
111
110
  while e
112
111
  if(e.level == level)
113
- w += calc_element_width(e)
112
+ x = calc_element_width(e)
113
+ w += x
114
114
  end
115
- e = @e_list.get_next
115
+ e = @e_list.get_next
116
116
  end
117
117
  return w
118
118
  end
@@ -150,6 +150,7 @@ class Graph
150
150
  e_arr = @e_list.get_elements
151
151
 
152
152
  h = @e_list.get_level_height
153
+
153
154
  h.times do |i|
154
155
  x = 0
155
156
  e_arr.each do |j|
@@ -167,126 +168,116 @@ class Graph
167
168
  if(j.parent != 0 )
168
169
  words = j.content.split(" ")
169
170
  unless @leafstyle == "nothing" && ETYPE_LEAF == j.type
170
- if (@leafstyle == "triangle" && ETYPE_LEAF == j.type && x == parent_indent && words.length > 0)
171
- txt_width = img_get_txt_width(j.content, @font, @font_size)
172
- triangle_to_parent(x, i, cw, txt_width, @symmetrize)
173
- elsif (@leafstyle == "auto" && ETYPE_LEAF == j.type && x == parent_indent)
174
- if words.length > 1 || j.triangle
175
- txt_width = img_get_txt_width(j.content, @font, @font_size)
176
- triangle_to_parent(x, i, cw, txt_width, @symmetrize)
177
- else
178
- line_to_parent(x, i, cw, @e_list.get_indent(j.parent), @e_list.get_element_width(j.parent))
179
- end
171
+ if (@leafstyle == "auto" && ETYPE_LEAF == j.type && x == parent_indent)
172
+ if words.length > 1 || j.triangle
173
+ txt_width = img_get_txt_width(j.content, @font, @font_size)
174
+ triangle_to_parent(x, i, cw, txt_width, @symmetrize)
175
+ else
176
+ line_to_parent(x, i, cw, @e_list.get_indent(j.parent), @e_list.get_element_width(j.parent))
177
+ end
180
178
  else
181
179
  line_to_parent(x, i, cw, @e_list.get_indent(j.parent), @e_list.get_element_width(j.parent))
182
180
  end
183
181
  end
184
182
  end
185
183
  end
186
-
187
184
  x += cw
188
185
  end
189
186
  end
190
187
  end
191
188
  return true if !@symmetrize
189
+
190
+ elements_to_draw = {}
191
+ triangles_to_draw = []
192
+ lines_to_draw = []
193
+
194
+ lmost = {:level => nil, :value => nil, :type => nil}
195
+ rmost = nil
192
196
  h.times do |i|
193
197
  curlevel = h - i - 1
194
- indent = 0
195
198
  e_arr.each_with_index do |j, idx|
196
199
  if (j.level == curlevel)
197
200
  # Draw a line to the parent element
198
201
  children = @e_list.get_children(j.id)
199
202
 
200
203
  tw = img_get_txt_width(j.content, @font, @font_size)
201
- if children.length > 1
204
+ if children.length > 0
202
205
  left, right = -1, -1
203
- children.each do |child|
206
+ children.each do |child|
204
207
  k = @e_list.get_id(child)
205
- kw = img_get_txt_width(k.content, @font, @font_size)
208
+ kw = img_get_txt_width(k.content, @font, @font_size)
206
209
  left = k.indent + kw / 2 if k.indent + kw / 2 < left or left == -1
207
210
  right = k.indent + kw / 2 if k.indent + kw / 2 > right
208
211
  end
209
- draw_element(left, curlevel, right - left, j.content, j.type)
212
+
213
+ elements_to_draw[j.id] = {:left => left, :curlevel => curlevel, :width => right - left, :content => j.content, :type => j.type}
210
214
  @e_list.set_indent(j.id, left + (right - left) / 2 - tw / 2)
211
215
 
212
216
  children.each do |child|
213
217
  k = @e_list.get_id(child)
214
218
  words = k.content.split(" ")
215
219
  dw = img_get_txt_width(k.content, @font, @font_size)
216
- unless @leafstyle == "nothing" && ETYPE_LEAF == k.type
217
- if (@leafstyle == "triangle" && ETYPE_LEAF == k.type && k.indent == j.indent && words.length > 0)
218
- txt_width = img_get_txt_width(k.content, @font, @font_size)
219
- triangle_to_parent(k.indent, curlevel + 1, dw, txt_width)
220
- elsif (@leafstyle == "auto" && ETYPE_LEAF == k.type && k.indent == j.indent)
221
- if words.length > 1 || k.triangle
222
- txt_width = img_get_txt_width(k.content, @font, @font_size)
223
- triangle_to_parent(k.indent, curlevel + 1, dw, txt_width)
224
- else
225
- line_to_parent(k.indent, curlevel + 1, dw, j.indent, tw)
226
- end
227
- else
228
- line_to_parent(k.indent, curlevel + 1, dw, j.indent, tw)
229
- end
230
- end
231
- end
232
220
 
233
- else
234
- unless children.empty?
235
- k = @e_list.get_id(children[0])
236
- kw = img_get_txt_width(k.content, @font, @font_size)
237
- left = k.indent
238
- right = k.indent + kw
239
- draw_element(left, curlevel, right - left, j.content, j.type)
240
- @e_list.set_indent(j.id, left + (right - left) / 2 - tw / 2)
221
+ children2 = @e_list.get_children(k.id)
241
222
 
242
- k = @e_list.get_id(children[0])
243
- words = k.content.split(" ")
244
- dw = img_get_txt_width(k.content, @font, @font_size)
245
223
  unless @leafstyle == "nothing" && ETYPE_LEAF == k.type
246
- if (@leafstyle == "triangle" && ETYPE_LEAF == k.type && words.length > 0)
247
- txt_width = img_get_txt_width(k.content, @font, @font_size)
248
- triangle_to_parent(k.indent, curlevel + 1, dw, txt_width)
249
- elsif (@leafstyle == "auto" && ETYPE_LEAF == k.type)
224
+ if (@leafstyle == "auto" && ETYPE_LEAF == k.type)
250
225
  if words.length > 1 || k.triangle
251
226
  txt_width = img_get_txt_width(k.content, @font, @font_size)
252
- triangle_to_parent(k.indent, curlevel + 1, dw, txt_width)
227
+ triangles_to_draw << {:indent => k.indent, :curlevel => curlevel + 1, :width1 => dw, :width2 => txt_width}
253
228
  else
254
- line_to_parent(k.indent, curlevel + 1, dw, j.indent, tw)
229
+ lines_to_draw << {:indent1 => k.indent, :curlevel => curlevel + 1, :width1 => dw, :indent2 => j.indent, :width2 => tw}
255
230
  end
256
231
  else
257
- line_to_parent(k.indent, curlevel + 1, dw, j.indent, tw)
258
- end
259
- end
260
-
261
- else
262
- parent = @e_list.get_id(j.parent)
263
- pw = img_get_txt_width(parent.content, @font, @font_size)
264
- pleft = parent.indent
265
- pright = pleft + pw
266
- if curlevel == (h - 1)
267
- e_arr.select{|l|l.level == curlevel}.each do |l|
268
- lw = img_get_txt_width(l.content, @font, @font_size)
269
- left = l.indent
270
- right = left + lw
271
- draw_element(left, curlevel, right - left, l.content, l.type)
272
- @e_list.set_indent(l.id, left + (right - left) / 2 - tw / 2)
232
+ lines_to_draw << {:indent1 => k.indent, :curlevel => curlevel + 1, :width1 => dw, :indent2 => j.indent, :width2 => tw}
273
233
  end
274
- break
275
- else
276
- left = j.indent
277
- right = left + tw
278
- if pw > tw
279
- left = pleft
280
- right = pright
281
- end
282
- draw_element(left, curlevel, right - left, j.content, j.type)
283
- @e_list.set_indent(j.id, left + (right - left) / 2 - tw / 2)
284
234
  end
285
235
  end
286
236
 
287
237
  end
238
+ elements = e_arr.select do |l|
239
+ l.level == curlevel && @e_list.get_children(l.id).empty?
240
+ end
241
+
242
+ elements.each.with_index do |l, idx|
243
+ lw = img_get_txt_width(l.content, @font, @font_size)
244
+ left = l.indent
245
+ right = left + lw
246
+ unless elements_to_draw.include? l.id
247
+ elements_to_draw[l.id] = {:left => left, :curlevel => curlevel, :width => right - left, :content => l.content, :type => l.type}
248
+ end
249
+ end
288
250
  end
289
251
  end
252
+
253
+ e_arr.each do |e|
254
+ lpos = e.indent - img_get_txt_width(e.content, @font, @font_size) / 2
255
+ next if lpos > 0
256
+ if !lmost[:value] || lmost[:value] > lpos
257
+ lmost[:level] = e.level
258
+ lmost[:value] = lpos
259
+ lmost[:type] = e
260
+ end
261
+ rpos = e.indent + e.width
262
+ rmost = rpos if !rmost || rmost < rpos
263
+ end
264
+ end
265
+
266
+ offset = 0
267
+ if lmost[:level] != h - 1
268
+ offset = lmost[:value] / -2
269
+ new_width = rmost
270
+ @width = new_width + offset
271
+ end
272
+
273
+ elements_to_draw.each do |k, v|
274
+ draw_element(v[:left] + offset, v[:curlevel], v[:width], v[:content], v[:type])
275
+ end
276
+ triangles_to_draw.each do |v|
277
+ triangle_to_parent(v[:indent] + offset, v[:curlevel], v[:width1], v[:width2])
278
+ end
279
+ lines_to_draw.each do |v|
280
+ line_to_parent(v[:indent1] + offset, v[:curlevel], v[:width1], v[:indent2] + offset, v[:width2])
290
281
  end
291
282
  end
292
283
 
@@ -99,6 +99,9 @@ EOD
99
99
  elsif /\A\-(.+)\-\z/ =~ main
100
100
  main = $1
101
101
  main_decoration= "underline"
102
+ elsif /\A\~(.+)\~\z/ =~ main
103
+ main = $1
104
+ main_decoration= "line-through"
102
105
  else
103
106
  main_decoration= ""
104
107
  end
@@ -137,6 +140,9 @@ EOD
137
140
  elsif /\A\-(.+)\-\z/ =~ sub
138
141
  sub = $1
139
142
  sub_decoration= "underline"
143
+ elsif /\A\~(.+)\~\z/ =~ sub
144
+ sub = $1
145
+ sub_decoration= "line-through"
140
146
  else
141
147
  sub_decoration= ""
142
148
  end
@@ -281,19 +287,19 @@ EOD
281
287
  main_before = parts[0].strip
282
288
  sub = parts[1]
283
289
  main = get_txt_only(main_before)
284
- if(main.contains_cjk?)
285
- main = 'n' * main.strip.size * 2
286
- else
287
- main
288
- end
290
+ # if(main.contains_cjk?)
291
+ # main = 'n' * main.strip.size * 2
292
+ # else
293
+ # main
294
+ # end
289
295
  main_metrics = img_get_txt_metrics(main, font, font_size, multiline)
290
296
  width = main_metrics.width
291
297
  if sub
292
- if(sub.contains_cjk?)
293
- sub = 'n' * sub.strip.size * 2
294
- else
295
- sub
296
- end
298
+ # if(sub.contains_cjk?)
299
+ # sub = 'n' * sub.strip.size * 2
300
+ # else
301
+ # sub
302
+ # end
297
303
  sub_metrics = img_get_txt_metrics(sub, font, font_size * SUBSCRIPT_CONST, multiline)
298
304
  width += sub_metrics.width
299
305
  end
@@ -37,8 +37,6 @@ class TreeGraph < Graph
37
37
  super(e_list, metrics, symmetrize, color, leafstyle, multibyte, @font, @font_size)
38
38
 
39
39
  # Initialize the image and colors
40
- @im = Image.new(@width, @height)
41
- @im.interlace = PlaneInterlace
42
40
  @gc = Draw.new
43
41
  @gc.font = @font
44
42
  @gc.pointsize(@font_size)
@@ -50,6 +48,8 @@ class TreeGraph < Graph
50
48
 
51
49
  def draw
52
50
  parse_list
51
+ @im = Image.new(@width, @height)
52
+ @im.interlace = PlaneInterlace
53
53
  @gc.draw(@im)
54
54
  end
55
55
 
@@ -62,6 +62,7 @@ class TreeGraph < Graph
62
62
  # by Geoffrey Grosenbach
63
63
  def to_blob(fileformat='PNG')
64
64
  draw
65
+ @im.trim!
65
66
  @im.border!(@margin, @margin, "white")
66
67
  @im.format = fileformat
67
68
  @im.interlace = PlaneInterlace
@@ -1,4 +1,4 @@
1
1
  module RSyntaxTree
2
- VERSION = "0.8.2"
2
+ VERSION = "0.8.6"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsyntaxtree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoichiro Hasebe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-01 00:00:00.000000000 Z
11
+ date: 2021-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rmagick
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  requirements: []
113
- rubygems_version: 3.2.11
113
+ rubygems_version: 3.2.32
114
114
  signing_key:
115
115
  specification_version: 4
116
116
  summary: RSyntaxTree is a graphical syntax tree generator written in Ruby