runtex 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/Code_zum_Pluendern_rtex4newrtex.rb +275 -0
- data/lib/catch_output.rb +99 -0
- data/lib/runtex.rb +221 -0
- data/lib/runtex_bibtex.rb +111 -0
- data/lib/runtex_job_chain.rb +371 -0
- data/lib/runtex_latex.rb +373 -0
- data/lib/runtex_makeindex.rb +114 -0
- data/lib/runtex_pathes.yaml +59 -0
- data/lib/runtex_rail.rb +116 -0
- data/lib/runtex_splitindex.rb +78 -0
- data/lib/runtex_tool.rb +128 -0
- data/lppl.txt +416 -0
- data/readme +73 -0
- data/unittest/expected/test_bibliography_babelbib.debug1.txt +31 -0
- data/unittest/expected/test_bibliography_babelbib.debug2.txt +16 -0
- data/unittest/expected/test_bibliography_babelbib.tex.runtex_summary.txt +19 -0
- data/unittest/expected/test_bibliography_babelbib_1.txt +15 -0
- data/unittest/expected/test_bibliography_babelbib_2.txt +11 -0
- data/unittest/expected/test_bibliography_plain.debug1.txt +45 -0
- data/unittest/expected/test_bibliography_plain.debug2.txt +16 -0
- data/unittest/expected/test_bibliography_plain.tex.runtex_summary.txt +18 -0
- data/unittest/expected/test_bibliography_plain_1.txt +19 -0
- data/unittest/expected/test_bibliography_plain_2.txt +11 -0
- data/unittest/expected/test_error.debug1.txt +22 -0
- data/unittest/expected/test_error.debug2.txt +12 -0
- data/unittest/expected/test_error.tex.runtex_summary.txt +15 -0
- data/unittest/expected/test_error_1.txt +15 -0
- data/unittest/expected/test_error_2.txt +12 -0
- data/unittest/expected/test_gloss.debug1.txt +45 -0
- data/unittest/expected/test_gloss.debug2.txt +16 -0
- data/unittest/expected/test_gloss.tex.runtex_summary.txt +18 -0
- data/unittest/expected/test_gloss_1.txt +19 -0
- data/unittest/expected/test_gloss_2.txt +11 -0
- data/unittest/expected/test_gloss_newgloss.debug1.txt +58 -0
- data/unittest/expected/test_gloss_newgloss.debug2.txt +20 -0
- data/unittest/expected/test_gloss_newgloss.tex.runtex_summary.txt +24 -0
- data/unittest/expected/test_gloss_newgloss_1.txt +23 -0
- data/unittest/expected/test_gloss_newgloss_2.txt +13 -0
- data/unittest/expected/test_glossaries.debug1.txt +56 -0
- data/unittest/expected/test_glossaries.debug2.txt +28 -0
- data/unittest/expected/test_glossaries.tex.runtex_summary.txt +30 -0
- data/unittest/expected/test_glossaries_1.txt +24 -0
- data/unittest/expected/test_glossaries_2.txt +19 -0
- data/unittest/expected/test_index.debug1.txt +35 -0
- data/unittest/expected/test_index.debug2.txt +18 -0
- data/unittest/expected/test_index.tex.runtex_summary.txt +24 -0
- data/unittest/expected/test_index2.debug1.txt +58 -0
- data/unittest/expected/test_index2.debug2.txt +29 -0
- data/unittest/expected/test_index2.tex.runtex_summary.txt +27 -0
- data/unittest/expected/test_index2_1.txt +23 -0
- data/unittest/expected/test_index2_2.txt +17 -0
- data/unittest/expected/test_index_1.txt +21 -0
- data/unittest/expected/test_index_2.txt +17 -0
- data/unittest/expected/test_makeindex.debug1.txt +35 -0
- data/unittest/expected/test_makeindex.debug2.txt +18 -0
- data/unittest/expected/test_makeindex.tex.runtex_summary.txt +18 -0
- data/unittest/expected/test_makeindex_1.txt +15 -0
- data/unittest/expected/test_makeindex_2.txt +11 -0
- data/unittest/expected/test_packagedoc_dtx.debug1.txt +54 -0
- data/unittest/expected/test_packagedoc_dtx.debug2.txt +27 -0
- data/unittest/expected/test_packagedoc_dtx.dtx.runtex_summary.txt +31 -0
- data/unittest/expected/test_packagedoc_dtx_1.txt +18 -0
- data/unittest/expected/test_packagedoc_dtx_2.txt +13 -0
- data/unittest/expected/test_rail.debug1.txt +35 -0
- data/unittest/expected/test_rail.debug2.txt +12 -0
- data/unittest/expected/test_rail.tex.runtex_summary.txt +12 -0
- data/unittest/expected/test_rail_1.txt +13 -0
- data/unittest/expected/test_rail_2.txt +9 -0
- data/unittest/expected/test_rail_error.debug1.txt +37 -0
- data/unittest/expected/test_rail_error.debug2.txt +35 -0
- data/unittest/expected/test_rail_error.tex.runtex_summary.txt +18 -0
- data/unittest/expected/test_rail_error_1.txt +18 -0
- data/unittest/expected/test_rail_error_2.txt +18 -0
- data/unittest/expected/test_splitindex.debug1.txt +64 -0
- data/unittest/expected/test_splitindex.debug2.txt +32 -0
- data/unittest/expected/test_splitindex.tex.runtex_summary.txt +31 -0
- data/unittest/expected/test_splitindex_1.txt +21 -0
- data/unittest/expected/test_splitindex_2.txt +15 -0
- data/unittest/expected/test_test.debug1.txt +32 -0
- data/unittest/expected/test_test.debug2.txt +12 -0
- data/unittest/expected/test_test.tex.runtex_summary.txt +12 -0
- data/unittest/expected/test_test_1.txt +15 -0
- data/unittest/expected/test_test_2.txt +9 -0
- data/unittest/expected/test_test_bibliography.debug1.txt +31 -0
- data/unittest/expected/test_test_gloss.debug1.txt +45 -0
- data/unittest/expected/test_test_gloss_newgloss.debug1.txt +58 -0
- data/unittest/expected/test_test_glossaries.debug1.txt +48 -0
- data/unittest/expected/test_test_index.debug1.txt +35 -0
- data/unittest/expected/test_test_index2.debug1.txt +58 -0
- data/unittest/expected/test_test_makeindex.debug1.txt +35 -0
- data/unittest/expected/test_test_rail.debug1.txt +35 -0
- data/unittest/expected/test_test_splitindex.debug1.txt +64 -0
- data/unittest/expected/test_test_test.debug1.txt +32 -0
- data/unittest/testcases.yaml +427 -0
- data/unittest/unittest_catch_output.rb +66 -0
- data/unittest/unittest_runtex.rb +282 -0
- metadata +149 -0
@@ -0,0 +1,111 @@
|
|
1
|
+
#
|
2
|
+
# This file is part of the runtex-bundle
|
3
|
+
#
|
4
|
+
|
5
|
+
module RunTeX
|
6
|
+
#Actions to handle bibliographies with bibTeX.
|
7
|
+
#
|
8
|
+
#Also supported:
|
9
|
+
#Glossaries with gloss.sty.
|
10
|
+
#Instead gloss.sty I recommend glossaries.sty (uses makeindex/xindy).
|
11
|
+
#
|
12
|
+
class BibTeX < Tool
|
13
|
+
def initialize(job, options = {})
|
14
|
+
super(job, options,
|
15
|
+
:source => "#{job.basename}.aux",
|
16
|
+
:target => "#{job.basename}.bbl",
|
17
|
+
:log => "#{job.basename}.blg"
|
18
|
+
)
|
19
|
+
@options.keys.each{|key|
|
20
|
+
case key
|
21
|
+
when :source
|
22
|
+
if @options[:source] !~ /\.aux/
|
23
|
+
@job.log.error( "#{@step} #{self.class}: Source is no aux-file (#{@options[:source]})" ) if @job.log.error?
|
24
|
+
end
|
25
|
+
when :target
|
26
|
+
if @options[:target] !~ /\.bbl/
|
27
|
+
@job.log.error( "#{@step} #{self.class}: Target is no bbl-file (#{@options[:target]})" ) if @job.log.error?
|
28
|
+
end
|
29
|
+
when :log
|
30
|
+
if @options[:log] !~ /\.blg/
|
31
|
+
@job.log.error( "#{@step} #{self.class}: Log is no blg-file (#{@options[:log]})" ) if @job.log.error?
|
32
|
+
end
|
33
|
+
else
|
34
|
+
@job.log.error( "#{@step} #{self.class}: Unknown option #{key}" ) if @job.log.error?
|
35
|
+
end
|
36
|
+
}
|
37
|
+
end #initialize
|
38
|
+
#Take the aux-file (source) and create the bbl-file.
|
39
|
+
def execute( step )
|
40
|
+
super(step)
|
41
|
+
@result = {
|
42
|
+
:error => [],
|
43
|
+
:warning => [],
|
44
|
+
:info => [],
|
45
|
+
}
|
46
|
+
#~ Logger.add( 5, self.class, "Execute #{Configuration.bibtex}for \"#{@filename}\"" )
|
47
|
+
if File.exist?( @options[:source])
|
48
|
+
@job.add2zip( @options[:source] )
|
49
|
+
end
|
50
|
+
if File.exist?( @options[:target])
|
51
|
+
@job.add2zip( @options[:target] )
|
52
|
+
bblold = File.readlines(@options[:target])
|
53
|
+
end
|
54
|
+
|
55
|
+
subrc = nil
|
56
|
+
cmd = build_cmd('bibtex', @options)
|
57
|
+
@job.log.debug( "#{@step} Call #{cmd}") if @job.log.debug?
|
58
|
+
stdout, stderr = catch_screen_output{ subrc = system( cmd ) }
|
59
|
+
#~ Logger.add_file( @filename + '.blg' ) if @logInclude
|
60
|
+
if ! subrc
|
61
|
+
@job.log.error( "#{@step} Error executing #{cmd}")
|
62
|
+
end
|
63
|
+
if File.exist?( @options[:target])
|
64
|
+
@job.add2zip( @options[:target] )
|
65
|
+
bblnew = File.readlines(@options[:target])
|
66
|
+
else
|
67
|
+
@job.log.error( "#{@step} No result after executing #{cmd}")
|
68
|
+
end
|
69
|
+
if bblold != bblnew
|
70
|
+
@job.please_rerun('Bibliography changed')
|
71
|
+
end
|
72
|
+
|
73
|
+
@job.helpfiles << @options[:source]
|
74
|
+
@job.helpfiles << @options[:target]
|
75
|
+
@job.helpfiles << "#{@job.basename}-blx.bib" #This is an auxiliary file used by the 'biblatex' package.
|
76
|
+
@job.logfiles << @options[:log]
|
77
|
+
|
78
|
+
|
79
|
+
if File.exist?( @options[:log])
|
80
|
+
@job.add2zip( @options[:log] )
|
81
|
+
File.readlines(@options[:log]).each{ |logline|
|
82
|
+
case logline
|
83
|
+
when /Database file #(.*): (.*)/
|
84
|
+
@result[:info] << "Database file #{$2} used"
|
85
|
+
when /Warning--I didn't find a database entry for "(.*)"/
|
86
|
+
@result[:warning] << "Databaseentry #{$1} missing"
|
87
|
+
#~ when /Warning--Empty definition in (.*)/
|
88
|
+
#~ result[:warning] << "Empty definition #{$1}"
|
89
|
+
when /Warning--(.*)/
|
90
|
+
@result[:warning] << "#{$1}"
|
91
|
+
when /I couldn't open (.*) file (.*)/
|
92
|
+
@result[:error] << "#{$1} #{$2} not found"
|
93
|
+
when /I found no (.*) commands---while reading file(.*)/
|
94
|
+
@result[:warning] << "found no #{$1} in #{$2}"
|
95
|
+
when /(.*)---line (.*) of file(.*)/
|
96
|
+
#line-number ist unsinnig
|
97
|
+
@result[:error] << "#{$1} in #{$3}"
|
98
|
+
end
|
99
|
+
}
|
100
|
+
else
|
101
|
+
@job.log.error( "#{@step} No BibTeX-Log found #{@options[:log]}")
|
102
|
+
end
|
103
|
+
return @result
|
104
|
+
end #execute
|
105
|
+
#Used in logger
|
106
|
+
def inspect()
|
107
|
+
"BibTeX<#{@options[:target]}>"
|
108
|
+
end
|
109
|
+
end #BibTeX
|
110
|
+
|
111
|
+
end #module RunTeX
|
@@ -0,0 +1,371 @@
|
|
1
|
+
#
|
2
|
+
# This file is part of the runtex-bundle
|
3
|
+
#
|
4
|
+
|
5
|
+
module RunTeX
|
6
|
+
|
7
|
+
# This class defines a process chain to translate a tex-File.
|
8
|
+
#
|
9
|
+
# The process chain starts with a TeX-tool (LaTeX, TeX, PDFLaTeX...).
|
10
|
+
#
|
11
|
+
# Postprocessors (dvi2ps, ps2pdf...) can be integrated here
|
12
|
+
class Job_chain
|
13
|
+
|
14
|
+
#
|
15
|
+
MAX_TEX_RUN = 5 #Stop for infinite TeX-runs
|
16
|
+
#The configuration defines:
|
17
|
+
#- the programm to call
|
18
|
+
#- post processes
|
19
|
+
File.open(RunTeX::CONFIGURATION){|f|
|
20
|
+
Configuration = YAML.load(f)
|
21
|
+
}
|
22
|
+
#Default options for TeX-Jobs.
|
23
|
+
#Used by Job_chain#new and Job_chain#help.
|
24
|
+
DEFAULT_OPTIONS = {
|
25
|
+
:format => :pdflatex,
|
26
|
+
:delete_logfiles => true,
|
27
|
+
:delete_helpfiles => true,
|
28
|
+
:zip_helpfiles => true,
|
29
|
+
:keep_summary => true,
|
30
|
+
:overfull => 100, #report overfull boxes > this value
|
31
|
+
:underfull => 9000, #report underfull boxes > this badness
|
32
|
+
}
|
33
|
+
|
34
|
+
def self.help()
|
35
|
+
return <<help
|
36
|
+
Help for RunTeX::Jobchain
|
37
|
+
Codeexample>>>>>Start>>>>>>>
|
38
|
+
require 'runtex'
|
39
|
+
#~ puts RunTeX::Job_chain.help()
|
40
|
+
tex = RunTeX::Job_chain.new('filename', {
|
41
|
+
#{DEFAULT_OPTIONS.map{|key, value| " #{key.inspect} => #{value.inspect}" }.join(",\n")}}
|
42
|
+
})
|
43
|
+
tex.start
|
44
|
+
require 'runtex'
|
45
|
+
#~ tex.start( 'pdflatex' )
|
46
|
+
Codeexample<<<<<<End<<<<<<<
|
47
|
+
help
|
48
|
+
#~ Available formats and programms:
|
49
|
+
#~ #{Configuration.keys.map{|k| k =~ /tex/ ? k : nil }.compact.to_yaml}
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
#
|
54
|
+
#Create a job and define the parameters.
|
55
|
+
#To execute it, use Job_chain#start()
|
56
|
+
def initialize( filename, options = {} )
|
57
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
58
|
+
|
59
|
+
@logfiles = []
|
60
|
+
@helpfiles = []
|
61
|
+
|
62
|
+
@log = Log4r::Logger.new( File.basename(filename) )
|
63
|
+
@log.level = Log4r::DEBUG
|
64
|
+
@log.outputters = Log4r::StdoutOutputter.new('log_stdout', :level => Log4r::INFO )
|
65
|
+
@logfiles << "#{filename}.runtex.log"
|
66
|
+
@log.add(Log4r::FileOutputter.new('log_file', :filename => "#{@logfiles.last}", :level => Log4r::DEBUG ) )
|
67
|
+
|
68
|
+
self.file= filename
|
69
|
+
|
70
|
+
(options.keys - DEFAULT_OPTIONS.keys).each{|key|
|
71
|
+
@log.warn( "#{self.inspect}: Unknown option-key #{key}" ) if @log.warn?
|
72
|
+
}
|
73
|
+
|
74
|
+
end
|
75
|
+
#Main document. This document is to be converted.
|
76
|
+
attr_reader :filename
|
77
|
+
#Main document without extension.
|
78
|
+
attr_reader :basename
|
79
|
+
#List with log-files. Used for Job_chain#delete_helpfiles
|
80
|
+
attr_reader :logfiles
|
81
|
+
#List with help-files. Used for Job_chain#delete_helpfiles
|
82
|
+
attr_reader :helpfiles
|
83
|
+
|
84
|
+
#Define the TeX-file
|
85
|
+
def file=( filename )
|
86
|
+
@dirname = File.dirname( filename)
|
87
|
+
@filename = File.basename( filename )
|
88
|
+
#~ @basename = File.basename( filename, ".tex" )
|
89
|
+
@basename = @filename.sub(/\.(tex|dtx)$/, '')
|
90
|
+
Dir.chdir(@dirname){
|
91
|
+
if ! File.exist?( @filename )
|
92
|
+
@log.fatal("File #{@filename } not found (looking in #{Dir.pwd()})") if @log.fatal?
|
93
|
+
end
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
#Start the job chain.
|
98
|
+
def start( format = @options[:format] )
|
99
|
+
puts "Start job chain for #{@filename }"
|
100
|
+
@log.info( "Start job chain for #{@dirname}/#{@filename }") if @log.info?
|
101
|
+
|
102
|
+
@texrun = 0
|
103
|
+
@rerun = [ nil ] #Flag, if an additional texrun is necessary (nil, so compact can delete it again)
|
104
|
+
@stop_rerun = {} #Set a Rerun-Stop in case of serious problems.
|
105
|
+
zipfilename = "#{@basename}.log.zip"
|
106
|
+
summary = nil
|
107
|
+
#Don't use "#{filename}.runtex.log", Thats already the log.
|
108
|
+
jobreport = "#{filename}.runtex_summary.txt"
|
109
|
+
|
110
|
+
Dir.chdir(@dirname){
|
111
|
+
if ! File.exist?( @filename )
|
112
|
+
@log.error( "File #{@filename} missing (dir #{@dirname})" ) if @log.error?
|
113
|
+
return false
|
114
|
+
end
|
115
|
+
|
116
|
+
if File.exist?( zipfilename )
|
117
|
+
#Extract previous help files
|
118
|
+
Zip::ZipFile.open( zipfilename, Zip::ZipFile::CREATE ){|zip|
|
119
|
+
zip.each{|f| f.extract if File.dirname("#{f}") == '.' and ! File.exist?("#{f}")}
|
120
|
+
}
|
121
|
+
File.delete( zipfilename)#Delete zip file. Easier then rebuild the zip.
|
122
|
+
@log.debug( "Re-Create log/help-zip #{zipfilename}") if @log.debug?
|
123
|
+
else
|
124
|
+
@log.debug( "Create log/help-zip #{zipfilename}") if @log.debug?
|
125
|
+
end
|
126
|
+
@zip = Zip::ZipFile.new( zipfilename, Zip::ZipFile::CREATE )
|
127
|
+
|
128
|
+
configuration = Configuration["#{format}"]
|
129
|
+
@log.fatal("No configuration for #{format}") if ! configuration and @log.fatal
|
130
|
+
|
131
|
+
while ! @rerun.empty? and @texrun < MAX_TEX_RUN
|
132
|
+
#Write the message only, if it is the 2nd run (-> test with compact).
|
133
|
+
@log.info( "%02i--- Rerun necessary (#{@rerun.join(', ')})" % @texrun ) if @log.info? and ! @rerun.compact.empty?
|
134
|
+
@rerun = []
|
135
|
+
texresult = run( LaTeX.new( self, {
|
136
|
+
:format => configuration['call'],
|
137
|
+
:overfull => @options[:overfull],
|
138
|
+
:underfull => @options[:underfull],
|
139
|
+
}
|
140
|
+
) )
|
141
|
+
texresult = {} unless texresult
|
142
|
+
#jobreport/summary for each step
|
143
|
+
summary = build_summary( texresult, jobreport, format )
|
144
|
+
@zip.add("%02i/#{jobreport}" % @texrun, jobreport )
|
145
|
+
#The deletion is done with the end-summary
|
146
|
+
|
147
|
+
end
|
148
|
+
if @texrun >= MAX_TEX_RUN
|
149
|
+
@log.warn( "Stop after #{MAX_TEX_RUN} tex runs") if @log.warn?
|
150
|
+
end
|
151
|
+
|
152
|
+
##################
|
153
|
+
#fixme - postprocesses
|
154
|
+
##################
|
155
|
+
configuration['post'].each{|post|
|
156
|
+
@log.error( "Post-process #{post} undefined") if @log.error?
|
157
|
+
} if configuration['post']
|
158
|
+
|
159
|
+
@helpfiles.uniq!
|
160
|
+
#Save all helpfiles to the zip file.
|
161
|
+
#In a later run, this helpfiles are extracted again.
|
162
|
+
if @options[:zip_helpfiles]
|
163
|
+
@log.debug( "Zip help files for later use (#{@helpfiles.join(', ')})") if @log.debug?
|
164
|
+
@helpfiles.each{|filename|
|
165
|
+
#~ @log.debug( "Zip #{filename} for later use") if @log.debug?
|
166
|
+
@zip.add( filename, filename ) if File.exist?(filename)
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
#fixme - I would like to add the log - does not work
|
171
|
+
#~ filename = @log.outputters[1].filename
|
172
|
+
#~ @log.outputters[1].close
|
173
|
+
#~ @log.remove[1]
|
174
|
+
#~ @zip.add( filename, filename )
|
175
|
+
|
176
|
+
#build the summary and save it
|
177
|
+
summary = build_summary( texresult, jobreport, format )
|
178
|
+
@zip.add(jobreport, jobreport)
|
179
|
+
@logfiles << jobreport unless @options[:keep_summary]
|
180
|
+
|
181
|
+
#Close must be done before the files are deleted.
|
182
|
+
@zip.close
|
183
|
+
|
184
|
+
#Delete logfiles if requested
|
185
|
+
if @options[:delete_logfiles]
|
186
|
+
@logfiles.delete_if{|filename| ! File.exist?(filename) } #delete for log
|
187
|
+
@log.debug( "Delete log files #{@logfiles.join(', ')}") if @log.debug?
|
188
|
+
@logfiles.each{|filename|
|
189
|
+
#~ @log.debug( "Delete #{filename}") if @log.debug?
|
190
|
+
begin; File.delete(filename) if File.exist?(filename)
|
191
|
+
rescue Errno::EACCES => err
|
192
|
+
@log.error( "Delete #{filename}: #{err}") if @log.error?
|
193
|
+
end
|
194
|
+
}
|
195
|
+
end
|
196
|
+
#Delete helpfiles if requested
|
197
|
+
if @options[:delete_helpfiles]
|
198
|
+
@helpfiles.delete_if{|filename| ! File.exist?(filename) } #delete for log
|
199
|
+
@log.debug( "Delete helpfiles #{@helpfiles.join(', ')}") if @log.debug?
|
200
|
+
@helpfiles.each{|filename|
|
201
|
+
#~ @log.debug( "Delete #{filename}") if @log.debug?
|
202
|
+
begin; File.delete(filename) if File.exist?(filename)
|
203
|
+
rescue Errno::EACCES => err
|
204
|
+
#Happens with rail.exe at xxx.rai-file
|
205
|
+
@log.error( "Delete #{filename}: #{err}") if @log.error?
|
206
|
+
end
|
207
|
+
}
|
208
|
+
end
|
209
|
+
|
210
|
+
} #Dir.chdir(@dirname)
|
211
|
+
puts summary
|
212
|
+
puts "More Details see #{jobreport} or #{zipfilename}"
|
213
|
+
return summary #for other usages (e.g.runtex_gui.rb..)
|
214
|
+
end #start
|
215
|
+
#
|
216
|
+
#Build the summary and store it in file jobreport
|
217
|
+
#
|
218
|
+
def build_summary( texresult, jobreport, format )
|
219
|
+
#Get main data (filename, number of pages, size...)
|
220
|
+
summary = texresult[:fileinfo].to_yaml
|
221
|
+
#Get more data
|
222
|
+
[ [:error, 'Errors'],
|
223
|
+
[:warning,'Warnings'],
|
224
|
+
[:overfull, "Overfull boxes > #{@options[:overfull]}"],
|
225
|
+
[:underfull, "Underfull boxes with badness > #{@options[:underfull]}"],
|
226
|
+
].each{|key, text|
|
227
|
+
next unless texresult[key]
|
228
|
+
next if texresult[key].empty?
|
229
|
+
summary << "#{text}:\n"
|
230
|
+
summary << texresult[key].to_yaml.sub(/--- \n/, '')
|
231
|
+
}
|
232
|
+
|
233
|
+
#Save the summary to a file
|
234
|
+
File.open(jobreport, 'w'){| file |
|
235
|
+
|
236
|
+
file << <<header
|
237
|
+
==================================================
|
238
|
+
| Report for TeX-Job #{filename}"
|
239
|
+
| #{Time.now.strftime('%Y-%m-%d %H:%M')}, TeX-run #{@texrun}
|
240
|
+
==================================================
|
241
|
+
|
242
|
+
header
|
243
|
+
file << "#{'='*50}\n"
|
244
|
+
file << "LaTeX (#{format})\n"
|
245
|
+
file << "#{'='*50}\n"
|
246
|
+
file << summary
|
247
|
+
@nextsteps.each{|step|
|
248
|
+
file << "\n#{'='*50}\n"
|
249
|
+
file << "#{step.inspect}\n"
|
250
|
+
file << "#{'='*50}\n"
|
251
|
+
file << step.summary
|
252
|
+
summary << "#{step.inspect}: #{step.summary(:count)}\n"
|
253
|
+
}#@nextsteps
|
254
|
+
@stop_rerun.each{|tool, reasons|
|
255
|
+
summary << "!! Rerun-Stopp for #{tool}!"
|
256
|
+
file << "\n#{'='*50}\n"
|
257
|
+
file << "!! Rerun-Stopp for #{tool}"
|
258
|
+
file << "\n#{'='*50}\n"
|
259
|
+
reasons.each{|reason|
|
260
|
+
file << "- #{reason}\n"
|
261
|
+
}
|
262
|
+
}#@stop_rerun
|
263
|
+
} #open file
|
264
|
+
return summary
|
265
|
+
end #build_summary( summary, jobreport )
|
266
|
+
|
267
|
+
#Counter for the texrun.
|
268
|
+
attr_reader :texrun
|
269
|
+
|
270
|
+
#Access to the logger
|
271
|
+
attr_reader :log
|
272
|
+
|
273
|
+
|
274
|
+
#Start a run with LaTeX. Required additional tools are added with << during the TeX-run.
|
275
|
+
def run( latex )
|
276
|
+
|
277
|
+
if ! latex.is_a?(LaTeX)
|
278
|
+
@log.fatal( "Run with a non-LaTeX-tool") if @log.fatal?
|
279
|
+
end
|
280
|
+
|
281
|
+
@texrun += 1
|
282
|
+
@nextsteps = []
|
283
|
+
|
284
|
+
#Run LaTeX
|
285
|
+
@latex = latex #store it for log in <<
|
286
|
+
@log.info( "%02i Start TeX-run #{@texrun}" % @texrun ) if @log.info?
|
287
|
+
texresult = latex.execute(1)
|
288
|
+
@log.debug( "#{latex.step} -> #{prepare_result(texresult)}") if @log.debug?
|
289
|
+
|
290
|
+
#Run the necessary tools
|
291
|
+
@nextsteps.each_with_index{|step, index|
|
292
|
+
result = step.execute( index + 2 ) #TeX is step 1
|
293
|
+
@log.debug( "#{step.step} -> #{prepare_result(result)}") if @log.debug? and !result.empty?
|
294
|
+
}
|
295
|
+
#Print the end statistic
|
296
|
+
return texresult
|
297
|
+
|
298
|
+
end
|
299
|
+
#Delete result hash form empty arrays and zero-counters, build an ordered string.
|
300
|
+
#Sort messages by importance
|
301
|
+
def prepare_result( result )
|
302
|
+
result.delete_if{|key,val| ( val.is_a?(Array) and val.empty? ) or val == 0 }
|
303
|
+
string = []
|
304
|
+
string << "File: #{result[:fileinfo].join(', ')}" if result[:fileinfo] #List with filename, size , number of errors...
|
305
|
+
string << "Errors: #{result[:error].join(', ')}" if result[:error]
|
306
|
+
string << "Warnings: #{result[:warning].join(', ')}" if result[:warning]
|
307
|
+
string << "Info: #{result[:info].join(', ')}" if result[:info]
|
308
|
+
(result.keys - [:fileinfo, :file, :size, :pages, :error, :warnings, :info ]).each{|key|
|
309
|
+
if result[key].respond_to?(:join)
|
310
|
+
string << "#{result[key]}: #{result[key].join(', ')}"
|
311
|
+
else
|
312
|
+
string << "#{result[key]}: #{result[key]}"
|
313
|
+
end
|
314
|
+
}
|
315
|
+
string.join('; ')
|
316
|
+
end
|
317
|
+
#Add a reason, why an additional TeX-run is necessary.
|
318
|
+
def please_rerun( reason )
|
319
|
+
@log.debug( "%02i Rerun necessary (#{reason})" % @texrun) if @log.debug?
|
320
|
+
@rerun << reason
|
321
|
+
end #please_rerun
|
322
|
+
#Set a Rerun-Stop in case of serious problems.
|
323
|
+
#Contains Symbols with name of the tool which should be blocked.
|
324
|
+
def stop_rerun( tool, reason )
|
325
|
+
@stop_rerun[tool] = [] unless @stop_rerun[tool]
|
326
|
+
@stop_rerun[tool] << reason
|
327
|
+
end
|
328
|
+
#Is there a rerun-stop for a special tool?
|
329
|
+
def stop_rerun?( tool )
|
330
|
+
return @stop_rerun.keys.include?(tool)
|
331
|
+
end
|
332
|
+
#Add a new step for the next step.
|
333
|
+
def << (step)
|
334
|
+
@log.debug( "#{@latex.step} Add new step #{step.inspect}" % @texrun ) if @log.debug?
|
335
|
+
|
336
|
+
case step
|
337
|
+
when Splitindex
|
338
|
+
@log.debug( "#{@latex.step} Replace Makeindex by Splitindex" ) if @log.debug?
|
339
|
+
@nextsteps.pop if @nextsteps.last.is_a?(Makeindex)
|
340
|
+
when Makeindex
|
341
|
+
if step.options[:name] =~ /Index2/ and
|
342
|
+
@nextsteps.last.is_a?(Makeindex) and
|
343
|
+
@nextsteps.last.options[:name] == 'Index'
|
344
|
+
@log.debug( "#{@latex.step} Replace Makeindex by #{step.options[:name]}" ) if @log.debug?
|
345
|
+
@nextsteps.pop if @nextsteps.last.is_a?(Makeindex)
|
346
|
+
end
|
347
|
+
when Rail
|
348
|
+
#Execute Rail only once
|
349
|
+
@nextsteps.each{|lstep| return false if lstep.is_a?(Rail) }
|
350
|
+
end
|
351
|
+
@nextsteps << step
|
352
|
+
end #Job_chain#<<
|
353
|
+
|
354
|
+
#Add the given file to the log-zip
|
355
|
+
def add2zip(filename)
|
356
|
+
zipname = "%02i/%s" % [@texrun, filename]
|
357
|
+
|
358
|
+
count = 1
|
359
|
+
while @zip.find_entry(zipname)
|
360
|
+
count += 1
|
361
|
+
zipname = "%02i/%s.%i" % [@texrun, filename, count]
|
362
|
+
end
|
363
|
+
@zip.add( zipname, filename )
|
364
|
+
|
365
|
+
end #add2zip
|
366
|
+
|
367
|
+
def inspect()
|
368
|
+
return "<RunTeX::Job_chain #{@filename}>"
|
369
|
+
end
|
370
|
+
end #Job_chain
|
371
|
+
end #module RunTeX
|