Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#!/usr/bin/perl
# $Id: fixmswrd.pl,v 1.4 2002/02/21 21:53:01 giles Exp $

#   (C) 1997 Anthony Shipman
# 
#   This software is provided 'as-is', without any express or implied
#   warranty.  In no event will the authors be held liable for any damages
#   arising from the use of this software.
# 
#   Permission is granted to anyone to use this software for any purpose,
#   including commercial applications, and to alter it and redistribute it
#   freely, subject to the following restrictions:
# 
#   1. The origin of this software must not be misrepresented; you must not
#      claim that you wrote the original software. If you use this software
#      in a product, an acknowledgment in the product documentation would be
#      appreciated but is not required.
#   2. Altered source versions must be plainly marked as such, and must not be
#      misrepresented as being the original software.
#   3. This notice may not be removed or altered from any source distribution.
# 
#   Anthony Shipman    shipmana@acm.org

# This program patches the postscript generated by MS Word printer drivers
# so that they work with ghostview 1.5.  The problem is that the document
# structuring conventions are not followed by Word.  The pages are supposed
# to be independent but they depend on a dictionary being opened outside
# of the pages.  The erroneous structure is
# 
#       %%EndSetup
#       NTPSOct95 begin
#       %%Page: 1 1
#       <text>
#       showpage
#       %%Page: 2 2
#       <text>
#       showpage
#       ......
#       %%Trailer
#       ...
#       end
#       %%EOF
# 
# This only works if the all of the structure around the pages is preserved.
# The opening of NTPSOct95 happens outside of any structured section so
# it is never seen by ghostview.  We change the structure to
# 
#       %%EndSetup
#       %%Page: 1 1
#       NTPSOct95 begin
#       <text>
#       showpage
#       end
#       %%Page: 2 2
#       NTPSOct95 begin
#       <text>
#       showpage
#       end
#       ......
#       %%Trailer
#       ...
#       %%EOF
# 
# That is the dictionary opening is repeated inside each page.
# 
# We add a comment to the document to mark that it has been converted.
# This has the form 
#       %LOCALGhostviewPatched
#
# Usage:
#       fixmswrd [-v] [file [output-file]]

require 'getopts.pl';

#=================================================================

$program = "fixmswrd";

sub usage {
    die "Usage: $program [-v] [file [output-file]]\n";
}

#=================================================================

&Getopts("v") || &usage;

$verbose = $opt_v;


$infile = shift(@ARGV);
if ($infile)
{
    open(INFILE, $infile) || die "$program: Cannot read from $infile\n";
    $handle = "INFILE";
}
else
{
    $handle = "STDIN";
}


$outfile = shift(@ARGV);
if ($outfile)
{
    open(OUTFILE, ">$outfile") || die "$program: Cannot write to $outfile\n";
    select(OUTFILE);
}

#  This reads the header comments and detects the presence of the marker.
$have_marker = 0;

undef $dict_name;
undef $dict_line;

&read_comments;
&put_comments;

if ($have_marker)
{
    $verbose && print STDERR "$program: Warning - already converted\n";

    while(<$handle>)            # pass the file through unchanged.
    {
        print;
    }
}
else
{
    $seen_trailer = 0;

    while(<$handle>)            # massage the file
    {
        if ($dict_line)
        {
            next if (/$dict_line/o);            # drop the old begin line
            $seen_trailer = 1 if (/^%%Trailer/);
            next if ($seen_trailer and /^end/); # drop the old end line
        }

        print;

        if (/^%%Page:/)
        {
            print "$dict_name begin\n"; # add at the start of the page
        }
        elsif (/^showpage/)
        {
            print "end\n";                      # add at the end of the page
        }
        elsif (/^%%BeginResource: procset (\S+)/)
        {
            $dict_name = $1;
            $dict_line = "^$dict_name begin";
        }
        elsif (/^%%BeginProcSet: (\S+)/)        # for older document versions
        {
            $dict_name = $1;
            $dict_line = "^$dict_name begin";
        }
        elsif (/^%%EndProlog:/)
        {
            unless ($dict_line) 
            {
                $verbose && 
                    print STDERR "$program: Warning - unrecognised document structure\n";
            }
        }
    }
}

exit 0;

#=================================================================


#  This reads all of the header comments into an array which we can write
#  out again later.  In addition we detect the presence of the marker comment.

sub read_comments
{
    @headers = ();

    while (<$handle>)
    {                           # without chopping
        push(@headers, $_);
        if (/^%LOCALGhostviewPatched/)
        {
            $have_marker = 1;
        }
        last if /^%%EndComments/;
    }
}



sub put_comments 
{
    foreach $h (@headers)
    {
        if (!$have_marker and ($h =~ /^%%EndComments/))
        {
            print "%LOCALGhostviewPatched\n";
        }
        print $h;               # contains the newline
    }
}