rsyntaxtree 0.8.6 → 0.8.8

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: b25b4f9bf189bb33a19980c2cd6247a93ae2dd14df820eaa9e991425fa56b0dd
4
- data.tar.gz: '0646683a124670135b38f5d93667cac8140a96d74c352d6bb28483cec93e3ee8'
3
+ metadata.gz: c1d573e0201c4374f3fc497b12eb34856fcedeb3513b7d17e403c3d85dbb4d1c
4
+ data.tar.gz: 60b26c37bd71b6f89f6a048a8e594945783d2486def18e4b9b170e89a68bf91c
5
5
  SHA512:
6
- metadata.gz: 0dc8fdc7c0b9c4181ed50372eeebc41d75bccaf4c81db63a79da218918c0c71d70fd0fa9e6df9e8f6e46d52c4153b0934577a76fbdc03d90e23d28bda6a37811
7
- data.tar.gz: c65b56bef0deb983be7cd81e914834de1536c07633c3709a642eedf2d3b461344d4a2ddfc0beae0f85ac0a954cf895472459919b2cf317ea2f26b633309a1f1a
6
+ metadata.gz: f9bc21b39ead52c96d917d799354b84b1c99c1f9d0a7078611e2213086d31d16c3bbb416ce856c874a0563a018b2df8452da1bdaad056348c86905d7a914a40f
7
+ data.tar.gz: e44c03daee5602becb706539f4035d8272d6096d1a26a7e79b0b0c0e439e579a24b85d04717bc1794704c19df24f47d0f95b6f2f05c66abe955f568ac52b189c
data/bin/rsyntaxtree CHANGED
@@ -37,6 +37,8 @@ EOS
37
37
  :default => "on"
38
38
  opt :autosub, "Put subscript numbers to nodes: on or off",
39
39
  :default => "off"
40
+ opt :transparent, "Make background transparent: on or off",
41
+ :default => "off"
40
42
  end
41
43
 
42
44
  Optimist::die :outdir, "must be an exsting directory path" unless FileTest::directory?(opts[:outdir])
@@ -48,8 +50,9 @@ Optimist::die :fontsize, "must be in the range of 8-26" unless opts[:fontsize] >
48
50
  Optimist::die :color, "must be either on or off" unless /\A(on|off)\z/ =~ opts[:color]
49
51
  Optimist::die :symmetrize, "must be either on or off" unless /\A(on|off)\z/ =~ opts[:symmetrize]
50
52
  Optimist::die :autosub, "must be either on or off" unless /\A(on|off)\z/ =~ opts[:autosub]
51
- Optimist::die :margin, "must be in the range of 1-5" if opts[:margin] < 1 || opts[:margin] > 5
53
+ Optimist::die :margin, "must be in the range of 0-5" if opts[:margin] < 1 || opts[:margin] > 5
52
54
  Optimist::die :vheight, "must be in the range of 0.5-5.0" if opts[:vheight] < 0.5 || opts[:vheight] > 5.0
55
+ Optimist::die :transparent, "must be either on or off" unless /\A(on|off)\z/ =~ opts[:transparent]
53
56
 
54
57
  string_opts = {}
55
58
  opts.each do |key, value|
@@ -23,9 +23,9 @@ class Element
23
23
  @level = level # Element level in the tree (0=top etc...)
24
24
  @width = 0 # Width of the element in pixels
25
25
  @indent = 0 # Drawing offset
26
- # content = content.strip
27
- if /\A.+\^\z/ =~ content.strip
28
- @content = content.gsub("^"){""}.strip # The actual element content
26
+ content = content.strip
27
+ if /\A.+\^\z/ =~ content
28
+ @content = content.gsub("^"){""} # The actual element content
29
29
  @triangle = true # draw triangle instead of stright bar when in auto mode
30
30
  else
31
31
  @content = content.gsub("^"){""}.strip # The actual element content
@@ -18,17 +18,20 @@ require 'graph'
18
18
 
19
19
  class SVGGraph < Graph
20
20
 
21
- def initialize(e_list, metrics, symmetrize, color, leafstyle, multibyte, fontstyle, font, font_cjk, font_size)
21
+ def initialize(e_list, metrics, symmetrize, color, leafstyle, multibyte, fontstyle, font, font_cjk, font_size, margin, transparent)
22
22
 
23
23
  # Store class-specific parameters
24
24
  @font = multibyte ? font_cjk : font
25
25
  @font_size = font_size
26
+ @transparent = transparent
27
+
26
28
  case fontstyle
27
29
  when /(?:sans|cjk)/
28
30
  @fontstyle = "sans-serif"
29
31
  when /(?:serif|math)/
30
32
  @fontstyle = "serif"
31
33
  end
34
+ @margin = margin.to_i
32
35
 
