243 lines
		
	
	
		
			6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
		
			6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								## Lout output
							 | 
						||
| 
								 | 
							
								# Copyright (C) 1993-1995 Ian Jackson.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# This file is free software; you can redistribute it and/or modify
							 | 
						||
| 
								 | 
							
								# it under the terms of the GNU General Public License as published by
							 | 
						||
| 
								 | 
							
								# the Free Software Foundation; either version 2, or (at your option)
							 | 
						||
| 
								 | 
							
								# any later version.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# It is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								# but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								# GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# You should have received a copy of the GNU General Public License
							 | 
						||
| 
								 | 
							
								# along with GNU Emacs; see the file COPYING.  If not, write to
							 | 
						||
| 
								 | 
							
								# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
							 | 
						||
| 
								 | 
							
								# Boston, MA 02111-1307, USA.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# (Note: I do not consider works produced using these BFNN processing
							 | 
						||
| 
								 | 
							
								# tools to be derivative works of the tools, so they are NOT covered
							 | 
						||
| 
								 | 
							
								# by the GPL.  However, I would appreciate it if you credited me if
							 | 
						||
| 
								 | 
							
								# appropriate in any documents you format using BFNN.)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_init {
							 | 
						||
| 
								 | 
							
								    open(LOUT,">$prefix.lout");
							 | 
						||
| 
								 | 
							
								    chop($dprint= `date '+%d %B %Y'`);
							 | 
						||
| 
								 | 
							
								    $dprint =~ s/^0//;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startup {
							 | 
						||
| 
								 | 
							
								    local ($lbs) = &lout_sanitise($user_brieftitle);
							 | 
						||
| 
								 | 
							
								    print LOUT <<END;
							 | 
						||
| 
								 | 
							
								\@SysInclude{ fontdefs }
							 | 
						||
| 
								 | 
							
								\@SysInclude{ langdefs }
							 | 
						||
| 
								 | 
							
								\@SysInclude{ dl }
							 | 
						||
| 
								 | 
							
								\@SysInclude{ docf }
							 | 
						||
