// 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;
}