From 39a70fce9851e47de70b762fbf9d081afc30b908 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Thu, 6 Apr 2006 23:00:00 +0200 Subject: stable 2006.04.06 23:00 --- scripts/context/perl/pdftrimwhite.pl | 40 +++--- scripts/context/ruby/base/system.rb | 16 ++- scripts/context/ruby/base/tex.rb | 229 +++++++++++++++++++------------ scripts/context/ruby/base/texutil.rb | 58 ++++++-- scripts/context/ruby/ctxtools.rb | 258 +++++++++++++++++++++++++++++++++-- scripts/context/ruby/graphics/gs.rb | 17 ++- scripts/context/ruby/newtexexec.rb | 2 +- scripts/context/ruby/texmfstart.rb | 5 +- scripts/context/ruby/textools.rb | 68 ++++++++- 9 files changed, 552 insertions(+), 141 deletions(-) (limited to 'scripts') diff --git a/scripts/context/perl/pdftrimwhite.pl b/scripts/context/perl/pdftrimwhite.pl index e42a8fd49..08c1de5d7 100644 --- a/scripts/context/perl/pdftrimwhite.pl +++ b/scripts/context/perl/pdftrimwhite.pl @@ -180,6 +180,7 @@ my $thisisunix = $Config{'osname'} !~ /dos|mswin/i ; my $figurefile = "" ; my $resultfile = "" ; +my $tempfile = "" ; my $programname = "cropcrap" ; @@ -224,7 +225,7 @@ my $width = my $height = my $llx = my $lly = my $urx = my $ury = 0 ; #D help information. sub PrintHelp - { print "This is CropCrap\n\n" . + { print "This is PdfTrimWhite\n\n" . "usage:\n\n" . "cropcrap [switches] filename result\n\n" . "switches:\n\n" . @@ -246,6 +247,7 @@ sub GetItRight { PrintHelp() ; exit } $figurefile = $ARGV[0] ; $figurefile =~ s/\.pdf$//oi ; $resultfile = $ARGV[1] ; $resultfile =~ s/\.pdf$//oi ; + $tempfile = "pdftrimwhite-$resultfile" ; if ($figurefile eq '') { PrintHelp() ; exit } unless ($thisisunix) @@ -257,7 +259,7 @@ sub GetItRight exit } if (($resultfile eq '')||($resultfile=~/(^\-|\.)/io)) { $resultfile = $programname } -$pipe = "2>&1" ; + $pipe = "2>&1" ; if ($thisisunix) { $pipe = "2>&1" } } @@ -376,7 +378,7 @@ sub PreparePlainTeX \\figureheight=\\ht0\n" } sub PrepareFirstPass - { open (TEX, ">$resultfile.tex") ; + { open (TEX, ">$tempfile.tex") ; if ($UsePlain) { print TEX PreparePlainTeX . @@ -406,7 +408,7 @@ sub SetupPlainTeX {\\immediate\\pdfximage page $Page {$figurefile.pdf}\\pdfrefximage\\pdflastximage}\n" } sub PrepareSecondPass - { open (TEX, ">$resultfile.tex") ; + { open (TEX, ">$tempfile.tex") ; if ($UsePlain) { print TEX SetupPlainTeX . @@ -438,30 +440,18 @@ sub FetchPaperSize sub RunTeX { if ($UsePlain) - { $result = - `pdftex -prog=pdftex -fmt=plain -int=batchmode $resultfile` } + { $result = `pdftex -prog=pdftex -fmt=plain -int=batchmode $tempfile` } else - { $result = - `texexec --batch --once --purge $resultfile` } -# print $result if $Verbose ; $results .= "$result\n" ; -# $result = `texutil --purge` ; - print $result if $Verbose ; $results .= "$result\n" } - -sub MakePSFile - { $result = - `$pdfps -paperw $pwidth -paperh $pheight $resultfile.pdf $resultfile.ps` ; + { $result = `texexec --batch --once --purge $tempfile` } print $result if $Verbose ; $results .= "$result\n" } sub FindBoundingBox - { $result = -# `$gs -sDEVICE=bbox -dNOPAUSE -dBATCH $resultfile.ps $pipe` ; - `$gs -sDEVICE=bbox -dNOPAUSE -dBATCH $resultfile.pdf $pipe` ; + { $result = `$gs -sDEVICE=bbox -dNOPAUSE -dBATCH $tempfile.pdf $pipe` ; print $result if $Verbose ; $results .= "$result\n" } sub IdentifyCropBox { RunTeX() ; FetchPaperSize () ; -# MakePSFile() ; FindBoundingBox() } #D Just to be sure, we check if there is some image data, so @@ -495,6 +485,10 @@ sub FixCropBox #D For error tracing we save the log information in a file. +sub RenameResult + { unlink "$resultfile.pdf" ; + rename "$tempfile.pdf", "$resultfile.pdf" } + sub SaveLogInfo { open (LOG, ">$resultfile.log") ; print LOG $results ; @@ -504,10 +498,9 @@ sub SaveLogInfo sub CleanUp { unless ($Verbose) - { unlink "$resultfile.tex" ; - unlink "$resultfile.tuo" ; - unlink "$resultfile.tui" ; - unlink "$resultfile.ps" ; + { unlink "$tempfile.tex" ; + unlink "$tempfile.tuo" ; + unlink "$tempfile.tui" ; unlink "$figurefile.tmp" } } #D Here it all comes together. @@ -526,6 +519,7 @@ if (ValidatedCropBox()) { PrepareSecondPass() ; FixCropBox() } +RenameResult() ; SaveLogInfo() ; CleanUp () ; diff --git a/scripts/context/ruby/base/system.rb b/scripts/context/ruby/base/system.rb index 50173a72d..4a8cba652 100644 --- a/scripts/context/ruby/base/system.rb +++ b/scripts/context/ruby/base/system.rb @@ -41,6 +41,18 @@ module System end end + def System.prependengine(str) + if str =~ /^\S+\.(pl|rb|lua|py)/io then + case $1 + when 'pl' then return "perl #{str}" + when 'rb' then return "ruby #{str}" + when 'lua' then return "lua #{str}" + when 'py' then return "python #{str}" + end + end + return str + end + def System.locatedprogram(program) if @@located.key?(program) then return @@located[program] @@ -49,7 +61,7 @@ module System if binname =~ /\..*$/io then @@binpaths.each do |path| if FileTest.file?(str = File.join(path,binname)) then - return @@located[program] = str + return @@located[program] = System.prependengine(str) end end end @@ -57,7 +69,7 @@ module System @@binpaths.each do |path| @@binsuffixes.each do |suffix| if FileTest.file?(str = File.join(path,"#{binname}#{suffix}")) then - return @@located[program] = str + return @@located[program] = System.prependengine(str) end end end diff --git a/scripts/context/ruby/base/tex.rb b/scripts/context/ruby/base/tex.rb index 1aee93fb1..700150055 100644 --- a/scripts/context/ruby/base/tex.rb +++ b/scripts/context/ruby/base/tex.rb @@ -129,7 +129,7 @@ class TEX 'forcetexutil', 'texutil', 'globalfile', 'autopath', 'purge', 'purgeall', 'keep', 'autopdf', 'xpdf', 'simplerun', 'verbose', - 'nooptionfile', 'nobackend' + 'nooptionfile', 'nobackend', 'noctx' ] @@stringvars = [ 'modefile', 'result', 'suffix', 'response', 'path', @@ -386,20 +386,20 @@ class TEX # upward compatibility problems) but stuck to the bas/mem/fmt flags if engine then case validmpsengine(engine) - when /mpost/ then "--mem" - when /mfont/ then "--bas" - else "--fmt" + when /mpost/ then "-mem" + when /mfont/ then "-bas" + else "-fmt" end else - "--fmt" + "-fmt" end end def prognameflag(progname=nil) case getvariable('distribution') - when 'standard' then prefix = "--progname" - when /web2c/io then prefix = "--progname" - when /miktex/io then prefix = "--alias" + when 'standard' then prefix = "-progname" + when /web2c/io then prefix = "-progname" + when /miktex/io then prefix = "-alias" else return "" end if progname then @@ -424,7 +424,7 @@ class TEX if Kpse.miktex? then "-tcx=#{file}" else - "--translate-file=#{file}" + "-translate-file=#{file}" end end @@ -574,7 +574,7 @@ class TEX interface = $1.sub(/cont\-/,'') results.push('') results.push("testing interface #{interface}") - flags = ['--process','--batch','--once',"--interface=#{interface}",engineflag] + flags = ['--noctx','--process','--batch','--once',"--interface=#{interface}",engineflag] # result = Kpse.pipescript('newtexexec',tempfilename,flags) result = runtexexec([tempfilename], flags, 1) if FileTest.file?("#{@@temprunfile}.log") then @@ -842,7 +842,7 @@ class TEX getarrayvariable('files').each do |filename| setvariable('filename',filename) report("processing text of graphic '#{filename}'") - processmpx(filename,true) + processmpx(filename,false,true) end reportruntime end @@ -883,6 +883,7 @@ class TEX elsif (str = getvariable('suffix')) && ! str.empty? then opt << "\\setupsystem[file=#{jobname}.#{str}]\n" end + opt << "\\setupsystem[\\c!method=2]\n" # 1=oldtexexec 2=newtexexec opt << "\\setupsystem[\\c!type=#{Tool.ruby_platform()}]\n" if (str = File.unixfied(getvariable('path'))) && ! str.empty? then opt << "\\usepath[#{str}]\n" unless str.empty? @@ -1043,9 +1044,10 @@ class TEX report("tex format: #{texformat}") report("progname: #{progname}") if texengine && texformat && progname then - command = [quoted(texengine),prognameflag(progname),formatflag(texengine,texformat),runoptions(texengine),filename,texprocextras(texformat)].join(' ') + command = [quoted(texengine),prognameflag(progname),formatflag(texengine,texformat),tcxflag,runoptions(texengine),filename,texprocextras(texformat)].join(' ') report(command) if getvariable('verbose') system(command) + true else false end @@ -1056,10 +1058,12 @@ class TEX mpsformat = validmpsformat(getarrayvariable('mpsformats').first) progname = validprogname(getvariable('progname')) if mpsengine && mpsformat && progname then - command = [quoted(mpsengine),prognameflag(progname),formatflag(mpsengine,mpsformat),runoptions(mpsengine),filename,mpsprocextras(mpsformat)].join(' ') ENV["MPXCOMMAND"] = "0" unless mpx + # command = [quoted(mpsengine),prognameflag(progname),formatflag(mpsengine,mpsformat),tcxflag,runoptions(mpsengine),filename,mpsprocextras(mpsformat)].join(' ') + command = [quoted(mpsengine),"-progname=mpost",formatflag(mpsengine,mpsformat),tcxflag,runoptions(mpsengine),filename,mpsprocextras(mpsformat)].join(' ') report(command) if getvariable('verbose') system(command) + true else false end @@ -1070,12 +1074,14 @@ class TEX if File.atleast?(mpfile,25) then # first run needed File.silentdelete(File.suffixed(mpfile,'mpt')) - doruntexmp(mpfile,false) + doruntexmp(mpfile) mpgraphics = checkmpgraphics(mpfile) mplabels = checkmplabels(mpfile) if mpgraphics || mplabels then # second run needed doruntexmp(mpfile,mplabels) + else + # no labels end end end @@ -1123,10 +1129,11 @@ class TEX begin if mode and job = TEX.new(@logger) then options.each do |option| - if option=~ /^\-*(.*?)\=(.*)$/o then - job.setvariable($1,$2) - else - job.setvariable(option,true) + case option + when /^\-*(.*?)\=(.*)$/o then + job.setvariable($1,$2) + when /^\-*(.*?)$/o then + job.setvariable($1,true) end end job.setvariable("files",filename) @@ -1243,31 +1250,33 @@ class TEX # preprocess files - ctx = CtxRunner.new(rawname,@logger) - if getvariable('ctxfile').empty? then - ctx.manipulate(File.suffixed(rawname,'ctx'),'jobname.ctx') - else - ctx.manipulate(File.suffixed(getvariable('ctxfile'),'ctx')) - end - ctx.savelog(File.suffixed(rawname,'ctl')) + unless getvariable('noctx') then + ctx = CtxRunner.new(rawname,@logger) + if getvariable('ctxfile').empty? then + ctx.manipulate(File.suffixed(rawname,'ctx'),'jobname.ctx') + else + ctx.manipulate(File.suffixed(getvariable('ctxfile'),'ctx')) + end + ctx.savelog(File.suffixed(rawname,'ctl')) - envs = ctx.environments - mods = ctx.modules + envs = ctx.environments + mods = ctx.modules - # merge environment and module specs + # merge environment and module specs - envs << getvariable('environments') unless getvariable('environments').empty? - mods << getvariable('modules') unless getvariable('modules') .empty? + envs << getvariable('environments') unless getvariable('environments').empty? + mods << getvariable('modules') unless getvariable('modules') .empty? - envs = envs.uniq.join(',') - mods = mods.uniq.join(',') + envs = envs.uniq.join(',') + mods = mods.uniq.join(',') - report("using search method '#{Kpse.searchmethod}'") if getvariable('verbose') - report("using environments #{envs}") if envs.length > 0 - report("using modules #{mods}") if mods.length > 0 + report("using search method '#{Kpse.searchmethod}'") if getvariable('verbose') + report("using environments #{envs}") if envs.length > 0 + report("using modules #{mods}") if mods.length > 0 - setvariable('environments', envs) - setvariable('modules', mods) + setvariable('environments', envs) + setvariable('modules', mods) + end # end of preprocessing and merging @@ -1389,11 +1398,12 @@ class TEX end - # mp specific + # The labels are collected in the mergebe hash. Here we merge the relevant labels + # into beginfig/endfig. We could as well do this in metafun itself. Maybe some + # day ... (it may cost a bit of string space but that is cheap nowadays). - def doruntexmp(mpname,mergebe=true,context=true) + def doruntexmp(mpname,mergebe=nil,context=true) texfound = false - mpbetex = Hash.new mpfile = File.suffixed(mpname,'mp') mpcopy = File.suffixed(mpname,'copy','mp') setvariable('mp.file',mpfile) @@ -1402,38 +1412,28 @@ class TEX if mpdata = File.silentread(mpfile) then mpdata.gsub!(/^\#.*\n/o,'') File.silentrename(mpfile,mpcopy) - texfound = mergebe || mpdata =~ /btex .*? etex/mo + texfound = mergebe || (mpdata =~ /btex .*? etex/mo) if mp = openedfile(mpfile) then - mpdata.gsub!(/(btex.*?)\;(.*?etex)/o) do "#{$1}@@@#{$2}" end - # mpdata.gsub!(/(\".*?)\;(.*?\")/o) do "#{$1}@@@#{$2}" end - mpdata.gsub!(/(\".*?\")/o) do "#{$1.gsub(/\;/o,'@@@')}" end - mpdata.gsub!(/\;/o, "\;\n") - # mpdata.gsub!(/\n+/o, "\n") - # mpdata.gsub!(/(btex.*?)\@\@\@(.*?etex)/o) do "#{$1}\;#{$2}" end - # mpdata.gsub!(/(\".*?)\@\@\@(.*?\")/mo) do "#{$1};#{$2}" end - mpdata.gsub!(/\@\@\@/o) do ";" end if mergebe then - mpdata.gsub!(/beginfig\s*\((\d+)\)\s*\;(.*?)endfig\s*\;/o) do + mpdata.gsub!(/beginfig\s*\((\d+)\)\s*\;(.+?)endfig\s*\;/mo) do n, str = $1, $2 - if str =~ /(.*?)(verbatimtex.*?etex)\s*\;(.*)/o then - "beginfig(#{n})\;\n#{$1}#{$2}\;\n#{mpbetex(n)}\n#{$3}\;endfig\;\n" + if str =~ /^(.*?)(verbatimtex.*?etex)\s*\;(.*)$/mo then + "beginfig(#{n})\;\n#{$1}#{$2}\;\n#{mergebe[n]}\n#{$3}\;endfig\;\n" else - "beginfig(#{n})\;\n#{mpbetex(n)}\n#{str}\;endfig\;\n" + "beginfig(#{n})\;\n#{mergebe[n]}\n#{str}\;endfig\;\n" end end + unless mpdata =~ /beginfig\s*\(\s*0\s*\)/o then + mp << mergebe['0'] if mergebe.key?('0') + end end - mpdata.gsub!(/\n+/mo, "\n") - mpdata.gsub!(/^\s*\;\s*\n/o, "") - unless mpdata =~ /beginfig\s*\(\s*0\s*\)/o then - mp << mpbetex['0'] if mpbetex.key?('0') - end - mp << mpdata # ?? + mp << splitmplines(mpdata) mp << "\n" mp << "end" mp << "\n" mp.close end - processmpx(mpname) if texfound + processmpx(mpname,true) if texfound if getvariable('batchmode') then options = ' --interaction=batch' elsif getvariable('nonstopmode') then @@ -1458,39 +1458,50 @@ class TEX end end - def processmpx(mpname,context=true) - mpname = File.suffixed(mpname,'mp') - if File.atleast?(mpname,10) && (data = File.silentread(mpname)) then + def processmpx(mpname,force=false,context=true) + unless force then + mpname = File.suffixed(mpname,'mp') + if File.atleast?(mpname,10) && (data = File.silentread(mpname)) then + if data =~ /(btex|etex|verbatimtex|textext)/o then + force = true + end + end + end + if force then begin - if data =~ /(btex|etex|verbatimtex)/o then - mptex = File.suffixed(mpname,'temp','tex') - mpdvi = File.suffixed(mpname,'temp','dvi') - mplog = File.suffixed(mpname,'temp','log') - mpmpx = File.suffixed(mpname,'mpx') - ok = system("mpto #{mpname} > #{mptex}") - if ok && File.appended(mptex, "\\end\n") then - if localjob = TEX.new(@logger) then - localjob.setvariable('files',mptex) - localjob.setvariable('backend','dvips') - localjob.setvariable('engine',getvariable('engine')) unless getvariable('engine').empty? - localjob.setvariable('once',true) - localjob.setvariable('nobackend',true) - if context then - localjob.setvariable('texformats',[getvariable('interface')]) unless getvariable('interface').empty? - elsif getvariable('interface').empty? then - localjob.setvariable('texformats',['plain']) - else - localjob.setvariable('texformats',[getvariable('interface')]) - end - localjob.processtex - ok = true # todo + mptex = File.suffixed(mpname,'temp','tex') + mpdvi = File.suffixed(mpname,'temp','dvi') + mplog = File.suffixed(mpname,'temp','log') + mpmpx = File.suffixed(mpname,'mpx') + command = "mpto #{mpname} > #{mptex}" + report(command) if getvariable('verbose') + ok = system(command) + if ok && File.appended(mptex, "\\end\n") then + # to be replaced by runtexexec([filenames],options,1) + if localjob = TEX.new(@logger) then + localjob.setvariable('files',mptex) + localjob.setvariable('backend','dvips') + localjob.setvariable('engine',getvariable('engine')) unless getvariable('engine').empty? + localjob.setvariable('once',true) + localjob.setvariable('nobackend',true) + if context then + localjob.setvariable('texformats',[getvariable('interface')]) unless getvariable('interface').empty? + elsif getvariable('interface').empty? then + localjob.setvariable('texformats',['plain']) else - ok = false - end - ok = ok && FileTest.file?(mpdvi) && system("dvitomp #{mpdvi} #{mpmpx}") - [mptex,mpdvi,mplog].each do |mpfil| - File.silentdelete(mpfil) + localjob.setvariable('texformats',[getvariable('interface')]) end + localjob.processtex + ok = true # todo + else + ok = false + end + # so far + command = "dvitomp #{mpdvi} #{mpmpx}" + report(command) if getvariable('verbose') + ok = ok && FileTest.file?(mpdvi) && system(command) + [mptex,mpdvi,mplog].each do |mpfil| + File.silentdelete(mpfil) end end rescue @@ -1551,4 +1562,42 @@ class TEX return nil end + # mp specific (todo: mp module) + + def splitmplines(str) + btex, verbatimtex, strings, result = Array.new, Array.new, Array.new, str.dup + # protect texts + result.gsub!(/btex\s*(.*?)\s*etex/) do + btex << $1 + "btex(#{btex.length-1})" + end + result.gsub!(/verbatimtex\s*(.*?)\s*etex/) do + verbatimtex << $1 + "verbatimtex(#{verbatimtex.length-1})" + end + result.gsub!(/\"(.*?)\"/) do + strings << $1 + "\"#{strings.length-1}\"" + end + result.gsub!(/\;/) do + ";\n" + end + result.gsub!(/(.{80,})(\-\-\-|\-\-|\.\.\.|\.\.)/) do + "#{$1}#{$2}\n" + end + result.gsub!(/\n[\s\n]+/mois) do + "\n" + end + result.gsub!(/btex\((\d+)\)/) do + "btex #{btex[$1.to_i]} etex" + end + result.gsub!(/verbatimtex\((\d+)\)/) do + "verbatimtex #{verbatimtex[$1.to_i]} etex" + end + result.gsub!(/\"(\d+)\"/) do + "\"#{strings[$1.to_i]}\"" + end + result + end + end diff --git a/scripts/context/ruby/base/texutil.rb b/scripts/context/ruby/base/texutil.rb index 12337c643..01ef11012 100644 --- a/scripts/context/ruby/base/texutil.rb +++ b/scripts/context/ruby/base/texutil.rb @@ -126,6 +126,8 @@ class TeXUtil class Sorter + @@downcase = true + def initialize(max=12) @rep, @map, @exp, @div = Hash.new, Hash.new, Hash.new, Hash.new @max = max @@ -149,7 +151,7 @@ class TeXUtil # sorter.expander('ijligature', 'y') def expander(from,to=nil) - from, to = converted(from), converted(to) + to = converted(to) # not from !!! @max = [@max,to.length+1].max if to @exp[from] = to || from || '' end @@ -179,17 +181,39 @@ class TeXUtil end if @map.size > 0 then # watch out, order of match matters - @rexb = /(\\[a-zA-Z]+|#{@map.keys.join('|')}|.)\s*/ # o + if @@downcase then + @rexb = /(\\[a-zA-Z]+|#{@map.keys.join('|')}|.)\s*/i # o + else + @rexb = /(\\[a-zA-Z]+|#{@map.keys.join('|')}|.)\s*/ # o + end else - @rexb = /(\\[a-zA-Z]+|.)\s*/o + if @@downcase then + @rexb = /(\\[a-zA-Z]+|.)\s*/io + else + @rexb = /(\\[a-zA-Z]+|.)\s*/o + end end - if true then + if false then @exp.keys.each do |e| @exp[e].downcase! end end end + def replace(str) + str.gsub(@rexa) do + @rep[$1.escaped] + end + end + + def normalize(str) + replace(str).gsub(/ +/,' ') + end + + def tokenize(str) + str.gsub(/\\strchr\{(.*?)\}/o) do "\\#{$1}" end + end + def remap(str) s = str.dup s.gsub!(/(\d+)/o) do @@ -203,6 +227,9 @@ class TeXUtil if @rexb then s.gsub!(@rexb) do token = $1.sub(/\\/o, '') +if @@downcase then + token.downcase! +end if @exp.key?(token) then @exp[token].ljust(@max,' ') elsif @map.key?(token) then @@ -220,7 +247,7 @@ class TeXUtil 'A'.upto('Z') do |c| expander(c) ; division(c) end expander('1','b') ; expander('2','c') ; expander('3','e') ; expander('4','f') expander('5','g') ; expander('6','h') ; expander('7','i') ; expander('8','i') - expander('9','j') ; expander('0','a') ; expander('-','-') ; + expander('9','j') ; expander('0','a') ; expander('-',"-") ; # end potential move shortcuts.each do |s| shortcut(s[0],s[1]) end expansions.each do |e| expander(e[0],e[1]) end @@ -261,6 +288,7 @@ class TeXUtil def converted(str) if str then + # puts str str.gsub(/([\+\-]*\d+)/o) do n = $1.to_i if n > 0 then @@ -400,6 +428,7 @@ class TeXUtil attr_writer :sortkey def build(sorter) +@sortkey = sorter.normalize(sorter.tokenize(@sortkey)) @sortkey = sorter.remap(sorter.simplify(@key.downcase)) if @sortkey.empty? then @sortkey = sorter.remap(@command.downcase) @@ -487,6 +516,8 @@ class TeXUtil attr_writer :sortkey def build(sorter) +@entry, @key = sorter.normalize(@entry), sorter.normalize(sorter.tokenize{@key}) +if false then @entry, @key = [@entry, @key].collect do |target| # +a+b+c &a&b&c a+b+c a&b&c case target[0,1] @@ -501,13 +532,15 @@ class TeXUtil target # end end +else + @entry, @key = cleanupsplit(@entry), cleanupsplit(@key) +end @sortkey = sorter.simplify(@key) @sortkey = @sortkey.split(@@split).collect do |c| sorter.remap(c) end.join(@@split) - # if ($Key eq "") { $Key = SanitizedString($Entry) } - # if ($ProcessHigh){ $Key = HighConverted($Key) } @sortkey = [ @sortkey.downcase, @sortkey, + @entry, @texthowto.ljust(10,' '), # @state, # no, messes up things (@realpage ||'').rjust(6,' ').gsub(/0/,' '), @@ -516,6 +549,15 @@ class TeXUtil ].join(@@split) end + def cleanupsplit(target) + # +a+b+c &a&b&c a+b+c a&b&c + case target[0,1] + when '&' then target.sub(/^./o,'').gsub(/([^\\])\&/o) do "#{$1}#{@@split}" end + when '+' then target.sub(/^./o,'').gsub(/([^\\])\+/o) do "#{$1}#{@@split}" end + else target .gsub(/([^\\])[\&\+]/o) do "#{$1}#{@@split}" end + end + end + def <=> (other) @sortkey <=> other.sortkey end @@ -561,7 +603,7 @@ class TeXUtil else testalpha = entry.sortkey[0,1].downcase end - if testalpha != alpha.downcase || alphaclass != entry.class then + if (testalpha != alpha.downcase) || (alphaclass != entry.class) then alpha = testalpha alphaclass = entry.class if alpha != ' ' then diff --git a/scripts/context/ruby/ctxtools.rb b/scripts/context/ruby/ctxtools.rb index a768264d9..0ba1a7561 100644 --- a/scripts/context/ruby/ctxtools.rb +++ b/scripts/context/ruby/ctxtools.rb @@ -17,7 +17,34 @@ # # todo: move kpse call to kpse class/module, faster and better -banner = ['CtxTools', 'version 1.3.1', '2004/2006', 'PRAGMA ADE/POD'] +# Taco Hoekwater on patterns and lig building (see 'agr'): +# +# Any direct use of a ligature (as accessed by \char or through active +# characters) is wrong and will create faulty hypenation. Normally, +# when TeX sees "office", it has six tokens, and it knows from the +# patterns that it can hyphenate between the "ff". It will build an +# internal list of four nodes, like this: +# +# [char, o , ffi ] +# [lig , ffi, c ,[f,f,i]] +# [char, c , e ] +# [char, e , NULL] +# +# as you can see from the ffi line, it has remembered the original +# characters. While hyphenating, it temporarily changes back to +# that, then re-instates the ligature afterwards. +# +# If you feed it the ligature directly, like so: +# +# [char, o , ffi ] +# [char, ffi , c ] +# [char, c , e ] +# [char, e , NULL] +# +# it cannot do that (it tries to hyphenate as if the "ffi" was a +# character), and the result is wrong hyphenation. + +banner = ['CtxTools', 'version 1.3.2', '2004/2006', 'PRAGMA ADE/POD'] unless defined? ownpath ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') @@ -772,6 +799,7 @@ class Language case @encoding.downcase when 't1', 'ec', 'cork' then preload_vector('ec') when 'y', 'texnansi' then preload_vector('texnansi') + when 'agr', 'agreek' then preload_vector('agr') end end @@ -818,11 +846,32 @@ class Language def convert if @data then n = 0 - @remapping.each do |k| - @data.gsub!(k[0]) do - # report("#{k[0]} => #{k[1]}") - n += 1 - k[1] + if true then + @data.gsub!(/\\(patterns|hypenation)\{(.*?)\}/mois) do + command, content = $1, $2 + @remapping.each_index do |i| + from, to, m = @remapping[i][0], @remapping[i][1], 0 + content.gsub!(from) do + m += 1 + "[#{i}]" + end + report("#{m.to_s.rjust(5)} entries remapped to #{to}") unless m == 0 + n += m + end + content.gsub!(/\[(\d+)\]/) do + @remapping[$1.to_i][1] + end + "\\#{command}\{#{content}\}" + end + else + @remapping.each do |k| + from, to, m = k[0], k[1], 0 + @data.gsub!(from) do + m += 1 + to + end + report("#{m.to_s.rjust(5)} entries remapped to #{to}") unless m == 0 + n += m end end report("#{n} changes in patterns and exceptions") @@ -1147,6 +1196,198 @@ class Language remap(/\\c\{.*?\}/, "") remap(/\\a\s*/, "[aeligature]") remap(/\\o\s*/, "[oeligature]") + when 'agr' then + remap(/\<\'a\|/, "[greekalphaiotasubdasiatonos]") + # remap(/\<\'a\|/, "[greekdasiatonos][greekAlpha][greekiota]") + remap(/\>\'a\|/, "[greekalphaiotasubpsilitonos]") + remap(/\<\`a\|/, "[greekalphaiotasubdasiavaria]") + remap(/\>\`a\|/, "[greekalphaiotasubpsilivaria]") + remap(/\<\~a\|/, "[greekalphaiotasubdasiaperispomeni]") + remap(/\>\~a\|/, "[greekalphaiotasubpsiliperispomeni]") + remap(/\'a\|/, "[greekalphaiotasubtonos]") + remap(/\`a\|/, "[greekalphaiotasubvaria]") + remap(/\~a\|/, "[greekalphaiotasubperispomeni]") + remap(/\a\|/, "[greekalphaiotasubpsili]") + remap(/a\|/, "[greekalphaiotasub]") + remap(/\<\'h\|/, "[greeketaiotasubdasiatonos]") + remap(/\>\'h\|/, "[greeketaiotasubpsilitonos]") + remap(/\<\`h\|/, "[greeketaiotasubdasiavaria]") + remap(/\>\`h\|/, "[greeketaiotasubpsilivaria]") + remap(/\<\~h\|/, "[greeketaiotasubdasiaperispomeni]") + remap(/\>\~h\|/, "[greeketaiotasubpsiliperispomeni]") + remap(/\'h\|/, "[greeketaiotasubtonos]") + remap(/\`h\|/, "[greeketaiotasubvaria]") + remap(/\~h\|/, "[greeketaiotasubperispomeni]") + remap(/\h\|/, "[greeketaiotasubpsili]") + remap(/h\|/, "[greeketaiotasub]") + remap(/\<'w\|/, "[greekomegaiotasubdasiatonos]") + remap(/\>'w\|/, "[greekomegaiotasubpsilitonos]") + remap(/\<`w\|/, "[greekomegaiotasubdasiavaria]") + remap(/\>`w\|/, "[greekomegaiotasubpsilivaria]") + remap(/\<~w\|/, "[greekomegaiotasubdasiaperispomeni]") + remap(/\>~w\|/, "[greekomegaiotasubpsiliperispomeni]") + remap(/\w\|/, "[greekomegaiotasubpsili]") + remap(/\'w\|/, "[greekomegaiotasubtonos]") + remap(/\`w\|/, "[greekomegaiotasubvaria]") + remap(/\~w\|/, "[greekomegaiotasubperispomeni]") + remap(/w\|/, "[greekomegaiotasub]") + remap(/\<\'i/, "[greekiotadasiatonos]") + remap(/\>\'i/, "[greekiotapsilitonos]") + remap(/\<\`i/, "[greekiotadasiavaria]") + remap(/\>\`i/, "[greekiotapsilivaria]") + remap(/\<\~i/, "[greekiotadasiaperispomeni]") + remap(/\>\~i/, "[greekiotapsiliperispomeni]") + remap(/\"\'i/, "[greekiotadialytikatonos]") + remap(/\"\`i/, "[greekiotadialytikavaria]") + remap(/\"\~i/, "[greekiotadialytikaperispomeni]") + remap(/\i/, "[greekiotapsili]") + remap(/\'i/, "[greekiotaoxia]") + remap(/\`i/, "[greekiotavaria]") + remap(/\~i/, "[greekiotaperispomeni]") + remap(/\"i/, "[greekiotadialytika]") + remap(/\>\~e/, "[greekepsilonpsiliperispomeni]") + remap(/\<\~e/, "[greekepsilondasiaperispomeni]") + remap(/\<\'e/, "[greekepsilondasiatonos]") + remap(/\>\'e/, "[greekepsilonpsilitonos]") + remap(/\<\`e/, "[greekepsilondasiavaria]") + remap(/\>\`e/, "[greekepsilonpsilivaria]") + remap(/\e/, "[greekepsilonpsili]") + remap(/\'e/, "[greekepsilonoxia]") + remap(/\`e/, "[greekepsilonvaria]") + remap(/\~e/, "[greekepsilonperispomeni]") + remap(/\<\'a/, "[greekalphadasiatonos]") + remap(/\>\'a/, "[greekalphapsilitonos]") + remap(/\<\`a/, "[greekalphadasiavaria]") + remap(/\>\`a/, "[greekalphapsilivaria]") + remap(/\<\~a/, "[greekalphadasiaperispomeni]") + remap(/\>\~a/, "[greekalphapsiliperispomeni]") + remap(/\a/, "[greekalphapsili]") + remap(/\'a/, "[greekalphaoxia]") + remap(/\`a/, "[greekalphavaria]") + remap(/\~a/, "[greekalphaperispomeni]") + remap(/\<\'h/, "[greeketadasiatonos]") + remap(/\>\'h/, "[greeketapsilitonos]") + remap(/\<\`h/, "[greeketadasiavaria]") + remap(/\>\`h/, "[greeketapsilivaria]") + remap(/\<\~h/, "[greeketadasiaperispomeni]") + remap(/\>\~h/, "[greeketapsiliperispomeni]") + remap(/\h/, "[greeketapsili]") + remap(/\'h/, "[greeketaoxia]") + remap(/\`h/, "[greeketavaria]") + remap(/\~h/, "[greeketaperispomeni]") + remap(/\<\~o/, "[greekomicrondasiaperispomeni]") + remap(/\>\~o/, "[greekomicronpsiliperispomeni]") + remap(/\<\'o/, "[greekomicrondasiatonos]") + remap(/\>\'o/, "[greekomicronpsilitonos]") + remap(/\<\`o/, "[greekomicrondasiavaria]") + remap(/\>\`o/, "[greekomicronpsilivaria]") + remap(/\o/, "[greekomicronpsili]") + remap(/\'o/, "[greekomicronoxia]") + remap(/\`o/, "[greekomicronvaria]") + remap(/\~o/, "[greekomicronperispomeni]") + remap(/\<\'u/, "[greekupsilondasiatonos]") + remap(/\>\'u/, "[greekupsilonpsilitonos]") + remap(/\<\`u/, "[greekupsilondasiavaria]") + remap(/\>\'u/, "[greekupsilonpsilivaria]") + remap(/\<\~u/, "[greekupsilondasiaperispomeni]") + remap(/\>\~u/, "[greekupsilonpsiliperispomeni]") + remap(/\"\'u/, "[greekupsilondialytikatonos]") + remap(/\"\`u/, "[greekupsilondialytikavaria]") + remap(/\"\~u/, "[greekupsilondialytikaperispomeni]") + remap(/\u/, "[greekupsilonpsili]") + remap(/\'u/, "[greekupsilonoxia]") + remap(/\`u/, "[greekupsilonvaria]") + remap(/\~u/, "[greekupsilonperispomeni]") + remap(/\"u/, "[greekupsilondiaeresis]") + remap(/\<\'w/, "[greekomegadasiatonos]") + remap(/\>\'w/, "[greekomegapsilitonos]") + remap(/\<\`w/, "[greekomegadasiavaria]") + remap(/\>\`w/, "[greekomegapsilivaria]") + remap(/\<\~w/, "[greekomegadasiaperispomeni]") + remap(/\>\~w/, "[greekomegapsiliperispomeni]") + remap(/\w/, "[greekomegapsili]") + remap(/\'w/, "[greekomegaoxia]") + remap(/\`w/, "[greekomegavaria]") + remap(/\~w/, "[greekomegaperispomeni]") + remap(/\r/, "[greekrhopsili]") + remap(/\<\~/, "[greekdasiaperispomeni]") + remap(/\>\~/, "[greekpsiliperispomeni]") + remap(/\<\'/, "[greekdasiatonos]") + remap(/\>\'/, "[greekpsilitonos]") + remap(/\<\`/, "[greekdasiavaria]") + remap(/\>\`/, "[greekpsilivaria]") + remap(/\"\'/, "[greekdialytikatonos]") + remap(/\"\`/, "[greekdialytikavaria]") + remap(/\"\~/, "[greekdialytikaperispomeni]") + remap(/\/, "[psili]") + remap(/\'/, "[oxia]") + remap(/\`/, "[greekvaria]") + remap(/\~/, "[perispomeni]") + remap(/\"/, "[dialytika]") + # unknown + remap(/\|/, "[greekIotadialytika]") + # next + remap(/A/, "[greekAlpha]") + remap(/B/, "[greekBeta]") + remap(/D/, "[greekDelta]") + remap(/E/, "[greekEpsilon]") + remap(/F/, "[greekPhi]") + remap(/G/, "[greekGamma]") + remap(/H/, "[greekEta]") + remap(/I/, "[greekIota]") + remap(/J/, "[greekTheta]") + remap(/K/, "[greekKappa]") + remap(/L/, "[greekLambda]") + remap(/M/, "[greekMu]") + remap(/N/, "[greekNu]") + remap(/O/, "[greekOmicron]") + remap(/P/, "[greekPi]") + remap(/Q/, "[greekChi]") + remap(/R/, "[greekRho]") + remap(/S/, "[greekSigma]") + remap(/T/, "[greekTau]") + remap(/U/, "[greekUpsilon]") + remap(/W/, "[greekOmega]") + remap(/X/, "[greekXi]") + remap(/Y/, "[greekPsi]") + remap(/Z/, "[greekZeta]") + remap(/a/, "[greekalpha]") + remap(/b/, "[greekbeta]") + remap(/c/, "[greekfinalsigma]") + remap(/d/, "[greekdelta]") + remap(/e/, "[greekepsilon]") + remap(/f/, "[greekphi]") + remap(/g/, "[greekgamma]") + remap(/h/, "[greeketa]") + remap(/i/, "[greekiota]") + remap(/j/, "[greektheta]") + remap(/k/, "[greekkappa]") + remap(/l/, "[greeklambda]") + remap(/m/, "[greekmu]") + remap(/n/, "[greeknu]") + remap(/o/, "[greekomicron]") + remap(/p/, "[greekpi]") + remap(/q/, "[greekchi]") + remap(/r/, "[greekrho]") + remap(/s/, "[greeksigma]") + remap(/t/, "[greektau]") + remap(/u/, "[greekupsilon]") + remap(/w/, "[greekomega]") + remap(/x/, "[greekxi]") + remap(/y/, "[greekpsi]") + remap(/z/, "[greekzeta]") else end @@ -1197,7 +1438,7 @@ class Commands # todo: filter the fallback list from context # The first entry in the array is the encoding which will be used - # when interpreting th eraw patterns. The second entry is a list of + # when interpreting the raw patterns. The second entry is a list of # filesets (string|aray), each first match of a set is taken. @@languagedata['ba' ] = [ 'ec' , ['bahyph.tex'] ] @@ -1224,7 +1465,7 @@ class Commands # mnhyph @@languagedata['nl' ] = [ 'ec' , ['nehyph96.tex'] ] @@languagedata['no' ] = [ 'ec' , ['nohyph.tex'] ] - # oldgrhyph.tex + @@languagedata['agr'] = [ 'agr' , [['grahyph4.tex','oldgrhyph.tex']] ] # new, todo @@languagedata['pl' ] = [ 'ec' , ['plhyph.tex'] ] @@languagedata['pt' ] = [ 'ec' , ['pthyph.tex'] ] @@languagedata['ro' ] = [ 'ec' , ['rohyph.tex'] ] @@ -1235,7 +1476,6 @@ class Commands @@languagedata['sv' ] = [ 'ec' , ['svhyph.tex'] ] @@languagedata['tr' ] = [ 'ec' , ['tkhyph.tex'] ] @@languagedata['uk' ] = [ 'default' , [['ukhyphen.tex','ukhyph.tex']] ] - end class Commands diff --git a/scripts/context/ruby/graphics/gs.rb b/scripts/context/ruby/graphics/gs.rb index 807cad10c..588ef2417 100644 --- a/scripts/context/ruby/graphics/gs.rb +++ b/scripts/context/ruby/graphics/gs.rb @@ -13,11 +13,14 @@ require 'base/variables' require 'base/system' +require 'ftools' class GhostScript include Variables + @@pdftrimwhite = 'pdftrimwhite.pl' + @@pstopdfoptions = [ 'AntiAliasColorImages', 'AntiAliasGrayImages', @@ -213,7 +216,7 @@ class GhostScript else report("invalid conversion method #{gsmethod}") end rescue - report("job aborted due to some error #{$!}") + report("job aborted due to some error: #{$!}") begin File.delete(resultfile) if test(?e,resultfile) rescue @@ -338,9 +341,12 @@ class GhostScript end - def convertbounded (inpfile, outfile) - + def convertbounded(inpfile, outfile) report("converting #{inpfile} bounded") + do_convertbounded(inpfile, outfile) + end + + def do_convertbounded(inpfile, outfile) begin return false if FileTest.file?(outfile) && (! File.delete(outfile)) @@ -456,13 +462,14 @@ class GhostScript report("converting #{inpfile} cropped") - convertbounded(inpfile, @@pdftempfile) + do_convertbounded(inpfile, @@pdftempfile) return unless test(?e,@@pdftempfile) arguments = " --offset=#{@offset} #{@@pdftempfile} #{outfile}" - unless ok = System.run('cropcrap',arguments) then + report("calling #{@@pdftrimwhite}") + unless ok = System.run(@@pdftrimwhite,arguments) then report('cropping failed') begin File.delete(outfile) diff --git a/scripts/context/ruby/newtexexec.rb b/scripts/context/ruby/newtexexec.rb index 564205d2e..a44cf1116 100644 --- a/scripts/context/ruby/newtexexec.rb +++ b/scripts/context/ruby/newtexexec.rb @@ -356,7 +356,7 @@ class Commands copyortrim(true,'trim') end - def copyortrim(trim=false) + def copyortrim(trim=false,what='unknown') if job = TEX.new(logger) then prepare(job) job.cleanuptemprunfiles diff --git a/scripts/context/ruby/texmfstart.rb b/scripts/context/ruby/texmfstart.rb index dfc9b1a26..0320ce97a 100644 --- a/scripts/context/ruby/texmfstart.rb +++ b/scripts/context/ruby/texmfstart.rb @@ -85,8 +85,9 @@ $predefined['mpstools'] = 'mpstools.rb' $predefined['exatools'] = 'exatools.rb' $predefined['xmltools'] = 'xmltools.rb' -$predefined['newpstopdf'] = 'newpstopdf.rb' -$predefined['newtexexec'] = 'newtexexec.rb' +$predefined['newpstopdf'] = 'newpstopdf.rb' +$predefined['newtexexec'] = 'newtexexec.rb' +$predefined['pdftrimwhite'] = 'pdftrimwhite.pl' $makelist = [ # context diff --git a/scripts/context/ruby/textools.rb b/scripts/context/ruby/textools.rb index 78982f175..3c257b7db 100644 --- a/scripts/context/ruby/textools.rb +++ b/scripts/context/ruby/textools.rb @@ -13,7 +13,7 @@ # This script will harbor some handy manipulations on tex # related files. -banner = ['TeXTools', 'version 1.2.2', '2002/2005', 'PRAGMA ADE/POD'] +banner = ['TeXTools', 'version 1.3.1', '2002/2006', 'PRAGMA ADE/POD'] unless defined? ownpath ownpath = $0.sub(/[\\\/][a-z0-9\-]*?\.rb/i,'') @@ -37,6 +37,70 @@ require 'ftools' # aware of this). Files will only be moved when --force is given. Let # me know if more fixes need to be made. +class Commands + + include CommandBase + + def tpmmake + if filename = @commandline.argument('first') then + filename = File.join('tpm',filename) unless filename =~ /^tpm[\/\\]/ + filename += '.tpm' unless filename =~ /\.tpm$/ + if FileTest.file?(filename) then + data = IO.read(filename) rescue '' + data, fn, n = calculate_tpm(data,"TPM:RunFiles") + data, fm, m = calculate_tpm(data,"TPM:DocFiles") + data = replace_tpm(data,"TPM:Size",n+m) + report("total size #{n+m}") + begin + File.open(filename, 'w') do |f| + f << data + end + rescue + report("unable to save '#{filename}'") + else + report("file '#{filename}' is updated") + filename = File.basename(filename).sub(/\..*$/,'') + zipname = sprintf("%s-%04i.%02i.%02i%s",filename,Time.now.year,Time.now.month,Time.now.day,'.zip') + File.delete(zipname) rescue true + report("zipping file '#{zipname}'") + system("zip -r -9 -q #{zipname} #{[fn,fm].flatten.join(' ')}") + end + else + report("no file '#{filename}'") + end + end + end + + def calculate_tpm(data, tag='') + size, ok = 0, Array.new + data.gsub!(/<#{tag}.*>(.*?)<\/#{tag}>/m) do + content = $1 + files = content.split(/\s+/) + files.each do |file| + unless file =~ /^\s*$/ then + if FileTest.file?(file) then + report("found file #{file}") + size += FileTest.size(file) rescue 0 + ok << file + else + report("missing file #{file}") + end + end + end + "<#{tag} size=\"#{size}\">#{content}" + end + [data, ok, size] + end + + def replace_tpm(data, tag='', txt='') + data.gsub(/(<#{tag}.*>)(.*?)(<\/#{tag}>)/m) do + $1 + txt.to_s + $3 + end + end + + +end + class Commands include CommandBase @@ -871,6 +935,8 @@ commandline.registeraction('downcasefilenames', '[--recurse] [--force]') # not y commandline.registeraction('stripformfeeds' , '[--recurse] [--force]') # not yet documented commandline.registeraction('showfont' , 'filename') +commandline.registeraction('tpmmake' , 'tpm file (run in texmf root)') + commandline.registeraction('help') commandline.registeraction('version') -- cgit v1.2.3