// Credit: Dennis Snell (@dmsnell) digraph G { rankdir=TB; nodesep=0.5; ranksep=0.8; fontname="sans-serif"; // Entry point entry [shape=plaintext label="Open script"]; entry -> script_data; // Double-circle states arranged more compactly data [shape=doublecircle label="Close script" fontname="sans-serif"]; script_data [shape=doublecircle color=blue label="script\ndata" fontname="sans-serif"]; script_data_escaped [shape=circle color=orange label="escaped" fontname="sans-serif"]; script_data_double_escaped [shape=circle color=red label="double\nescaped" fontname="sans-serif"]; // Group related nodes on same ranks where possible {rank=same; script_data script_data_escaped script_data_double_escaped} script_data -> script_data [label="" fontname="monospace"]; script_data_escaped -> script_data_double_escaped [label=<<script > fontname="monospace"]; script_data_escaped -> data [label=<</script> fontname="monospace"]; script_data_double_escaped -> script_data [xlabel="-->" fontname="monospace"]; script_data_double_escaped -> script_data_escaped [label=<</script> fontname="monospace"]; label=< = SP, HT, FF, CR, NL, /, >>; labelloc=b; labeljust=r; }