| 
								 | 
							
								\@Use { \@DocumentLayout
							 | 
						||
| 
								 | 
							
								  \@OddTop { \@Null }
							 | 
						||
| 
								 | 
							
								  \@EvenTop { \@Null }
							 | 
						||
| 
								 | 
							
								  \@StartOddTop { \@Null }
							 | 
						||
| 
								 | 
							
								  \@StartEvenTop { \@Null }
							 | 
						||
| 
								 | 
							
								  \@OddFoot { { $lbs } \@Centre{ - \@PageNum - } \@Right{ $dprint } }
							 | 
						||
| 
								 | 
							
								  \@EvenFoot { { $lbs } \@Centre{ - \@PageNum - } \@Right{ $dprint } }
							 | 
						||
| 
								 | 
							
								  \@StartOddFoot { { $lbs } \@Centre{ - \@PageNum - } \@Right{ $dprint } }
							 | 
						||
| 
								 | 
							
								  \@StartEvenFoot { { $lbs } \@Centre{ - \@PageNum - } \@Right{ $dprint } }
							 | 
						||
| 
								 | 
							
								  \@ParaGap { 1.70vx }
							 | 
						||
| 
								 | 
							
								  \@InitialBreak { 1.0fx ragged hyphen }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								\@Use { \@OrdinaryLayout }
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								    $lout_textstatus= 'p';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_pageref {
							 | 
						||
| 
								 | 
							
								    print LOUT "Q$_[1] (page {\@PageOf{$_[0]}}) ";
							 | 
						||
| 
								 | 
							
								    &lout_text("\`");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endpageref {
							 | 
						||
| 
								 | 
							
								    &lout_text("'");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_finish {
							 | 
						||
| 
								 | 
							
								    print LOUT "\@End \@Text\n";
							 | 
						||
| 
								 | 
							
								    close(L);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startmajorheading {
							 | 
						||
| 
								 | 
							
								    $lout_styles .= 'h';
							 | 
						||
| 
								 | 
							
								    print LOUT <<END
							 | 
						||
| 
								 | 
							
								\@CNP
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  newpath   0  ysize 0.3 ft sub  moveto
							 | 
						||
| 
								 | 
							
								            xsize  0  rlineto
							 | 
						||
| 
								 | 
							
								            0  0.2 ft  rlineto
							 | 
						||
| 
								 | 
							
								            xsize neg  0  rlineto
							 | 
						||
| 
								 | 
							
								  closepath fill
							 | 
						||
| 
								 | 
							
								} \@Graphic { //1.6f \@HAdjust \@Heading{
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								    ;
							 | 
						||
| 
								 | 
							
								    $endh= "}\n{\@PageMark s_$_[0]}\n/1.0fo\n";
							 | 
						||
| 
								 | 
							
								    &lout_text($_[0] ? "Section $_[0].  " : '');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startminorheading {
							 | 
						||
| 
								 | 
							
								    $lout_styles .= 'h';
							 | 
						||
| 
								 | 
							
								    print LOUT "//0.2f \@CNP {\@PageMark $_[0]} \@Heading{\n";
							 | 
						||
| 
								 | 
							
								    $endh= '';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endheading {
							 | 
						||
| 
								 | 
							
								    $lout_styles =~ s/.$//; print LOUT "}\n$endh";
							 | 
						||
| 
								 | 
							
								    $lout_status= 'p';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endmajorheading { &lout_endheading(@_); }
							 | 
						||
| 
								 | 
							
								sub lout_endminorheading { &lout_endheading(@_); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_courier {
							 | 
						||
| 
								 | 
							
								    $lout_styles .= 'f';
							 | 
						||
| 
								 | 
							
								    print LOUT "{{0.7 1.0} \@Scale {Courier Bold} \@Font {";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endcourier {
							 | 
						||
| 
								 | 
							
								    $lout_styles =~ s/.$//; print LOUT "}}";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_italic { $lout_styles .= 'f'; print LOUT "{Slope \@Font {"; }
							 | 
						||
| 
								 | 
							
								sub lout_enditalic { $lout_styles =~ s/.$//; print LOUT "}}"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startindent { $lout_styles .= 'i'; print LOUT "\@IndentedDisplay {\n"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endindent {
							 | 
						||
| 
								 | 
							
								    &lout_endpara;
							 | 
						||
| 
								 | 
							
								    $lout_styles =~ s/.$//; print LOUT "}\n\@LP\n";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startpackedlist { $lout_plc=-1; }
							 | 
						||
| 
								 | 
							
								sub lout_endpackedlist { &lout_newline if !$lout_plc; }
							 | 
						||
| 
								 | 
							
								sub lout_packeditem {
							 | 
						||
| 
								 | 
							
								    &lout_newline if !$lout_plc;
							 | 
						||
| 
								 | 
							
								    &lout_tab(($lout_plc>0)*40+5);
							 | 
						||
| 
								 | 
							
								    $lout_plc= !$lout_plc;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startlist {
							 | 
						||
| 
								 | 
							
								    &lout_endpara;
							 | 
						||
| 
								 | 
							
								    print LOUT "\@RawIndentedList style {\@Bullet} indent {0.5i} gap {1.1vx}\n";
							 | 
						||
| 
								 | 
							
								    $lout_styles .= 'l';
							 | 
						||
| 
								 | 
							
								    $lout_status= '';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endlist {
							 | 
						||
| 
								 | 
							
								    &lout_endpara;
							 | 
						||
| 
								 | 
							
								    print LOUT "\@EndList\n\n";
							 | 
						||
| 
								 | 
							
								    $lout_styles =~ s/.$//;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_item {
							 | 
						||
| 
								 | 
							
								    &lout_endpara;
							 | 
						||
| 
								 | 
							
								    print LOUT "\@ListItem{";
							 | 
						||
| 
								 | 
							
								    $lout_styles.= 'I';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startindex {
							 | 
						||
| 
								 | 
							
								    print LOUT "//0.0fe\n";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endindex {
							 | 
						||
| 
								 | 
							
								    $lout_status='p';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startindexmainitem {
							 | 
						||
| 
								 | 
							
								    $lout_marker= $_[0];
							 | 
						||
| 
								 | 
							
								    $lout_status= '';
							 | 
						||
| 
								 | 
							
								    print LOUT "//0.3vx Bold \@Font \@HAdjust { \@HContract { { $_[1] } |3cx {";
							 | 
						||
| 
								 | 
							
								    $lout_iiendheight= '1.00';
							 | 
						||
| 
								 | 
							
								    $lout_styles .= 'X';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startindexitem {
							 | 
						||
| 
								 | 
							
								    $lout_marker= $_[0];
							 | 
						||
| 
								 | 
							
								    print LOUT "\@HAdjust { \@HContract { { $_[1] } |3cx {";
							 | 
						||
| 
								 | 
							
								    $lout_iiendheight= '0.95';
							 | 
						||
| 
								 | 
							
								    $lout_styles .= 'X';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endindexitem {
							 | 
						||
| 
								 | 
							
								    print LOUT "} } |0c \@PageOf { $lout_marker } } //${lout_iiendheight}vx\n";
							 | 
						||
| 
								 | 
							
								    $lout_styles =~ s/.$//;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_email { &lout_courier; &lout_text('<'); }
							 | 
						||
| 
								 | 
							
								sub lout_endemail { &lout_text('>'); &lout_endcourier; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_ftpon { &lout_courier; }  sub lout_endftpon { &lout_endcourier; }
							 | 
						||
| 
								 | 
							
								sub lout_ftpin { &lout_courier; }  sub lout_endftpin { &lout_endcourier; }
							 | 
						||
| 
								 | 
							
								sub lout_docref { }  sub lout_enddocref { }
							 | 
						||
| 
								 | 
							
								sub lout_ftpsilent { $lout_ignore++; }
							 | 
						||
| 
								 | 
							
								sub lout_endftpsilent { $lout_ignore--; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_newsgroup { &lout_courier; }
							 | 
						||
| 
								 | 
							
								sub lout_endnewsgroup { &lout_endcourier; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_text {
							 | 
						||
| 
								 | 
							
								    return if $lout_ignore;
							 | 
						||
| 
								 | 
							
								    $lout_status= 'p';
							 | 
						||
| 
								 | 
							
								    $_= &lout_sanitise($_[0]);
							 | 
						||
| 
								 | 
							
								    s/ $/\n/ unless $lout_styles =~ m/[fhX]/;
							 | 
						||
| 
								 | 
							
								    print LOUT $_;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_tab {
							 | 
						||
| 
								 | 
							
								    local ($size) = $_[0]*0.5;
							 | 
						||
| 
								 | 
							
								    print LOUT " |${size}ft ";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_newline {
							 | 
						||
| 
								 | 
							
								    print LOUT " //1.0vx\n";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_sanitise {
							 | 
						||
| 
								 | 
							
								    local ($in) = @_;
							 | 
						||
| 
								 | 
							
								    local ($out);
							 | 
						||
| 
								 | 
							
								    $in= ' '.$in.' ';
							 | 
						||
| 
								 | 
							
								    $out='';
							 | 
						||
| 
								 | 
							
								    while ($in =~ m/(\s)(\S*[\@\/|\\\"\^\&\{\}\#]\S*)(\s)/) {
							 | 
						||
| 
								 | 
							
								        $out .= $`.$1;
							 | 
						||
| 
								 | 
							
								        $in = $3.$';
							 | 
						||
| 
								 | 
							
								        $_= $2;
							 | 
						||
| 
								 | 
							
								        s/[\\\"]/\\$&/g;
							 | 
						||
| 
								 | 
							
								        $out .= '"'.$_.'"';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    $out .= $in;
							 | 
						||
| 
								 | 
							
								    $out =~ s/^ //;  $out =~ s/ $//;
							 | 
						||
| 
								 | 
							
								    $out;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endpara {
							 | 
						||
| 
								 | 
							
								    return if $lout_status eq '';
							 | 
						||
| 
								 | 
							
								    if ($lout_styles eq '') {
							 | 
						||
| 
								 | 
							
								        print LOUT "\@LP\n\n";
							 | 
						||
| 
								 | 
							
								    } elsif ($lout_styles =~ s/I$//) {
							 | 
						||
| 
								 | 
							
								        print LOUT "}\n";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    $lout_status= '';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_startverbatim {
							 | 
						||
| 
								 | 
							
								    print LOUT "//0.4f\n\@RawIndentedDisplay lines \@Break".
							 | 
						||
| 
								 | 
							
								               " { {0.7 1.0} \@Scale {Courier Bold} \@Font {\n";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_verbatim {
							 | 
						||
| 
								 | 
							
								    $_= $_[0];
							 | 
						||
| 
								 | 
							
								    s/^\s*//;
							 | 
						||
| 
								 | 
							
								    print LOUT &lout_sanitise($_),"\n";
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sub lout_endverbatim { print LOUT "}\n}\n//0.4f\n"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1;
							 |