diff options
| author | Hans Hagen <pragma@wxs.nl> | 2006-11-16 12:02:00 +0100 | 
|---|---|---|
| committer | Hans Hagen <pragma@wxs.nl> | 2006-11-16 12:02:00 +0100 | 
| commit | 2129e59b313d0a032b7b6eb3dab287dd32437ef9 (patch) | |
| tree | 23b8818581484b897723bf6fb42a12a1b660afb6 /scripts | |
| parent | f9c73d27ce69d59cfaeb543664e69c620642a0dc (diff) | |
| download | context-2129e59b313d0a032b7b6eb3dab287dd32437ef9.tar.gz | |
stable 2006.11.16 12:02
Diffstat (limited to 'scripts')
29 files changed, 1305 insertions, 488 deletions
diff --git a/scripts/context/perl/mptopdf.pl b/scripts/context/perl/mptopdf.pl index f85c36891..b1589a9d3 100644 --- a/scripts/context/perl/mptopdf.pl +++ b/scripts/context/perl/mptopdf.pl @@ -120,9 +120,9 @@ foreach my $file (@files) {      $_ = $file ;      if (s/\.(\d+|mps)$// && -e $file) {          if ($miktex) { -            $command = "pdfetex -undump=mptopdf" ; +            $command = "pdftex -undump=mptopdf" ;          } else { -            $command = "pdfetex  -fmt=mptopdf -progname=context" ; +            $command = "pdftex -fmt=mptopdf -progname=context" ;          }          if ($dosish) {              $command = "$command \\relax $file" ; diff --git a/scripts/context/perl/texfont.pl b/scripts/context/perl/texfont.pl index 425417374..ec875e5b4 100644 --- a/scripts/context/perl/texfont.pl +++ b/scripts/context/perl/texfont.pl @@ -42,6 +42,7 @@ use Config ;  use FindBin ;  use File::Copy ;  use Getopt::Long ; +use Data::Dumper;  $Getopt::Long::passthrough = 1 ; # no error message  $Getopt::Long::autoabbrev  = 1 ; # partial switch accepted @@ -146,6 +147,7 @@ my $trace           = 0 ;  my $afmpl           = 0 ;  my $trees           = 'TEXMFFONTS,TEXMFLOCAL,TEXMFEXTRA,TEXMFMAIN,TEXMFDIST' ;  my $pattern         = '' ; +my $uselmencodings  = 0 ;  my $fontsuffix  = "" ;  my $namesuffix  = "" ; @@ -198,6 +200,7 @@ my @cleanup         = () ;    # atl: build list of generated files to delete      "expert"       => \$expert,      "afmpl"        => \$afmpl,      "afm2pl"       => \$afmpl, +    "lm"           => \$uselmencodings,      "rootlist=s"   => \$trees,      "pattern=s"    => \$pattern,      "trace"        => \$trace,    # --verbose conflicts with --ve @@ -549,7 +552,6 @@ if ($sourcepath eq "auto") # todo uppercase root                      foreach my $sub ("tfm","vf")                        { foreach my $typ ("","-raw")                            { my $nam = "$path/fonts/$sub/$vendor/$collection/$encoding$varlabel$typ-$file.$sub" ; -                        #  { my $nam = "$path/fonts/$sub/$vendor/$collection/$encoding$varlabel$typ-$file$fontsuffix.$sub" ;                              if (-s $nam)                                { report ("removing : $encoding$varlabel$typ-$file.$sub") ;                                  unlink $nam } } } } @@ -558,11 +560,12 @@ if ($sourcepath eq "auto") # todo uppercase root                    { report ("removing : $nam") ;                      unlink "$nam" }                  my $mapfile = "$encoding$varlabel-$vendor-$collection" ; -                my $maproot = "$fontroot/fonts/map/pdftex/context"; -                if (-e "$maproot$mapfile.map") -                  { report ("renaming : $mapfile.map -> $mapfile.bak") ; -                    unlink "$maproot$mapfile.bak" ; -                    rename "$maproot$mapfile.map", "$maproot$mapfile.bak" } +				foreach my $map ("pdftex","dvips", "dvipdfm") +                  { my $maproot = "$fontroot/fonts/map/$map/context/"; +                    if (-e "$maproot$mapfile.map") +                       { report ("renaming : $mapfile.map -> $mapfile.bak") ; +                         unlink "$maproot$mapfile.bak" ; +                         rename "$maproot$mapfile.map", "$maproot$mapfile.bak" } }                  exit }              else                { last } } } } @@ -576,9 +579,13 @@ my $tfmpath = "$fontroot/fonts/tfm/$vendor/$collection" ;  my $vfpath  = "$fontroot/fonts/vf/$vendor/$collection" ;  my $pfbpath = "$fontroot/fonts/type1/$vendor/$collection" ;  my $ttfpath = "$fontroot/fonts/truetype/$vendor/$collection" ; -my $mappath = "$fontroot/fonts/map/pdftex/context" ; +my $otfpath = "$fontroot/fonts/opentype/$vendor/$collection" ;  my $encpath = "$fontroot/fonts/enc/dvips/context" ; +sub mappath +  { my $str = shift ; +    return "$fontroot/fonts/map/$str/context" } +  # are not on local path ! ! ! !  foreach my $path ($afmpath, $pfbpath) @@ -597,20 +604,19 @@ if (($fontroot =~ /texmf\-fonts/o) || (-e "$fontroot/ls-R") || (-e "$fontroot/ls  sub do_make_path    { my $str = shift ;      if ($str =~ /^(.*)\/.*?$/) -      { do_make_path($1) } +      { do_make_path($1); }      mkdir $str, 0755 unless -d $str }  sub make_path    { my $str = shift ; -    do_make_path("$fontroot/fonts") ; -    do_make_path("$fontroot/fonts/$str") ; -    do_make_path("$fontroot/fonts/$str/$vendor") ;      do_make_path("$fontroot/fonts/$str/$vendor/$collection") }  if ($makepath&&$install)    { make_path ("afm") ; make_path ("type1") } -do_make_path($mappath) ; +do_make_path(mappath("pdftex")) ; +do_make_path(mappath("dvips")) ; +do_make_path(mappath("dvipdfm")) ;  do_make_path($encpath) ;  # now fonts/map and fonts/enc @@ -624,21 +630,23 @@ if ($install)  error ("unknown tfm path $tfmpath") unless -d $tfmpath ;  error ("unknown vf  path $vfpath" ) unless -d $vfpath  ; -error ("unknown map path $mappath") unless -d $mappath ; +error ("unknown map path " . mappath("pdftex"))  unless -d mappath("pdftex"); +error ("unknown map path " . mappath("dvips"))   unless -d mappath("dvips"); +error ("unknown map path " . mappath("dvipdfm")) unless -d mappath("dvipdfm");  my $mapfile = "$identifier.map" ;  my $bakfile = "$identifier.bak" ;  my $texfile = "$identifier.tex" ; -                report  "encoding vector : $encoding" ; +                report "encoding vector : $encoding" ;  if ($variant) { report "encoding variant : $variant" }                  report      "vendor name : $vendor" ;                  report  "    source path : $sourcepath" ;                  report  "font collection : $collection" ;                  report  "texmf font root : $lcfontroot" ; -                report  "pdftex map file : $mapfile" ; +                report  "  map file name : $mapfile" ; -if ($install)        { report "source path : $sourcepath" } +if ($install) { report "source path : $sourcepath" }  my $fntlist = "" ; @@ -736,45 +744,74 @@ if ($install)          copy_files("ttf",$sourcepath,$ttfpath) }      if ($extension eq "otf")        { make_path("truetype") ; -	copy_files("otf",$sourcepath,$ttfpath) } } +	    copy_files("otf",$sourcepath,$ttfpath) } }  error ("no afm files found") unless @files ; -my $map = my $tex = 0 ; my $mapdata = my $texdata = "" ; - -copy ("$mappath/$mapfile","$mappath/$bakfile") ; - -if (open (MAP,"<$mappath/$mapfile")) -  { report ("extending map file : $mappath/$mapfile") ; -    while (<MAP>) { unless (/^\%/o) { $mapdata .= $_ } } -    close (MAP) } -else -  { report ("no map file at : $mappath/$mapfile") } +sub open_mapfile +  { my $type = shift; +	my $mappath = mappath($type); +    my $mapdata = ""; +	my $mapptr = undef; +	my $fullmapfile = $mapfile; +	$fullmapfile = "$type-$fullmapfile" unless $type eq "pdftex"; +	if ($install) +	  { copy ("$mappath/$mapfile","$mappath/$bakfile") ; } +    if (open ($mapptr,"<$mappath/$mapfile")) +      { report ("extending map file : $mappath/$mapfile") ; +        while (<$mapptr>) { unless (/^\%/o) { $mapdata .= $_ } } +        close ($mapptr) } +    else +      { report ("no map file at : $mappath/$mapfile") } +    #~ unless (open ($mapptr,">$fullmapfile") ) +do_make_path($mappath) ; +    unless (open ($mapptr,">$mappath/$fullmapfile") ) +      { report "warning : can't open $fullmapfile" } +    else +      { if ($type eq "pdftex") +          { print $mapptr "% This file is generated by the TeXFont Perl script.\n"; +            print $mapptr "%\n" ; +            print $mapptr "% You need to add the following line to your file:\n" ; +            print $mapptr "%\n" ; +            print $mapptr "%   \\pdfmapfile{+$mapfile}\n" ; +            print $mapptr "%\n" ; +            print $mapptr "% In ConTeXt you can best use:\n" ; +            print $mapptr "%\n" ; +            print $mapptr "%   \\loadmapfile\[$mapfile\]\n\n" } } +    return ($mapptr,$mapdata) ; } + +sub finish_mapfile +  { my ($type, $mapptr, $mapdata ) = @_; +	my $fullmapfile = $mapfile; +	$fullmapfile = "$type-$fullmapfile" unless $type eq "pdftex"; +    if (defined $mapptr) +      { report ("updating map file : $mapfile (for $type)") ; +        while ($mapdata =~ s/\n\n+/\n/mois) {} ; +        $mapdata =~ s/^\s*//gmois ; +        print $mapptr $mapdata ; +        close ($mapptr) ; +        if ($install) +          { copy ("$fullmapfile", mappath($type) . "/$mapfile") ; } } } + + +my ($PDFTEXMAP,$pdftexmapdata)   = open_mapfile("pdftex"); +my ($DVIPSMAP,$dvipsmapdata)     = open_mapfile("dvips"); +my ($DVIPDFMMAP,$dvipdfmmapdata) = open_mapfile("dvipdfm"); + +my $tex = 0 ; +my $texdata = "" ;  if (open (TEX,"<$texfile"))    { while (<TEX>) { unless (/stoptext/o) { $texdata .= $_ } }      close (TEX) } -$map = open (MAP,">$mapfile") ;  $tex = open (TEX,">$texfile") ; -unless ($map) { report "warning : can't open $mapfile" }  unless ($tex) { report "warning : can't open $texfile" } -if ($map) -  { print MAP "% This file is generated by the TeXFont Perl script.\n" ; -    print MAP "%\n" ; -    print MAP "% You need to add the following line to your file:\n" ; -    print MAP "%\n" ; -    print MAP "%   \\pdfmapfile{+$mapfile}\n" ; -    print MAP "%\n" ; -    print MAP "% In ConTeXt you can best use:\n" ; -    print MAP "%\n" ; -    print MAP "%   \\loadmapfile\[$mapfile\]\n\n" } -  if ($tex)    { if ($texdata eq "") -      { print TEX "% output=pdftex interface=en\n" ; +      { print TEX "% interface=en\n" ;          print TEX "\n" ;          print TEX "\\usemodule[fnt-01]\n" ;          print TEX "\n" ; @@ -811,6 +848,227 @@ if ($encoding ne "") # evt -progname=context    { $encfil = `kpsewhich -progname=pdftex $encoding$varlabel.enc` ;      chomp $encfil ; if ($encfil eq "") { $encfil = "$encoding$varlabel.enc" } } +sub build_pdftex_mapline +  { my ($option, $usename, $fontname, $rawname, $cleanfont, $encoding, $varlabel, $strange)  = @_; +    my $cleanname = $fontname; +	$cleanname =~ s/\_//gio ; +    $option =~ s/^\s+(.*)/$1/o ; +    $option =~ s/(.*)\s+$/$1/o ; +    $option =~ s/  / /g ; +    if ($option ne "") +      { $option = "\"$option\" 4" } +    else +      { $option = "4" } +    # adding cleanfont is kind of dangerous +    my $thename = ""; +	my $str = ""; +    my $theencoding = "" ; +    if ($strange ne "") +      { $thename = $cleanname ; $theencoding = "" ; } +    elsif ($lcdf) +      { $thename = $usename ; $theencoding = " $encoding$varlabel-$cleanname.enc" } +    elsif ($afmpl) +      { $thename = $usename ; $theencoding = " $encoding$varlabel.enc" } +    elsif ($virtual) +      { $thename = $rawname ; $theencoding = " $encoding$varlabel.enc" } +    else +      { $thename = $usename ; $theencoding = " $encoding$varlabel.enc" } +if ($uselmencodings) { +    $theencoding =~ s/^(ec)\.enc/lm\-$1.enc/ ; +} +    # quit rest if no type 1 file +    my $pfb_sourcepath = $sourcepath ; +    $pfb_sourcepath =~ s@/afm/@/type1/@ ; +    unless ((-e "$pfbpath/$fontname.$extension")|| +			(-e "$pfb_sourcepath/$fontname.$extension")|| +			(-e "$sourcepath/$fontname.$extension")|| +			(-e "$ttfpath/$fontname.$extension")) +	  { if ($tex) { $report .= "missing file: \\type \{$fontname.pfb\}\n" } +		report ("missing pfb file : $fontname.pfb") } +    # now add entry to map +    if ($strange eq "") { +	  if ($extension eq "otf") { +		if ($lcdf) { +		  my $mapline = "" ; +		  if (open(ALTMAP,"texfont.map")) { +			while (<ALTMAP>) { +			  chomp ; +			  # atl: we assume this b/c we always force otftotfm --no-type1 +			  if (/<<(.*)\.otf$/oi) { +				$mapline = $_ ; last ; +			  } +			} +			close(ALTMAP) ; +		  } else { +			report("no mapfile from otftotfm : texfont.map") ; +		  } +		  if ($preproc) { +			$mapline =~ s/<\[/</; +			$mapline =~ s/<<(\S+)\.otf$/<$1\.pfb/ ; +		  } else { +			$mapline =~ s/<<(\S+)\.otf$/<< $ttfpath\/$fontname.$extension/ ; +		  } +		  $str = "$mapline\n" ; +		} else { +		  if ($preproc) { +			$str = "$thename $cleanfont $option < $fontname.pfb$theencoding\n" ; +		  } else { +			# PdfTeX can't subset OTF files, so we have to include the whole thing +			# It looks like we also need to be explicit on where to find the file +			$str = "$thename $cleanfont $option << $ttfpath/$fontname.$extension <$theencoding\n" ; +		  } +		} +	  } else { +		$str = "$thename $cleanfont $option < $fontname.$extension$theencoding\n" ; +	  } +    } else { +	  $str = "$thename $cleanfont < $fontname.$extension\n" ; +    } +    return ($str, $thename); } + +sub build_dvips_mapline +  { my ($option, $usename, $fontname, $rawname, $cleanfont, $encoding, $varlabel, $strange)  = @_; +    my $cleanname = $fontname; +	$cleanname =~ s/\_//gio ; +    $option =~ s/^\s+(.*)/$1/o ; +    $option =~ s/(.*)\s+$/$1/o ; +    $option =~ s/  / /g ; +    # adding cleanfont is kind of dangerous +    my $thename = ""; +	my $str = ""; +    my $optionencoding = "" ; +	my $encname = ""; +    my $theencoding = "" ; +	if ($encoding ne "") # evt -progname=context +	  { $encfil = `kpsewhich -progname=dvips $encoding$varlabel.enc` ; +		chomp $encfil ; +		if ($encfil eq "") +         { $encfil = "$encoding$varlabel.enc" ; } +		if (open(ENC,"<$encfil")) +		  { while (<ENC>) +			{ if (/^\/([^ ]+)\s*\[/) +              { $encname = $1; +                last; } } +			close ENC; } } +    if ($strange ne "") +      { $thename = $cleanname ; +		$optionencoding = "\"$option\""  if length($option)>1; } +    elsif ($lcdf) +      { $thename = $usename ; +		$optionencoding = "\"$option $encname ReEncodeFont\" <$encoding$varlabel-$cleanname.enc" } +    elsif ($afmpl) +      { $thename = $usename ; +		$optionencoding = "\"$option $encname ReEncodeFont\" <$encoding$varlabel.enc" } +    elsif ($virtual) +      { $thename = $rawname ; +		$optionencoding = "\"$option $encname ReEncodeFont\" <$encoding$varlabel.enc" } +    else +      { $thename = $usename ; +		$optionencoding = "\"$option $encname ReEncodeFont\" <$encoding$varlabel.enc" } +if ($uselmencodings) { +    $theencoding =~ s/^(ec)\.enc/lm\-$1.enc/ ; +} +    # quit rest if no type 1 file +    my $pfb_sourcepath = $sourcepath ; +    $pfb_sourcepath =~ s@/afm/@/type1/@ ; +    unless ((-e "$pfbpath/$fontname.$extension")|| +			(-e "$pfb_sourcepath/$fontname.$extension")|| +			(-e "$sourcepath/$fontname.$extension")|| +			(-e "$ttfpath/$fontname.$extension")) +	  { if ($tex) { $report .= "missing file: \\type \{$fontname.pfb\}\n" } +       report ("missing pfb file : $fontname.pfb") } +    # now add entry to map +    if ($strange eq "") { +	  if ($extension eq "otf") { +		if ($lcdf) { +		  my $mapline = "" ; +		  if (open(ALTMAP,"texfont.map")) { +			while (<ALTMAP>) { +			  chomp ; +			  # atl: we assume this b/c we always force otftotfm --no-type1 +			  if (/<<(.*)\.otf$/oi) { +				$mapline = $_ ; last ; +			  } +			} +			close(ALTMAP) ; +		  } else { +			report("no mapfile from otftotfm : texfont.map") ; +		  } +		  if ($preproc) { +			$mapline =~ s/<\[/</; +			$mapline =~ s/<<(\S+)\.otf$/<$1\.pfb/ ; +		  } else { +			$mapline =~ s/<<(\S+)\.otf$/<< $ttfpath\/$fontname.$extension/ ; +		  } +		  $str = "$mapline\n" ; +		} else { +		  if ($preproc) { +			$str = "$thename $cleanfont $optionencoding <$fontname.pfb\n" ; +		  } else { +			# dvips can't subset OTF files, so we have to include the whole thing +			# It looks like we also need to be explicit on where to find the file +			$str = "$thename $cleanfont $optionencoding << $ttfpath/$fontname.$extension \n" ; +		  } +		} +	  } else { +		$str = "$thename $cleanfont $optionencoding <$fontname.$extension\n" ; +	  } +	} else { +	  $str = "$thename $cleanfont $optionencoding <$fontname.$extension\n" ; +	} +    return ($str, $thename); } +#	return $str; } + + +sub build_dvipdfm_mapline +  { my ($option, $usename, $fontname, $rawname, $cleanfont, $encoding, $varlabel, $strange)  = @_; +    my $cleanname = $fontname; +	$cleanname =~ s/\_//gio ; +	$option =~ s/([\d\.]+)\s+SlantFont/ -s $1 /; +	$option =~ s/([\d\.]+)\s+ExtendFont/ -e $1 /; +    $option =~ s/^\s+(.*)/$1/o ; +    $option =~ s/(.*)\s+$/$1/o ; +    $option =~ s/  / /g ; +    # adding cleanfont is kind of dangerous +    my $thename = ""; +	my $str = ""; +    my $theencoding = "" ; +    if ($strange ne "") +      { $thename = $cleanname ; $theencoding = "" ; } +    elsif ($lcdf) +      { $thename = $usename ; $theencoding = " $encoding$varlabel-$cleanname" } +    elsif ($afmpl) +      { $thename = $usename ; $theencoding = " $encoding$varlabel" } +    elsif ($virtual) +      { $thename = $rawname ; $theencoding = " $encoding$varlabel" } +    else +      { $thename = $usename ; $theencoding = " $encoding$varlabel" } +if ($uselmencodings) { +    $theencoding =~ s/^(ec)\.enc/lm\-$1.enc/ ; +} +    # quit rest if no type 1 file +    my $pfb_sourcepath = $sourcepath ; +    $pfb_sourcepath =~ s@/afm/@/type1/@ ; +    unless ((-e "$pfbpath/$fontname.$extension")|| +			(-e "$pfb_sourcepath/$fontname.$extension")|| +			(-e "$sourcepath/$fontname.$extension")|| +			(-e "$ttfpath/$fontname.$extension")) +	  { if ($tex) { $report .= "missing file: \\type \{$fontname.pfb\}\n" } +		report ("missing pfb file : $fontname.pfb") } +    # now add entry to map +    if ($strange eq "") { +	  if ($extension eq "otf") { +		#TH: todo +	  } else { +		$str = "$thename $theencoding $fontname $option\n" ; +	  } +	} else { +	  $str = "$thename $fontname $option\n" ; +	} +    return ($str, $thename); } +#	return $str; } + +  sub preprocess_font    { my ($infont,$pfbfont) = @_ ;      if ($infont ne "") @@ -850,20 +1108,20 @@ foreach my $file (@files)      if ($encoding ne "")        { $encstr = " -T $encfil" }      if ($caps ne "") -      { $vfstr = " -V $raw$cleanname$fontsuffix" } +      { $vfstr = " -V $use$cleanname$fontsuffix" }      else # if ($virtual) -      { $vfstr = " -v $raw$cleanname$fontsuffix" } +      { $vfstr = " -v $use$cleanname$fontsuffix" }      my $font = "";      # let's see what we have here (we force texnansi.enc to avoid error messages)      if ($lcdf)        { my $command = "otfinfo -p $file" ; -        print "$command\n" if $trace ; +        print "$command\n" if $trace;          $font = `$command` ;          chomp $font ;          $cleanname = $cleanfont = $font }      else        { my $command = "afm2tfm \"$file\" -p texnansi.enc texfont.tfm" ; -        print "$command\n" if $trace ; +        print "$command (for testing)\n" if $trace ;          $font = `$command` ;          UnLink "texfont.tfm" ;          ($rawfont,$cleanfont,$restfont) = split(/\s/,$font) } @@ -912,6 +1170,9 @@ foreach my $file (@files)              if ($afmpl)                { report "         generating pl : $cleanname$fontsuffix (from $cleanname)" ;                  $encstr = " -p $encfil" ; +if ($uselmencodings) { +    $encstr =~ s/(ec)\.enc$/lm\-$1\.enc/ ; +}                  my $command = "afm2pl -f afm2tfm $shape $passon $encstr $file $cleanname$fontsuffix.vpl" ;                  print "$command\n" if $trace ;                  my $ok = `$command` ; @@ -924,28 +1185,28 @@ foreach my $file (@files)                  my $command = "afm2tfm $file $shape $passon $encstr $vfstr $raw$cleanname$fontsuffix" ;                  print "$command\n" if $trace ;                  $font = `$command` } -                # generate vf file if needed -                chomp $font ; -                if ($font =~ /.*?([\d\.]+)\s*ExtendFont/io) { $extend = $1 } -                if ($font =~ /.*?([\d\.]+)\s*SlantFont/io)  { $slant  = $1 } -                if ($extend ne "") { $option .= " $1 ExtendFont " } -                if ($slant ne "")  { $option .= " $1 SlantFont " } -                if ($noligs) { removeligatures("$raw$cleanname$fontsuffix") } -                if ($afmpl) -                  { report "generating new tfm : $use$cleanname$fontsuffix" ; -                    my $command = "pltotf $cleanname$fontsuffix.vpl $use$cleanname$fontsuffix.tfm" ; -                    print "$command\n" if $trace ; -                    my $ok = `$command` } -                elsif ($virtual) -                  { report "generating new vf : $use$cleanname$fontsuffix (from $raw$cleanname)" ; -                    my $command = "vptovf $raw$cleanname$fontsuffix.vpl $use$cleanname$fontsuffix.vf $use$cleanname$fontsuffix.tfm" ; -                    print "$command\n" if $trace ; -                    my $ok = `$command` } -                else -                  { report "generating new tfm : $use$cleanname$fontsuffix (from $raw$cleanname)" ; -                    my $command = "pltotf $raw$cleanname$fontsuffix.vpl $use$cleanname$fontsuffix.tfm" ; -                    print "$command\n" if $trace ; -                    my $ok = `$command` } } } +			# generate vf file if needed +			chomp $font ; +			if ($font =~ /.*?([\d\.]+)\s*ExtendFont/io) { $extend = $1 } +			if ($font =~ /.*?([\d\.]+)\s*SlantFont/io)  { $slant  = $1 } +			if ($extend ne "") { $option .= " $extend ExtendFont " } +			if ($slant ne "")  { $option .= " $slant SlantFont " } +			if ($noligs) { removeligatures("$raw$cleanname$fontsuffix") } +			if ($afmpl) +			  { report "generating new tfm : $use$cleanname$fontsuffix" ; +				my $command = "pltotf $cleanname$fontsuffix.vpl $use$cleanname$fontsuffix.tfm" ; +				print "$command\n" if $trace ; +				my $ok = `$command` } +			elsif ($virtual) +			  { report "generating new vf : $use$cleanname$fontsuffix (from $use$cleanname)" ; +				my $command = "vptovf $use$cleanname$fontsuffix.vpl $use$cleanname$fontsuffix.vf $use$cleanname$fontsuffix.tfm" ; +				print "$command\n" if $trace ; +				my $ok = `$command` } +			else +			  { report "generating new tfm : $use$cleanname$fontsuffix (from $raw$cleanname)" ; +				my $command = "pltotf $raw$cleanname$fontsuffix.vpl $use$cleanname$fontsuffix.tfm" ; +				print "$command\n" if $trace ; +				my $ok = `$command` } } }      elsif (-e "$sourcepath/$cleanname.tfm" )        { report "using existing tfm : $cleanname.tfm" }      elsif (($strange eq "expert")&&($expert)) @@ -993,85 +1254,43 @@ foreach my $file (@files)        { UnLink ("$rawname.$suf", "$usename.$suf") ;          UnLink ("$cleanname.$suf", "$fontname.$suf") ;          UnLink ("$cleanname$fontsuffix.$suf", "$fontname$fontsuffix.$suf") } -    # add line to maps file -    $option =~ s/^\s+(.*)/$1/o ; -    $option =~ s/(.*)\s+$/$1/o ; -    $option =~ s/  / /o ; -    if ($option ne "") -      { $option = "\"$option\" 4" } -    else -      { $option = "4" } -    # adding cleanfont is kind of dangerous -    my $thename = my $str = my $theencoding = "" ; -    if ($strange ne "") -      { $thename = $cleanname ; $theencoding = "" ; } -    elsif ($lcdf) -      { $thename = $usename ; $theencoding = " $encoding$varlabel-$cleanname.enc" } -    elsif ($afmpl) -      { $thename = $usename ; $theencoding = " $encoding$varlabel.enc" } -    elsif ($virtual) -      { $thename = $rawname ; $theencoding = " $encoding$varlabel.enc" } -    else -      { $thename = $usename ; $theencoding = " $encoding$varlabel.enc" } -    # quit rest if no type 1 file -    my $pfb_sourcepath = $sourcepath ; -    $pfb_sourcepath =~ s@/afm/@/type1/@ ; -    unless ((-e "$pfbpath/$fontname.$extension")|| -             (-e "$pfb_sourcepath/$fontname.$extension")|| -             (-e "$sourcepath/$fontname.$extension")|| -	    (-e "$ttfpath/$fontname.$extension")) -     { if ($tex) { $report .= "missing file: \\type \{$fontname.pfb\}\n" } -       report ("missing pfb file : $fontname.pfb") } -    # now add entry to map -    if ($strange eq "") { -        if ($extension eq "otf") { -            if ($lcdf) { -                my $mapline = "" ; -                if (open(ALTMAP,"texfont.map")) { -                    while (<ALTMAP>) { -                        chomp ; -                        # atl: we assume this b/c we always force otftotfm --no-type1 -                        if (/<<(.*)\.otf$/oi) { -                            $mapline = $_ ; last ; -                        } -                    } -                    close(ALTMAP) ; -                } else { -                    report("no mapfile from otftotfm : texfont.map") ; -                } -                if ($preproc) { -                    $mapline =~ s/<\[/</; -                    $mapline =~ s/<<(\S+)\.otf$/<$1\.pfb/ ; -                } else { -                    $mapline =~ s/<<(\S+)\.otf$/<< $ttfpath\/$fontname.$extension/ ; -                } -                $str = "$mapline\n" ; -            } else { -                if ($preproc) { -                    $str = "$thename $cleanfont $option < $fontname.pfb$theencoding\n" ; -                } else { -                    # PdfTeX can't subset OTF files, so we have to include the whole thing -                    # It looks like we also need to be explicit on where to find the file -                    $str = "$thename $cleanfont $option << $ttfpath/$fontname.$extension <[$theencoding\n" ; -                } -            } -        } else { -            $str = "$thename $cleanfont $option < $fontname.$extension$theencoding\n" ; -        } -    } else { -        $str = "$thename $cleanfont < $fontname.$extension\n" ; +    # add line to map files +	my $str = my $thename = ""; +    ($str, $thename) = build_pdftex_mapline($option, $usename, $fontname, $rawname, $cleanfont, $encoding, $varlabel, $strange); +	# check for redundant entries +    if (defined $PDFTEXMAP) { +	  $pdftexmapdata =~ s/^$thename\s.*?$//gmis ; +	  if ($afmpl) { +		if ($pdftexmapdata =~ s/^$rawname\s.*?$//gmis) { +		  report ("removing raw file : $rawname") ; +		} +	  } +	  $maplist .= $str ; +	  $pdftexmapdata .= $str ;      } -    # check for redundant entries -    if ($map) { -        $mapdata =~ s/^$thename\s.*?$//gmis ; -        if ($afmpl) { -            if ($mapdata =~ s/^$rawname\s.*?$//gmis) { -               report ("removing raw file : $rawname") ; -            } -        } -        $maplist .= $str ; -        $mapdata .= $str ; +    ($str, $thename) = build_dvips_mapline($option, $usename, $fontname, $rawname, $cleanfont, $encoding, $varlabel, $strange); +	# check for redundant entries +    if (defined $DVIPSMAP) { +	  $dvipsmapdata =~ s/^$thename\s.*?$//gmis ; +	  if ($afmpl) { +		if ($dvipsmapdata =~ s/^$rawname\s.*?$//gmis) { +		  report ("removing raw file : $rawname") ; +		} +	  } +	  $dvipsmapdata .= $str ;      } +    ($str, $thename) = build_dvipdfm_mapline($option, $usename, $fontname, $rawname, $cleanfont, $encoding, $varlabel, $strange); +	# check for redundant entries +    if (defined $DVIPDFMMAP) { +	  $dvipdfmmapdata =~ s/^$thename\s.*?$//gmis ; +	  if ($afmpl) { +		if ($dvipdfmmapdata =~ s/^$rawname\s.*?$//gmis) { +		  report ("removing raw file : $rawname") ; +		} +	  } +	  $dvipdfmmapdata .= $str ; +    } +      # write lines to tex file      if (($strange eq "expert")&&($expert)) {          $fntlist .= "\\definefontsynonym[$cleanfont$namesuffix][$cleanname] \% expert\n" ; @@ -1090,14 +1309,13 @@ foreach my $file (@files)      }  } -if ($map) -  { report ("updating map file : $mapfile") ; -    while ($mapdata =~ s/\n\n+/\n/mois) {} ; -    $mapdata =~ s/^\s*//gmois ; -    print MAP $mapdata } +finish_mapfile("pdftex",  $PDFTEXMAP,  $pdftexmapdata); +finish_mapfile("dvipdfm", $DVIPDFMMAP, $dvipdfmmapdata); +finish_mapfile("dvips",   $DVIPSMAP,   $dvipsmapdata);  if ($tex) -  { $mappath =~ s/\\/\//go ; +  { my $mappath = mappath("pdftex"); +    $mappath =~ s/\\/\//go ;      $savedoptions =~ s/^\s+//gmois ; $savedoptions =~ s/\s+$//gmois ;      $fntlist      =~ s/^\s+//gmois ; $fntlist      =~ s/\s+$//gmois ;      $maplist      =~ s/^\s+//gmois ; $maplist      =~ s/\s+$//gmois ; @@ -1127,11 +1345,8 @@ if ($tex)      print TEX "\n" ;      print TEX "\\stoptext\n" } -if ($map) { close (MAP) }  if ($tex) { close (TEX) } -copy ($mapfile,"$mappath/$mapfile") ; -  # atl: global cleanup with generated files (afm & ttf don't mix)  UnLink(@cleanup) ; @@ -1146,9 +1361,9 @@ print "\n" ; system ("mktexlsr $fontroot") ; print "\n" ;  if ($show) { system ("texexec --once --silent $texfile") } -@files = validglob("$identifier.*") ; +@files = validglob("$identifier.* *-$identifier.map") ;  foreach my $file (@files) -  { unless ($file =~ /(tex|pdf|log|mp|tmp)$/io) { unlink $file } } +  { unless ($file =~ /(tex|pdf|log|mp|tmp)$/io) { UnLink ($file) } }  exit ; diff --git a/scripts/context/ruby/base/ctx.rb b/scripts/context/ruby/base/ctx.rb index 0baf5a88b..dff9570d8 100644 --- a/scripts/context/ruby/base/ctx.rb +++ b/scripts/context/ruby/base/ctx.rb @@ -84,7 +84,7 @@ class CtxRunner              end              if ! done && defaultname && FileTest.file?(defaultname) then                  report("using default ctxfile #{defaultname}") -                @ctxname = defaultname +                @ctxname, done = defaultname, true              end              if not done then                  report('no ctx file found') @@ -115,23 +115,34 @@ class CtxRunner              if @jobname then                  variables['job'] = @jobname              end -            REXML::XPath.each(@xmldata.root,"//ctx:value[@name='job']") do |val| +            root = @xmldata.root +            begin +                REXML::XPath.each(root,"//ctx:block") do |blk| +                    if @jobname && blk.attributes['pattern'] then +                        root.delete(blk) unless @jobname =~ /#{blk.attributes['pattern']}/ +                    else +                        root.delete(blk) +                    end +                end +            rescue +            end +            REXML::XPath.each(root,"//ctx:value[@name='job']") do |val|                  substititute(val,variables['job'])              end -            REXML::XPath.each(@xmldata.root,"/ctx:job/ctx:message") do |mes| +            REXML::XPath.each(root,"/ctx:job//ctx:message") do |mes|                  report("preprocessing: #{justtext(mes)}")              end -            REXML::XPath.each(@xmldata.root,"/ctx:job/ctx:process/ctx:resources/ctx:environment") do |sty| +            REXML::XPath.each(root,"/ctx:job//ctx:process/ctx:resources/ctx:environment") do |sty|                  @environments << justtext(sty)              end -            REXML::XPath.each(@xmldata.root,"/ctx:job/ctx:process/ctx:resources/ctx:module") do |mod| +            REXML::XPath.each(root,"/ctx:job//ctx:process/ctx:resources/ctx:module") do |mod|                  @modules << justtext(mod)              end -            REXML::XPath.each(@xmldata.root,"/ctx:job/ctx:process/ctx:resources/ctx:filter") do |fil| +            REXML::XPath.each(root,"/ctx:job//ctx:process/ctx:resources/ctx:filter") do |fil|                  @filters << justtext(fil)              end              commands = Hash.new -            REXML::XPath.each(@xmldata.root,"/ctx:job/ctx:preprocess/ctx:processors/ctx:processor") do |pre| +            REXML::XPath.each(root,"/ctx:job//ctx:preprocess/ctx:processors/ctx:processor") do |pre|                  begin                      commands[pre.attributes['name']] = pre                  rescue @@ -139,13 +150,13 @@ class CtxRunner              end              suffix = @@suffix              begin -                suffix = REXML::XPath.match(@xmldata.root,"/ctx:job/ctx:preprocess/@suffix").to_s +                suffix = REXML::XPath.match(root,"/ctx:job//ctx:preprocess/@suffix").to_s              rescue                  suffix = @@suffix              else                  if suffix && suffix.empty? then suffix = @@suffix end              end -            REXML::XPath.each(@xmldata.root,"/ctx:job/ctx:preprocess/ctx:files") do |files| +            REXML::XPath.each(root,"/ctx:job//ctx:preprocess/ctx:files") do |files|                  REXML::XPath.each(files,"ctx:file") do |pattern|                      preprocessor = pattern.attributes['processor']                      if preprocessor and not preprocessor.empty? then @@ -267,7 +278,7 @@ class CtxRunner                                          if f = File.open(fullname,'r') and i = REXML::Document.new(f) then                                              report("including ctx file #{name}")                                              REXML::XPath.each(i.root,"*") do |ii| -                                                xmldata.root.insert_after(e,ii) +                                                xmldata.root.insert_before(e,ii)                                                  more = true                                              end                                          end @@ -275,8 +286,8 @@ class CtxRunner                                      end                                  rescue                                  end +                                break if done                              end -                            break if done                          end                          report("no valid ctx inclusion file #{name}") unless done                      rescue Exception diff --git a/scripts/context/ruby/base/kpse.rb b/scripts/context/ruby/base/kpse.rb index b0321672f..bff3cc1fa 100644 --- a/scripts/context/ruby/base/kpse.rb +++ b/scripts/context/ruby/base/kpse.rb @@ -28,6 +28,10 @@ class String          end      end +    def sane_path +        self.gsub(/\\/,'/') +    end +  end  class Array @@ -36,6 +40,12 @@ class Array          self.join(File::PATH_SEPARATOR)      end +    def non_empty +        self.delete_if do |i| +            (i == nil || i.empty?) rescue false +        end +    end +  end  module Kpse @@ -96,42 +106,57 @@ module Kpse          @@scripts.keys.sort.each do |k| puts("scripts : #{k} -> #{@@scripts[k]}\n") end      end +    def Kpse.used_path(varname) +        begin +            if @@mswindows then +                path = run("--expand-path=\$#{varname}") rescue '' +            else +                path = run("--expand-path='$#{varname}'") rescue '' +            end +        rescue +            path = '' +        end +        return path.sane_path +    end +      def Kpse.found(filename, progname=nil, format=nil)          begin              tag = Kpse.key(filename) # all              if @@located.key?(tag) then -                return @@located[tag] +                return @@located[tag].sane_path              elsif FileTest.file?(filename) then                  setvariable(tag,filename)                  return filename              elsif FileTest.file?(File.join(@@ownpath,filename)) then                  setvariable(tag,File.join(@@ownpath,filename)) -                return @@located[tag] +                return @@located[tag].sane_path              else                  [progname,@@progname].flatten.compact.uniq.each do |prg|                      [format,@@formats].flatten.compact.uniq.each do |fmt|                          begin                              tag = Kpse.key(filename,prg,fmt)                              if @@located.key?(tag) then -                                return @@located[tag] +                                return @@located[tag].sane_path                              elsif p = Kpse.kpsewhich(filename,prg,fmt) then                                  setvariable(tag,p.chomp) -                                return @@located[tag] +                                return @@located[tag].sane_path                              end                          rescue                          end                      end                  end                  setvariable(tag,filename) -                return filename +                return filename.sane_path              end          rescue -            filename +            filename.sane_path          end      end      def Kpse.kpsewhich(filename,progname,format) -        Kpse.run("-progname=#{progname} -format=\"#{format}\" #{filename}") +        p = if progname && ! progname.empty? then "-progname=#{progname}" else '' end +        f = if format   && ! format.empty?   then "-format=\"#{format}\"" else '' end +        Kpse.run("#{p} #{f} #{filename}")      end      def Kpse.which @@ -160,7 +185,7 @@ module Kpse          # maybe we should check for writeability          unless @@paths.key?('formatpaths') then              begin -                setpath('formatpaths',run("--show-path=fmt").gsub(/\\/,'/').split_path) +                setpath('formatpaths',run("--show-path=fmt").sane_path.split_path)              rescue                  setpath('formatpaths',[])              end diff --git a/scripts/context/ruby/base/kpsefast.rb b/scripts/context/ruby/base/kpsefast.rb index 20c07c70a..24ff1a0fa 100644 --- a/scripts/context/ruby/base/kpsefast.rb +++ b/scripts/context/ruby/base/kpsefast.rb @@ -9,6 +9,8 @@  # www       : www.pragma-ade.com  # todo: multiple cnf files +# +# todo: cleanup, string or table store (as in lua variant)  class String diff --git a/scripts/context/ruby/base/mp.rb b/scripts/context/ruby/base/mp.rb index b30be1110..5dd2948cf 100644 --- a/scripts/context/ruby/base/mp.rb +++ b/scripts/context/ruby/base/mp.rb @@ -91,8 +91,8 @@ EOT                      f.puts("")                      f.puts(@@start[method])                  end -                data.gsub!(/[^\\]%.*?$/mo) do -                    '' +                data.gsub!(/([^\\])%.*?$/mo) do +                    $1                  end                  data.scan(/(verbatim|b)tex\s*(.*?)\s*etex/mo) do                      tag, text = $1, $2 diff --git a/scripts/context/ruby/base/tex.rb b/scripts/context/ruby/base/tex.rb index a6403dcde..f6f3dc4ed 100644 --- a/scripts/context/ruby/base/tex.rb +++ b/scripts/context/ruby/base/tex.rb @@ -85,6 +85,9 @@ class TEX      @@pdftex     = 'pdftex' # new default, pdfetex is gone +    @@luafiles  = "luafiles.tmp" +    @@luatarget = "lua/context" +      ENV['PATH'].split(File::PATH_SEPARATOR).each do |p|          if System.unix? then              pp, pe = "#{p}/pdftex"    , "#{p}/pdfetex" @@ -113,7 +116,7 @@ class TEX      ['pdfetex','pdftex','pdf','pdftex','standard'] .each do |b| @@backends[b]   = 'pdftex'    end      ['dvipdfmx','dvipdfm','dpx','dpm']             .each do |b| @@backends[b]   = 'dvipdfmx'  end      ['xetex','xtx']                                .each do |b| @@backends[b]   = 'xetex'     end -    ['dvips','ps']                                 .each do |b| @@backends[b]   = 'dvips'     end +    ['dvips','ps','dvi']                           .each do |b| @@backends[b]   = 'dvips'     end      ['dvipsone']                                   .each do |b| @@backends[b]   = 'dvipsone'  end      ['acrobat','adobe','distiller']                .each do |b| @@backends[b]   = 'acrobat'   end      ['xdv','xdv2pdf']                              .each do |b| @@backends[b]   = 'xdv2pdf'   end @@ -164,7 +167,7 @@ class TEX      @@runoptions['xetex']   = ['--8bit  -no-pdf'] # from now on we assume (x)dvipdfmx to be used      @@runoptions['pdfetex'] = ['--8bit ']      @@runoptions['pdftex']  = ['--8bit ']         # pdftex is now pdfetex -    @@runoptions['luatex']  = ['--8bit '] +    @@runoptions['luatex']  = ['']      @@runoptions['aleph']   = ['--8bit ']      @@booleanvars = [ @@ -225,6 +228,29 @@ class TEX          @@extrabooleanvars << vars      end +    # def jobvariables(names=nil) +        # if [names ||[]].flatten.size == 0 then +            # names = [allbooleanvars,allstringvars].flatten +        # end +        # data = Hash.new +        # names.each do |name| +            # if allbooleanvars.include?(name) then +                # data[name] = if getvariable(name) then "yes" else "no" end +            # else +                # data[name] = getvariable(name) +            # end +        # end +        # data +    # end + +    # def setjobvariables(names=nil) +        # assignments = Array.new +        # jobvariables(names).each do |k,v| +            # assignments << "#{k}=\{#{v}\}" +        # end +        # "\setvariables[exe][#{assignments.join(", ")}]" +    # end +      @@temprunfile = 'texexec'      @@temptexfile = 'texexec.tex' @@ -524,6 +550,41 @@ class TEX          return version      end +    def cleanupluafiles +        File.delete(@@luafiles) rescue false +    end + +    def compileluafiles +        begin +            Dir.glob("lua/context/*.luc").each do |luc| +                File.delete(luc) rescue false +            end +        rescue +        end +        if data = (IO.readlines(@@luafiles) rescue nil) then +            report("compiling lua files (using #{File.expand_path(@@luafiles)})") +            begin +                Dir.makedirs(@@luatarget) rescue false +                data.each do |line| +                    luafile = line.chomp +                    lucfile = File.basename(luafile).gsub(/\..*?$/,'') + ".luc" +                    if runcommand(["luac","-s","-o",quoted(File.join(Dir.getwd,@@luatarget,lucfile)),quoted(luafile)]) then +                        report("#{File.basename(luafile)} converted to #{File.basename(lucfile)}") +                    else +                        report("#{File.basename(luafile)} not converted to #{File.basename(lucfile)}") +                    end +                end +            rescue +                report("fatal error in compilation") +            end +        else +            report("no lua compilations needed") +        end +        File.delete(@@luafiles) rescue false +    end + +    # we need engine methods +      def makeformats          checktestversion @@ -561,9 +622,18 @@ class TEX                      makeuserfile                      makeresponsefile                  end -                texformats.each do |texformat| -                    report("generating tex format #{texformat}") -                    runcommand([quoted(texengine),prognameflag(progname),iniflag,tcxflag,prefixed(texformat,texengine),texmakeextras(texformat)]) +                if texengine == 'luatex' then +                    cleanupluafiles +                    texformats.each do |texformat| +                        report("generating tex format #{texformat}") +run_luatools("--ini --compile #{texformat}") +                    end +                    compileluafiles +                else +                    texformats.each do |texformat| +                        report("generating tex format #{texformat}") +                        runcommand([quoted(texengine),prognameflag(progname),iniflag,tcxflag,prefixed(texformat,texengine),texmakeextras(texformat)]) +                    end                  end              else                  report("unable to make format due to lack of permissions") @@ -592,8 +662,10 @@ class TEX              mpsformatpath = ''          end          # check for problems +        report("")          report("tex engine path: #{texformatpath}") unless texformatpath.empty?          report("mps engine path: #{mpsformatpath}") unless mpsformatpath.empty? +        report("")          [['fmt','tex'],['mem','mps']].each do |f|              [[texformatpath,'global'],[mpsformatpath,'global'],[savedpath,'current']].each do |p|                  begin @@ -601,11 +673,20 @@ class TEX                  rescue                  else                      Dir.glob("*.#{f[0]}").each do |file| -                        report("#{f[1]}format: #{filestate(file)} > #{File.expand_path(file)}") +                        report("#{f[1]}: #{filestate(file)} > #{File.expand_path(file)} (#{File.size(file)})")                      end                  end              end          end +        begin +            lucdir = File.join(texformatpath,@@luatarget) +            Dir.chdir(lucdir) +        rescue +        else +            Dir.glob("*.luc").each do |file| +                report("luc: #{filestate(file)} > #{File.expand_path(file)} (#{File.size(file)})") +            end +        end          # to be sure, go back to current path          begin              Dir.chdir(savedpath) @@ -613,6 +694,7 @@ class TEX          end          # finalize          cleanup +        report("")          reportruntime      end @@ -853,10 +935,10 @@ class TEX          rname = File.unsuffixed(resultname)          if ! rname.empty? && (rname != fname) then              report("outputfile #{rname}") -            ['tuo','log','dvi','pdf'].each do |s| +            ['tuo','tuc','log','dvi','pdf'].each do |s|                  File.silentrename(File.suffixed(fname,s),File.suffixed('texexec',s))              end -            ['tuo'].each do |s| +            ['tuo','tuc'].each do |s|                  File.silentrename(File.suffixed(rname,s),File.suffixed(fname,s)) if FileTest.file?(File.suffixed(rname,s))              end          end @@ -867,12 +949,12 @@ class TEX          rname = File.unsuffixed(resultname)          if ! rname.empty? && (rname != fname) then              report("renaming #{fname} to #{rname}") -            ['tuo','log','dvi','pdf'].each do |s| +            ['tuo','tuc','log','dvi','pdf'].each do |s|                  File.silentrename(File.suffixed(fname,s),File.suffixed(rname,s))              end              report("restoring #{fname}")              unless $fname == 'texexec' then -                ['tuo','log','dvi','pdf'].each do |s| +                ['tuo','tuc','log','dvi','pdf'].each do |s|                      File.silentrename(File.suffixed('texexec',s),File.suffixed(fname,s))                  end              end @@ -1034,6 +1116,20 @@ class TEX      public +    def run_luatools(args) +        # dirty trick: we know that the lua path is relative to the ruby path; of course this +        # will not work well when stubs are used +        [(ENV["_CTX_K_S_texexec_"] or ENV["_CTX_K_S_THREAD_"] or ENV["TEXMFSTART.THREAD"]), File.dirname($0)].each do |path| +            if path then +                script = "#{path}/../lua/luatools.lua" +                if FileTest.file?(script) then +                    return runcommand("lua #{script} #{args}") +                end +            end +        end +        return runcommand("texmfstart luatools #{args}") +    end +      def processmpgraphic          getarrayvariable('files').each do |filename|              setvariable('filename',filename) @@ -1126,6 +1222,38 @@ class TEX          reportruntime      end +    def processmpstatic +        if filename = getvariable('filename') then +            filename += ".mp" unless filename =~ /\..+?$/ +            if FileTest.file?(filename) then +                begin +                    data = IO.read(filename) +                    File.open("texexec.tex",'w') do |f| +                        f << "\\setupoutput[pdftex]\n" +                        f << "\\setupcolors[state=start]\n" +                        data.sub!(/^%mpenvironment\:\s*(.*?)$/mois) do +                            f << $1 +                            "\n" +                        end +                        f << "\\starttext\n" +                        f << "\\startMPpage\n" +                        f << data.gsub(/end\.*\s*$/m, '') # a bit of a hack +                        f << "\\stopMPpage\n" +                        f << "\\stoptext\n" +                    end +                    report("converting static '#{filename}'") +                    runtex("texexec.tex") +                    pdffile = File.suffixed(filename,'pdf') +                    File.silentrename("texexec.pdf",pdffile) +                    report ("#{filename} converted to #{pdffile}") +                rescue +                    report("error in converting #{filename} (#{$!}") +                end +            end +        end +        reportruntime +    end +      def processmpxtex          getarrayvariable('files').each do |filename|              setvariable('filename',filename) @@ -1372,7 +1500,11 @@ class TEX          report("progname: #{progname}")          if texengine && texformat && progname then              fixbackendvars(@@mappaths[texengine]) +if texengine == "luatex" then +    run_luatools("--fmt=#{texformat} #{filename}") +else              runcommand([quoted(texengine),prognameflag(progname),formatflag(texengine,texformat),tcxflag,runoptions(texengine),filename,texprocextras(texformat)]) +end              # true          else              false @@ -1451,7 +1583,25 @@ class TEX          end      end -    # 1=tex 2=mptex 3=mpxtex 4=mpgraphic +    def runluacheck(jobname) +        if false then +            # test-pos.tex / 6 meg tua file: 18.6 runtime +            old, new = File.suffixed(jobname,'tua'), File.suffixed(jobname,'tuc') +            if FileTest.file?(old) then +                report("converting #{old} into #{new}") +                system("luac -s -o #{new} #{old}") +            end +        else +            # test-pos.tex / 6 meg tua file: 17.5 runtime +            old, new = File.suffixed(jobname,'tua'), File.suffixed(jobname,'tuc') +            if FileTest.file?(old) then +                report("renaming #{old} into #{new}") +                File.rename(old,new) rescue false +            end +        end +    end + +    # 1=tex 2=mptex 3=mpxtex 4=mpgraphic 5=mpstatic      def runtexexec(filename=[], options=[], mode=nil)          begin @@ -1470,6 +1620,7 @@ class TEX                      when 2 then job.processmptex                      when 3 then job.processmpxtex                      when 4 then job.processmpgraphic +                    when 5 then job.processmpstatic                  end                  job.inspect && Kpse.inspect if getvariable('verbose')                  return true @@ -1658,6 +1809,7 @@ class TEX                          ok = runtex(if dummyfile || forcexml then rawbase else rawname end)                          if ok then                              ok = runtexutil(rawbase) if getvariable('texutil') || getvariable('forcetexutil') +                            runluacheck(rawbase)                              runbackend(rawbase)                              popresult(rawbase,result)                          end @@ -1667,10 +1819,11 @@ class TEX                              end                          end                      else +# goto tmp/jobname when present                          mprundone, ok, stoprunning = false, true, false                          texruns, nofruns = 0, getvariable('runs').to_i                          state = FileState.new -                        ['tub','tuo'].each do |s| +                        ['tub','tuo','tuc'].each do |s|                              state.register(File.suffixed(rawbase,s))                          end                          if getvariable('automprun') then # check this @@ -1690,13 +1843,16 @@ class TEX                                      makeoptionfile(rawbase,jobname,orisuffix,false,false,2,texruns) # unknown                                  end                              end +# goto .                              ok = runtex(File.suffixed(if dummyfile || forcexml then rawbase else rawname end,jobsuffix)) +# goto tmp/jobname when present                              if ok && (nofruns > 1) then                                  unless getvariable('nompmode') then                                      mprundone = runtexmpjob(rawbase, "mpgraph")                                      mprundone = runtexmpjob(rawbase, "mprun")                                  end                                  ok = runtexutil(rawbase) +                                runluacheck(rawbase)                                  state.update                                  stoprunning = state.stable?                              end @@ -1704,11 +1860,16 @@ class TEX                          if not ok then                              setvariable('error','error in tex file')                          end -                        ok = runtexutil(rawbase) if (nofruns == 1) && getvariable('texutil') +                        if (nofruns == 1) && getvariable('texutil') then +                            ok = runtexutil(rawbase) +                            runluacheck(rawbase) +                        end                          if ok && finalrun && (nofruns > 1) then                              makeoptionfile(rawbase,jobname,orisuffix,true,finalrun,4,texruns) unless getvariable('nooptionfile')                              report("final TeX run #{texruns}") +# goto .                              ok = runtex(File.suffixed(if dummyfile || forcexml then rawbase else rawname end,jobsuffix)) +# goto tmp/jobname when present                          end                          if getvariable('keep') then                              ['top','log','run'].each do |suffix| @@ -1721,8 +1882,11 @@ class TEX                               # File.silentdelete(File.suffixed(rawbase,s))                          # end                          if ok then +# goto .                              runbackend(rawbase)                              popresult(rawbase,result) +# goto tmp/jobname when present +# skip next                          end                          if true then # autopurge                              begin @@ -1755,14 +1919,14 @@ class TEX                                      end                                  end                              rescue -                                report("fatal error #{$!}") +                                # report("fatal error #{$!}")                              end                          end                      end                      Kpse.runscript('ctxtools',rawbase,'--purge')       if getvariable('purge')                      Kpse.runscript('ctxtools',rawbase,'--purge --all') if getvariable('purgeall') - +# till here                  when 'latex' then                      ok = runtex(rawname) @@ -1913,7 +2077,7 @@ class TEX      def purge_mpx_files(mpname)          unless getvariable('keep') then -            ['tex', 'log', 'tui', 'tuo', 'top'].each do |suffix| +            ['tex', 'log', 'tui', 'tuo', 'tuc', 'top'].each do |suffix|                  File.silentdelete(File.suffixed(mpname,'temp',suffix))              end          end diff --git a/scripts/context/ruby/base/texutil.rb b/scripts/context/ruby/base/texutil.rb index 2bca83167..7c402b98f 100644 --- a/scripts/context/ruby/base/texutil.rb +++ b/scripts/context/ruby/base/texutil.rb @@ -235,7 +235,11 @@ class TeXUtil          end          def tokenize(str) -            str.gsub(/\\strchr\{(.*?)\}/o) do "\\#{$1}" end +            if str then +                str.gsub(/\\strchr\{(.*?)\}/o) do "\\#{$1}" end +            else +                "" +            end          end          def remap(str) @@ -461,7 +465,6 @@ class TeXUtil              class Synonym                  @@debug = false -                @@debug = true                  def initialize(t, c, k, d)                      @type, @command, @key, @sortkey, @data = t, c, k, k, d @@ -559,7 +562,6 @@ class TeXUtil                  @@specialbanner = "" # \\relax"                  @@debug = false -                @@debug = true                  @@howto = /^(.*?)\:\:(.*)$/o                  @@split = ' && ' @@ -598,7 +600,8 @@ class TeXUtil                              # end                          end                      else -                        @entry, @key = cleanupsplit(@entry), cleanupsplit(@key) +                        # @entry, @key = cleanupsplit(@entry), cleanupsplit(@key) +@entry, @key = cleanupsplit(@entry), xcleanupsplit(@key)                      end                      @sortkey = sorter.simplify(@key)                      # special = @sortkey =~ /^([^a-zA-Z\\])/o @@ -613,7 +616,7 @@ class TeXUtil                          @entry,                          @texthowto.ljust(10,' '),                          # @state, # no, messes up things -                        (@realpage ||'').rjust(6,' ').gsub(/0/,' '), +                        (@realpage.to_s || '').rjust(6,' ').gsub(/0/,' '),                          # (@realpage ||'').rjust(6,' '),                          @pagehowto                      ].join(@@split) @@ -628,6 +631,23 @@ class TeXUtil                      end                  end +def xcleanupsplit(target) # +a+b+c &a&b&c a+b+c a&b&c +    t = Array.new +    case target[0,1] +        when '&' then +            t = target.sub(/^./o,'').split(/([^\\])\&/o) +        when '+' then +            t = target.sub(/^./o,'').split(/([^\\])\+/o) +        else +            # t = target.split(/([^\\])[\&\+]/o) +            # t = target.split(/[\&\+]/o) +            t = target.split(/(?!\\)[\&\+]/o) # lookahead +    end +    if not t[1] then t[1] = " " end # we need some entry else we get subentries first +    if not t[2] then t[2] = " " end # we need some entry else we get subentries first +    return t.join(@@split) +end +                  def <=> (other)                      @sortkey <=> other.sortkey                  end @@ -659,11 +679,13 @@ class TeXUtil                          alphaclass, alpha = '', ''                          @@savedhowto, @@savedfrom, @@savedto, @@savedentry = '', '', '', ''                          if @@debug then +                        # if true then                              list.each do |entry|                                  handle << "% [#{entry.sortkey.gsub(/#{@@split}/o,'] [')}]\n"                              end                          end                          list.each do |entry| +# puts(entry.sortkey.gsub(/\s+/,""))                              if entry.sortkey =~ /^(\S+)/o then                                  if sorter.division?($1) then                                      testalpha = sorter.getdivision($1) @@ -738,6 +760,7 @@ class TeXUtil                              elsif @@savedhowto != entry.pagehowto and ! entry.pagehowto.empty? then                                  @@savedhowto = entry.pagehowto                              end +                            # beware, we keep multiple page entries per realpage because of possible prefix usage                              if copied || ! ((lastpage == entry.page) && (lastrealpage == entry.realpage)) then                                  nextentry = "{#{entry.type}}{#{previous[0]}}{#{previous[1]}}{#{previous[2]}}{#{entry.pagehowto},#{entry.texthowto}}"                                  savedline = "{#{entry.type}}{#{@@savedhowto},#{entry.texthowto}}{#{entry.location}}{#{entry.page}}{#{entry.realpage}}" @@ -791,7 +814,8 @@ class TeXUtil                          @@registers[data[1]].push(Register.new(3,data[1],data[2],data[3],data[4],nil,data[5],data[6]))                      when 's' then                          @@registers[data[1]] = Array.new unless @@registers.key?(data[1]) -                        @@registers[data[1]].push(Register.new(4,data[1],data[2],data[3],data[4],data[5],data[6],nil)) +                        # was this but wrong sort order       (4,data[1],data[2],data[3],data[4],data[5],data[6],nil)) +                        @@registers[data[1]].push(Register.new(4,data[1],data[2],data[3],data[4],data[5],data[6],0))                      when 'l' then                          @@languages[data[1]] = data[2] || ''                  end @@ -820,6 +844,7 @@ class TeXUtil                      @@registers[s].each_index do |i|                          @@registers[s][i].build(@@sorter[s])                      end +                    # @@registers[s].uniq!                      @@registers[s] = @@registers[s].sort                  end              end diff --git a/scripts/context/ruby/concheck.rb b/scripts/context/ruby/concheck.rb index bf09bbdc8..6c7512bff 100644 --- a/scripts/context/ruby/concheck.rb +++ b/scripts/context/ruby/concheck.rb @@ -223,6 +223,7 @@ def some_chr_error(data, filename, left, right)      levels = Array.new      for line in 0..data.length-1 do           str = data[line] +         # str = data[line].gsub(/\\[\#{left}\#{right}]/,'')           column = 0           while column<str.length do              case str[column].chr @@ -365,6 +366,7 @@ end  # todo : language dependent  def check_file_tex (filename) +    error = false      if data = load_file(filename) then          message("checking tex file", filename)          interface = guess_interface(data) @@ -372,42 +374,49 @@ def check_file_tex (filename)          data = cleanup_data(data,interface)          # data.each do |d| print d  end          $valid[interface].each do |v| -            return false if some_wrd_error(data, filename, v[0], v[1] ,$valid_tex) +            if some_wrd_error(data, filename, v[0], v[1] ,$valid_tex) then +                error = true +                break +            end          end          # return false if some_wrd_error(data, filename, '\\\\start'   , '\\\\stop'   , $valid_tex)          # return false if some_wrd_error(data, filename, '\\\\Start'   , '\\\\Stop'   , $valid_tex)          # return false if some_wrd_error(data, filename, '\\\\beginvan', '\\\\eindvan', $valid_tex)          # return false if some_wrd_error(data, filename, '\\\\begin'   , '\\\\end|\\\\eind', $valid_tex) -        return false if some_sym_error(data, filename, '$', false) -        return false if some_sym_error(data, filename, '|', true) -        return false if some_chr_error(data, filename, '{', '}') -        return false if some_chr_error(data, filename, '[', ']') -        return false if some_chr_error(data, filename, '(', ')') -        return false if some_key_error(data, filename, valid) -        message("no errors in tex code", filename) -        return true +        error = true if some_sym_error(data, filename, '$', false) +        error = true if some_sym_error(data, filename, '|', true) +        error = true if some_chr_error(data, filename, '{', '}') +        error = true if some_chr_error(data, filename, '[', ']') +        error = true if some_chr_error(data, filename, '(', ')') +        error = true if some_key_error(data, filename, valid) +        message("no errors in tex code", filename) unless error +        return error      else          return false      end  end  def check_file_mp (filename) +    error = false      if data = load_file(filename) then          message("checking metapost file", filename)          interface = guess_interface(data)          valid = load_valid(data,interface)          $valid[interface].each do |v| -            return false if some_wrd_error(data, filename, v[0], v[1] ,$valid_tex) +            if some_wrd_error(data, filename, v[0], v[1] ,$valid_tex) then +                error = true +                break +            end          end          # return false if some_wrd_error(data, filename, '', 'begin', 'end', $valid_mp) -        return false if some_chr_error(data, filename, '{', '}') -        return false if some_chr_error(data, filename, '[', ']') -        return false if some_chr_error(data, filename, '(', ')') -        return false if some_key_error(data, filename, valid) -        message("no errors in metapost code", filename) -        return true +        error = true if some_chr_error(data, filename, '{', '}') +        error = true if some_chr_error(data, filename, '[', ']') +        error = true if some_chr_error(data, filename, '(', ')') +        error = true if some_key_error(data, filename, valid) +        message("no errors in metapost code", filename) unless error +        return error      else -        return true +        return false      end  end @@ -440,7 +449,7 @@ def check_file(filename='')          when '' then              message("provide filename")              return false -        when /\.tex$/i then +        when /\.(tex|mk.+)$/i then              return check_file_tex(filename) # && check_file_text(filename)          when /\.mp$/i then              return check_file_mp(filename) @@ -450,12 +459,13 @@ def check_file(filename='')      end  end -if filename = ARGV[0] then -    if check_file(filename) then -        exit 0 -    else -        exit 1 +if ARGV.size > 0 then +    someerror = false +    ARGV.each do |filename| +         somerror = true if check_file(filename)      end +    exit (if someerror then 1 else 0 end)  else      exit 1  end + diff --git a/scripts/context/ruby/ctxtools.rb b/scripts/context/ruby/ctxtools.rb index 0cf96e10d..567c927a5 100644 --- a/scripts/context/ruby/ctxtools.rb +++ b/scripts/context/ruby/ctxtools.rb @@ -46,16 +46,13 @@  banner = ['CtxTools', 'version 1.3.3', '2004/2006', 'PRAGMA ADE/POD'] -# todo dirname - -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger'  require 'base/system' +require 'base/kpse' +require 'base/file'  require 'rexml/document'  require 'net/http' @@ -86,6 +83,10 @@ class String          end      end +    def nosuffix(suffix) +        self.sub(/\.#{suffix}/,'') # no /o +    end +  end  class Commands @@ -108,7 +109,7 @@ class Commands          maincontextfile = 'context.tex'          unless FileTest.file?(maincontextfile) then              begin -                maincontextfile = `kpsewhich -progname=context #{maincontextfile}`.chomp +                maincontextfile = Kpse.found(maincontextfile,'context')              rescue                  maincontextfile = ''              end @@ -417,6 +418,8 @@ class Commands      public +    # faster is to glob the whole dir and regexp over that list +      def purgefiles          pattern  = @commandline.arguments @@ -444,13 +447,16 @@ class Commands              files = Dir.glob(globbed)              report("purging#{if purgeall then ' all' end} temporary files : #{globbed}")          else +            report("purging#{if purgeall then ' all' end} temporary files : #{pattern.join(' ')}")              pattern.each do |pat| -                globbed = if recurse then "**/#{pat}-*.*" else "#{pat}-*.*" end +                nosuf = File.unsuffixed(pat) +                globbed = if recurse then "**/#{nosuf}-*.*" else "#{nosuf}-*.*" end +                report("checking files that match '#{globbed}'")                  files = Dir.glob(globbed) -                globbed = if recurse then "**/#{pat}.*" else "#{pat}.*" end +                globbed = if recurse then "**/#{nosuf}.*" else "#{nosuf}.*" end +                report("checking files that match '#{globbed}'")                  files.push(Dir.glob(globbed))              end -            report("purging#{if purgeall then ' all' end} temporary files : #{pattern.join(' ')}")          end          files.flatten!          files.sort! @@ -522,6 +528,7 @@ class Commands      $dontaskprefixes = [          # "tex-form.tex", "tex-edit.tex", "tex-temp.tex",          "texexec.tex", "texexec.tui", "texexec.tuo", +        "texexec.tuc", "texexec.tua",          "texexec.ps", "texexec.pdf", "texexec.dvi",          "cont-opt.tex", "cont-opt.bak"      ] @@ -531,7 +538,7 @@ class Commands          "xlscript\\.xsl"      ]      $forsuresuffixes = [ -        "tui", "tup", "ted", "tes", "top", +        "tui", "tua", "tup", "ted", "tes", "top",          "log", "tmp", "run", "bck", "rlg",          "mpt", "mpx", "mpd", "mpo", "mpb",          "ctl", @@ -541,7 +548,7 @@ class Commands          "dvi", "ps", "pdf"      ]      $texnonesuffixes = [ -        "tuo", "tub", "top" +        "tuo", "tub", "top", "tuc"      ]      $dummyfiles = [          "mpgraph" @@ -639,7 +646,7 @@ class Commands                  nofdocuments, nofdefinitions, nofskips = 0, 0, 0                  skiplevel, indocument, indefinition, skippingbang = 0, false, false, false                  if processtype.empty? then -                  filetype = filesuffix.downcase +                  filetype = filesuffix.downcase.sub(/^mk.+$/,'tex') # make sure that mkii and mkiv files are handled                  else                    filetype = processtype.downcase                  end @@ -1049,7 +1056,7 @@ class Language          commentfile = rmename.dup          begin -            desfile = `kpsewhich -progname=context #{desname}`.chomp +            desfile = Kpse.found(desname,'context')              if f = File.new(desfile) then                  if doc = REXML::Document.new(f) then                      if e = REXML::XPath.first(doc.root,"/descriptions/description[@language='#{@language}']") then @@ -1188,7 +1195,7 @@ class Language      def located(filename)          begin -            fname = `kpsewhich -progname=context #{filename}`.chomp +            fname = Kpse.found(filename, 'context')              if FileTest.file?(fname) then                  report("using file #{fname}")                  return fname @@ -1519,7 +1526,7 @@ class Language          if ! encoding.empty? then              begin -                filename = `kpsewhich -progname=context #{filename}` +                filename = Kpse.found(filename, 'context')                  if data = IO.readlines(filename.chomp) then                      report("preloading #{encoding} character mappings")                      accept = false @@ -1865,8 +1872,7 @@ class Commands          entities   = Hash.new          filenames.each do |filename| -          # filename = `texmfstart tmftools.rb --progname=context #{filename}`.chomp -            filename = `kpsewhich --progname=context #{filename}`.chomp +            filename = Kpse.found(filename, 'context')              if filename and not filename.empty? and FileTest.file?(filename) then                  report("loading #{filename.gsub(/\\/,'/')}") unless outputname.empty?                  IO.readlines(filename).each do |line| @@ -1874,7 +1880,7 @@ class Commands                          when /^[\#\%]/io then                              # skip comment line                          when /\\definecharacter\s+([a-z]+)\s+\{\\uchar\{*(\d+)\}*\{(\d+)\}\}/io then -                            name, code = $1, ($2.to_i*256 + $3.to_i).to_s +                            name, code = $1, sprintf("%04X",$2.to_i*256 + $3.to_i)                              entities[name] = code.rjust(4,'0') unless entities.key?(name)                          when /^([A-F0-9]+)\;([a-z][a-z]+)\;(.*?)\;(.*?)\s*$/io then                              code, name, adobe, comment = $1, $2, $3, $4 @@ -2076,187 +2082,424 @@ class TexDeps          noInputMode noOutputMode noDefaultInputMode noDefaultOutputMode      /.split -    @@cs_plain = %q/ -        TeX -        bgroup egroup endgraf space empty null -        newcount newdimen newskip newmuskip newbox newtoks newhelp newread newwrite newfam newlanguage newinsert newif -        maxdimen magstephalf magstep -        frenchspacing nonfrenchspacing normalbaselines obeylines obeyspaces raggedright ttraggedright -        thinspace negthinspace enspace enskip quad qquad -        smallskip medskip bigskip removelastskip topglue vglue hglue -        break nobreak allowbreak filbreak goodbreak smallbreak medbreak bigbreak -        line leftline rightline centerline rlap llap underbar strutbox strut -        cases matrix pmatrix bordermatrix eqalign displaylines eqalignno leqalignno -        pageno folio tracingall showhyphens fmtname fmtversion -        hphantom vphantom phantom smash +    @@cs_metatex = %q/      /.split -    @@cs_eplain = %q/ -        eTeX -        newmarks grouptype interactionmode nodetype iftype -        tracingall loggingall tracingnone +    @@cs_xetex = %q/ +    /.split + +    @@cs_skip = %q/ +        v\! c\! s\! e\! m\! f\! +        \!tf \!tt \!tq \!ta \?\? +        csname endcsname relax +        \!\!string[a-f] \!\!dimen[a-k] \!\!count[a-f] \!\!toks[a-e] \!\!box[a-e] +        \!\!width[a-c] \!\!height[a-c] \!\!depth[a-c] +        \!\!done[a-f] if\!\!done[a-f] if\:\!\!done[a-f] +        scratch globalscratch +        ascii[a-d] globalascii +        @@expanded @@globalexpanded @EA @EAEA @EAEAEA +        bgroup egroup par next nextnext docommand dodocommand dododocommand +        \!\!width \!\!height \!\!depth \!\!plus \!\!minus \!\!to +    /.split + +    @@cs_skip = %q/ +        [vcsemf]\! \?\? +        \!t[ftqa] +        csname endcsname relax +        \!\!string[a-f] \!\!dimen[a-k] \!\!count[a-f] \!\!toks[a-e] \!\!box[a-e] +        \!\!width[a-c] \!\!height[a-c] \!\!depth[a-c] +        \!\!done[a-f] if\!\!done[a-f] if\:\!\!done[a-f] +        scratch globalscratch +        ascii[a-d] globalascii +        @@expanded @@globalexpanded @(EA)+ +        [be]group par next nextnext (do)+command +        \!\!(width|height|depth|plus|minus|to)      /.split      # let's ignore \dimendef etc -    @@primitives_def = "def|edef|xdef|gdef|let|newcount|newdimen|newskip|newbox|newtoks|newmarks|chardef|mathchardef|newconditional" +    @@primitives_def = %q/ +         def edef xdef gdef let +         newcount newdimen newskip newbox newtoks newmarks newif newinsert newmuskip +         chardef mathchardef dimendef countdef toksdef +         newconditional definecomplexorsimple definecomplexorsimpleempty +         newcounter newpersistentmark +         installinsertion installspecial\s*\\[* installoutput\s*\\[* +    /.split -    @@cs_global  = [@@cs_tex,@@cs_etex,@@cs_pdftex,@@cs_omega].sort.flatten -    @@types      = [['invalid','*'],['okay','='],['forward','>'],['backward','<'],['unknown','?']] +    @@types = [['invalid','*'],['okay','='],['forward','>'],['backward','<'],['unknown','?']] + +    @@skips = /^(#{@@cs_skip.join('|')})/o + +    def initialize(logger=nil,compact=false) +        @defined      = Hash.new +        @definitive   = Hash.new +        @used_before  = Hash.new +        @used_after   = Hash.new +        @dependencies = Hash.new +        @fineorder    = Hash.new +        @forward      = Hash.new +        @backward     = Hash.new +        @disorder     = Hash.new +        @disordercs   = Hash.new +        @type         = Hash.new +        @filename     = 'context.tex' +        @files        = Array.new # keep load order ! +        @order        = Hash.new +        @logger       = logger +        @filefilter   = nil +        @namefilter   = nil +        @compact      = compact +        # +        @@cs_tex.each     do |cs| @defined[cs] = ['-tex--------'] end +        @@cs_etex.each    do |cs| @defined[cs] = ['-etex-------'] end +        @@cs_pdftex.each  do |cs| @defined[cs] = ['-pdftex-----'] end +        @@cs_omega.each   do |cs| @defined[cs] = ['-omega------'] end +        @@cs_xetex.each   do |cs| @defined[cs] = ['-xetex------'] end +        @@cs_metatex.each do |cs| @defined[cs] = ['-metatex----'] end +    end -    def initialize(logger=nil) -        @cs_local = Hash.new -        @cs_new   = Hash.new -        @cs_defd  = Hash.new -        @cs_used  = Hash.new -        @filename = 'context.tex' -        @files    = Array.new # keep load order ! -        @compact  = false -        @logger   = logger +    def report(str) +        @logger.report(str) rescue false      end -    def load(filename='context.tex',omitlist=['mult-com.tex']) +    def setfilter(data) +        data.split(/\s*\,\s*/).each do |d| +            if d =~ /\.tex$/ then +                @filefilter = Array.new unless @filefilter +                @filefilter << d +            else +                @namefilter = Array.new unless @namefilter +                @namefilter << d +            end +        end +    end + +    def load(filename='context.tex')          begin              @filename = filename +            n = 0              File.open(filename) do |f|                  f.each do |line| -                    if line =~ /^\\input\s+(\S+)\s*/o then -                        @files.push($1) unless omitlist.include?(File.basename($1)) +                    if line =~ /^(\\input\s+|\\load[a-z]+\{)([a-z\-\.]+)(\}*)/ then +                        ante, name, post = $1, $2, $3 +                        @files.push(name) +                        @order[name] = n += 1                      end                  end              end          rescue              @files = Array.new +            @order = Hash.new +        end +    end + +    def save(filename='context.tex') +        unless @filefilter || @namefilter then +            begin +                data = IO.readlines(filename).each do |line| +                    line.gsub!(/^(\\input\s+|\\load[a-z]+\{)([a-z\-\.]+)(\}*)\s*$/) do +                        ante, name, post = $1, $2, $3 +                        fin = (@fineorder[name]    || [])-[name] +                        dep = (@dependencies[name] || [])-[name] +                        dis = (@disorder[name]     || [])-[name] +                        fin = if fin.size > 0 then " B[#{fin.join(' ')}]" else "" end +                        dep = if dep.size > 0 then " A[#{dep.join(' ')}]" else "" end +                        dis = if dis.size > 0 then " D[#{dis.join(' ')}]" else "" end +                        "#{ante}#{name}#{post} %#{fin}#{dep}#{dis}\n" +                    end +                end +            rescue +                report("error: #{$!}") +            else +                begin +                    newname = filename.sub(/\..*$/,'.log') +                    report("") +                    report("writing to #{newname}") +                    report("") +                    File.open(newname,'w') do |f| +                        f << data +                    end +                rescue +                    report("error: #{$!}") +                end +            end          end      end      def analyze +        report('') +        report("loading files") +        report('') +        n = 0          @files.each do |filename|              if f = File.open(filename) then -                @logger.report("loading #{filename}") if @logger -                defs, uses, n = 0, 0, 0 +                defs, uses, l = 0, 0, 0 +                n += 1 +                report("#{n.to_s.rjust(5,' ')} #{filename}")                  f.each do |line| -                    n += 1 +                    l += 1 +                    line.chomp! + + +                    line.sub!(/\%.*$/, '') +                    line.gsub!(/\\(unexpanded|unprotected|global|protected|long)\s*(\\)/, "\\") +                    # the superseded, overloaded, forwarded, and predefined macros +                    # are at the outer level anyway, so there we may ignore leading +                    # spaces (could be inside an \if); other definitions are only +                    # accepted when they start at the beginning of a line                      case line -                        when /^%/ -                            # skip -                        when /\\newif\s*\\if([a-zA-Z@\?\!]+)/ then -                            pushdef(filename,n,"if:#{$1}") -                        when /\\([a-zA-Z@\?\!]+)(true|false)/ then -                            pushuse(filename,n,"if:#{$1}") -                        when /^\s*\\(#{@primitives_def})\\([a-zA-Z@\?\!]{3,})/o -                            pushdef(filename,n,$2) -                        when /\\([a-zA-Z@\?\!]{3,})/o -                            pushuse(filename,n,$1) +                        when /^\\ifx\s*\\[a-zA-Z\@\!\?]+\s*\\undefined\s*(\\else)*(.*?)$/ then +                            if $2 =~ /^\s*\\(#{@@primitives_def.join('|')})\s*\\([a-zA-Z\@\?\!]{3,})/o then +                                pushdef(filename,l,$2,5) # kind of auto-predefined +                            end +                        when /^\s*\\superseded\s*\\(#{@@primitives_def.join('|')})\s*\\([a-zA-Z\@\?\!]{3,})(.*)$/o +                            name, rest = $2, $3 +                            pushdef(filename,l,name,1) +                            moreuse(filename,l,rest) +                        when /^\s*\\overloaded\s*\\(#{@@primitives_def.join('|')})\s*\\([a-zA-Z\@\?\!]{3,})(.*)$/o +                            name, rest = $2, $3 +                            pushdef(filename,l,name,2) +                            moreuse(filename,l,rest) +                        when /^\s*\\forwarded\s*\\(#{@@primitives_def.join('|')})\s*\\([a-zA-Z\@\?\!]{3,})(.*)$/o +                            name, rest = $2, $3 +                            pushdef(filename,l,name,3) +                            moreuse(filename,l,rest) +                        when /^\s*\\predefined\s*\\(#{@@primitives_def.join('|')})\s*\\([a-zA-Z\@\?\!]{3,})(.*)$/o +                            name, rest = $2, $3 +                            pushdef(filename,l,name,4) +                            moreuse(filename,l,rest) +                        when /^\\(#{@@primitives_def.join('|')})[\=\s]*\\([a-zA-Z\@\?\!]{3,})(.*)$/o +                            name, rest = $2, $3 # \=* catches the \let \a = \b +                            pushdef(filename,l,name,0) +                            moreuse(filename,l,rest) +                        when /\\newevery\s*\\([a-zA-Z\@\?\!]+)\s*\\([a-zA-Z\@\?\!]+)/ then +                            a, b = $1, $2 +                            pushdef(filename,l,a,0) +                            pushdef(filename,l,b,0) +                        else +                            moreuse(filename,l,line)                      end                  end                  f.close              end          end +        @used_after.each do |cs,files| +            (@defined[cs] || []).each do |name| +                @dependencies[name] = Array.new unless @dependencies[name] +                files.each do |file| +                    @dependencies[name] << file unless @dependencies[name].include?(file) +                end +            end +        end +        @used_before.each do |cs,files| +            (@defined[cs] || []).each do |name| +                @disorder[name]   = Array.new unless @disorder[name] +                @disordercs[name] = Array.new unless @disordercs[name] +                @fineorder[name]  = Array.new unless @fineorder[name] +                files.each do |file| +                    unless @disorder[name].include?(file) || name == file then +                        unless @defined[cs].include?(file) then +                            if @order[name] > @order[file] then +                                @disorder[name]   << file +                                @disordercs[name] << "#{file}:#{cs}" +                            end +                        end +                    end +                    @fineorder[name] << file unless @fineorder[name].include?(file) || name == file +                end +            end +        end      end -    def feedback(compact=false) +    def moreuse(filename,l,line) +        line.scan(/\\if([a-zA-Z@\?\!]{3,})/) do |name, rest| # rest, else array +            pushuse(filename,l,"if#{name}") unless name =~ /^(true|false)$/ +        end +        line.scan(/\\([a-zA-Z@\?\!]{3,})/) do |name, rest| # rest, else array +            if name =~ /(true|false)$/ then +                pushuse(filename,l,"if#{name}") unless name =~ /^(if|set)$/ +            else +                pushuse(filename,l,name) +            end +        end +    end + +    def feedback          begin -            outputfile = File.basename(@filename).sub(/\.tex$/,'')+'.dep' -            File.open(outputfile,'w') do |f| -                @compact = compact -                @logger.report("saving analysis in #{outputfile}") if @logger -                list, len = @cs_local.keys.sort, 0 -                if @compact then -                    list.each do |cs| -                        if cs.length > len then len = cs.length end +            # get max length +            l = 0 +            list = @defined.keys.sort +            list.each do |cs| +                l = cs.length if cs.length > l +            end +            if ! @compact then +                n = 0 +                report('') +                report("defined: #{@defined.size}") +                report('') +                @defined.keys.sort.each do |cs| +                    next if @namefilter && ! @namefilter.include?(cs) +                    next if @filefilter && ! @defined[cs].include?(cs) +                    if @defined[cs].size > 1 then +                        dlist = @defined[cs].collect do |d| +                            if d == @definitive[cs] then d else "[#{d}]" end +                        end +                    else +                        dlist = @defined[cs]                      end -                    len += 1 -                else -                    f.puts "<?xml version='1.0'?>\n" -                    f.puts "<dependencies xmlns='http://www.pragma-ade.com/schemas/texdeps.rng' rootfile='#{@filename}'>\n" +                    report("#{(n += 1).to_s.rjust(5,' ')} #{cs.ljust(l,' ')} == #{dlist.join(' ')}")                  end -                list.each do |cs| -                    if @cs_new.key?(cs) then -                        if @cs_new[cs] == @cs_local[cs] then -                            f.puts some_struc(cs,len,1,some_str(@cs_new,@cs_defd,cs)) -                        elsif @cs_new[cs].first == @cs_local[cs].first then -                            f.puts some_struc(cs,len,2,some_str(@cs_new,@cs_defd,cs),some_str(@cs_local,@cs_used,cs)) -                        else -                            f.puts some_struc(cs,len,3,some_str(@cs_new,@cs_defd,cs),some_str(@cs_local,@cs_used,cs)) -                        end +            end +            if true then +                n = 0 +                report('') +                report("used before defined: #{@used_before.size}") +                report('') +                @used_before.keys.sort.each do |cs| +                    next if @namefilter && ! @namefilter.include?(cs) +                    next if @filefilter && (@used_before[cs] & @filefilter).size == 0 +                    used = @used_before[cs] - (@defined[cs] || []) +                    defined = (@defined[cs] || []).join(' ') +                    defined = "[ ? ]" if defined.empty? +                    if used.size > 0 then +                        report("#{(n += 1).to_s.rjust(5,' ')} #{cs.ljust(l,' ')} == #{defined} -> #{used.join(' ')}")                      else -                        f.puts some_struc(cs,len,4,some_str(@cs_local,@cs_used,cs)) +                        report("#{(n += 1).to_s.rjust(5,' ')} #{cs.ljust(l,' ')} == #{defined}")                      end                  end -                if @compact then -                    # nothing -                else -                    "</dependencies>\n" unless @compact +                report('      none') if n == 0 +            end +            if ! @compact then +                n = 0 +                report('') +                report("used after defined: #{@used_after.size}") +                report('') +                @used_after.keys.sort.each do |cs| +                    next if @namefilter && ! @namefilter.include?(cs) +                    next if @filefilter &&  (@used_after[cs] & @filefilter).size == 0 +                    used = @used_after[cs] - (@defined[cs] || []) +                    defined = (@defined[cs] || []).join(' ') +                    if used.size > 0 then +                        report("#{(n += 1).to_s.rjust(5,' ')} #{cs.ljust(l,' ')} == #{defined} <- #{used.join(' ')}") +                    else +                        report("#{(n += 1).to_s.rjust(5,' ')} #{cs.ljust(l,' ')} == #{defined}") +                    end +                end +                report('      none') if n == 0 +            end +            if ! @compact then +                unless @filefilter || @namefilter then +                    [false,true].each do |mode| +                        n = 0 +                        report("") +                        report("file dependecies #{if mode then '(critical)' end}") +                        [@dependencies].each do |dependencies| +                            report("") +                            dependencies.keys.sort.each do |f| +                                if dependencies[f].size > 0 then +                                    dependencies[f].delete(f) +                                end +                                if mode then +                                    dep = dependencies[f].delete_if do |d| +                                        f[0..3] == d[0..3] # same xxxx- prefix +                                    end +                                else +                                    dep = dependencies[f] +                                end +                                if dep.size > 0 then +                                    name = f.nosuffix('tex').ljust(8,' ') +                                    list = dep.sort.collect do |k| k.nosuffix('tex') end +                                    report("#{(n += 1).to_s.rjust(5,' ')} #{name} !! #{list.join(' ')}") +                                end +                            end +                        end +                        report('      none') if n == 0 +                    end +                end +            end +            if true then +                unless @filefilter || @namefilter then +                    [false,true].each do |mode| +                        [@disorder,@disordercs].each do |disorder| +                            n = 0 +                            report("") +                            report("file disorder #{if mode then '(critical)' end}") +                            report("") +                            disorder.keys.sort.each do |f| +                                if disorder[f].size > 0 then +                                    disorder[f].delete(f) +                                end +                                if mode then +                                    dis = disorder[f].delete_if do |d| +                                        f[0..3] == d[0..3] # same xxxx- prefix +                                    end +                                else +                                    dis = disorder[f] +                                end +                                if dis.size > 0 then +                                    name = f.nosuffix('tex').ljust(8,' ') +                                    list = dis.sort.collect do |k| k.nosuffix('tex') end +                                    report("#{(n += 1).to_s.rjust(3,' ')} #{name} ?? #{list.join(' ')}") +                                end +                            end +                        end +                        report('      none') if n == 0 +                    end                  end              end          rescue +            puts("fatal error: #{$!} #{$@.join("\n")}")          end      end      private -    def some_struc(cs,len,type=1,defstr='',usestr='') -        if @compact then -            "#{cs.ljust(len)} #{@@types[type][1]} #{defstr} #{usestr}" -        else -            "<macro name='#{cs}' type='#{type}'>\n" + -            if defstr.empty? then "  <defined/>\n" else "  <defined>\n#{defstr}  <\defined>\n" end + -            if usestr.empty? then "  <used/>\n"    else "  <used>#{usestr}\n  <\used>\n" end + -            "</macro>\n" -        end +    def csdefined?(cs,filename) +        @defined[cs] && @defined[cs].include?(filename) +    end +    def csbefore?(cs,filename) +        @used_before[cs] && @used_before[cs].include?(filename) +    end +    def csafter?(cs,filename) +        @used_after[cs] && @used_after[cs].include?(filename)      end -    def some_str(files, lines, cs) -        return '' unless files[cs] -        if @compact then -            str = '[ ' -            files[cs].each do |c| -                str += c -                str += " (#{lines[cs][c].join(' ')}) " if lines[cs][c] -                str += ' ' -            end -            str += ']' -            str.gsub(/ +/, ' ') -        else -            str = '' -            files[cs].each do |c| -                if lines[cs][c] then -                    str += "    <file name='#{c}'>\n" -                    str += "      " -                    lines[cs][c].each do |l| -                        # str += "      <line n='#{l}'/>\n" -                        str += "<line n='#{l}'/>" -                    end -                    str += "\n" -                    str += "    </file>\n" -                else -                    str += "    <file name='#{c}'/>\n" -                end -            end -            str -        end +    def csignored?(cs) +        cs.to_s =~ @@skips      end -    def pushdef(filename,n,cs) -        unless @cs_new.key?(cs) then -            @cs_new[cs] = Array.new -            @cs_defd[cs] = Hash.new unless @cs_defd.key?(cs) +    def pushdef(filename,n,cs,type) +        if csignored?(cs) then +            # nothing +        elsif @defined[cs] then +            case type +                when 5 then +                    # if test, no definition done +                else +                    @definitive[cs] = filename +                    unless @filefilter || @namefilter then +                        report("#{cs} is redefined") unless csdefined?(cs,filename) || @compact +                    end +            end +            @defined[cs] << filename unless @defined[cs].include?(filename) +        else +            @defined[cs] = Array.new +            @defined[cs] << filename +            @definitive[cs] = filename +            @type[cs] = type          end -        @cs_defd[cs][filename] = Array.new unless @cs_defd[cs][filename] -        @cs_new[cs].push(filename) unless @cs_new[cs].include?(filename) -        @cs_defd[cs][filename] << n      end      def pushuse(filename,n,cs) -        unless @@cs_global.include?(cs.to_s) then -            unless @cs_local[cs] then -                @cs_local[cs] = Array.new -                @cs_used[cs] = Hash.new unless @cs_used.key?(cs) -            end -            @cs_used[cs][filename] = Array.new unless @cs_used[cs][filename] -            @cs_local[cs].push(filename) unless @cs_local[cs].include?(filename) -            @cs_used[cs][filename] << n +        if csignored?(cs) then +            # nothing +        elsif @defined[cs] then +            @used_after[cs] = Array.new unless @used_after[cs] +            @used_after[cs] << filename unless csafter?(cs,filename) +        else +            @used_before[cs] = Array.new unless @used_before[cs] +            @used_before[cs] << filename unless csbefore?(cs,filename)          end      end @@ -2271,9 +2514,9 @@ class Commands          filename = if @commandline.arguments.empty? then 'context.tex' else @commandline.arguments.first end          compact  = @commandline.option('compact') -        ['progname=context',''].each do |progname| +        ['context',''].each do |progname|              unless FileTest.file?(filename) then -                name = `kpsewhich #{progname} #{filename}`.chomp +                name = Kpse.found(filename, progname)                  if FileTest.file?(name) then                      filename = name                      break @@ -2281,10 +2524,12 @@ class Commands              end          end -        if FileTest.file?(filename) && deps = TexDeps.new(logger) then +        if FileTest.file?(filename) && deps = TexDeps.new(logger,compact) then +            deps.setfilter(@commandline.option('filter'))              deps.load              deps.analyze -            deps.feedback(compact) +            deps.feedback +            deps.save if @commandline.option('save')          else              report("unknown file #{filename}")          end @@ -2365,9 +2610,9 @@ class Commands          end          def locatedlocaltree -            tree = `kpsewhich --expand-path $TEXMFLOCAL`.chomp rescue nil +            tree = Kpse.used_path('TEXMFLOCAL')              unless tree && FileTest.directory?(tree) then -                tree = `kpsewhich --expand-path $TEXMF`.chomp rescue nil +                tree = Kpse.used_path('TEXMF')              end              return tree          end @@ -2377,7 +2622,8 @@ class Commands                   report("fatal error, '#{archive}' has not been downloaded")                   return false              end -            unless system("unzip -uo #{archive}") then +            # unless system("unzip -uo #{archive}") then +            unless system("unzip -o #{archive}") then                  report("fatal error, make sure that you have 'unzip' in your path")                  return false              end @@ -2441,15 +2687,18 @@ commandline.registeraction('dpxmapfiles'       , 'convert pdftex mapfiles to dvi  commandline.registeraction('listentities'      , 'create doctype entity definition from enco-uc.tex')  commandline.registeraction('brandfiles'        , 'add context copyright notice [--force]')  commandline.registeraction('platformize'       , 'replace line-endings [--recurse --force] [pattern]') -commandline.registeraction('dependencies'      , 'analyze depedencies witin context [--compact] [rootfile]') +commandline.registeraction('dependencies'      , 'analyze depedencies within context [--save --compact --filter=[macros|filenames]] [filename]')  commandline.registeraction('updatecontext'     , 'download latest version and remake formats')  commandline.registeraction('disarmutfbom'      , 'remove utf bom [--force]')  commandline.registervalue('type','') +commandline.registervalue('filter','')  commandline.registerflag('recurse')  commandline.registerflag('force') +commandline.registerflag('compact')  commandline.registerflag('pipe') +commandline.registerflag('save')  commandline.registerflag('all')  commandline.registerflag('xml')  commandline.registerflag('log') diff --git a/scripts/context/ruby/pdftools.rb b/scripts/context/ruby/pdftools.rb index 8a62a0487..d40e2d852 100644 --- a/scripts/context/ruby/pdftools.rb +++ b/scripts/context/ruby/pdftools.rb @@ -15,10 +15,7 @@  banner = ['PDFTools', 'version 1.2.1', '2003/2005', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' diff --git a/scripts/context/ruby/pstopdf.rb b/scripts/context/ruby/pstopdf.rb index 197f83961..a677cb617 100644 --- a/scripts/context/ruby/pstopdf.rb +++ b/scripts/context/ruby/pstopdf.rb @@ -12,7 +12,7 @@  banner = ['PsToPdf', 'version 2.0.1', '2002-2006', 'PRAGMA ADE/POD'] -$: << File.expand_path(File.dirname($0)) +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  # todo: paden/prefix in magick and inkscape  # todo: clean up method handling (pass strings, no numbers) diff --git a/scripts/context/ruby/rlxtools.rb b/scripts/context/ruby/rlxtools.rb index 1225dedb3..40a45bd51 100644 --- a/scripts/context/ruby/rlxtools.rb +++ b/scripts/context/ruby/rlxtools.rb @@ -12,10 +12,7 @@  banner = ['RlxTools', 'version 1.0.1', '2004/2005', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' @@ -98,6 +95,9 @@ class Commands                      if conversion = variables['conversion'] then                          report("testing for conversion #{conversion}")                          if suffix = variables['suffix'].downcase then +                            if ! suffix.empty? && variables['file'] && variables['file'] !~ /\.([a-z]+)$/i then +                                variables['file'] += ".#{suffix}" +                            end                              if file = variables['file'] then                                  report("conversion #{conversion} for suffix #{suffix} for file #{file}")                              else @@ -251,17 +251,43 @@ class Commands      include CommandBase -    def identify -        @commandline.arguments.each do |filename| -            if state = do_identify(filename) then -                begin -                    File.open(filename+'.rli','w') do |f| -                        f << state +    @@xmlbanner = "<?xml version='1.0' standalone='yes'?>" + +    def identify(resultfile='rlxtools.rli') +        if @commandline.option('collect') then +            begin +                File.open(resultfile,'w') do |f| +                    f << "#{@@xmlbanner}\n" +                    f << "<rl:identification>\n" +                    @commandline.arguments.each do |filename| +                        if state = do_identify(filename) then +                            report("#{filename} is identified") +                            f << state +                        else +                            report("unable to identify #{filename}") +                        end +                    end +                    f << "</rl:identification>\n" +                    report("result saved in #{resultfile}") +                end +            rescue +                report("error in writing result") +            end +        else +            @commandline.arguments.each do |filename| +                if state = do_identify(filename) then +                    begin +                        File.open(filename+'.rli','w') do |f| +                            f << "#{@@xmlbanner}\n" +                            f << state +                        end +                    rescue +                        report("error in identifying #{filename}") +                    else +                        report("#{filename} is identified")                      end -                rescue -                    report("error in identifying #{filename}")                  else -                    report("#{filename} is identified") +                    report("unable to identify #{filename}")                  end              end          end @@ -269,11 +295,15 @@ class Commands      private -    def do_identify(filename) +    def do_identify(filename,centimeters=false)          begin              str = nil              if FileTest.file?(filename) then -                result = `identify -format \"x=%x,y=%y,w=%w,h=%h,b=%b\" #{filename}`.chomp.split(',') +                if centimeters then +                    result = `identify -units PixelsPerCentimeter -format \"x=%x,y=%y,w=%w,h=%h,b=%b\" #{filename}`.chomp.split(',') +                else +                    result = `identify -units PixelsPerInch       -format \"x=%x,y=%y,w=%w,h=%h,b=%b\" #{filename}`.chomp.split(',') +                end                  tags = Hash.new                  result.each do |r|                      if rr = r.split("=") then @@ -285,7 +315,6 @@ class Commands                  height = unified(tags['h']||0,tags['y']||'1')                  if size > 0 then                      str = '' -                    str << "<?xml version='1.0' standalone='yes'?>\n"                      str << "<rl:identify name='#{File.basename(filename)}'>\n"                      str << "  <rl:size>#{size}</rl:size>\n"                      str << "  <rl:path>#{File.dirname(filename).sub(/\\/o,'/')}</rl:path>\n" @@ -322,13 +351,14 @@ end  logger      = Logger.new(banner.shift)  commandline = CommandLine.new -commandline.registeraction('manipulate', ' [--test] manipulatorfile resourselog') -commandline.registeraction('identify', 'filename') +commandline.registeraction('manipulate', '[--test] manipulatorfile resourselog') +commandline.registeraction('identify'  , '[--collect] filename')  commandline.registeraction('help')  commandline.registeraction('version')  commandline.registerflag('test') +commandline.registerflag('collect')  commandline.expand diff --git a/scripts/context/ruby/texexec.rb b/scripts/context/ruby/texexec.rb index 1a7175f23..f1c8059c9 100644 --- a/scripts/context/ruby/texexec.rb +++ b/scripts/context/ruby/texexec.rb @@ -1,9 +1,6 @@  banner = ['TeXExec', 'version 6.2.0', '1997-2006', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'ftools'     # needed ? @@ -97,6 +94,16 @@ class Commands          end      end +    def mpstatic +        if job = TEX.new(logger) then +            job.setvariable('filename',@commandline.arguments.first) +            prepare(job) +            job.processmpstatic +            job.inspect && Kpse.inspect  if @commandline.option('verbose') +            exit 1 if job.error? +        end +    end +      # hard coded goodies # to be redone as s-ctx-.. with vars passed as such      def listing @@ -143,21 +150,21 @@ class Commands      end      def figures -        # this one will be redone using rlxtools +        # we replaced "texutil --figures ..."          if job = TEX.new(logger) then              prepare(job)              job.cleanuptemprunfiles              files = @commandline.arguments.sort              if files.length > 0 then                  if f = File.open(job.tempfilename('tex'),'w') then -                    # will be replaced, does not work any more -                    Kpse.runscript('texutil.pl',files.join(' '),'--figures') +                    Kpse.runscript('rlxtools', ['--identify','--collect'], files.join(' '))                      figures     = @commandline.checkedoption('method', 'a').downcase                      paperoffset = @commandline.checkedoption('paperoffset', '0pt')                      backspace   = @commandline.checkedoption('backspace', '1.5cm')                      topspace    = @commandline.checkedoption('topspace', '1.5cm')                      boxtype     = @commandline.checkedoption('boxtype','')                      f << "% format=english\n"; +                    f << "\\usemodule[res-20]\n"                      f << "\\setuplayout\n";                      f << "  [topspace=#{topspace},backspace=#{backspace},\n"                      f << "   header=1.5cm,footer=0pt,\n"; @@ -175,10 +182,9 @@ class Commands                      f.close                      job.setvariable('interface','english')                      job.setvariable('simplerun',true) -                    # job.setvariable('nooptionfile',true)                      job.setvariable('files',[job.tempfilename])                      job.processtex -                    File.silentdelete('texutil.tuf') +                    # File.silentdelete('rlxtools.rli') unless job.getvariable('keep')                  else                      report('no figures to show')                  end @@ -194,7 +200,7 @@ class Commands              prepare(job)              job.cleanuptemprunfiles              files = @commandline.arguments.sort -            msuffixes = ['tex','mp','pl','pm','rb'] +            msuffixes = ['tex','mkii','mkiv','mp','pl','pm','rb']              if files.length > 0 then                  files.each do |fname|                      fnames = Array.new @@ -208,6 +214,11 @@ class Commands                      fnames.each do |ffname|                          if msuffixes.include?(File.splitname(ffname)[1]) && FileTest.file?(ffname) then                              if mod = File.open(job.tempfilename('tex'),'w') then +if File.suffix(ffname) =~ /^(mkii|mkiv)$/o then +    markfile = $1 +else +    markfile = nil +end                                  Kpse.runscript('ctxtools',ffname,'--document')                                  if ted = File.silentopen(File.suffixed(ffname,'ted')) then                                      firstline = ted.gets @@ -220,7 +231,7 @@ class Commands                                  else                                      mod << "% interface=en\n"                                  end -                                mod << "\\usemodule[abr-01,mod-01]\n" +                                mod << "\\usemodule[mod-01]\n"                                  mod << "\\def\\ModuleNumber{1}\n"                                  mod << "\\starttext\n"                                  # todo: global file too @@ -231,10 +242,15 @@ class Commands                                  job.setvariable('simplerun',true)                                  # job.setvariable('nooptionfile',true)                                  job.setvariable('files',[job.tempfilename]) +result = File.unsuffixed(File.basename(ffname)) +if markfile then +    result = result+'-'+markfile +end +job.setvariable('result',result)                                  job.processtex -                                ["dvi", "pdf","tuo"].each do |s| -                                    File.silentrename(job.tempfilename(s),File.suffixed(ffname,s)); -                                end +                                # ["dvi", "pdf","ps"].each do |s| +                                    # File.silentrename(job.tempfilename(s),File.suffixed(ffname,s)); +                                # end                              end                          end                      end @@ -246,6 +262,39 @@ class Commands          end      end +    def pdfsplit +        if job = TEX.new(logger) then +            prepare(job) +            job.cleanuptemprunfiles +            filename = File.expand_path(@commandline.arguments.first) +            if FileTest.file?(filename) then +                basename = filename.sub(/\..*?$/,'') +                tempfile = File.suffixed(job.tempfilename,'tex') +                if basename != filename then +                    info = `pdfinfo #{filename}` +                    if info =~ /Pages:\s*(\d+)/ then +                        nofpages = $1.to_i +                        nofpages.times do |i| +                            if f = File.open(tempfile,"w") then +                                n = i + 1 +                                report("extracting page #{n}") +                                f << "\\starttext\\startTEXpage\n" +                                f << "\\externalfigure[#{filename}][object=no,page=#{n}]\n" +                                f << "\\stopTEXpage\\stoptext\n" +                                f.close +                                job.setvariable('interface','english') # redundant +                                job.setvariable('simplerun',true) +                                job.setvariable('files',[tempfile]) +                                job.processtex +                            end +                        end +                    end +                end +            end +            job.cleanuptemprunfiles +        end +    end +      def arrangeoutput          if job = TEX.new(logger) then              prepare(job) @@ -391,8 +440,8 @@ class Commands                              f <<  "]\n"                              f <<  "\\definepapersize\n"                              f <<  "  [copy]\n" -                            f <<  "  [width=\\naturalfigurewidth,\n" -                            f <<  "   height=\\naturalfigureheight]\n" +                            f <<  "  [width=\\figurewidth,\n" +                            f <<  "   height=\\figureheight]\n"                              f <<  "\\setuppapersize\n"                              f <<  "  [copy][copy]\n"                              f <<  "\\setuplayout\n" @@ -578,6 +627,7 @@ commandline.registeraction('process',   'process file')  commandline.registeraction('mptex',     'process mp file')  commandline.registeraction('mpxtex',    'process mpx file')  commandline.registeraction('mpgraphic', 'process mp file to stand-alone graphics') +commandline.registeraction('mpstatic',  'process mp/ctx file to stand-alone graphics')  commandline.registeraction('listing',    'list of file content')  commandline.registeraction('figures',    'generate overview of figures') @@ -587,6 +637,7 @@ commandline.registeraction('pdfselect',  'select pages from file(s)')  commandline.registeraction('pdfcopy',    'copy pages from file(s)')  commandline.registeraction('pdftrim',    'trim pages from file(s)')  commandline.registeraction('pdfcombine', 'combine multiple pages') +commandline.registeraction('pdfsplit',   'split file in pages')  # compatibility switch diff --git a/scripts/context/ruby/texmfstart.rb b/scripts/context/ruby/texmfstart.rb index 411cb9248..b9ced8813 100644 --- a/scripts/context/ruby/texmfstart.rb +++ b/scripts/context/ruby/texmfstart.rb @@ -31,9 +31,7 @@  # we don't depend on other libs -$ownpath = File.expand_path(File.dirname($0)) unless defined? $ownpath - -$: << $ownpath +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require "rbconfig"  require "md5" @@ -176,6 +174,8 @@ end  # concept   : Hans Hagen  # info      : j.hagen@xs4all.nl +# todo: multiple cnf files +#  class String @@ -1429,7 +1429,8 @@ end  $mswindows = Config::CONFIG['host_os'] =~ /mswin/  $separator = File::PATH_SEPARATOR -$version   = "2.0.0" +$version   = "2.0.2" +$ownpath   = File.dirname($0)  if $mswindows then      require "win32ole" @@ -1473,6 +1474,8 @@ $predefined['pdftools'] = 'pdftools.rb'  $predefined['mpstools'] = 'mpstools.rb'  $predefined['exatools'] = 'exatools.rb'  $predefined['xmltools'] = 'xmltools.rb' +$predefined['luatools'] = 'luatools.lua' +$predefined['mtxtools'] = 'mtxtools.rb'  $predefined['newpstopdf']   = 'pstopdf.rb'  $predefined['newtexexec']   = 'texexec.rb' @@ -1497,6 +1500,8 @@ $makelist = [      'exatools',      'runtools',      'rlxtools', +    'luatools', +    'mtxtools',      #      # no, 'texmfstart'  ] @@ -1509,31 +1514,36 @@ $makelist = [  $scriptlist   = 'rb|pl|py|lua|jar'  $documentlist = 'pdf|ps|eps|htm|html' -$editor = ENV['TEXMFSTART_EDITOR'] || ENV['EDITOR'] || ENV['editor'] || 'scite' +$editor       = ENV['TEXMFSTART_EDITOR'] || ENV['EDITOR'] || ENV['editor'] || 'scite' -$crossover = true # to other tex tools, else only local +$crossover    = true # to other tex tools, else only local +$kpse         = nil -$applications['unknown']  = '' -$applications['perl']     = $applications['pl']  = 'perl' -$applications['ruby']     = $applications['rb']  = 'ruby' -$applications['python']   = $applications['py']  = 'python' -$applications['lua']      = $applications['lua'] = 'lua' -$applications['java']     = $applications['jar'] = 'java' +def set_applications(page=1) -if $mswindows then -    $applications['pdf']  = ['',"pdfopen --page #{$page} --file",'acroread'] -    $applications['html'] = ['','netscape','mozilla','opera','iexplore'] -    $applications['ps']   = ['','gview32','gv','gswin32','gs'] -else -    $applications['pdf']  = ["pdfopen --page #{$page} --file",'acroread'] -    $applications['html'] = ['netscape','mozilla','opera'] -    $applications['ps']   = ['gview','gv','gs'] -end +    $applications['unknown']  = '' +    $applications['perl']     = $applications['pl']  = 'perl' +    $applications['ruby']     = $applications['rb']  = 'ruby' +    $applications['python']   = $applications['py']  = 'python' +    $applications['lua']      = $applications['lua'] = 'lua' +    $applications['java']     = $applications['jar'] = 'java' -$applications['htm']      = $applications['html'] -$applications['eps']      = $applications['ps'] +    if $mswindows then +        $applications['pdf']  = ['',"pdfopen --page #{page} --file",'acroread'] +        $applications['html'] = ['','netscape','mozilla','opera','iexplore'] +        $applications['ps']   = ['','gview32','gv','gswin32','gs'] +    else +        $applications['pdf']  = ["pdfopen --page #{page} --file",'acroread'] +        $applications['html'] = ['netscape','mozilla','opera'] +        $applications['ps']   = ['gview','gv','gs'] +    end -$kpse = nil +    $applications['htm']      = $applications['html'] +    $applications['eps']      = $applications['ps'] + +end + +set_applications()  def check_kpse      if $kpse then @@ -1795,6 +1805,21 @@ def expanded(arg) # no "other text files", too restricted      end  end +def changeddir?(path) +    if path.empty? then +        return true +    else +        begin +            Dir.chdir(path) if ! path.empty? +        rescue +            report("unable to change to directory: #{path}") +        else +            report("changed to directory: #{path}") +        end +        return File.expand_path(Dir.getwd) == File.expand_path(path) +    end +end +  def runcommand(command)      if $locate then          command = command.split(' ').collect do |c| @@ -1810,20 +1835,10 @@ def runcommand(command)          print command # to stdout and no newline      elsif $execute then          report("using 'exec' instead of 'system' call: #{command}") -        begin -            Dir.chdir($path) if ! $path.empty? -        rescue -            report("unable to chdir to: #{$path}") -        end -        exec(command) +        exec(command) if changeddir?($path)      else          report("using 'system' call: #{command}") -        begin -            Dir.chdir($path) if ! $path.empty? -        rescue -            report("unable to chdir to: #{$path}") -        end -        system(command) +        system(command) if changeddir?($path)      end  end @@ -1961,7 +1976,10 @@ def find(filename,program)          end          filename.sub!(/^.*[\\\/]/, '')          # next we look at the current path and the callerpath -        [['.','current'],[$ownpath,'caller'],[registered("THREAD"),'thread']].each do |p| +        [ ['.','current'], +          [$ownpath,'caller'], ["#{$ownpath}/../#{suffixlist[0]}",'caller'], +          [registered("THREAD"),'thread'], ["#{registered("THREAD")}/../#{suffixlist[0]}",'thread'], +        ].each do |p|              if p && ! p.empty? && ! (p[0] == 'unknown') then                  suffixlist.each do |suffix|                      fname = "#{filename}.#{suffix}" @@ -2125,9 +2143,9 @@ def find(filename,program)              return ''          end      rescue -        # error, trace = $!, $@.join("\n") -        # report("fatal error: #{error}\n#{trace}") -        report("fatal error") +        error, trace = $!, $@.join("\n") +        report("fatal error: #{error}\n#{trace}") +        # report("fatal error")      end  end @@ -2402,7 +2420,7 @@ def execute(arguments)      $program     = $directives['program']     || 'context'      $direct      = $directives['direct']      || false      $edit        = $directives['edit']        || false -    $page        = $directives['page']        || 0 +    $page        = $directives['page']        || 1      $browser     = $directives['browser']     || false      $report      = $directives['report']      || false      $verbose     = $directives['verbose']     || false @@ -2440,6 +2458,8 @@ def execute(arguments)      $verbose = true if (ENV['_CTX_VERBOSE_'] =~ /(y|yes|t|true|on)/io) && ! $locate && ! $report +    set_applications($page) +      # private:      $selfmerge   = $directives['selfmerge'] || false diff --git a/scripts/context/ruby/texsync.rb b/scripts/context/ruby/texsync.rb index 22b7d46c0..ade307d8e 100644 --- a/scripts/context/ruby/texsync.rb +++ b/scripts/context/ruby/texsync.rb @@ -16,10 +16,7 @@  banner = ['TeXSync', 'version 1.1.1', '2002/2004', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/]\w*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' diff --git a/scripts/context/ruby/textools.rb b/scripts/context/ruby/textools.rb index 993388347..345a27572 100644 --- a/scripts/context/ruby/textools.rb +++ b/scripts/context/ruby/textools.rb @@ -15,10 +15,7 @@  banner = ['TeXTools', 'version 1.3.1', '2002/2006', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' diff --git a/scripts/context/ruby/texutil.rb b/scripts/context/ruby/texutil.rb index da9a19205..ee0fc1e5e 100644 --- a/scripts/context/ruby/texutil.rb +++ b/scripts/context/ruby/texutil.rb @@ -1,9 +1,6 @@  banner = ['TeXUtil  ', 'version 9.1.0', '1997-2005', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' diff --git a/scripts/context/ruby/tmftools.rb b/scripts/context/ruby/tmftools.rb index 074e949d1..626ef1f4a 100644 --- a/scripts/context/ruby/tmftools.rb +++ b/scripts/context/ruby/tmftools.rb @@ -27,10 +27,7 @@  banner = ['TMFTools', 'version 1.1.0 (experimental, no help yet)', '2005/2006', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' diff --git a/scripts/context/ruby/www/exa.rb b/scripts/context/ruby/www/exa.rb index c6d59d864..5e9b3fd82 100644 --- a/scripts/context/ruby/www/exa.rb +++ b/scripts/context/ruby/www/exa.rb @@ -145,12 +145,12 @@ class WWW              dat << "</exa:data>\n"              if req.empty? then                  req << "<?xml version='1.0' ?>\n" -                req << "<exa:request #{@@namespace}'>\n" +                req << "<exa:request xmlns:exa='#{@@namespace}'>\n"                  req << "<exa:application>\n"                  req << "<exa:action>'#{action}</exa:action>\n"     unless action.empty?                  # req << "<exa:command>'#{command}</exa:command>\n"  unless command.empty?                  # req << "<exa:url>'#{url}</exa:url>\n"              unless url.empty? -                req << "<exa:application>\n" +                req << "</exa:application>\n"                  req << "<exa:comment>constructed request</exa:comment>\n"                  req << dat                  req << "</exa:request>\n" diff --git a/scripts/context/ruby/www/lib.rb b/scripts/context/ruby/www/lib.rb index 2a4f3e14f..f5f362b12 100644 --- a/scripts/context/ruby/www/lib.rb +++ b/scripts/context/ruby/www/lib.rb @@ -172,8 +172,8 @@ class WWW          @interface.set('process:os'        , platform)          @interface.set('process:texos'     , 'texmf-' + platform) -        @interface.set('trace:run'         , 'yes') if (ENV['EXA:TRACE:RUN']    || '') =~ @@re_true -        @interface.set('trace:errors'      , 'yes') if (ENV['EXA:TRACE:ERRORS'] || '') =~ @@re_true +        @interface.set('trace:run'         , 'yes') if (ENV['EXA_TRACE_RUN']    || '') =~ @@re_true +        @interface.set('trace:errors'      , 'yes') if (ENV['EXA_TRACE_ERRORS'] || '') =~ @@re_true          yield self if block_given?      end @@ -1276,12 +1276,19 @@ class WWW          resultname, replyname = 'result.pdf', 'reply.exa'          replyfile = File.join(tmp,replyname)          resultfile = File.join(tmp,resultname) +        targetname = File.join(cache_root,dir,resultname) +        # make sure that there is no target left in case of an +        # error; needed in case of given session name +        if FileTest.directory?(File.join(cache_root,dir)) then +            File.delete(targetname) rescue false +        end +        # now try to locate the file          if FileTest.file?(fullname) then              if indirect?(fullname) then                  begin +                    # check if directory exists and (if so) delete left overs                      File.makedirs(File.join(cache_root,dir)) -                    targetname = File.join(cache_root,dir,resultname) -                    File.delete(targetname) rescue false # left overs +                    File.delete(targetname) rescue false                      File.symlink(fullname,targetname) rescue message('Status',$!)                      unless FileTest.file?(targetname) then                          FileUtils::cp(fullname,targetname) rescue false diff --git a/scripts/context/ruby/wwwclient.rb b/scripts/context/ruby/wwwclient.rb index 8f5451a8d..d41541a09 100644 --- a/scripts/context/ruby/wwwclient.rb +++ b/scripts/context/ruby/wwwclient.rb @@ -19,7 +19,7 @@  banner = ['WWWClient', 'version 1.0.0', '2003-2006', 'PRAGMA ADE/POD'] -$: << File.dirname(File.expand_path($0)) +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' diff --git a/scripts/context/ruby/wwwserver.rb b/scripts/context/ruby/wwwserver.rb index 18ea57df1..53e1cdc51 100644 --- a/scripts/context/ruby/wwwserver.rb +++ b/scripts/context/ruby/wwwserver.rb @@ -2,7 +2,7 @@  banner = ['WWWServer', 'version 1.0.0', '2003-2006', 'PRAGMA ADE/POD'] -$: << File.dirname(File.expand_path($0)) +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' diff --git a/scripts/context/ruby/wwwwatch.rb b/scripts/context/ruby/wwwwatch.rb index 0afb9a392..0faa45aec 100644 --- a/scripts/context/ruby/wwwwatch.rb +++ b/scripts/context/ruby/wwwwatch.rb @@ -2,7 +2,7 @@  banner = ['WWWWatch', 'version 1.0.0', '2003-2006', 'PRAGMA ADE/POD'] -$: << File.dirname(File.expand_path($0)) +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' @@ -46,6 +46,7 @@ class Watch < Monitor          @logger      = logger          @verbose     = false          @create      = false +        @onlyonerun  = false          # [:INT, :TERM, :EXIT].each do |signal|              # trap(signal) do                  # kill @@ -100,7 +101,7 @@ class Watch < Monitor              exit! rescue false # no checking, no at_exit done          end          unless File.writable?(@cache_path) then -            puts "no valid work path: #{@work_path}" ; # no reason to exit +            puts "no valid cache path: #{@cache_path}" ; # no reason to exit          end          @last_action = Time.now          report("watching path #{@work_path}") if @verbose @@ -302,7 +303,7 @@ class Watch < Monitor                                              lck = File.expand_path(sessionfile.sub(/ses$/,'lck'))                                              start_of_run = Time.now                                              start_of_job = start_of_run.dup -                                            max_runtime = @max_age +                                            max_time = @max_age                                              begin                                                  start_of_job = vars['starttime'].to_i || start_of_run                                                  start_of_job = start_of_run if start_of_job == 0 @@ -356,7 +357,11 @@ class Watch < Monitor                                  else                                      report("watchdog: skipping - id (#{vars['id']}) / status (#{vars['status']})") if @verbose                                  end -                                @skips[sessionfile] = true +                                if @onlyonerun then +                                    @skips[sessionfile] = true +                                else +                                    @skips.delete(sessionfile) +                                end                              else                                  # not yet ok                              end @@ -379,6 +384,15 @@ class Watch < Monitor          begin              # report(Time.now.to_s) if @verbose              loop do +                @threads.delete_if do |k,v| +                    begin +                        v == nil || v.stop? +                    rescue +                        true +                    else +                        false +                    end +                end                  if @threads.length == @max_threads then                      if @delay > @max_threads then                          sleep(@delay) diff --git a/scripts/context/ruby/xmltools.rb b/scripts/context/ruby/xmltools.rb index a10d34314..fe4fbde22 100644 --- a/scripts/context/ruby/xmltools.rb +++ b/scripts/context/ruby/xmltools.rb @@ -17,11 +17,7 @@  banner = ['XMLTools', 'version 1.2.0', '2002/2006', 'PRAGMA ADE/POD'] -unless defined? ownpath -    ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') -    # ownpath = File.dirname($0) -    $: << ownpath -end +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!  require 'base/switch'  require 'base/logger' @@ -106,6 +102,11 @@ class Commands                          output.xputs("<type>#{bt}</type>\n", 6)                      end                      output.xputs("<size>#{File.stat(f).size}</size>\n", 6) +                    permissions = '' +                    permissions << 'r' if File.readable?(f) +                    permissions << 'w' if File.writable?(f) +                    permissions << 'x' if File.executable?(f) +                    output.xputs("<permissions>#{permissions}</permissions>\n", 6) unless permissions.empty?                  end                  output.xputs("<date>#{File.stat(f).mtime.strftime("%Y-%m-%d %H:%M")}</date>\n", 6)                  output.xputs("</file>\n", 4) diff --git a/scripts/context/stubs/mswin/luatools.bat b/scripts/context/stubs/mswin/luatools.bat new file mode 100755 index 000000000..707657fad --- /dev/null +++ b/scripts/context/stubs/mswin/luatools.bat @@ -0,0 +1,2 @@ +@echo off +texmfstart luatools.lua %* diff --git a/scripts/context/stubs/mswin/mtxtools.bat b/scripts/context/stubs/mswin/mtxtools.bat new file mode 100755 index 000000000..b658116a5 --- /dev/null +++ b/scripts/context/stubs/mswin/mtxtools.bat @@ -0,0 +1,2 @@ +@echo off +texmfstart mtxtools.rb %* diff --git a/scripts/context/stubs/unix/luatools b/scripts/context/stubs/unix/luatools new file mode 100755 index 000000000..cb3ec1add --- /dev/null +++ b/scripts/context/stubs/unix/luatools @@ -0,0 +1,2 @@ +#!/bin/sh +texmfstart luatools.lua "$@" diff --git a/scripts/context/stubs/unix/mtxtools b/scripts/context/stubs/unix/mtxtools new file mode 100755 index 000000000..2922e0b46 --- /dev/null +++ b/scripts/context/stubs/unix/mtxtools @@ -0,0 +1,2 @@ +#!/bin/sh +texmfstart mtxtools.rb "$@"  | 
