maruku 0.5.5 → 0.5.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.
- data/bin/maruku +9 -3
- data/docs/changelog.html +52 -4
- data/docs/changelog.md +35 -5
- data/docs/index.html +13 -5
- data/docs/maruku.html +13 -5
- data/docs/maruku.md +14 -3
- data/lib/maruku/defaults.rb +4 -1
- data/lib/maruku/input/parse_block.rb +1 -1
- data/lib/maruku/input/parse_span_better.rb +14 -9
- data/lib/maruku/input/type_detection.rb +1 -1
- data/lib/maruku/input_textile2/t2_parser.rb +1 -1
- data/lib/maruku/output/to_html.rb +10 -0
- data/lib/maruku/output/to_latex.rb +1 -1
- data/lib/maruku/string_utils.rb +4 -0
- data/lib/maruku/tests/new_parser.rb +1 -1
- data/lib/maruku/version.rb +1 -1
- data/maruku_gem.rb +1 -1
- data/tests/unittest/email.md +2 -2
- data/tests/unittest/inline_html.md +134 -8
- data/tests/unittest/links.md +1 -1
- data/tests/unittest/links2.md +42 -0
- data/tests/unittest/lists10.md +62 -0
- data/tests/unittest/lists11.md +57 -0
- data/tests/unittest/lists8.md +2 -7
- data/tests/unittest/lists_after_paragraph.md +2 -2
- data/tests/unittest/misc_sw.md +2 -2
- data/tests/unittest/notyet/triggering.md +2 -2
- data/tests/unittest/paragraphs.md +1 -1
- data/tests/unittest/wrapping.md +2 -2
- data/unit_test_block.sh +5 -0
- data/unit_test_span.sh +2 -0
- metadata +215 -213
- data/lib/maruku/ext/diagrams/diagrams.rb +0 -8
- data/lib/maruku/ext/diagrams/grid.rb +0 -78
- data/lib/maruku/ext/diagrams/inspect.rb +0 -11
- data/lib/maruku/ext/diagrams/layout.rb +0 -508
- data/lib/maruku/ext/diagrams/parser.rb +0 -219
- data/lib/maruku/ext/diagrams/structures.rb +0 -168
- data/lib/maruku/ext/diagrams/to_html.rb +0 -37
- data/lib/maruku/ext/diagrams/to_latex.rb +0 -103
- data/lib/maruku/ext/diagrams/unittest.rb +0 -123
@@ -1,78 +0,0 @@
|
|
1
|
-
module Diagrams
|
2
|
-
|
3
|
-
class Grid
|
4
|
-
attr_accessor :width, :height
|
5
|
-
|
6
|
-
def initialize(width, height, init)
|
7
|
-
@width, @height = width, height
|
8
|
-
@data = Array.new
|
9
|
-
height.times do @data.push [init]*@width end
|
10
|
-
@init = init
|
11
|
-
end
|
12
|
-
|
13
|
-
def get(x, y)
|
14
|
-
@data[y][x]
|
15
|
-
end
|
16
|
-
|
17
|
-
def set(x, y, v)
|
18
|
-
@data[y][x] = v || @init
|
19
|
-
end
|
20
|
-
|
21
|
-
def inspect
|
22
|
-
@data.map{|x|
|
23
|
-
x.map{|y|
|
24
|
-
case y
|
25
|
-
when true; '#'
|
26
|
-
when false, nil; ' '
|
27
|
-
when Fixnum; y.chr
|
28
|
-
end
|
29
|
-
}.join
|
30
|
-
}.join("\n")
|
31
|
-
end
|
32
|
-
|
33
|
-
def inspect2(valid)
|
34
|
-
s = ""
|
35
|
-
|
36
|
-
s += "+" + "-"*@width + "+\n"
|
37
|
-
for y in 0..(@height-1)
|
38
|
-
s += "|"
|
39
|
-
for x in 0..(@width-1)
|
40
|
-
s += valid.get(x,y) ? get(x,y).chr : " "
|
41
|
-
end
|
42
|
-
s += "|"
|
43
|
-
s += "\n"
|
44
|
-
end
|
45
|
-
s += "+" + "-"*@width + "+\n"
|
46
|
-
s
|
47
|
-
end
|
48
|
-
|
49
|
-
def each
|
50
|
-
for y in 0..(height-1)
|
51
|
-
for x in 0..(width-1)
|
52
|
-
e = get(x,y)
|
53
|
-
yield x,y,e
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def set_area(x,y,w,h,e)
|
59
|
-
for i in (x..x+w-1)
|
60
|
-
for j in (y..y+h-1)
|
61
|
-
set(i,j,e)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def read_area(x,y,w,h)
|
67
|
-
s = ""
|
68
|
-
for j in (y..y+h-1)
|
69
|
-
for i in (x..x+w-1)
|
70
|
-
s << get(i,j)
|
71
|
-
end
|
72
|
-
s << "\n"
|
73
|
-
end
|
74
|
-
s
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
@@ -1,508 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
|
-
module Diagrams
|
4
|
-
|
5
|
-
class SSimple
|
6
|
-
attr_accessor :begin, :end # begin and end variables
|
7
|
-
attr_accessor :spring
|
8
|
-
def get_spring() @spring end
|
9
|
-
def internal_variables() [] end
|
10
|
-
end
|
11
|
-
|
12
|
-
class SParallel
|
13
|
-
attr_accessor :begin, :end # begin and end variables
|
14
|
-
attr_accessor :children
|
15
|
-
def internal_variables()
|
16
|
-
@children.map{|x|x.internal_variables}.flatten
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
class VarGraph
|
22
|
-
class Node
|
23
|
-
attr_accessor :name
|
24
|
-
attr_accessor :children
|
25
|
-
attr_accessor :parents
|
26
|
-
|
27
|
-
attr_accessor :next # closure of children
|
28
|
-
attr_accessor :prev # closure of parents
|
29
|
-
|
30
|
-
def initialize(name_)
|
31
|
-
@name = name_
|
32
|
-
@children = []
|
33
|
-
@parents = []
|
34
|
-
@next = []
|
35
|
-
@prev = []
|
36
|
-
end
|
37
|
-
|
38
|
-
def inspect() "N[#{@name}]" end
|
39
|
-
alias to_s inspect
|
40
|
-
|
41
|
-
# return parents
|
42
|
-
def compute_parents_closure
|
43
|
-
@parents.each do |parent| # xxx rifare
|
44
|
-
parent.compute_parents_closure
|
45
|
-
end
|
46
|
-
|
47
|
-
@prev = @parents.map do |p| p.prev end.flatten
|
48
|
-
@prev += @parents
|
49
|
-
@prev.uniq!
|
50
|
-
end
|
51
|
-
|
52
|
-
def compute_children_closure
|
53
|
-
@children.each do |child| # xxx rifare
|
54
|
-
child.compute_children_closure
|
55
|
-
end
|
56
|
-
|
57
|
-
@next = @children.map do |c| c.next end.flatten
|
58
|
-
@next += @children
|
59
|
-
@next.uniq!
|
60
|
-
end
|
61
|
-
|
62
|
-
def dist_up() @parents.empty? ? 0 : @parents.map{|x| x.dist_up}.max+1 end
|
63
|
-
def dist_down() @children.empty? ? 0 : @children.map{|x| x.dist_down}.max+1 end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
def ==(other)
|
68
|
-
self.name == other.name
|
69
|
-
end
|
70
|
-
|
71
|
-
attr_accessor :name2node
|
72
|
-
|
73
|
-
def initialize
|
74
|
-
self.name2node = {}
|
75
|
-
end
|
76
|
-
|
77
|
-
def add_edge(var1, var2)
|
78
|
-
raise "var1 = var2 = #{var1.inspect}" if var1 == var2
|
79
|
-
|
80
|
-
name2node[var1] = Node.new(var1) if not name2node.has_key? var1
|
81
|
-
name2node[var2] = Node.new(var2) if not name2node.has_key? var2
|
82
|
-
|
83
|
-
n1,n2 = name2node[var1],name2node[var2]
|
84
|
-
|
85
|
-
n1.children.push n2
|
86
|
-
n2.parents.push n1
|
87
|
-
end
|
88
|
-
|
89
|
-
def compute_closure
|
90
|
-
@name2node.each do |var, node|
|
91
|
-
node.compute_children_closure
|
92
|
-
node.compute_parents_closure
|
93
|
-
end
|
94
|
-
|
95
|
-
@name2node.each do |var, node|
|
96
|
-
# puts "Node #{var} -> #{node.next.inspect}"
|
97
|
-
# puts "Node #{var} <- #{node.prev.inspect}"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def go_recursive(node_head, id)
|
102
|
-
sub = []
|
103
|
-
node_head.children.each do |child|
|
104
|
-
if child.parents.size == 1
|
105
|
-
sub.push child
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
puts "#{id} Found #{sub.size} subs: #{sub.inspect}"
|
110
|
-
|
111
|
-
node_head.children.each do |child|
|
112
|
-
if (not sub.include?(child)) and child.parents.size != 1
|
113
|
-
adottare = []
|
114
|
-
sub.each do |su|
|
115
|
-
if child.prev.include? su
|
116
|
-
adottare.push su
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
puts "#{id} child #{child} might be associated with #{adottare.inspect} - #{child.parents.inspect}"
|
121
|
-
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
sub.each_with_index do |sub, i|
|
126
|
-
puts "#{id}/#{i}: #{sub}"
|
127
|
-
go_recursive(sub, "#{id}/#{i}")
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def go!
|
132
|
-
|
133
|
-
def do_it(name2node, function)
|
134
|
-
dist2nodes = []
|
135
|
-
name2node.each do |var, node|
|
136
|
-
dist = node.send function
|
137
|
-
dist2nodes[dist] =[] if dist2nodes[dist] == nil
|
138
|
-
dist2nodes[dist].push node
|
139
|
-
end
|
140
|
-
dist2nodes
|
141
|
-
end
|
142
|
-
|
143
|
-
up = do_it(@name2node, :dist_up)
|
144
|
-
down = do_it(@name2node, :dist_down)
|
145
|
-
|
146
|
-
up.each_with_index do |nodes, i|
|
147
|
-
puts "U Generation #{i}: #{nodes.inspect}"
|
148
|
-
end
|
149
|
-
down.each_with_index do |nodes, i|
|
150
|
-
puts "D Generation #{i}: #{nodes.inspect}"
|
151
|
-
end
|
152
|
-
|
153
|
-
# go_recursive(@name2node[DIAG_TL], "root")
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
class Layout
|
158
|
-
def initialize
|
159
|
-
@hsystem = VarGraph.new
|
160
|
-
@vsystem = VarGraph.new
|
161
|
-
|
162
|
-
@hlink,@vlink = {},{}
|
163
|
-
@hsprings,@vsprings={},{}
|
164
|
-
end
|
165
|
-
|
166
|
-
def to_dot()
|
167
|
-
return to_dot_links(@hlink,@hsprings), to_dot_links(@vlink,@vsprings)
|
168
|
-
end
|
169
|
-
|
170
|
-
def to_dot_links(links, springs)
|
171
|
-
s = "digraph diagram {\n"
|
172
|
-
links.each do |var, to_other|
|
173
|
-
if not to_other.empty?
|
174
|
-
var_ = var.gsub(/^[^_]+_/,'')
|
175
|
-
s += "\t#{var} [label = \"#{var_}\" ];\n"
|
176
|
-
to_other.each do |v2, spring|
|
177
|
-
s += "\t #{var} -> #{v2} [ label = \"#{spring.inspect}\"];\n"
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
s += "}\n"
|
182
|
-
end
|
183
|
-
|
184
|
-
def add_var(s)
|
185
|
-
@hlink[s]=[] if not @hlink[s]
|
186
|
-
@vlink[s]=[] if not @vlink[s]
|
187
|
-
end
|
188
|
-
|
189
|
-
# var2-var1 = spring
|
190
|
-
def add_con_h(var1,var2,hspring)
|
191
|
-
add_var var1; add_var var2;
|
192
|
-
@hlink[var1].push [var2, hspring]
|
193
|
-
@hsprings[[var1,var2]] = hspring
|
194
|
-
|
195
|
-
@hsystem.add_edge(var1, var2)
|
196
|
-
end
|
197
|
-
|
198
|
-
def add_con_v(var1,var2,vspring)
|
199
|
-
add_var var1; add_var var2;
|
200
|
-
@vlink[var1].push [var2, vspring]
|
201
|
-
@vsprings[[var1,var2]] = vspring
|
202
|
-
|
203
|
-
@vsystem.add_edge(var1, var2)
|
204
|
-
end
|
205
|
-
|
206
|
-
def get_preferred(var1, var2)
|
207
|
-
hpaths = rec_paths(@hlink, var1, var2)
|
208
|
-
vpaths = rec_paths(@vlink, var1, var2)
|
209
|
-
puts inspect
|
210
|
-
hpaths.each do |h|
|
211
|
-
puts "H: #{h.inspect}"
|
212
|
-
end
|
213
|
-
vpaths.each do |v|
|
214
|
-
puts "V: #{v.inspect}"
|
215
|
-
end
|
216
|
-
|
217
|
-
hsprings =
|
218
|
-
hpaths.map do |h|
|
219
|
-
ss = []
|
220
|
-
for i in 0..(h.size-2)
|
221
|
-
v1,v2 = h[i],h[i+1]
|
222
|
-
ss.push @hsprings[[v1,v2]]
|
223
|
-
end
|
224
|
-
ss
|
225
|
-
end
|
226
|
-
vsprings =
|
227
|
-
vpaths.map do |h|
|
228
|
-
ss = []
|
229
|
-
for i in 0..(h.size-2)
|
230
|
-
v1,v2 = h[i],h[i+1]
|
231
|
-
ss.push @vsprings[[v1,v2]]
|
232
|
-
end
|
233
|
-
ss
|
234
|
-
end
|
235
|
-
|
236
|
-
|
237
|
-
def go_up_parallel(par)
|
238
|
-
final = par[0]
|
239
|
-
for i in 1..(par.size-1)
|
240
|
-
final = Spring.parallel(final, par[i])
|
241
|
-
end
|
242
|
-
final
|
243
|
-
end
|
244
|
-
|
245
|
-
def go_up_series(series)
|
246
|
-
tot = series[0]
|
247
|
-
for i in 1..(series.size-1)
|
248
|
-
tot = Spring.series(tot, series[i])
|
249
|
-
end
|
250
|
-
tot
|
251
|
-
end
|
252
|
-
|
253
|
-
def compress(x)
|
254
|
-
t = x.map do |s| go_up_series(s) end
|
255
|
-
final = go_up_parallel(t)
|
256
|
-
end
|
257
|
-
|
258
|
-
def sum_of_shrink(series)
|
259
|
-
sum = 0
|
260
|
-
series.each do |s| sum += s.shrink end
|
261
|
-
sum
|
262
|
-
end
|
263
|
-
|
264
|
-
def sum_of_stretch(series)
|
265
|
-
sum = 0
|
266
|
-
series.each do |s| sum += s.stretch end
|
267
|
-
sum
|
268
|
-
end
|
269
|
-
|
270
|
-
def go_back(imposed, series)
|
271
|
-
pref = go_up_series(series)
|
272
|
-
if pref.pref > imposed
|
273
|
-
# must shrink
|
274
|
-
shrink = pref.pref - imposed
|
275
|
-
sum = sum_of_shrink(series)
|
276
|
-
series.each do |s|
|
277
|
-
its_shrink = (s.shrink / sum) * shrink
|
278
|
-
its_imposed = s.pref - its_shrink
|
279
|
-
if s.imposed
|
280
|
-
s.imposed = (its_imposed+ s.imposed)*0.5
|
281
|
-
else
|
282
|
-
s.imposed = its_imposed
|
283
|
-
end
|
284
|
-
s.pref = s.pref*0.5 + s.imposed*0.5
|
285
|
-
end
|
286
|
-
else
|
287
|
-
# must stretch
|
288
|
-
stretch = imposed - pref.pref
|
289
|
-
sum = sum_of_stretch(series)
|
290
|
-
series.each do |s|
|
291
|
-
its_stretch = (s.stretch / sum) * stretch
|
292
|
-
its_imposed = s.pref + its_stretch
|
293
|
-
if s.imposed
|
294
|
-
s.imposed = (its_imposed+ s.imposed)*0.5
|
295
|
-
else
|
296
|
-
s.imposed = its_imposed
|
297
|
-
end
|
298
|
-
s.pref = s.pref*0.5 + s.imposed*0.5
|
299
|
-
end
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
for i in 0..100
|
304
|
-
hpref = compress(hsprings)
|
305
|
-
vpref = compress(vsprings)
|
306
|
-
|
307
|
-
width = hpref.pref
|
308
|
-
height = vpref.pref
|
309
|
-
|
310
|
-
hsprings.each do |series| go_back(height, series) end
|
311
|
-
vsprings.each do |series| go_back(width, series) end
|
312
|
-
end
|
313
|
-
|
314
|
-
hpaths.each do |h|
|
315
|
-
ss = []
|
316
|
-
len = 0
|
317
|
-
for i in 0..(h.size-2)
|
318
|
-
v1,v2 = h[i],h[i+1]
|
319
|
-
this = @hsprings[[v1,v2]].imposed
|
320
|
-
puts "#{v1} - #{v2} | "+ ("%0.2f" % this)
|
321
|
-
len += this
|
322
|
-
end
|
323
|
-
puts "LEN: #{len}"
|
324
|
-
ss
|
325
|
-
end
|
326
|
-
|
327
|
-
return hpref,vpref
|
328
|
-
end
|
329
|
-
|
330
|
-
# returns [] if there isn't one
|
331
|
-
def rec_paths(links, var1, var2)
|
332
|
-
all_paths = []
|
333
|
-
(links[var1] || []).each do |v, spring|
|
334
|
-
if v == var2
|
335
|
-
all_paths.push [var2]
|
336
|
-
else
|
337
|
-
all_paths = all_paths + rec_paths(links, v, var2)
|
338
|
-
end
|
339
|
-
end
|
340
|
-
all_paths.map{|x| [var1]+x}
|
341
|
-
end
|
342
|
-
|
343
|
-
|
344
|
-
def algo2
|
345
|
-
@hsystem.compute_closure
|
346
|
-
@hsystem.go!
|
347
|
-
=begin
|
348
|
-
def reduce(links, varA, varZ)
|
349
|
-
paths = rec_paths(links, varA, varZ)
|
350
|
-
|
351
|
-
puts "Found #{paths.size} paths:"
|
352
|
-
paths.each_with_index do |path, i|
|
353
|
-
puts "path #{i}: #{path.inspect}"
|
354
|
-
end
|
355
|
-
|
356
|
-
var2path = {}
|
357
|
-
|
358
|
-
paths.each_with_index do |path, p|
|
359
|
-
for i in 1..path.size-2
|
360
|
-
var = path[i]
|
361
|
-
var2path[var] ||= []
|
362
|
-
var2path[var].push p
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
var2path.each do |v, paths|
|
367
|
-
puts "var #{v} -> #{paths.inspect}"
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
|
-
reduce(@hlink, DIAG_TL, DIAG_BR)
|
372
|
-
=end
|
373
|
-
|
374
|
-
end
|
375
|
-
|
376
|
-
def inspect
|
377
|
-
s = ""
|
378
|
-
@hlink.each do |v1,a|
|
379
|
-
a.each do |v2, spring|
|
380
|
-
s += "#{v1.inspect} -> #{v2.inspect} (#{spring.inspect})\n"
|
381
|
-
end
|
382
|
-
end
|
383
|
-
s
|
384
|
-
end
|
385
|
-
end
|
386
|
-
|
387
|
-
DIAG_TL = "tl"
|
388
|
-
DIAG_BR = "br"
|
389
|
-
|
390
|
-
class Diagram
|
391
|
-
|
392
|
-
|
393
|
-
def top_right(i); "#{@diag_id}_b#{i}_tr"; end
|
394
|
-
|
395
|
-
def assign_variables(diag_id)
|
396
|
-
@boxes.each_with_index do |b, i|
|
397
|
-
b.v_tl = "#{diag_id}_b#{i}_tl"
|
398
|
-
b.v_br = "#{diag_id}_b#{i}_br"
|
399
|
-
end
|
400
|
-
@arrows.each_with_index do |a, i|
|
401
|
-
a.v_start = "#{diag_id}_a#{i}_start"
|
402
|
-
a.v_end = "#{diag_id}_a#{i}_end"
|
403
|
-
end
|
404
|
-
@points.each_with_index do |p, i|
|
405
|
-
p.v_p = "#{diag_id}_p#{i}_p"
|
406
|
-
end
|
407
|
-
end
|
408
|
-
|
409
|
-
def do_layout(diag_id)
|
410
|
-
def margin_con() Spring.new(30,0,30,1,1000) end
|
411
|
-
def arrow_con() Spring.new(30,1,60,100,1000) end
|
412
|
-
def zero_con() Spring.new(0,0,0,0,0) end
|
413
|
-
def positive_con(pref) Spring.new(0,1,pref,1000,1000) end
|
414
|
-
|
415
|
-
@diag_id = diag_id
|
416
|
-
assign_variables(diag_id)
|
417
|
-
|
418
|
-
l = Layout.new
|
419
|
-
@boxes.each do |b|
|
420
|
-
# size of the box is copied from b.hs and b.vs
|
421
|
-
l.add_con_h(b.v_tl, b.v_br, b.hs)
|
422
|
-
l.add_con_v(b.v_tl, b.v_br, b.vs)
|
423
|
-
# should not be outside of the diagram
|
424
|
-
l.add_con_h(DIAG_TL, b.v_tl, margin_con)
|
425
|
-
l.add_con_h(b.v_br, DIAG_BR, margin_con)
|
426
|
-
l.add_con_v(DIAG_TL, b.v_tl, margin_con)
|
427
|
-
l.add_con_v(b.v_br, DIAG_BR, margin_con)
|
428
|
-
# now, for each arrow
|
429
|
-
b.links[:N].each{|a|
|
430
|
-
l.add_con_v(a.v_end, b.v_tl, zero_con)
|
431
|
-
l.add_con_h(b.v_tl, a.v_end, positive_con(b.hs.pref/2))
|
432
|
-
l.add_con_h(a.v_end, b.v_br, positive_con(b.hs.pref/2))
|
433
|
-
}
|
434
|
-
b.links[:S].each{|a|
|
435
|
-
l.add_con_v(b.v_br, a.v_start, zero_con)
|
436
|
-
l.add_con_h(b.v_tl, a.v_start, positive_con(b.hs.pref/2))
|
437
|
-
l.add_con_h(a.v_start, b.v_br, positive_con(b.hs.pref/2))
|
438
|
-
}
|
439
|
-
b.links[:W].each{|a|
|
440
|
-
l.add_con_h(a.v_end, b.v_tl, zero_con)
|
441
|
-
l.add_con_v(b.v_tl, a.v_end, positive_con(b.vs.pref/2))
|
442
|
-
l.add_con_v(a.v_end, b.v_br, positive_con(b.vs.pref/2))
|
443
|
-
}
|
444
|
-
b.links[:E].each{|a|
|
445
|
-
l.add_con_h(b.v_br, a.v_start, zero_con)
|
446
|
-
l.add_con_v(b.v_tl, a.v_start, positive_con(b.vs.pref/2))
|
447
|
-
l.add_con_v(a.v_start, b.v_br, positive_con(b.vs.pref/2))
|
448
|
-
}
|
449
|
-
|
450
|
-
b.aligned[:t].each do |b2| l.add_con_v(b2.v_tl, b.v_tl, zero_con) end
|
451
|
-
b.aligned[:b].each do |b2| l.add_con_v(b2.v_br, b.v_br, zero_con) end
|
452
|
-
b.aligned[:l].each do |b2| l.add_con_h(b2.v_tl, b.v_tl, zero_con) end
|
453
|
-
b.aligned[:r].each do |b2| l.add_con_h(b2.v_br, b.v_br, zero_con) end
|
454
|
-
end
|
455
|
-
|
456
|
-
@points.each do |p|
|
457
|
-
# should not be outside of the diagram
|
458
|
-
l.add_con_h(DIAG_TL, p.v_p, margin_con)
|
459
|
-
l.add_con_h(p.v_p, DIAG_BR, margin_con)
|
460
|
-
l.add_con_v(DIAG_TL, p.v_p, margin_con)
|
461
|
-
l.add_con_v(p.v_p, DIAG_BR, margin_con)
|
462
|
-
# now, for each arrow
|
463
|
-
p.links[:N].each{|a|
|
464
|
-
l.add_con_v(a.v_end, p.v_p, zero_con)
|
465
|
-
l.add_con_h(a.v_end, p.v_p, zero_con)
|
466
|
-
}
|
467
|
-
p.links[:S].each{|a|
|
468
|
-
l.add_con_v(p.v_p, a.v_start, zero_con)
|
469
|
-
l.add_con_h(p.v_p, a.v_start, zero_con)
|
470
|
-
}
|
471
|
-
p.links[:W].each{|a|
|
472
|
-
l.add_con_h(a.v_end, p.v_p, zero_con)
|
473
|
-
l.add_con_v(a.v_end, p.v_p, zero_con)
|
474
|
-
}
|
475
|
-
p.links[:E].each{|a|
|
476
|
-
l.add_con_h(p.v_p, a.v_start, zero_con)
|
477
|
-
l.add_con_v(p.v_p, a.v_start, zero_con)
|
478
|
-
}
|
479
|
-
|
480
|
-
p.aligned[:t].each do |p2| l.add_con_v(p2.v_p, p.v_p, zero_con) end
|
481
|
-
p.aligned[:l].each do |p2| l.add_con_h(p2.v_p, p.v_p, zero_con) end
|
482
|
-
end
|
483
|
-
|
484
|
-
@arrows.each do |a|
|
485
|
-
if a.is_vert?
|
486
|
-
l.add_con_v(a.v_start, a.v_end, arrow_con)
|
487
|
-
l.add_con_h(a.v_start, a.v_end, zero_con)
|
488
|
-
else
|
489
|
-
l.add_con_h(a.v_start, a.v_end, arrow_con)
|
490
|
-
l.add_con_v(a.v_start, a.v_end, zero_con)
|
491
|
-
end
|
492
|
-
end
|
493
|
-
|
494
|
-
doth, dotv = l.to_dot
|
495
|
-
File.open("#{diag_id}_h.dot",'w') do |f| f.write doth end
|
496
|
-
File.open("#{diag_id}_v.dot",'w') do |f| f.write dotv end
|
497
|
-
|
498
|
-
l.algo2
|
499
|
-
# hs, vs = l.get_preferred(DIAG_TL, DIAG_BR)
|
500
|
-
|
501
|
-
# puts "Preferred hs = #{hs.inspect}"
|
502
|
-
# puts "Preferred vs = #{vs.inspect}"
|
503
|
-
end
|
504
|
-
|
505
|
-
end
|
506
|
-
|
507
|
-
|
508
|
-
end
|