home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Inkscape / Inkscape-0.48.2-1-win32.exe / share / extensions / outline2svg.pl < prev    next >
Perl Script  |  2011-07-08  |  5KB  |  166 lines

  1. #!/usr/bin/perl
  2.  
  3. # This is a script to render a plain text outline file into SVG.
  4. # Copyright (C) 2006 Bryce Harrington.  Available for use under the GPL.
  5. #
  6. # Usage:  outline2svg.pl <presentation.outline> [ --master=template.svg ]
  7. #
  8. use strict;
  9. use Getopt::Long;
  10. use Pod::Usage;
  11. use SVG::Parser;
  12. use vars qw($VERSION);
  13. $VERSION = '1.00';
  14.  
  15. our $opt_version      = 0;
  16. our $opt_help         = 0;
  17. our $opt_man          = 0;
  18. our $opt_debug        = 1;
  19. our $opt_master       = "template.svg";
  20. our $opt_width        = 300;
  21. our $opt_height       = 200;
  22. our $opt_x_margin     = 100;
  23. our $opt_y_margin     = 150;
  24. our $opt_font         = 'Arial';
  25. our $opt_font_family  = 'Arial';
  26. our $opt_font_size    = 24;
  27.  
  28. Getopt::Long::Configure ("bundling", "no_ignore_case");
  29. GetOptions(
  30.            "version|V",         # Prints the version and exits
  31.            "help|h",            # Prints a brief help message
  32.            "man",               # Prints a manual page (detailed help)
  33.            "debug|D=i",         # Prints debug messages
  34.            "master|m=s",        # Master template to use
  35.            "width|w=i",         # Page width
  36.            "height|h=i",        # Page height
  37.            "x-margin|x=i",      # Horizontal offset
  38.            "y-margin|y=i",      # Vertical offset
  39.            "font=s",            # Default font name
  40.            "font-family=s",     # Default font family
  41.            "font-size=s",       # Default font size
  42.            );
  43.  
  44. my $i = 0;
  45. my $page = 0;
  46. my $filename;
  47. my $svg;
  48.  
  49. sub start_page {
  50.     my $title = shift;
  51.     end_page();
  52.  
  53.     $filename = sprintf("%02d_$title.svg", $page);
  54.     $filename =~ s/\s+/_/g;
  55.     $filename =~ s#/#-#g;
  56.     $filename =~ s#[^\w\:\.\,\+\-]+#_#g;
  57.  
  58.     $svg = SVG::Parser->new()->parsefile($opt_master);
  59.     $svg->comment('Generated by outline2svg');
  60.     $page++;
  61.     $i = 0;
  62. }
  63.  
  64. sub end_page {
  65.     if (defined($svg) && defined($filename)) {
  66.         open(FILE, ">$filename")
  67.             or die "Could not open '$filename' for writing: $!\n";
  68.         my $contents = $svg->xmlify();
  69.         # Work-around bug in SVG::Parser
  70.         $contents =~ s/�//g;
  71.         print "$filename\n" if $opt_debug>0;
  72.         print FILE $contents;
  73.         close(FILE) || print "Error closing $filename:  $!\n";
  74.  
  75.         undef $svg;
  76.         undef $filename;
  77.     }
  78. }
  79.  
  80.  
  81. my $font = $opt_font;
  82. my $font_family = $opt_font_family;
  83. my $font_size = $opt_font_size;
  84. my $line_spacing = $font_size * 1.5;
  85.  
  86. while (my $line = <>) {
  87.     chomp($line);
  88.     $line =~ s/\s+$//;  # Trim trailing space
  89.     my $x = 10;
  90.     my $style = { 'font' => $font, 
  91.                   'font-family' => $font_family, 
  92.                   'font-size' => $font_size
  93.               };
  94.  
  95.     # Convert tabs into spaces, otherwise we get errors about invalid char
  96.     $line =~ s/\t/    /g;
  97.  
  98.     # If we've encountered a page marker, increment the page number
  99.     if ($line =~ /^\* (.*)$/) {
  100.         my $title = $1;
  101.         start_page($title);
  102.  
  103.         if ($title !~ /^(title|overview)$/i ) {
  104.             $style->{'font-size'} *= 1.5;
  105.             $svg->text(id    => "title_$i",
  106.                        x     => $opt_x_margin,
  107.                        y     => $opt_y_margin,
  108.                        'xml:space' => 'preserve',
  109.                        style => $style,
  110.                        )
  111.                 ->cdata($title);
  112.         }
  113.         $i++;
  114.  
  115.     } elsif (defined($svg)) {
  116.         my $y = $line_spacing*(1+$i);
  117.  
  118.         my $num_leading_spaces = 0;
  119.         if ($line =~ /^(\s+)/) {
  120.             $num_leading_spaces = length($1);
  121.  
  122.         }
  123.  
  124.         if ($num_leading_spaces > 0 &&
  125.             length($line) > $num_leading_spaces &&
  126.             length($line) + $num_leading_spaces > 70 &&
  127.             length($line) + $num_leading_spaces <76 ) {
  128.             # Looks like user is trying to center this text
  129.             $line =~ s/^\s+//;
  130.             $style->{'align'} = 'centered';
  131.             $style->{'anchor'} = 'middle';
  132.             $x = $opt_width / 2;
  133.  
  134.         } else {
  135.             while ($line && $line =~ /^\s/) {
  136.                 $line =~ s/^\s//;  # Just delete one space at a time
  137.                 $x += 5;
  138.             }
  139.  
  140.             # Create bullets if needed
  141.             if ($line =~ /^-\s+/) {
  142.                 $line =~ s/^-\s+//;
  143.                 $x += 10;
  144.                 $svg->circle(cx=>$opt_x_margin + $x - ($font_size/2), 
  145.                              cy=>$opt_y_margin + $y - ($font_size/3), 
  146.                              r=>($font_size/6.0));
  147.             }
  148.         }
  149.  
  150.         # Convert markup into appropriate SVG-isms
  151.         $svg->text(id    => "text_line_$i",
  152.                    x     => $opt_x_margin + $x,
  153.                    y     => $opt_y_margin + $y,
  154.                    'xml:space' => 'preserve',
  155.                    style => $style,
  156.                    )
  157.             ->cdata($line);
  158.         $i++;
  159.     }
  160. }
  161. end_page();
  162.  
  163. #print $svg->xmlify();
  164.  
  165.