33
36
  super(e_list, metrics, symmetrize, color, leafstyle, multibyte, @font, @font_size)
34
37
 
@@ -38,17 +41,35 @@ class SVGGraph < Graph
38
41
  @tree_data = String.new
39
42
  end
40
43
 
44
+ def get_left_most(tree_data)
45
+ xs = @tree_data.scan(/x1?=['"]([^'"]+)['"]/).map{|m| m.first.to_i}
46
+ xs.min
47
+ end
48
+
41
49
  def svg_data
42
50
  parse_list
51
+ lm = get_left_most(@tree_data)
52
+ width = @width - lm + @margin * 2
53
+ height = @height + @margin * 2
54
+
43
55
  header =<<EOD
44
56
  <?xml version="1.0" standalone="no"?>
45
57
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
46
58
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
47
- <svg width="#{@width}" height="#{@height}" version="1.1" xmlns="http://www.w3.org/2000/svg">
59
+ <svg width="#{width}" height="#{height}" viewBox="#{-@margin + lm}, -#{@margin}, #{@width - lm + @margin * 2}, #{@height + @margin * 2}" version="1.1" xmlns="http://www.w3.org/2000/svg">
60
+ EOD
61
+
62
+ rect =<<EOD
63
+ <rect x="#{-@margin + lm}" y="-#{@margin}" width="#{@width - lm + @margin * 2}" height="#{@height + @margin * 2}" stroke="none" fill="white" />"
48
64
  EOD
49
65
 
50
66
  footer = "</svg>"
51
- header + @tree_data + footer
67
+
68
+ if @transparent
69
+ header + @tree_data + footer
70
+ else
71
+ header + rect + @tree_data + footer
72
+ end
52
73
  end
53
74
 
54
75
  # Create a temporary file and returns only its filename
@@ -287,19 +308,9 @@ EOD
287
308
  main_before = parts[0].strip
288
309
  sub = parts[1]
289
310
  main = get_txt_only(main_before)
290
- # if(main.contains_cjk?)
291
- # main = 'n' * main.strip.size * 2
292
- # else
293
- # main
294
- # end
295
311
  main_metrics = img_get_txt_metrics(main, font, font_size, multiline)
296
312
  width = main_metrics.width
297
313
  if sub
298
- # if(sub.contains_cjk?)
299
- # sub = 'n' * sub.strip.size * 2
300
- # else
301
- # sub
302
- # end
303
314
  sub_metrics = img_get_txt_metrics(sub, font, font_size * SUBSCRIPT_CONST, multiline)
304
315
  width += sub_metrics.width
305
316
  end
@@ -21,18 +21,19 @@ class TreeGraph < Graph
21
21
 
22
22
  def initialize(e_list, metrics, symmetrize, color, leafstyle, multibyte,
23
23
  fontstyle, font, font_it, font_bd, font_itbd, font_math, font_cjk, font_size,
24
- margin)
24
+ margin, transparent)
25
25
 
26
26
  # Store class-specific parameters
27
- @fontstyle = fontstyle
28
- @font = multibyte ? font_cjk : font
29
- @font_size = font_size
30
- @font_it = font_it
31
- @font_bd = font_bd
32
- @font_itbd = font_itbd
33
- @font_math = font_math
34
- @font_cjk = font_cjk
35
- @margin = margin
27
+ @fontstyle = fontstyle
28
+ @font = multibyte ? font_cjk : font
29
+ @font_size = font_size
30
+ @font_it = font_it
31
+ @font_bd = font_bd
32
+ @font_itbd = font_itbd
33
+ @font_math = font_math
34
+ @font_cjk = font_cjk
35
+ @margin = margin
36
+ @transparent = transparent
36
37
 
37
38
  super(e_list, metrics, symmetrize, color, leafstyle, multibyte, @font, @font_size)
38
39
 
@@ -49,6 +50,9 @@ class TreeGraph < Graph
49
50
  def draw
50
51
  parse_list
51
52
  @im = Image.new(@width, @height)
53
+ if @transparent
54
+ @im.matte_reset!
55
+ end
52
56
  @im.interlace = PlaneInterlace
53
57
  @gc.draw(@im)
54
58
  end
@@ -63,7 +67,11 @@ class TreeGraph < Graph
63
67
  def to_blob(fileformat='PNG')
64
68
  draw
65
69
  @im.trim!
66
- @im.border!(@margin, @margin, "white")
70
+ if @transparent
71
+ @im.border!(@margin, @margin, "transparent")
72
+ else
73
+ @im.border!(@margin, @margin, "white")
74
+ end
67
75
  @im.format = fileformat
68
76
  @im.interlace = PlaneInterlace
69
77
  return @im.to_blob
@@ -73,6 +81,7 @@ class TreeGraph < Graph
73
81
 
