markdoc 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+ }
@@ -1,3 +1,3 @@
1
1
  module Markdoc
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
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.1
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