]> git.donarmstrong.com Git - lilypond.git/blob - ly/graphviz-init.ly
470faffa6ac36228222bb077a250e1fdb2e240cb
[lilypond.git] / ly / graphviz-init.ly
1 \version "2.19.22"
2
3 #(use-modules (scm graphviz))
4
5 #(define last-grob-action '())
6
7 #(define sym-blacklist '())
8 #(define sym-whitelist '())
9
10 #(define file-line-blacklist '())
11 #(define file-line-whitelist '())
12
13 #(define grob-blacklist '())
14 #(define grob-whitelist '())
15
16 #(define (blacklist-symbol sym)
17   (set! sym-blacklist (cons sym sym-blacklist)))
18
19 #(define (whitelist-symbol sym)
20   (set! sym-whitelist (cons sym sym-whitelist)))
21
22 #(define (whitelist-grob sym)
23   (set! grob-whitelist (cons sym grob-whitelist)))
24
25 #(define graph (make-empty-graph (ly:parser-output-name)))
26
27 % an event is relevant if
28 % (it is on some whitelist or all whitelists are empty)
29 % and
30 % (it isn't on any blacklist)
31
32 #(define (relevant? grob file line prop)
33   (let ((file-line `(,file . ,line)))
34    (and
35     (or
36      (= 0 (length file-line-whitelist) (length sym-whitelist) (length grob-whitelist))
37      (memq prop sym-whitelist)
38      (memq (grob::name grob) grob-whitelist)
39      (member file-line file-line-whitelist))
40     (and
41      (not (memq prop sym-blacklist))
42      (not (memq (grob::name grob) grob-blacklist))
43      (not (member file-line file-line-blacklist))))))
44
45 #(define (grob-event-node grob label cluster)
46   (let ((node-id (add-node graph label cluster))
47         (prev (assv grob last-grob-action)))
48    (if (pair? prev)
49        (add-edge graph (cdr prev) node-id))
50    (set! last-grob-action (assv-set! last-grob-action grob node-id))))
51
52 #(define (truncate-value val)
53   (let ((val-str (format #f "~a" val)))
54    (string-take val-str (min 50 (string-length val-str)))))
55
56 #(define (grob-mod grob file line func prop val)
57   (let* ((val-str (truncate-value val))
58          (label (format #f "~a\\n~a:~a\\n~a <- ~a" (grob::name grob) file line prop val-str)))
59    (if (relevant? grob file line prop)
60        (grob-event-node grob label file))))
61
62 #(define (grob-cache grob prop callback value)
63   (let* ((val-str (truncate-value value))
64          (label (format #f "caching ~a.~a\\n~a -> ~a" (grob::name grob) prop callback value)))
65    (if (relevant? grob #f #f prop)
66        (grob-event-node grob label #f))))
67
68 #(define (grob-create grob file line func)
69   (let ((label (format #f "~a\\n~a:~a" (grob::name grob) file line)))
70    (grob-event-node grob label file)))
71
72 #(ly:set-grob-modification-callback grob-mod)
73 #(ly:set-property-cache-callback grob-cache)
74 %#(ly:set-grob-creation-callback grob-create)