3 #(use-modules (scm graphviz))
5 #(use-modules (ice-9 regex))
7 #(define last-grob-action '())
9 #(define sym-blacklist '())
10 #(define sym-whitelist '())
12 #(define file-line-blacklist '())
13 #(define file-line-whitelist '())
15 #(define grob-blacklist '())
16 #(define grob-whitelist '())
18 #(define (blacklist-symbol sym)
19 (set! sym-blacklist (cons sym sym-blacklist)))
21 #(define (whitelist-symbol sym)
22 (set! sym-whitelist (cons sym sym-whitelist)))
24 #(define (whitelist-grob sym)
25 (set! grob-whitelist (cons sym grob-whitelist)))
27 #(define graph (make-empty-graph (ly:parser-output-name)))
29 % an event is relevant if
30 % (it is on some whitelist or all whitelists are empty)
32 % (it isn't on any blacklist)
34 #(define (relevant? grob file line prop)
35 (let ((file-line `(,file . ,line)))
38 (= 0 (length file-line-whitelist) (length sym-whitelist) (length grob-whitelist))
39 (memq prop sym-whitelist)
40 (memq (grob::name grob) grob-whitelist)
41 (member file-line file-line-whitelist))
43 (not (memq prop sym-blacklist))
44 (not (memq (grob::name grob) grob-blacklist))
45 (not (member file-line file-line-blacklist))))))
47 #(define (grob-event-node grob label cluster)
48 (let ((node-id (add-node graph label cluster))
49 (prev (assv grob last-grob-action)))
51 (add-edge graph (cdr prev) node-id))
52 (set! last-grob-action (assv-set! last-grob-action grob node-id))))
54 #(define (truncate-value val)
55 (let ((val-str (format #f "~a" val)))
56 (string-take val-str (min 50 (string-length val-str)))))
58 #(define (grob-mod grob file line func prop val)
59 (let* ((val-str (truncate-value val))
60 (label (format #f "~a\\n~a:~a\\n~a <- ~a" (grob::name grob) file line prop val-str))
61 ;; to keep escaped "\"" we need to transform it to "\\\""
62 ;; otherwise the final pdf-creation will break
64 (regexp-substitute/global #f "\"" label 'pre "\\\"" 'post)))
65 (if (relevant? grob file line prop)
66 (grob-event-node grob escaped-label file))))
68 #(define (grob-cache grob prop callback value)
69 (let* ((val-str (truncate-value value))
70 (label (format #f "caching ~a.~a\\n~a -> ~a" (grob::name grob) prop callback value)))
71 (if (relevant? grob #f #f prop)
72 (grob-event-node grob label #f))))
74 #(define (grob-create grob file line func)
75 (let ((label (format #f "~a\\n~a:~a" (grob::name grob) file line)))
76 (grob-event-node grob label file)))
78 #(ly:set-grob-modification-callback grob-mod)
79 #(ly:set-property-cache-callback grob-cache)
80 %#(ly:set-grob-creation-callback grob-create)