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