rsyntaxtree 0.8.8 → 0.9.1
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/fonts/NotoSansJP-Bold.otf +0 -0
- data/fonts/NotoSansJP-Regular.otf +0 -0
- data/fonts/NotoSansMath-Regular.ttf +0 -0
- data/fonts/NotoSerifJP-Bold.otf +0 -0
- data/fonts/NotoSerifJP-Regular.otf +0 -0
- data/lib/rsyntaxtree/element.rb +1 -1
- data/lib/rsyntaxtree/error_message.rb +1 -1
- data/lib/rsyntaxtree/graph.rb +10 -5
- data/lib/rsyntaxtree/string_parser.rb +9 -2
- data/lib/rsyntaxtree/svg_graph.rb +90 -46
- data/lib/rsyntaxtree/tree_graph.rb +33 -14
- data/lib/rsyntaxtree/version.rb +1 -1
- data/lib/rsyntaxtree.rb +18 -11
- metadata +6 -4
- data/fonts/NotoSansCJKjp-Regular.otf +0 -0
- data/fonts/NotoSerifCJKjp-Regular.otf +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69c3a36921d2441f35c9729197aaea3ded204780b7033361a3434605e17e70cb
|
4
|
+
data.tar.gz: 342c7b8e779e2fca098d441f11ea7a458e050e42b49957369a7af3ac9ffd5ce8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddffb304231af332a8de21e29a97943570b8297749c7368c536b0f15103a392c4f10f1b6c77c79c0ab8b48a3fbe05ccfcc09da69b20b53c0f5a41692245d5137
|
7
|
+
data.tar.gz: 0c6a91490bdf0a26bcfed5cdad68bc25fdd9252577b86a638a8a6ce72a4c5c297324dda81e9e0f1852bee545d437d16f625ec312141fd8a56868b691d9bd05b6
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/rsyntaxtree/element.rb
CHANGED
@@ -24,7 +24,7 @@ class Element
|
|
24
24
|
@width = 0 # Width of the element in pixels
|
25
25
|
@indent = 0 # Drawing offset
|
26
26
|
content = content.strip
|
27
|
-
if /\A.+\^\z/ =~ content
|
27
|
+
if /\A.+\^\z/m =~ content
|
28
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
|
@@ -23,7 +23,7 @@ class ErrorMessage
|
|
23
23
|
@filename = filename
|
24
24
|
@format = format
|
25
25
|
|
26
|
-
metrics = img_get_txt_metrics(text, font, font_size, true)
|
26
|
+
metrics = img_get_txt_metrics(text, font, font_size, NoDecoration, true)
|
27
27
|
|
28
28
|
@im = Image.new(metrics.width, metrics.height)
|
29
29
|
@gc = Draw.new
|
data/lib/rsyntaxtree/graph.rb
CHANGED
@@ -66,6 +66,9 @@ class Graph
|
|
66
66
|
gc.pointsize = font_size
|
67
67
|
gc.gravity = CenterGravity
|
68
68
|
gc.stroke = 'none'
|
69
|
+
gc.kerning = 0
|
70
|
+
gc.interline_spacing = 0
|
71
|
+
gc.interword_spacing = 0
|
69
72
|
end
|
70
73
|
|
71
74
|
if multiline
|
@@ -81,18 +84,19 @@ class Graph
|
|
81
84
|
# for all child elements.
|
82
85
|
def calc_element_width(e)
|
83
86
|
w = 0
|
87
|
+
content = e.content.gsub("<>", " ")
|
84
88
|
|
85
89
|
children = @e_list.get_children(e.id)
|
86
90
|
|
87
91
|
if(children.length == 0)
|
88
|
-
w = img_get_txt_width(
|
92
|
+
w = img_get_txt_width(content, @font, @font_size) + @font_size
|
89
93
|
else
|
90
94
|
children.each do |child|
|
91
95
|
child_e = @e_list.get_id(child)
|
92
96
|
w += calc_element_width(child_e)
|
93
97
|
end
|
94
98
|
|
95
|
-
tw = img_get_txt_width(
|
99
|
+
tw = img_get_txt_width(content, @font, @font_size) + @font_size
|
96
100
|
if(tw > w)
|
97
101
|
fix_child_size(e.id, w, tw)
|
98
102
|
w = tw
|
@@ -186,13 +190,13 @@ class Graph
|
|
186
190
|
end
|
187
191
|
end
|
188
192
|
return true if !@symmetrize
|
189
|
-
|
193
|
+
|
190
194
|
elements_to_draw = {}
|
191
195
|
triangles_to_draw = []
|
192
196
|
lines_to_draw = []
|
193
197
|
|
194
198
|
lmost = {:level => nil, :value => nil, :type => nil}
|
195
|
-
rmost = nil
|
199
|
+
rmost = nil
|
196
200
|
h.times do |i|
|
197
201
|
curlevel = h - i - 1
|
198
202
|
e_arr.each_with_index do |j, idx|
|
@@ -299,8 +303,9 @@ class Graph
|
|
299
303
|
return text
|
300
304
|
end
|
301
305
|
|
302
|
-
def img_get_txt_height(text, font, font_size, multiline =
|
306
|
+
def img_get_txt_height(text, font, font_size, multiline = true)
|
303
307
|
metrics = img_get_txt_metrics(text, font, font_size, multiline)
|
308
|
+
# y = (metrics.bounds.y2 - metrics.bounds.y1).round
|
304
309
|
y = metrics.height
|
305
310
|
return y
|
306
311
|
end
|
@@ -171,8 +171,15 @@ class StringParser
|
|
171
171
|
end
|
172
172
|
when "\\"
|
173
173
|
escape = true
|
174
|
-
when
|
175
|
-
|
174
|
+
when "n", " ", "+", "-", "=", "~", "#", "*"
|
175
|
+
if escape
|
176
|
+
token += "\\#{ch}"
|
177
|
+
escape = false
|
178
|
+
else
|
179
|
+
token += ch
|
180
|
+
end
|
181
|
+
# when /[\n\r]/
|
182
|
+
# gottoken = false # same as do nothing
|
176
183
|
else
|
177
184
|
token += ch
|
178
185
|
escape = false if escape
|
@@ -27,17 +27,23 @@ class SVGGraph < Graph
|
|
27
27
|
|
28
28
|
case fontstyle
|
29
29
|
when /(?:sans|cjk)/
|
30
|
-
@fontstyle
|
31
|
-
|
32
|
-
|
30
|
+
@fontstyle = "\"'Noto Sans JP', 'Noto Sans', sans-serif\""
|
31
|
+
@fontcss = "http://fonts.googleapis.com/earlyaccess/notosansjp.css"
|
32
|
+
when /(?:serif)/
|
33
|
+
@fontstyle = "\"'Noto Serif JP', 'Noto Serif', serif\""
|
34
|
+
@fontcss = "https://fonts.googleapis.com/css?family=Noto+Serif+JP"
|
35
|
+
when /(?:math)/
|
36
|
+
@fontstyle = "\"Latin Modern Roman', sans-serif\""
|
37
|
+
@fontcss = "https://cdn.jsdelivr.net/gh/sugina-dev/latin-modern-web@1.0.1/style/latinmodern-roman.css"
|
33
38
|
end
|
39
|
+
|
34
40
|
@margin = margin.to_i
|
35
41
|
|
36
|
-
super(e_list, metrics, symmetrize, color, leafstyle, multibyte, @
|
42
|
+
super(e_list, metrics, symmetrize, color, leafstyle, multibyte, @fontstyle, @font_size)
|
37
43
|
|
38
44
|
@line_styles = "<line style='stroke:black; stroke-width:#{FONT_SCALING};' x1='X1' y1='Y1' x2='X2' y2='Y2' />\n"
|
39
45
|
@polygon_styles = "<polygon style='fill: none; stroke: black; stroke-width:#{FONT_SCALING};' points='X1 Y1 X2 Y2 X3 Y3' />\n"
|
40
|
-
@text_styles = "<text style='fill: COLOR; font-size:
|
46
|
+
@text_styles = "<text letter-spacing='0' word-spacing='0' kerning='0' style='fill: COLOR; font-size: FONT_SIZE ST WA' x='X_VALUE' y='Y_VALUE' TD font-family=#{@fontstyle}>CONTENT</text>\n"
|
41
47
|
@tree_data = String.new
|
42
48
|
end
|
43
49
|
|
@@ -54,11 +60,17 @@ class SVGGraph < Graph
|
|
54
60
|
|
55
61
|
header =<<EOD
|
56
62
|
<?xml version="1.0" standalone="no"?>
|
57
|
-
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
63
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
58
64
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
59
65
|
<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">
|
66
|
+
<defs>
|
67
|
+
<style>
|
68
|
+
@import url(#{@fontcss});
|
69
|
+
</style>
|
70
|
+
</defs>
|
60
71
|
EOD
|
61
72
|
|
73
|
+
|
62
74
|
rect =<<EOD
|
63
75
|
<rect x="#{-@margin + lm}" y="-#{@margin}" width="#{@width - lm + @margin * 2}" height="#{@height + @margin * 2}" stroke="none" fill="white" />"
|
64
76
|
EOD
|
@@ -89,21 +101,21 @@ EOD
|
|
89
101
|
end
|
90
102
|
|
91
103
|
:private
|
92
|
-
|
104
|
+
|
93
105
|
# Add the element into the tree (draw it)
|
94
106
|
def draw_element(x, y, w, string, type)
|
95
|
-
string = string.sub(/\^\z/){""}
|
107
|
+
string = string.sub(/\^\z/){""}
|
96
108
|
# Calculate element dimensions and position
|
97
109
|
if (type == ETYPE_LEAF) and @leafstyle == "nothing"
|
98
110
|
top = row2px(y - 1) + (@font_size * 1.5)
|
99
|
-
else
|
111
|
+
else
|
100
112
|
top = row2px(y)
|
101
113
|
end
|
102
114
|
left = x + @m[:b_side]
|
103
115
|
bottom = top + @e_height
|
104
116
|
right = left + w
|
105
117
|
|
106
|
-
# Split the string into the main part and the
|
118
|
+
# Split the string into the main part and the
|
107
119
|
# subscript part of the element (if any)
|
108
120
|
parts = string.split("_", 2)
|
109
121
|
if(parts.length > 1 )
|
@@ -148,11 +160,18 @@ EOD
|
|
148
160
|
main = $1
|
149
161
|
end
|
150
162
|
|
151
|
-
# Calculate text size for the main and the
|
163
|
+
# Calculate text size for the main and the
|
152
164
|
# subscript part of the element
|
153
165
|
# symbols for underline/overline removed temporarily
|
154
166
|
|
155
|
-
main_width =
|
167
|
+
main_width = 0
|
168
|
+
main_height = 0
|
169
|
+
main.split(/\\n/).each do |l|
|
170
|
+
l_width = img_get_txt_width(l, @font, @font_size)
|
171
|
+
main_width = l_width if main_width < l_width
|
172
|
+
main_height += img_get_txt_height(l, @font, @font_size)
|
173
|
+
end
|
174
|
+
|
156
175
|
|
157
176
|
if sub != ""
|
158
177
|
if /\A\=(.+)\=\z/ =~ sub
|
@@ -184,9 +203,11 @@ EOD
|
|
184
203
|
sub_style = ""
|
185
204
|
sub_weight = ""
|
186
205
|
end
|
206
|
+
sub_height = img_get_txt_height(sub, @font, @font_size)
|
187
207
|
sub_width = img_get_txt_width(sub.to_s, @font, @sub_size)
|
188
208
|
else
|
189
209
|
sub_width = 0
|
210
|
+
sub_height = 0
|
190
211
|
end
|
191
212
|
|
192
213
|
if /\A#(.+)#\z/ =~ sub
|
@@ -194,14 +215,13 @@ EOD
|
|
194
215
|
end
|
195
216
|
|
196
217
|
# Center text in the element
|
197
|
-
|
198
|
-
txt_pos = left + (right - left) / 2 - txt_width / 2
|
218
|
+
txt_pos = left + (right - left) / 2
|
199
219
|
|
200
220
|
# Select apropriate color
|
201
221
|
if(type == ETYPE_LEAF)
|
202
222
|
col = @col_leaf
|
203
223
|
else
|
204
|
-
col = @col_node
|
224
|
+
col = @col_node
|
205
225
|
end
|
206
226
|
|
207
227
|
if(main[0].chr == "<" && main[-1].chr == ">")
|
@@ -210,29 +230,47 @@ EOD
|
|
210
230
|
|
211
231
|
# Draw main text
|
212
232
|
main_data = @text_styles.sub(/COLOR/, col)
|
213
|
-
main_data = main_data.sub(/FONT_SIZE/, @font_size.to_s)
|
214
|
-
main_x = txt_pos
|
215
|
-
main_y = top + @e_height - @m[:e_padd]
|
233
|
+
main_data = main_data.sub(/FONT_SIZE/, @font_size.to_s + "px;")
|
234
|
+
main_x = txt_pos - (main_width + sub_width) / 2
|
235
|
+
main_y = top + @e_height - @m[:e_padd]
|
216
236
|
main_data = main_data.sub(/X_VALUE/, main_x.to_s)
|
217
237
|
main_data = main_data.sub(/Y_VALUE/, main_y.to_s)
|
218
|
-
|
238
|
+
if /\\n/ =~ main
|
239
|
+
lines = main.split(/\\n/)
|
240
|
+
new_main = ""
|
241
|
+
dy = 0
|
242
|
+
lines.each_with_index do |l, idx|
|
243
|
+
if idx == 0
|
244
|
+
dy = 0
|
245
|
+
else
|
246
|
+
dy = 1
|
247
|
+
main_y += img_get_txt_height(l, @font, @font_size)
|
248
|
+
end
|
249
|
+
this_width = img_get_txt_width(l, @font, @font_size)
|
250
|
+
this_x = txt_pos - (this_width + sub_width) / 2
|
251
|
+
new_main << "<tspan x='#{this_x}' y='#{main_y}'>#{l}</tspan>"
|
252
|
+
@height = main_y if main_y > @height
|
253
|
+
end
|
254
|
+
main = new_main
|
255
|
+
end
|
219
256
|
@tree_data += main_data.sub(/TD/, "text-decoration='#{main_decoration}'")
|
220
|
-
.sub(/ST/, main_style)
|
221
|
-
.sub(/WA/, main_weight)
|
257
|
+
.sub(/ST/, main_style + ";")
|
258
|
+
.sub(/WA/, main_weight + ";")
|
222
259
|
.sub(/CONTENT/, main)
|
223
260
|
|
224
261
|
# Draw subscript text
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
sub_data = sub_data.sub(/X_VALUE/, sub_x.
|
231
|
-
sub_data = sub_data.sub(/Y_VALUE/, sub_y.
|
262
|
+
if sub && sub != ""
|
263
|
+
sub_data = @text_styles.sub(/COLOR/, col)
|
264
|
+
sub_data = sub_data.sub(/FONT_SIZE/, @sub_size.to_s)
|
265
|
+
sub_x = right - sub_width
|
266
|
+
sub_y = main_y + sub_height / 4
|
267
|
+
sub_data = sub_data.sub(/X_VALUE/, sub_x.to_s)
|
268
|
+
sub_data = sub_data.sub(/Y_VALUE/, sub_y.to_s)
|
232
269
|
@tree_data += sub_data.sub(/TD/, "text-decoration='#{sub_decoration}'")
|
233
270
|
.sub(/ST/, sub_style)
|
234
271
|
.sub(/WA/, sub_weight)
|
235
|
-
.sub(/CONTENT/,
|
272
|
+
.sub(/CONTENT/, sub)
|
273
|
+
@height += sub_height / 4
|
236
274
|
end
|
237
275
|
end
|
238
276
|
|
@@ -248,10 +286,10 @@ EOD
|
|
248
286
|
toBot = (row2px(fromY - 1 ) + @e_height)
|
249
287
|
toLeft = (toX + toW / 2 + @m[:b_side])
|
250
288
|
|
251
|
-
line_data = @line_styles.sub(/X1/, fromLeft.
|
252
|
-
line_data = line_data.sub(/Y1/, fromTop.
|
253
|
-
line_data = line_data.sub(/X2/, toLeft.
|
254
|
-
@tree_data += line_data.sub(/Y2/, toBot.
|
289
|
+
line_data = @line_styles.sub(/X1/, fromLeft.to_s)
|
290
|
+
line_data = line_data.sub(/Y1/, fromTop.to_s)
|
291
|
+
line_data = line_data.sub(/X2/, toLeft.to_s)
|
292
|
+
@tree_data += line_data.sub(/Y2/, toBot.to_s)
|
255
293
|
|
256
294
|
end
|
257
295
|
|
@@ -264,9 +302,9 @@ EOD
|
|
264
302
|
toX = fromX
|
265
303
|
fromCenter = (fromX + fromW / 2 + @m[:b_side])
|
266
304
|
|
267
|
-
fromTop = row2px(fromY)
|
268
|
-
fromLeft1 = (fromCenter + textW / 2)
|
269
|
-
fromLeft2 = (fromCenter - textW / 2)
|
305
|
+
fromTop = row2px(fromY)
|
306
|
+
fromLeft1 = (fromCenter + textW / 2)
|
307
|
+
fromLeft2 = (fromCenter - textW / 2)
|
270
308
|
toBot = (row2px(fromY - 1) + @e_height)
|
271
309
|
|
272
310
|
if symmetrize
|
@@ -275,12 +313,12 @@ EOD
|
|
275
313
|
toLeft = (toX + textW / 2 + @m[:b_side] * 3)
|
276
314
|
end
|
277
315
|
|
278
|
-
polygon_data = @polygon_styles.sub(/X1/, fromLeft1.
|
279
|
-
polygon_data = polygon_data.sub(/Y1/, fromTop.
|
280
|
-
polygon_data = polygon_data.sub(/X2/, fromLeft2.
|
281
|
-
polygon_data = polygon_data.sub(/Y2/, fromTop.
|
282
|
-
polygon_data = polygon_data.sub(/X3/, toLeft.
|
283
|
-
@tree_data += polygon_data.sub(/Y3/, toBot.
|
316
|
+
polygon_data = @polygon_styles.sub(/X1/, fromLeft1.to_s)
|
317
|
+
polygon_data = polygon_data.sub(/Y1/, fromTop.to_s)
|
318
|
+
polygon_data = polygon_data.sub(/X2/, fromLeft2.to_s)
|
319
|
+
polygon_data = polygon_data.sub(/Y2/, fromTop.to_s)
|
320
|
+
polygon_data = polygon_data.sub(/X3/, toLeft.to_s)
|
321
|
+
@tree_data += polygon_data.sub(/Y3/, toBot.to_s)
|
284
322
|
end
|
285
323
|
|
286
324
|
# If a node element text is wider than the sum of it's
|
@@ -292,9 +330,9 @@ EOD
|
|
292
330
|
children = @e_list.get_children(id)
|
293
331
|
@e_list.set_element_width(id, target)
|
294
332
|
|
295
|
-
if(children.length > 0 )
|
333
|
+
if(children.length > 0 )
|
296
334
|
delta = target - current
|
297
|
-
target_delta = delta / children.length
|
335
|
+
target_delta = delta / children.length
|
298
336
|
|
299
337
|
children.each do |child|
|
300
338
|
child_width = @e_list.get_element_width(child)
|
@@ -303,7 +341,7 @@ EOD
|
|
303
341
|
end
|
304
342
|
end
|
305
343
|
|
306
|
-
def img_get_txt_width(text, font, font_size, multiline =
|
344
|
+
def img_get_txt_width(text, font, font_size, multiline = true)
|
307
345
|
parts = text.split("_", 2)
|
308
346
|
main_before = parts[0].strip
|
309
347
|
sub = parts[1]
|
@@ -311,9 +349,15 @@ EOD
|
|
311
349
|
main_metrics = img_get_txt_metrics(main, font, font_size, multiline)
|
312
350
|
width = main_metrics.width
|
313
351
|
if sub
|
314
|
-
sub_metrics = img_get_txt_metrics(sub, font, font_size * SUBSCRIPT_CONST, multiline)
|
352
|
+
sub_metrics = img_get_txt_metrics(sub.strip, font, font_size * SUBSCRIPT_CONST, multiline)
|
315
353
|
width += sub_metrics.width
|
316
354
|
end
|
317
355
|
return width
|
318
356
|
end
|
357
|
+
|
358
|
+
def img_get_txt_height(text, font, font_size)
|
359
|
+
main_metrics = img_get_txt_metrics(text, font, font_size, false)
|
360
|
+
main_metrics.height
|
361
|
+
end
|
362
|
+
|
319
363
|
end
|
@@ -53,7 +53,8 @@ class TreeGraph < Graph
|
|
53
53
|
if @transparent
|
54
54
|
@im.matte_reset!
|
55
55
|
end
|
56
|
-
@im.interlace = PlaneInterlace
|
56
|
+
# @im.interlace = PlaneInterlace
|
57
|
+
@im.interlace = LineInterlace
|
57
58
|
@gc.draw(@im)
|
58
59
|
end
|
59
60
|
|
@@ -81,7 +82,6 @@ class TreeGraph < Graph
|
|
81
82
|
|
82
83
|
# Add the element into the tree (draw it)
|
83
84
|
def draw_element(x, y, w, string, type)
|
84
|
-
numlines = string.count("\n")
|
85
85
|
string = string.sub(/\^\z/){""}
|
86
86
|
# Calculate element dimensions and position
|
87
87
|
if (type == ETYPE_LEAF) and @leafstyle == "nothing"
|
@@ -90,7 +90,6 @@ class TreeGraph < Graph
|
|
90
90
|
top = row2px(y)
|
91
91
|
end
|
92
92
|
left = x + @m[:b_side]
|
93
|
-
bottom = top + @e_height * numlines
|
94
93
|
right = left + w
|
95
94
|
|
96
95
|
# Split the string into the main part and the
|
@@ -144,7 +143,14 @@ class TreeGraph < Graph
|
|
144
143
|
# Calculate text size for the main and the
|
145
144
|
# subscript part of the element
|
146
145
|
|
147
|
-
|
146
|
+
|
147
|
+
main_width = 0
|
148
|
+
main_height = 0
|
149
|
+
main.split(/\\n/).each do |l|
|
150
|
+
l_width = img_get_txt_width(l, main_font, @font_size)
|
151
|
+
main_width = l_width if main_width < l_width
|
152
|
+
main_height += img_get_txt_height(l, @font, @font_size)
|
153
|
+
end
|
148
154
|
|
149
155
|
if /\A\=(.+)\=\z/ =~ sub
|
150
156
|
sub = $1
|
@@ -183,15 +189,16 @@ class TreeGraph < Graph
|
|
183
189
|
end
|
184
190
|
|
185
191
|
if sub != ""
|
192
|
+
# add a separation of the width of "M"
|
186
193
|
sub_width = img_get_txt_width(sub.to_s, sub_font, @sub_size)
|
194
|
+
sub_height = img_get_txt_height(sub.to_s, sub_font, @sub_size)
|
187
195
|
else
|
188
196
|
sub_width = 0
|
197
|
+
sub_height = 0
|
189
198
|
end
|
190
199
|
|
191
200
|
# Center text in the element
|
192
|
-
|
193
|
-
|
194
|
-
txt_pos = left + (right - left) / 2 - txt_width / 2
|
201
|
+
txt_pos = left + (right - left) / 2
|
195
202
|
|
196
203
|
# Select apropriate color
|
197
204
|
if(type == ETYPE_LEAF)
|
@@ -209,22 +216,33 @@ class TreeGraph < Graph
|
|
209
216
|
|
210
217
|
# Draw main text
|
211
218
|
@gc.pointsize(@font_size)
|
212
|
-
|
219
|
+
@gc.kerning = 0
|
220
|
+
@gc.interline_spacing = 0
|
221
|
+
@gc.interword_spacing = 0
|
222
|
+
|
223
|
+
main_x = txt_pos - sub_width / 2
|
213
224
|
main_y = top + @e_height - @m[:e_padd]
|
214
225
|
|
215
|
-
@gc.interline_spacing = -(@main_height / 3)
|
226
|
+
# @gc.interline_spacing = -(@main_height / 3)
|
216
227
|
@gc.font(main_font)
|
217
228
|
@gc.decorate(main_decoration)
|
218
|
-
|
229
|
+
numlines = main.count("\\n")
|
230
|
+
if numlines > 1
|
231
|
+
@height = @height + @main_height * numlines
|
232
|
+
end
|
233
|
+
@gc.text_align(CenterAlign)
|
234
|
+
@gc.text(main_x.ceil, main_y.ceil, main.gsub("\\n", "\n"))
|
219
235
|
|
220
236
|
# Draw subscript text
|
221
|
-
if (sub
|
237
|
+
if (sub != "" )
|
222
238
|
@gc.pointsize(@sub_size)
|
223
|
-
sub_x =
|
224
|
-
sub_y = top +
|
239
|
+
sub_x = main_x + (main_width / 2) + (sub_width / 2)
|
240
|
+
sub_y = top + main_height + sub_height / 4
|
241
|
+
@height += sub_height / 4
|
225
242
|
@gc.font(sub_font)
|
226
243
|
@gc.decorate(sub_decoration)
|
227
|
-
@gc.
|
244
|
+
@gc.text_align(CenterAlign)
|
245
|
+
@gc.text(sub_x.ceil, sub_y.ceil, " " + sub.gsub("\\n", "\n"))
|
228
246
|
end
|
229
247
|
end
|
230
248
|
|
@@ -259,6 +277,7 @@ class TreeGraph < Graph
|
|
259
277
|
fromLeft1 = (fromCenter + textW / 2).ceil
|
260
278
|
fromLeft2 = (fromCenter - textW / 2).ceil
|
261
279
|
toBot = (row2px(fromY - 1) + @e_height)
|
280
|
+
|
262
281
|
if symmetrize
|
263
282
|
toLeft = (toX + textW / 2 + @m[:b_side])
|
264
283
|
else
|
data/lib/rsyntaxtree/version.rb
CHANGED
data/lib/rsyntaxtree.rb
CHANGED
@@ -40,7 +40,8 @@ class RSGenerator
|
|
40
40
|
key = keystr.to_sym
|
41
41
|
case key
|
42
42
|
when :data
|
43
|
-
data =
|
43
|
+
data = value
|
44
|
+
# data = CGI.unescape(value)
|
44
45
|
data = data.gsub('-AMP-', '&')
|
45
46
|
.gsub('-PERCENT-', "%")
|
46
47
|
.gsub('-PRIME-', "'")
|
@@ -64,7 +65,7 @@ class RSGenerator
|
|
64
65
|
new_params[:font_bd] = FONT_DIR + "/NotoSans-Bold.ttf"
|
65
66
|
new_params[:font_bdit] = FONT_DIR + "/NotoSans-BoldItalic.ttf"
|
66
67
|
new_params[:font_math] = FONT_DIR + "/NotoSansMath-Regular.ttf"
|
67
|
-
new_params[:font_cjk] = FONT_DIR + "/
|
68
|
+
new_params[:font_cjk] = FONT_DIR + "/NotoSansJP-Regular.otf"
|
68
69
|
new_params[:fontstyle] = "sans"
|
69
70
|
elsif value == "noto-serif" || value == "serif"
|
70
71
|
new_params[:font] = FONT_DIR + "/NotoSerif-Regular.ttf"
|
@@ -72,7 +73,7 @@ class RSGenerator
|
|
72
73
|
new_params[:font_bd] = FONT_DIR + "/NotoSerif-Bold.ttf"
|
73
74
|
new_params[:font_bdit] = FONT_DIR + "/NotoSerif-BoldItalic.ttf"
|
74
75
|
new_params[:font_math] = FONT_DIR + "/NotoSansMath-Regular.ttf"
|
75
|
-
new_params[:font_cjk] = FONT_DIR + "/
|
76
|
+
new_params[:font_cjk] = FONT_DIR + "/NotoSerifJP-Regular.otf"
|
76
77
|
new_params[:fontstyle] = "serif"
|
77
78
|
elsif value == "cjk zenhei" || value == "cjk"
|
78
79
|
new_params[:font] = FONT_DIR + "/wqy-zenhei.ttf"
|
@@ -88,7 +89,7 @@ class RSGenerator
|
|
88
89
|
new_params[:font_bd] = FONT_DIR + "/lmroman10-bold.otf"
|
89
90
|
new_params[:font_bdit] = FONT_DIR + "/lmroman10-bolditalic.otf"
|
90
91
|
new_params[:font_math] = FONT_DIR + "/latinmodern-math.otf"
|
91
|
-
new_params[:font_cjk] = FONT_DIR + "/
|
92
|
+
new_params[:font_cjk] = FONT_DIR + "/NotoSerifJP-Regular.otf"
|
92
93
|
new_params[:fontstyle] = "math"
|
93
94
|
end
|
94
95
|
else
|
@@ -110,19 +111,25 @@ class RSGenerator
|
|
110
111
|
:margin => 0,
|
111
112
|
:vheight => 1.0,
|
112
113
|
:fontstyle => "sans",
|
113
|
-
:font => "/
|
114
|
+
:font => "/NotoSansJP-Regular.otf",
|
114
115
|
:font_it => "/NotoSans-Italic.ttf",
|
115
116
|
:font_bd => "/NotoSans-Bold.ttf",
|
116
117
|
:font_bdit => "/NotoSans-BoldItalic.ttf",
|
117
118
|
:font_math => "/NotoSansMath-Regular.ttf"
|
118
119
|
}
|
119
120
|
@metrics = {
|
120
|
-
:e_width =>
|
121
|
-
:e_padd =>
|
122
|
-
:v_space =>
|
123
|
-
:h_space =>
|
124
|
-
:b_side =>
|
125
|
-
:b_topbot =>
|
121
|
+
:e_width => 0,
|
122
|
+
:e_padd => 20,
|
123
|
+
:v_space => 0,
|
124
|
+
:h_space => 0,
|
125
|
+
:b_side => 0,
|
126
|
+
:b_topbot => 0
|
127
|
+
# :e_width => 120,
|
128
|
+
# :e_padd => 14,
|
129
|
+
# :v_space => 20,
|
130
|
+
# :h_space => 20,
|
131
|
+
# :b_side => 10,
|
132
|
+
# :b_topbot => 10
|
126
133
|
}
|
127
134
|
|
128
135
|
@params.merge! new_params
|
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.
|
4
|
+
version: 0.9.1
|
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-
|
11
|
+
date: 2021-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rmagick
|
@@ -67,13 +67,15 @@ files:
|
|
67
67
|
- fonts/NotoSans-BoldItalic.ttf
|
68
68
|
- fonts/NotoSans-Italic.ttf
|
69
69
|
- fonts/NotoSans-Regular.ttf
|
70
|
-
- fonts/
|
70
|
+
- fonts/NotoSansJP-Bold.otf
|
71
|
+
- fonts/NotoSansJP-Regular.otf
|
71
72
|
- fonts/NotoSansMath-Regular.ttf
|
72
73
|
- fonts/NotoSerif-Bold.ttf
|
73
74
|
- fonts/NotoSerif-BoldItalic.ttf
|
74
75
|
- fonts/NotoSerif-Italic.ttf
|
75
76
|
- fonts/NotoSerif-Regular.ttf
|
76
|
-
- fonts/
|
77
|
+
- fonts/NotoSerifJP-Bold.otf
|
78
|
+
- fonts/NotoSerifJP-Regular.otf
|
77
79
|
- fonts/latinmodern-math.otf
|
78
80
|
- fonts/lmroman10-bold.otf
|
79
81
|
- fonts/lmroman10-bolditalic.otf
|
Binary file
|
Binary file
|