3 #(use-modules (scm graphviz))
5 #(define last-grob-action '())
7 #(define sym-blacklist '())
8 #(define sym-whitelist '())
10 #(define file-line-blacklist '())
11 #(define file-line-whitelist '())
13 #(define grob-blacklist '())
14 #(define grob-whitelist '())
16 #(define (blacklist-symbol sym)
17 (set! sym-blacklist (cons sym sym-blacklist)))
19 #(define (whitelist-symbol sym)
20 (set! sym-whitelist (cons sym sym-whitelist)))
22 #(define (whitelist-grob str)
23 (set! grob-whitelist (cons str grob-whitelist)))
25 #(define graph (make-empty-graph (ly:parser-output-name parser)))
27 #(define (grob-name g)
28 (let* ((meta (ly:grob-property g 'meta))
29 (name-pair (assq 'name meta)))
34 % an event is relevant if
35 % (it is on some whitelist or all whitelists are empty)
37 % (it isn't on any blacklist)
39 #(define (relevant? grob file line prop)
40 (let ((file-line `(,file . ,line)))
43 (= 0 (length file-line-whitelist) (length sym-whitelist) (length grob-whitelist))
44 (memq prop sym-whitelist)
45 (memq (grob-name grob) grob-whitelist)
46 (member file-line file-line-whitelist))
48 (not (memq prop sym-blacklist))
49 (not (memq (grob-name grob) grob-blacklist))
50 (not (member file-line file-line-blacklist))))))
52 #(define (grob-event-node grob label cluster)
53 (let ((node-id (add-node graph label cluster))
54 (prev (assv grob last-grob-action)))
56 (add-edge graph (cdr prev) node-id))
57 (set! last-grob-action (assv-set! last-grob-action grob node-id))))
59 #(define (truncate-value val)
60 (let ((val-str (format "~a" val)))
61 (string-take val-str (min 50 (string-length val-str)))))
63 #(define (grob-mod grob file line func prop val)
64 (let* ((val-str (truncate-value val))
65 (label (format "~a\\n~a:~a\\n~a <- ~a" (grob-name grob) file line prop val-str)))
66 (if (relevant? grob file line prop)
67 (grob-event-node grob label file))))
69 #(define (grob-cache grob prop callback value)
70 (let* ((val-str (truncate-value value))
71 (label (format "caching ~a.~a\\n~a -> ~a" (grob-name grob) prop callback value)))
72 (if (relevant? grob #f #f prop)
73 (grob-event-node grob label #f))))
75 #(define (grob-create grob file line func)
76 (let ((label (format "~a\\n~a:~a" (grob-name grob) file line)))
77 (grob-event-node grob label file)))
79 #(ly:set-grob-modification-callback grob-mod)
80 #(ly:set-property-cache-callback grob-cache)
81 %#(ly:set-grob-creation-callback grob-create)