markdoc 1.0.1 → 1.0.2
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/lib/markdoc/sequence.pic +406 -0
- data/lib/markdoc/version.rb +1 -1
- metadata +2 -1
@@ -0,0 +1,406 @@
|
|
1
|
+
#/usr/bin/pic2plot -Tps
|
2
|
+
#
|
3
|
+
# Pic macros for drawing UML sequence diagrams
|
4
|
+
#
|
5
|
+
# (C) Copyright 2004-2005 Diomidis Spinellis.
|
6
|
+
#
|
7
|
+
# Permission to use, copy, and distribute this software and its
|
8
|
+
# documentation for any purpose and without fee is hereby granted,
|
9
|
+
# provided that the above copyright notice appear in all copies and that
|
10
|
+
# both that copyright notice and this permission notice appear in
|
11
|
+
# supporting documentation.
|
12
|
+
#
|
13
|
+
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
14
|
+
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
15
|
+
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
16
|
+
#
|
17
|
+
#
|
18
|
+
|
19
|
+
|
20
|
+
# Default parameters (can be redefined)
|
21
|
+
|
22
|
+
# Spacing between messages
|
23
|
+
spacing = 0.25;
|
24
|
+
# Active box width
|
25
|
+
awid = .1;
|
26
|
+
# Box height
|
27
|
+
boxht = 0.3;
|
28
|
+
# Commend folding
|
29
|
+
corner_fold=awid
|
30
|
+
# Comment distance
|
31
|
+
define comment_default_move {up 0.25 right 0.25};
|
32
|
+
# Comment height
|
33
|
+
comment_default_ht=0.5;
|
34
|
+
# Comment width
|
35
|
+
comment_default_wid=1;
|
36
|
+
# Underline object name
|
37
|
+
underline=1;
|
38
|
+
|
39
|
+
# Create a new object(name,label)
|
40
|
+
define object {
|
41
|
+
$1: box $2; move;
|
42
|
+
# Could also underline text with \mk\ul\ul\ul...\rt
|
43
|
+
if (underline) then {
|
44
|
+
line from $1.w + (.1, -.07) to $1.e + (-.1, -.07);
|
45
|
+
}
|
46
|
+
move to $1.e;
|
47
|
+
move right;
|
48
|
+
# Active is the level of activations of the object
|
49
|
+
# 0 : inactive : draw thin line swimlane
|
50
|
+
# 1 : active : draw thick swimlane
|
51
|
+
# > 1: nested : draw nested swimlane
|
52
|
+
active_$1 = 0;
|
53
|
+
lifestart_$1 = $1.s.y;
|
54
|
+
}
|
55
|
+
|
56
|
+
# Create a new external actor(name,label)
|
57
|
+
define actor {
|
58
|
+
$1: [
|
59
|
+
XSEQC: circle rad 0.06;
|
60
|
+
XSEQL: line from XSEQC.s down .12;
|
61
|
+
line from XSEQL.start - (.15,.02) to XSEQL.start + (.15,-.02);
|
62
|
+
XSEQL1: line from XSEQL.end left .08 down .15;
|
63
|
+
XSEQL2: line from XSEQL.end right .08 down .15;
|
64
|
+
line at XSEQC.n invis "" "" "" $2;
|
65
|
+
]
|
66
|
+
move to $1.e;
|
67
|
+
move right;
|
68
|
+
active_$1 = 0;
|
69
|
+
lifestart_$1 = $1.s.y - .05;
|
70
|
+
}
|
71
|
+
|
72
|
+
# Create a new placeholder object(name)
|
73
|
+
define placeholder_object {
|
74
|
+
$1: box invisible;
|
75
|
+
move;
|
76
|
+
move to $1.e;
|
77
|
+
move right;
|
78
|
+
active_$1 = 0;
|
79
|
+
lifestart_$1 = $1.s.y;
|
80
|
+
}
|
81
|
+
|
82
|
+
define pobject {
|
83
|
+
placeholder_object($1);
|
84
|
+
}
|
85
|
+
|
86
|
+
define extend_lifeline {
|
87
|
+
if (active_$1 > 0) then {
|
88
|
+
# draw the left edges of the boxes
|
89
|
+
move to ($1.x - awid/2, Here.y);
|
90
|
+
for level = 1 to active_$1 do {
|
91
|
+
line from (Here.x, lifestart_$1) to Here;
|
92
|
+
move right awid/2
|
93
|
+
}
|
94
|
+
|
95
|
+
# draw the right edge of the innermost box
|
96
|
+
move right awid/2;
|
97
|
+
line from (Here.x, lifestart_$1) to Here;
|
98
|
+
} else {
|
99
|
+
line from ($1.x, lifestart_$1) to ($1.x, Here.y) dashed;
|
100
|
+
}
|
101
|
+
lifestart_$1 = Here.y;
|
102
|
+
}
|
103
|
+
|
104
|
+
# complete(name)
|
105
|
+
# Complete the lifeline of the object with the given name
|
106
|
+
define complete {
|
107
|
+
extend_lifeline($1)
|
108
|
+
if (active_$1) then {
|
109
|
+
# draw bottom of all active boxes
|
110
|
+
line right ((active_$1 + 1) * awid/2) from ($1.x - awid/2, Here.y);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
# Draw a message(from_object,to_object,label)
|
115
|
+
define message {
|
116
|
+
down;
|
117
|
+
move spacing;
|
118
|
+
# Adjust so that lines and arrows do not fall into the
|
119
|
+
# active box. Should be .5, but the arrow heads tend to
|
120
|
+
# overshoot.
|
121
|
+
if ($1.x <= $2.x) then {
|
122
|
+
off_from = awid * .6;
|
123
|
+
off_to = -awid * .6;
|
124
|
+
} else {
|
125
|
+
off_from = -awid * .6;
|
126
|
+
off_to = awid * .6;
|
127
|
+
}
|
128
|
+
|
129
|
+
# add half a box width for each level of nesting
|
130
|
+
if (active_$1 > 1) then {
|
131
|
+
off_from = off_from + (active_$1 - 1) * awid/2;
|
132
|
+
}
|
133
|
+
|
134
|
+
# add half a box width for each level of nesting
|
135
|
+
if (active_$2 > 1) then {
|
136
|
+
off_to = off_to + (active_$2 - 1) * awid/2;
|
137
|
+
}
|
138
|
+
|
139
|
+
if ($1.x == $2.x) then {
|
140
|
+
arrow from ($1.x + off_from, Here.y) right then down .25 then left $3 ljust " " " " " " ;
|
141
|
+
} else {
|
142
|
+
arrow from ($1.x + off_from, Here.y) to ($2.x + off_to, Here.y) $3 " ";
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
# Display a lifeline constraint(object,label)
|
147
|
+
define lifeline_constraint {
|
148
|
+
off_from = awid;
|
149
|
+
# add half a box width for each level of nesting
|
150
|
+
if (active_$1 > 1) then {
|
151
|
+
off_from = off_from + (active_$1 - 1) * awid/2;
|
152
|
+
}
|
153
|
+
|
154
|
+
box at ($1.x + off_from, Here.y) invis $2 ljust " " ;
|
155
|
+
}
|
156
|
+
|
157
|
+
define lconstraint {
|
158
|
+
lifeline_constraint($1,$2);
|
159
|
+
}
|
160
|
+
|
161
|
+
# Display an object constraint(label)
|
162
|
+
# for the last object drawn
|
163
|
+
define object_constraint {
|
164
|
+
{ box invis with .s at last box .nw $1 ljust; }
|
165
|
+
}
|
166
|
+
|
167
|
+
define oconstraint {
|
168
|
+
object_constraint($1);
|
169
|
+
}
|
170
|
+
|
171
|
+
# Draw a creation message(from_object,to_object,object_label)
|
172
|
+
define create_message {
|
173
|
+
down;
|
174
|
+
move spacing;
|
175
|
+
if ($1.x <= $2.x) then {
|
176
|
+
off_from = awid * .6;
|
177
|
+
off_to = -boxwid * .51;
|
178
|
+
} else {
|
179
|
+
off_from = -awid * .6;
|
180
|
+
off_to = boxwid * .51;
|
181
|
+
}
|
182
|
+
|
183
|
+
# add half a box width for each level of nesting
|
184
|
+
if (active_$1 > 1) then {
|
185
|
+
off_from = off_from + (active_$1 - 1) * awid/2;
|
186
|
+
}
|
187
|
+
|
188
|
+
# See comment in destroy_message
|
189
|
+
XSEQA: arrow from ($1.x + off_from, Here.y) to ($2.x + off_to, Here.y) "�create�" " ";
|
190
|
+
if ($1.x <= $2.x) then {
|
191
|
+
{ XSEQB: box $3 with .w at XSEQA.end; }
|
192
|
+
} else {
|
193
|
+
{ XSEQB: box $3 with .e at XSEQA.end; }
|
194
|
+
}
|
195
|
+
{
|
196
|
+
line from XSEQB.w + (.1, -.07) to XSEQB.e + (-.1, -.07);
|
197
|
+
}
|
198
|
+
lifestart_$2 = XSEQB.s.y;
|
199
|
+
move (spacing + boxht) / 2;
|
200
|
+
}
|
201
|
+
|
202
|
+
define cmessage {
|
203
|
+
create_message($1,$2,$3);
|
204
|
+
}
|
205
|
+
|
206
|
+
# Draw an X for a given object
|
207
|
+
define drawx {
|
208
|
+
{
|
209
|
+
line from($1.x - awid, lifestart_$1 - awid) to ($1.x + awid, lifestart_$1 + awid);
|
210
|
+
line from($1.x - awid, lifestart_$1 + awid) to ($1.x + awid, lifestart_$1 - awid);
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
# Draw a destroy message(from_object,to_object)
|
215
|
+
define destroy_message {
|
216
|
+
down;
|
217
|
+
move spacing;
|
218
|
+
# The troff code is \(Fo \(Fc
|
219
|
+
# The groff code is also \[Fo] \[Fc]
|
220
|
+
# The pic2plot code is \Fo \Fc
|
221
|
+
# See http://www.delorie.com/gnu/docs/plotutils/plotutils_71.html
|
222
|
+
# To stay compatible with all we have to hardcode the characters
|
223
|
+
message($1,$2,"�destroy�");
|
224
|
+
complete($2);
|
225
|
+
drawx($2);
|
226
|
+
}
|
227
|
+
|
228
|
+
define dmessage {
|
229
|
+
destroy_message($1,$2);
|
230
|
+
}
|
231
|
+
|
232
|
+
# An object deletes itself: delete(object)
|
233
|
+
define delete {
|
234
|
+
complete($1);
|
235
|
+
lifestart_$1 = lifestart_$1 - awid;
|
236
|
+
drawx($1);
|
237
|
+
}
|
238
|
+
|
239
|
+
# Draw a message return(from_object,to_object,label)
|
240
|
+
define return_message {
|
241
|
+
down;
|
242
|
+
move spacing;
|
243
|
+
# See comment in message
|
244
|
+
if ($1.x <= $2.x) then {
|
245
|
+
off_from = awid * .6;
|
246
|
+
off_to = -awid * .6;
|
247
|
+
} else {
|
248
|
+
off_from = -awid * .6;
|
249
|
+
off_to = awid * .6;
|
250
|
+
}
|
251
|
+
|
252
|
+
# add half a box width for each level of nesting
|
253
|
+
if (active_$1 > 1) then {
|
254
|
+
off_from = off_from + (active_$1 - 1) * awid/2;
|
255
|
+
}
|
256
|
+
|
257
|
+
# add half a box width for each level of nesting
|
258
|
+
if (active_$2 > 1) then {
|
259
|
+
off_to = off_to + (active_$2 - 1) * awid/2;
|
260
|
+
}
|
261
|
+
|
262
|
+
arrow from ($1.x + off_from, Here.y) to ($2.x + off_to, Here.y) dashed $3 " ";
|
263
|
+
}
|
264
|
+
|
265
|
+
define rmessage {
|
266
|
+
return_message($1,$2,$3);
|
267
|
+
}
|
268
|
+
|
269
|
+
# Object becomes active
|
270
|
+
# Can be nested to show recursion
|
271
|
+
define active {
|
272
|
+
extend_lifeline($1);
|
273
|
+
# draw top of new active box
|
274
|
+
line right awid from ($1.x + (active_$1 - 1) * awid/2, Here.y);
|
275
|
+
active_$1 = active_$1 + 1;
|
276
|
+
}
|
277
|
+
|
278
|
+
# Object becomes inactive
|
279
|
+
# Can be nested to show recursion
|
280
|
+
define inactive {
|
281
|
+
extend_lifeline($1);
|
282
|
+
active_$1 = active_$1 - 1;
|
283
|
+
# draw bottom of innermost active box
|
284
|
+
line right awid from ($1.x + (active_$1 - 1) * awid/2, Here.y);
|
285
|
+
}
|
286
|
+
|
287
|
+
# Time step
|
288
|
+
# Useful at the beginning and the end
|
289
|
+
# to show object states
|
290
|
+
define step {
|
291
|
+
down;
|
292
|
+
move spacing;
|
293
|
+
}
|
294
|
+
|
295
|
+
# Switch to asynchronous messages
|
296
|
+
define async {
|
297
|
+
arrowhead = 0;
|
298
|
+
arrowwid = arrowwid * 2;
|
299
|
+
}
|
300
|
+
|
301
|
+
# Switch to synchronous messages
|
302
|
+
define sync {
|
303
|
+
arrowhead = 1;
|
304
|
+
arrowwid = arrowwid / 2;
|
305
|
+
}
|
306
|
+
|
307
|
+
# same as lifeline_constraint, but Text and empty string are exchanged.
|
308
|
+
define lconstraint_below{
|
309
|
+
off_from = awid;
|
310
|
+
# add half a box width for each level of nesting
|
311
|
+
if (active_$1 > 1) then {
|
312
|
+
off_from = off_from + (active_$1 - 1) * awid/2;
|
313
|
+
}
|
314
|
+
|
315
|
+
box at ($1.x + off_from, Here.y) invis "" $2 ljust;
|
316
|
+
}
|
317
|
+
|
318
|
+
# begin_frame(left_object,name,label_text);
|
319
|
+
define begin_frame {
|
320
|
+
# The lifeline will be cut here
|
321
|
+
extend_lifeline($1);
|
322
|
+
# draw the frame-label
|
323
|
+
$2: box $3 invis with .n at ($1.x, Here.y);
|
324
|
+
d = $2.e.y - $2.se.y;
|
325
|
+
line from $2.ne to $2.e then down d left d then to $2.sw;
|
326
|
+
# continue the lifeline below the frame-label
|
327
|
+
move to $2.s;
|
328
|
+
lifestart_$1 = Here.y;
|
329
|
+
}
|
330
|
+
|
331
|
+
# end_frame(right_object,name);
|
332
|
+
define end_frame {
|
333
|
+
# dummy-box for the lower right corner:
|
334
|
+
box invis "" with .s at ($1.x, Here.y);
|
335
|
+
# draw the frame
|
336
|
+
frame_wid = last box.se.x - $2.nw.x
|
337
|
+
frame_ht = - last box.se.y + $2.nw.y
|
338
|
+
box with .nw at $2.nw wid frame_wid ht frame_ht;
|
339
|
+
# restore Here.y
|
340
|
+
move to last box.s;
|
341
|
+
}
|
342
|
+
|
343
|
+
# comment(object,[name],[line_movement], [box_size] text);
|
344
|
+
define comment {
|
345
|
+
old_y = Here.y
|
346
|
+
# draw the first connecting line, at which's end the box wil be positioned
|
347
|
+
move to ($1.x, Here.y)
|
348
|
+
if "$3" == "" then {
|
349
|
+
line comment_default_move() dashed;
|
350
|
+
} else {
|
351
|
+
line $3 dashed;
|
352
|
+
}
|
353
|
+
|
354
|
+
# draw the box, use comment_default_xx if no explicit
|
355
|
+
# size is given together with the text in parameter 4
|
356
|
+
old_boxht=boxht;
|
357
|
+
old_boxwid=boxwid;
|
358
|
+
boxht=comment_default_ht;
|
359
|
+
boxwid=comment_default_wid;
|
360
|
+
if "$2" == "" then {
|
361
|
+
box invis $4;
|
362
|
+
} else {
|
363
|
+
$2: box invis $4;
|
364
|
+
}
|
365
|
+
boxht=old_boxht;
|
366
|
+
boxwid=old_boxwid;
|
367
|
+
|
368
|
+
# draw the frame of the comment
|
369
|
+
line from last box.nw \
|
370
|
+
to last box.ne - (corner_fold, 0) \
|
371
|
+
then to last box.ne - (0, corner_fold) \
|
372
|
+
then to last box.se \
|
373
|
+
then to last box.sw \
|
374
|
+
then to last box.nw ;
|
375
|
+
line from last box.ne - (corner_fold, 0) \
|
376
|
+
to last box.ne - (corner_fold, corner_fold) \
|
377
|
+
then to last box.ne - (0, corner_fold) ;
|
378
|
+
|
379
|
+
# restore Here.y
|
380
|
+
move to ($1.x, old_y)
|
381
|
+
}
|
382
|
+
|
383
|
+
# connect_to_comment(object,name);
|
384
|
+
define connect_to_comment {
|
385
|
+
old_y = Here.y
|
386
|
+
# start at the object
|
387
|
+
move to ($1.x, Here.y)
|
388
|
+
# find the best connection-point of the comment to use as line-end
|
389
|
+
if $1.x < $2.w.x then {
|
390
|
+
line to $2.w dashed;
|
391
|
+
} else {
|
392
|
+
if $1.x > $2.e.x then {
|
393
|
+
line to $2.e dashed;
|
394
|
+
} else {
|
395
|
+
if Here.y < $2.s.y then {
|
396
|
+
line to $2.s dashed;
|
397
|
+
} else {
|
398
|
+
if Here.y > $2.n.y then {
|
399
|
+
line to $2.n dashed;
|
400
|
+
}
|
401
|
+
}
|
402
|
+
}
|
403
|
+
}
|
404
|
+
# restore Here.y
|
405
|
+
move to ($1.x, old_y)
|
406
|
+
}
|
data/lib/markdoc/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: markdoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- lib/markdoc/pseudocode.treetop
|
89
89
|
- lib/markdoc/renderer.rb
|
90
90
|
- lib/markdoc/sequence.rb
|
91
|
+
- lib/markdoc/sequence.pic
|
91
92
|
- lib/markdoc/version.rb
|
92
93
|
- css/style.css
|
93
94
|
- css/pygments.css
|