X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=contrib%2Fdump-asy.pl;h=2c244752695cf645bc1b16adde28c8cf3795f791;hb=c1e622be27ad6695d0bc12b82de71a14b233ecb4;hp=478a896a5c4b403c36962a6ad675c670f9351608;hpb=828ce9c6400f3dddb6189bec6da7f2fd173af10b;p=i3%2Fi3 diff --git a/contrib/dump-asy.pl b/contrib/dump-asy.pl index 478a896a..2c244752 100755 --- a/contrib/dump-asy.pl +++ b/contrib/dump-asy.pl @@ -1,20 +1,35 @@ #!/usr/bin/env perl # vim:ts=4:sw=4:expandtab -# renders the layout tree using asymptote -# -# ./dump-asy.pl -# will render the entire tree -# ./dump-asy.pl 'name' -# will render the tree starting from the node with the specified name, -# e.g. ./dump-asy.pl 2 will render workspace 2 and below use strict; use warnings; use Data::Dumper; +use Getopt::Long; +use Pod::Usage; use AnyEvent::I3; use File::Temp; +use File::Spec; use File::Basename; use v5.10; +use IPC::Cmd qw[can_run]; + +my %options = ( + gv => 1, + save => undef, + help => 0, +); +my $result = GetOptions( + "gv!" => \$options{gv}, + "save=s" => \$options{save}, + "help|?" => \$options{help}, +); + +pod2usage(-verbose => 2, -exitcode => 0) if $options{help}; + +# prerequisites check so we can be specific about failures caused +# by not having these tools in the path +can_run('asy') or die 'Please install asymptote'; +can_run('gv') or die 'Please install gv' unless !$options{gv}; my $i3 = i3(); @@ -31,7 +46,7 @@ sub dump_node { my $o = ($n->{orientation} eq 'none' ? "u" : ($n->{orientation} eq 'horizontal' ? "h" : "v")); my $w = (defined($n->{window}) ? $n->{window} : "N"); - my $na = $n->{name}; + my $na = ($n->{name} or "[Empty]"); $na =~ s/#/\\#/g; $na =~ s/\$/\\\$/g; $na =~ s/&/\\&/g; @@ -39,9 +54,10 @@ sub dump_node { $na =~ s/~/\\textasciitilde{}/g; my $type = 'leaf'; if (!defined($n->{window})) { - $type = $n->{orientation} . '-split'; + $type = $n->{layout}; } - my $name = qq|``$na'' ($type)|; + my $marks = $n->{marks} ? ' [' . join('][', @{$n->{marks}}) . ']' : ''; + my $name = qq|``$na'' ($type)$marks|; print $tmp "TreeNode n" . $n->{id} . " = makeNode("; @@ -76,5 +92,60 @@ say $tmp "draw(n" . $root->{id} . ", (0, 0));"; close($tmp); my $rep = "$tmp"; $rep =~ s/asy$/eps/; -my $tmp_dir = dirname($rep); -system("cd $tmp_dir && asy $tmp && gv --scale=-1000 --noresize --widgetless $rep && rm $rep"); +if ($options{gv}) { + my $tmp_dir = dirname($rep); + $options{save} = File::Spec->rel2abs($options{save}) if $options{save}; + chdir($tmp_dir); +} else { + $rep = basename($rep); # Output in current dir. +} +system("asy $tmp"); # Create the .eps file. +system("gv --scale=-1000 --noresize --widgetless $rep") if $options{gv}; +if ($options{save}) { + system("mv $rep ${options{save}}"); +} elsif ($options{gv}) { + system("rm $rep"); +} +system("rm $tmp"); + +__END__ + +=head1 NAME + +dump-asy.pl - Render the layout tree using asymptote + +=head1 SYNOPSIS + +dump-asy.pl [workspace] + +=head1 EXAMPLE + +Render the entire tree, run: + + ./dump-asy.pl + +Render the tree starting from the node with the specified name, run: + + ./dump-asy.pl 'name' + +Render the entire tree, save in file 'file.eps' and show using gv, run: + + ./dump-asy.pl --save file.eps + +=head1 OPTIONS + +=over 8 + +=item B<--gv> + +=item B<--no-gv> + +Enable or disable showing the result through gv. If disabled, an .eps file will +be saved in the current working directory. Enabled by default. + +=item B<--save> + +Save result using the specified file-name. If omitted, no file will be saved +when using '--gv' or a random name will be used when using '--no-gv'. + +=back