diff options
author | https://www.google.com/accounts/o8/id?id=AItOawlkQOG_UxmAVOjXBQJLpiBmBWXEiTL9PYw <Terry@web> | 2011-11-06 00:01:00 -0400 |
---|---|---|
committer | admin <admin@branchable.com> | 2011-11-06 00:01:00 -0400 |
commit | 74935b3e875bbefcff20f326e1978274e3d6edcb (patch) | |
tree | 6ff7fe6e9152361c1cd1e196bfa6630731ed9f71 | |
parent | c3d2d113eaf1c7191d54e109d6e049c5599e230d (diff) | |
download | ikiwiki-74935b3e875bbefcff20f326e1978274e3d6edcb.tar ikiwiki-74935b3e875bbefcff20f326e1978274e3d6edcb.tar.gz |
-rw-r--r-- | doc/plugins/contrib/mscgen.mdwn | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/doc/plugins/contrib/mscgen.mdwn b/doc/plugins/contrib/mscgen.mdwn index 9ae3901f7..2985339d1 100644 --- a/doc/plugins/contrib/mscgen.mdwn +++ b/doc/plugins/contrib/mscgen.mdwn @@ -43,3 +43,94 @@ Security implications: to be determined. This plugin uses the [[!cpan Digest::SHA]] perl module. This plugin borrows heavily from the [[graphviz|plugins/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 render_graph(%params); +} + +1 +"""]] |