This plugin provides the msc directive. This directive allows embedding mscgen message sequence chart graphs in a page.

Here's an mscgen source example.

[[!msc  src="""
  arcgradient = 8;

  a [label="Client"],b [label="Server"];

  a=>b [label="data1"];
  a-xb [label="data2"];
  a=>b [label="data3"];
  a<=b [label="ack1, nack2"];
  a=>b [label="data2", arcskip="1"];
  |||;
  a<=b [label="ack3"];
  |||;
"""]]

And here's the resulting graph.

[[!msc src=<<""" arcgradient = 8;

a [label="Client"],b [label="Server"];

a=>b [label="data1"]; a-xb [label="data2"]; a=>b [label="data3"]; a<=b [label="ack1, nack2"]; a=>b [label="data2", arcskip="1"]; |||; a<=b [label="ack3"]; |||; """]]

Security implications: to be determined.

This plugin uses the Digest::SHA perl module.

This plugin borrows heavily from the graphviz plugin written by JoshTriplett.

I couldn't upload an attachment, so here's the plugin source.

[[!format perl """

!/usr/bin/perl

mscgen plugin for ikiwiki: render mscgen source as an image.

Terry Golubiewski

Derived from graphviz plugin by Josh Triplett.

package IkiWiki::Plugin::mscgen;

use warnings; use strict; use IkiWiki 3.00; use IPC::Open2;

sub import { hook(type => "getsetup", id => "mscgen", call => \&getsetup); hook(type => "preprocess", id => "msc", call => \&graph); }

sub getsetup () { return plugin => { safe => 1, rebuild => undef, section => "widget", }, }

sub render_graph (\%) { my %params = %{(shift)};

my $src = "msc {\n";
$src .= $params{src};
$src .= "\n}\n";

# Use the sha1 of the mscgen code as part of its filename.
eval q{use Digest::SHA};
error($@) if $@;
my $dest=$params{page}."/msc-".
    IkiWiki::possibly_foolish_untaint(Digest::SHA::sha1_hex($src)).
    ".png";
will_render($params{page}, $dest);

if (! -e "$config{destdir}/$dest") {
    my $pid;
    my $sigpipe=0;
    $SIG{PIPE}=sub { $sigpipe=1 };
    $pid=open2(*IN, *OUT, 'mscgen', '-Tpng', '-i-', '-o-');

    # open2 doesn't respect "use open ':utf8'"
    binmode (OUT, ':utf8');

    print OUT $src;
    close OUT;

    my $png;
    {
        local $/ = undef;
        $png = <IN>;
    }
    close IN;

    waitpid $pid, 0;
    $SIG{PIPE}="DEFAULT";
    error gettext("failed to run mscgen") if $sigpipe;

    if (! $params{preview}) {
        writefile($dest, $config{destdir}, $png, 1);
    }
    else {
        # in preview mode, embed the image in a data uri
        # to avoid temp file clutter
        eval q{use MIME::Base64};
        error($@) if $@;
        return "<img src=\"data:image/png;base64,".
            encode_base64($png)."\" />";
    }
}

return "<img src=\"".urlto($dest, $params{destpage})."\" />\n";

}

sub graph (@) { my %params=@; $params{src} = "" unless defined $params{src}; return rendergraph(%params); }

1 """]]