74
82
  # Add the element into the tree (draw it)
75
83
  def draw_element(x, y, w, string, type)
84
+ numlines = string.count("\n")
76
85
  string = string.sub(/\^\z/){""}
77
86
  # Calculate element dimensions and position
78
87
  if (type == ETYPE_LEAF) and @leafstyle == "nothing"
@@ -81,7 +90,7 @@ class TreeGraph < Graph
81
90
  top = row2px(y)
82
91
  end
83
92
  left = x + @m[:b_side]
84
- bottom = top + @e_height
93
+ bottom = top + @e_height * numlines
85
94
  right = left + w
86
95
 
87
96
  # Split the string into the main part and the
@@ -284,7 +293,7 @@ class TreeGraph < Graph
284
293
  end
285
294
  end
286
295
 
287
- def img_get_txt_width(text, font, font_size, multiline = false)
296
+ def img_get_txt_width(text, font, font_size, multiline = true)
288
297
  parts = text.split("_", 2)
289
298
  main_before = parts[0].strip
290
299
  sub = parts[1]
@@ -1,4 +1,4 @@
1
1
  module RSyntaxTree
2
- VERSION = "0.8.6"
2
+ VERSION = "0.8.8"
3
3
  end
4
4
 
data/lib/rsyntaxtree.rb CHANGED
@@ -49,7 +49,7 @@ class RSGenerator
49
49
  .gsub('-CABRACKET-', '>')
50
50
  new_params[key] = data
51
51
  new_params[:multibyte] = data.contains_cjk?
52
- when :symmetrize, :color, :autosub
52
+ when :symmetrize, :color, :autosub, :transparent
53
53
  new_params[key] = value && value != "off" ? true : false
54
54
  when :fontsize
55
55
  new_params[key] = value.to_i * FONT_SCALING
@@ -98,22 +98,23 @@ class RSGenerator
98
98
 
99
99
  # defaults to the following
100
100
  @params = {
101
- :symmetrize => true,
102
- :color => true,
103
- :autosub => false,
104
- :fontsize => 18,
105
- :format => "png",
106
- :leafstyle => "auto",
107
- :filename => "syntree",
108
- :data => "",
109
- :margin => 0,
110
- :vheight => 1.0,
111
- :fontstyle => "sans",
112
- :font => "/NotoSansCJKjp-Regular.otf",
113
- :font_it => "/NotoSans-Italic.ttf",
114
- :font_bd => "/NotoSans-Bold.ttf",
115
- :font_bdit => "/NotoSans-BoldItalic.ttf",
116
- :font_math => "/NotoSansMath-Regular.ttf"
101
+ :symmetrize => true,
102
+ :color => true,
103
+ :autosub => false,
104
+ :transparent => false,
105
+ :fontsize => 18,
106
+ :format => "png",
107
+ :leafstyle => "auto",
108
+ :filename => "syntree",
109
+ :data => "",
110
+ :margin => 0,
111
+ :vheight => 1.0,
112
+ :fontstyle => "sans",
113
+ :font => "/NotoSansCJKjp-Regular.otf",
114
+ :font_it => "/NotoSans-Italic.ttf",
115
+ :font_bd => "/NotoSans-Bold.ttf",
116
+ :font_bdit => "/NotoSans-BoldItalic.ttf",
117
+ :font_math => "/NotoSansMath-Regular.ttf"
117
118
  }
118
119
  @metrics = {
119
120
  :e_width => 120,
@@ -163,7 +164,7 @@ class RSGenerator
163
164
  elist = sp.get_elementlist
164
165
  graph = SVGGraph.new(elist, @metrics,
165
166
  @params[:symmetrize], @params[:color], @params[:leafstyle], @params[:multibyte],
166
- @params[:fontstyle], @params[:font], @params[:font_cjk], @params[:fontsize],
167
+ @params[:fontstyle], @params[:font], @params[:font_cjk], @params[:fontsize], @params[:margin], @params[:transparent]
167
168
  )
168
169
  graph.svg_data
169
170
  end
@@ -176,7 +177,7 @@ class RSGenerator
176
177
  graph = TreeGraph.new(elist, @metrics,
177
178
  @params[:symmetrize], @params[:color], @params[:leafstyle], @params[:multibyte],
178
179
  @params[:fontstyle], @params[:font], @params[:font_it], @params[:font_bd], @params[:font_bdit], @params[:font_math],
179
- @params[:font_cjk], @params[:fontsize], @params[:margin],
180
+ @params[:font_cjk], @params[:fontsize], @params[:margin], @params[:transparent]
180
181
  )
181
182
  graph.to_blob(@params[:format])
182
183
  end
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.6
4
+ version: 0.8.8
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-03 00:00:00.000000000 Z
11
+ date: 2021-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rmagick