wortsammler 0.0.9 → 1.0.0

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.
@@ -11,98 +11,98 @@ Treetop.load File.dirname(__FILE__) + "/mdTraceParser.treetop"
11
11
 
12
12
 
13
13
  class TraceableSet
14
-
15
-
16
-
17
- # this generates a synopsis of traces in markdown Format
18
- # @param [Symbol] selectedCategory the the category of the Traceables
19
- # which shall be reported.
20
- def reqtraceSynopsis(selectedCategory)
21
- all_traces(selectedCategory).
22
- sort_by{|x| trace_order_index(x.id) }.
23
- map{|t|
24
- tidm=t.id.gsub("_","-")
25
-
26
- lContributes=t.contributes_to.
27
- # map{|c| cm=c.gsub("_","-"); "[\[#{c}\]](#RT-#{cm})"}
28
- map{|c| cm=c.gsub("_","-"); "<a href=\"#RT-#{cm}\">\[#{c}\]</a>"}
29
-
30
- luptraces = [uptrace_ids[t.id]].flatten.compact.map{|x| self[x]}
31
-
32
- luptraces=luptraces.
33
- sort_by{|x| trace_order_index(x.id)}.
34
- map{|u|
35
- um = u.id.gsub("_","-")
36
- " - <a href=\"#RT-#{um}\">[#{u.id}]</a> #{u.header_orig}"
37
- }
38
-
39
- ["- ->[#{t.id}] <!-- --> <a id=\"RT-#{tidm}\"/>**#{t.header_orig}**" +
40
- # " (#{t.contributes_to.join(', ')})", "",
41
- " (#{lContributes.join(', ')})", "",
42
- luptraces
43
- ].flatten.join("\n")
44
- }.join("\n\n")
45
- end
46
14
 
47
15
 
48
- # this generates the downstream_tracefile
49
- def to_downstream_tracefile(selectedCategory)
50
- all_traces(selectedCategory).
51
- sort_by{|x| trace_order_index(x.id) }.
52
- map{|t|
53
- "\n\n[#{t.id}] **#{t.header_orig}** { }()"
54
- }.join("\n\n")
55
- end
56
16
 
57
- #
58
-
59
- # This factory method processes all traces in a particular markdown file
60
- # and returns a TraceableSet
61
- #
62
-
63
- # @param mdFile [String] name of the markdown File which shall be scanned
64
-
65
- #
66
-
67
- # @return [TraceableSet] The set of traceables found in the markdown file
68
- def self.processTracesInMdFile(mdFile)
69
-
70
- parser=TraceInMarkdownParser.new
71
- parser.consume_all_input = true
72
-
73
- raw_md_code_file=File.open(mdFile, "r:bom|utf-8")
74
- raw_md_code = raw_md_code_file.readlines.join
75
- raw_md_code_file.close
76
- # print mdFile
77
- result = parser.parse(raw_md_code)
78
- # print " ... parsed\n" todo: use logger here
79
-
80
- result_set = TraceableSet.new
81
-
82
- if result
83
- result.descendant.select{|x| x.getLabel==="trace"}.each{|c|
84
- id = c.traceId.payload.text_value
85
- uptraces = c.uptraces.payload.text_value
86
- header = c.traceHead.payload.text_value
87
- bodytext = c.traceBody.payload.text_value
88
- uptraces = c.uptraces.payload.text_value
89
- # Populate the Traceable entry
90
- theTrace = Traceable.new
91
- theTrace.info = mdFile
92
- theTrace.id = id
93
- theTrace.header_orig = header
94
- theTrace.body_orig = bodytext
95
- theTrace.trace_orig = c.text_value
96
- theTrace.contributes_to = uptraces.gsub!(/\s*/, "").split(",")
97
- theTrace.category = :SPECIFICATION_ITEM
98
- result_set.add(theTrace)
99
- }
100
- # puts " .... finished"
101
- else
102
- puts ["","-----------", texFile, parser.failure_reason].join("\n")
103
- end
104
- result_set
17
+ # this generates a synopsis of traces in markdown Format
18
+ # @param [Symbol] selectedCategory the the category of the Traceables
19
+ # which shall be reported.
20
+ def reqtraceSynopsis(selectedCategory)
21
+ all_traces(selectedCategory).
22
+ sort_by{|x| trace_order_index(x.id) }.
23
+ map{|t|
24
+ tidm=t.id.gsub("_","-")
25
+
26
+ lContributes=t.contributes_to.
27
+ # map{|c| cm=c.gsub("_","-"); "[\[#{c}\]](#RT-#{cm})"}
28
+ map{|c| cm=c.gsub("_","-"); "<a href=\"#RT-#{cm}\">\[#{c}\]</a>"}
29
+
30
+ luptraces = [uptrace_ids[t.id]].flatten.compact.map{|x| self[x]}
31
+
32
+ luptraces=luptraces.
33
+ sort_by{|x| trace_order_index(x.id)}.
34
+ map{|u|
35
+ um = u.id.gsub("_","-")
36
+ " - <a href=\"#RT-#{um}\">[#{u.id}]</a> #{u.header_orig}"
37
+ }
38
+
39
+ ["- ->[#{t.id}] <!-- --> <a id=\"RT-#{tidm}\"/>**#{t.header_orig}**" +
40
+ # " (#{t.contributes_to.join(', ')})", "",
41
+ " (#{lContributes.join(', ')})", "",
42
+ luptraces
43
+ ].flatten.join("\n")
44
+ }.join("\n\n")
45
+ end
46
+
47
+
48
+ # this generates the downstream_tracefile
49
+ def to_downstream_tracefile(selectedCategory)
50
+ all_traces(selectedCategory).
51
+ sort_by{|x| trace_order_index(x.id) }.
52
+ map{|t|
53
+ "\n\n[#{t.id}] **#{t.header_orig}** { }()"
54
+ }.join("\n\n")
55
+ end
56
+
57
+ #
58
+
59
+ # This factory method processes all traces in a particular markdown file
60
+ # and returns a TraceableSet
61
+ #
62
+
63
+ # @param mdFile [String] name of the markdown File which shall be scanned
64
+
65
+ #
66
+
67
+ # @return [TraceableSet] The set of traceables found in the markdown file
68
+ def self.processTracesInMdFile(mdFile)
69
+
70
+ parser=TraceInMarkdownParser.new
71
+ parser.consume_all_input = true
72
+
73
+ raw_md_code_file=File.open(mdFile, "r:bom|utf-8")
74
+ raw_md_code = raw_md_code_file.readlines.join
75
+ raw_md_code_file.close
76
+ # print mdFile
77
+ result = parser.parse(raw_md_code)
78
+ # print " ... parsed\n" todo: use logger here
79
+
80
+ result_set = TraceableSet.new
81
+
82
+ if result
83
+ result.descendant.select{|x| x.getLabel==="trace"}.each{|c|
84
+ id = c.traceId.payload.text_value
85
+ uptraces = c.uptraces.payload.text_value
86
+ header = c.traceHead.payload.text_value
87
+ bodytext = c.traceBody.payload.text_value
88
+ uptraces = c.uptraces.payload.text_value
89
+ # Populate the Traceable entry
90
+ theTrace = Traceable.new
91
+ theTrace.info = mdFile
92
+ theTrace.id = id
93
+ theTrace.header_orig = header
94
+ theTrace.body_orig = bodytext
95
+ theTrace.trace_orig = c.text_value
96
+ theTrace.contributes_to = uptraces.gsub!(/\s*/, "").split(",")
97
+ theTrace.category = :SPECIFICATION_ITEM
98
+ result_set.add(theTrace)
99
+ }
100
+ # puts " .... finished"
101
+ else
102
+ puts ["","-----------", texFile, parser.failure_reason].join("\n")
105
103
  end
104
+ result_set
105
+ end
106
+
106
107
 
107
-
108
- end
108
+ end
@@ -43,6 +43,8 @@ class TraceableSet
43
43
  # * second
44
44
  #
45
45
  # @return [type] [description]
46
+ #
47
+ #
46
48
  def add(traceable)
47
49
  #TOOD: check traceable
48
50
  #TODO: check if append can be optimized
@@ -284,7 +286,7 @@ class TraceableSet
284
286
  # @param [Nokogiri::XML::Document] doc - the document
285
287
  # @return [Nokogiri::XML::Document] the beautified document
286
288
  def xp(doc)
287
- xsl =<<XSL
289
+ xsl =<<-XSL
288
290
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
289
291
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
290
292
  <xsl:strip-space elements="*"/>
@@ -292,7 +294,7 @@ class TraceableSet
292
294
  <xsl:copy-of select="."/>
293
295
  </xsl:template>
294
296
  </xsl:stylesheet>
295
- XSL
297
+ XSL
296
298
 
297
299
 
298
300
  xslt = Nokogiri::XSLT(xsl)
@@ -17,6 +17,8 @@ require 'tmpdir'
17
17
  require 'nokogiri'
18
18
  require "rubyXL"
19
19
  require 'logger'
20
+ require 'wortsammler/latex_helper'
21
+
20
22
 
21
23
  Encoding.default_external = Encoding::UTF_8
22
24
  Encoding.default_internal = Encoding::UTF_8
@@ -822,13 +824,14 @@ class PandocBeautifier
822
824
  tempfile = input
823
825
  tempfilePdf = "#{@tempdir}/x.TeX.md".to_osPath
824
826
  tempfileHtml = "#{@tempdir}/x.html.md".to_osPath
825
- outfilePdf = "#{outdir}/#{outname}.pdf".to_osPath
826
- outfileDocx = "#{outdir}/#{outname}.docx".to_osPath
827
- outfileHtml = "#{outdir}/#{outname}.html".to_osPath
828
- outfileRtf = "#{outdir}/#{outname}.rtf".to_osPath
829
- outfileLatex = "#{outdir}/#{outname}.latex".to_osPath
830
- outfileText = "#{outdir}/#{outname}.txt".to_osPath
831
- outfileSlide = "#{outdir}/#{outname}.slide.html".to_osPath
827
+ outfile = "#{outdir}/#{outname}".to_osPath
828
+ outfilePdf = "#{outfile}.pdf"
829
+ outfileDocx = "#{outfile}.docx"
830
+ outfileHtml = "#{outfile}.html"
831
+ outfileRtf = "#{outfile}.rtf"
832
+ outfileLatex = "#{outfile}.latex"
833
+ outfileText = "#{outfile}.txt"
834
+ outfileSlide = "#{outfile}.slide.html"
832
835
 
833
836
  if vars.has_key? :frontmatter
834
837
  latexTitleInclude = "--include-before-body=#{vars[:frontmatter].esc}"
@@ -871,7 +874,6 @@ class PandocBeautifier
871
874
 
872
875
  begin
873
876
 
874
-
875
877
  if format.include?("frontmatter") then
876
878
 
877
879
  ReferenceTweaker.new("pdf").prepareFile(tempfile, tempfilePdf)
@@ -880,15 +882,8 @@ class PandocBeautifier
880
882
  `#{cmd}`
881
883
  end
882
884
 
883
- if format.include?("pdf") then
884
- @log.debug("creating #{outfilePdf}")
885
- ReferenceTweaker.new("pdf").prepareFile(tempfile, tempfilePdf)
886
- cmd="pandoc -S #{tempfilePdf.esc} #{toc} --standalone #{option_chapters} --latex-engine xelatex --number-sections #{vars_string}" +
887
- " --template #{latexStyleFile.esc} --ascii -o #{outfilePdf.esc} #{latexTitleInclude}"
888
- `#{cmd}`
889
- end
890
885
 
891
- if format.include?("latex") then
886
+ if (format.include?("pdf") | format.include?("latex")) then
892
887
  @log.debug("creating #{outfileLatex}")
893
888
  ReferenceTweaker.new("pdf").prepareFile(tempfile, tempfilePdf)
894
889
 
@@ -897,6 +892,32 @@ class PandocBeautifier
897
892
  `#{cmd}`
898
893
  end
899
894
 
895
+
896
+ if format.include?("pdf") then
897
+ @log.debug("creating #{outfilePdf}")
898
+ ReferenceTweaker.new("pdf").prepareFile(tempfile, tempfilePdf)
899
+ #cmd="pandoc -S #{tempfilePdf.esc} #{toc} --standalone #{option_chapters} --latex-engine xelatex --number-sections #{vars_string}" +
900
+ # " --template #{latexStyleFile.esc} --ascii -o #{outfilePdf.esc} #{latexTitleInclude}"
901
+ cmd="xelatex -halt-on-error -interaction nonstopmode -output-directory=#{outdir.esc} #{outfileLatex.esc}"
902
+ #cmdmkindex = "makeindex \"#{outfile.esc}.idx\""
903
+
904
+ latex=LatexHelper.new.set_latex_command(cmd).setlogger(@log)
905
+ latex.run(outfileLatex)
906
+
907
+ messages=latex.log_analyze("#{outdir}/#{outname}.log")
908
+
909
+ removeables = ["toc", "aux", "bak", "idx", "ilg", "ind" ]
910
+ removeables << "log" unless messages > 0
911
+
912
+
913
+ removeables << "latex" unless format.include?("latex")
914
+ removeables = removeables.map{|e| "#{outdir}/#{outname}.#{e}"}.select{|f| File.exists?(f)}
915
+ removeables.each{|e|
916
+ @log.debug "removing file: #{e}"
917
+ FileUtils.rm e
918
+ }
919
+ end
920
+
900
921
  if format.include?("html") then
901
922
  #todo: handle css
902
923
  @log.debug("creating #{outfileHtml}")
@@ -951,7 +972,8 @@ class PandocBeautifier
951
972
  `#{cmd}`
952
973
  end
953
974
  rescue Exception => e
954
- @log.error "failed to perform #{cmd}, #{e.message}"
975
+ @log.error "failed to perform #{cmd}, \n#{e.message}"
976
+ @log.error e.backtrace.join("\n")
955
977
  #TODO make a try catch block kere
956
978
  end
957
979
  nil
@@ -46,11 +46,12 @@ optparse = OptionParser.new do|opts|
46
46
  opts.on( "-v", '--version', 'print Version info, then turn on verbose mode' ) do
47
47
  options[:version] = true
48
48
  options[:verbose] = true
49
+ $log.level=Logger::DEBUG
49
50
  end
50
51
 
51
52
  opts.separator nil
52
53
 
53
- options[:init] = false
54
+ options[:init] = nil
54
55
  opts.on( "-n", '--init DIR', 'create a project folder in DIR' ) do|file|
55
56
  options[:init] = file
56
57
  end
@@ -58,12 +59,12 @@ optparse = OptionParser.new do|opts|
58
59
 
59
60
  opts.separator nil
60
61
 
61
- options[:inputpath] = false
62
+ options[:inputpath] = nil
62
63
  opts.on( '-i', '--inputpath PATH', 'set input file/project folder for processing') do|path|
63
64
  options[:inputpath] = path
64
65
  end
65
66
 
66
- options[:manifest] = false
67
+ options[:manifest] = nil
67
68
  opts.on( '-m', '--manifest PATH', 'set mainfest file for processing' ) do|file|
68
69
  options[:manifest] = file
69
70
  end
@@ -75,7 +76,7 @@ optparse = OptionParser.new do|opts|
75
76
  options[:outputformats] = formatlist
76
77
  end
77
78
 
78
- options[:outputfolder] = false
79
+ options[:outputfolder] = nil
79
80
  opts.on( '-o', '--outputfolder PATH', 'set the output to PATH' ) do|path|
80
81
  options[:outputfolder] = path
81
82
  end
@@ -120,6 +121,5 @@ rescue RegexpError => error
120
121
  exit
121
122
  end
122
123
 
123
-
124
124
  Wortsammler.verify_options(options)
125
125
  Wortsammler.execute(options)
@@ -0,0 +1,244 @@
1
+ # a=LatexHelper.new.set_command(cmd).setlogger(log).
2
+
3
+ class LatexHelper
4
+
5
+ attr_accessor :latex_result, :mkindex_result
6
+
7
+ @latex_command = nil
8
+ @latex_result=nil
9
+ @mkindex_result=nil
10
+ @log=nil
11
+
12
+
13
+
14
+ #
15
+ # [initialize description]
16
+ #
17
+ # @return [type] [description]
18
+ def initialize()
19
+ end
20
+
21
+ def setlogger(log)
22
+ @log=log
23
+ return self
24
+ end
25
+
26
+
27
+
28
+ #
29
+ # [set_latex_command description]
30
+ # @param cmd [type] [description]
31
+ #
32
+ # @return [type] [description]
33
+ def set_latex_command(cmd)
34
+ @latex_command=cmd
35
+ return self
36
+ end
37
+
38
+
39
+ #
40
+ # [run_latex description]
41
+ #
42
+ # @return [type] [description]
43
+ def run_latex()
44
+ @latex_result = `#{@latex_command}`
45
+ return self
46
+ end
47
+
48
+ #
49
+ # [run_mkindex description]
50
+ # @param outfile [type] [description]
51
+ #
52
+ # @return [type] [description]
53
+ def run_mkindex(outfile)
54
+ outfilename=File.basename(outfile, ".*")
55
+ indexinfile="#{outfilename}.idx"
56
+ indexlogfile="#{outfilename}.ilg"
57
+ indexoutfile="#{outfilename}.ind"
58
+
59
+ current_dir = FileUtils.pwd
60
+ FileUtils.cd(File.dirname(outfile)) do |mydir|
61
+ @mkindex_result=nil
62
+ if File.exist?(indexinfile) then
63
+ a=`makeindex -q #{indexinfile.esc} 2>&1`
64
+ @mkindex_result=ilg_analyse(indexlogfile)
65
+ end
66
+ end
67
+
68
+ return self
69
+ end
70
+
71
+
72
+ #
73
+ # [add_sort_key description]
74
+ # @param indexinfile [type] [description]
75
+ #
76
+ # @return [type] [description]
77
+ def add_sort_key(indexinfile)
78
+ content=File.open(indexinfile, "r").read
79
+ content.gsub!(/\\indexentry{([^\}]*)}/){|entry|
80
+ reference=$1.split("|").first
81
+ originalterms=reference.split("!")
82
+ newterms=originalterms.map{|ot|
83
+
84
+ sortterm=ot.clone
85
+ sortterm.gsub!('Ä', "ae")
86
+ sortterm.gsub!('ä', "ae")
87
+ sortterm.gsub!('Ö', "oe")
88
+ sortterm.gsub!('ö', "oe")
89
+ sortterm.gsub!('Ü', "ue")
90
+ sortterm.gsub!('ü', "ue")
91
+ sortterm.gsub!('ß', "ss")
92
+ nt=ot
93
+ nt="#{sortterm}@#{ot}" unless sortterm.include?("@")
94
+ }.join("!")
95
+ # require 'pry';binding.pry
96
+
97
+ entry.gsub(reference, newterms)
98
+ }
99
+
100
+ File.open(indexinfile, "w") do |f|
101
+ f.puts(content)
102
+ end
103
+ end
104
+
105
+ #
106
+ # [run description]
107
+ # @param outfile [type] [description]
108
+ #
109
+ # @return [type] [description]
110
+ def run(outfile)
111
+
112
+ reruncount=3
113
+
114
+ run_latex()
115
+ run_mkindex(outfile)
116
+
117
+ while need_rerun? && ((reruncount-=1) >0)
118
+ run_latex()
119
+ run_mkindex(outfile)
120
+ end
121
+ end
122
+
123
+
124
+ #
125
+ # [need_rerun? description]
126
+ #
127
+ # @return [type] [description]
128
+ def need_rerun?()
129
+ @latex_result.include?("Rerun to get")
130
+ true
131
+ end
132
+
133
+
134
+ #
135
+ # [ilg_analyse description]
136
+ # @param logfilename [type] [description]
137
+ #
138
+ # @return [type] [description]
139
+ def ilg_analyse(logfilename)
140
+ stat = {}
141
+ error = nil
142
+ File.readlines(logfilename).each{ |logline|
143
+ if error #Index error announced in previous line
144
+ ( stat[:errors] ||= [] ) << "#{logline.chomp.sub(/.*--/, "")} #{error}"
145
+ error = nil
146
+ else
147
+ case logline
148
+ when /Scanning input file (.*)\...done \((.*) entries accepted, (.*) rejected\)./
149
+ #~ stat[:source_information] ||= [] << "input file #{$1} (#{$2} entries accepted, #{$3} rejected)"
150
+ stat[:source_information] ||= []
151
+ stat[:source_information] << "Input file: #{$1}"
152
+ stat[:source_information] << "Entries accepted: #{$2}"
153
+ stat[:source_information] << "Entries rejected: #{$3}"
154
+ #~ when /done \((.*) entries accepted, (.*) rejected\)./
155
+ #~ result[:rejected] += $2.to_i() if $2.to_i() > 0
156
+ when /!! Input index error \(file = (.*), line = (.*)\):/
157
+ #Error-message on next line
158
+ error = "(file #{$1} line #{$2}: #{logline})"
159
+ end
160
+ end #if error
161
+ }
162
+ stat
163
+ end
164
+
165
+
166
+ #
167
+ # This analyzes the latex log file thereby filters warenings and errors
168
+ # @param logfilename [String] The filename of the log
169
+ #
170
+ # @return [Nil] no return
171
+ def log_analyze(logfilename)
172
+ result = {
173
+ errors: 0,
174
+ warings: 0,
175
+ loglines: []
176
+ }
177
+
178
+ outCounter = 0
179
+ lineCounter = 0
180
+ errorCounter = 0
181
+ warningCounter = 0
182
+ previousLine = ""
183
+
184
+ logfilename_reported = File.basename(logfilename)
185
+
186
+ File.readlines(logfilename).each{ |l|
187
+ logline = l.strip
188
+ lineCounter += 1
189
+
190
+
191
+ if logline =~ /Output written on/ then
192
+ outCounter = 5
193
+ end
194
+
195
+ if logline =~ /Running / then
196
+ lineCounter = 0
197
+ end
198
+
199
+ if logline =~ /Buffer size exceeded/ then
200
+ lineCounter = 0
201
+ @log.error ("\n!Error Buffer size exceeded, for details see line #{lineCounter} #{logfilename_reported}")
202
+ @log.info previousLine
203
+ errorCounter += 1
204
+ outCounter=5
205
+ end
206
+
207
+ if logline =~ /^!/ then
208
+ lineCounter = 0
209
+ @log.error ("LaTeX error; for details see line #{lineCounter} #{logfilename_reported}")
210
+ errorCounter += 1
211
+ outCounter=5
212
+ end
213
+
214
+ if logline =~ /\[ INFO\]/ then
215
+ $log.info logline
216
+ end
217
+
218
+ if logline =~ /Warning:|pdfTeX warning/ then
219
+ $log.warn "for details see line #{lineCounter} #{logfilename_reported}"
220
+ warningCounter += 1
221
+ outCounter = 5
222
+ end
223
+
224
+ if logline =~ /^(Underfull|Overfull)/ then
225
+ outCounter = 0
226
+ end
227
+
228
+ if (outCounter > 0) then
229
+ $log.info logline
230
+ outCounter -= 1
231
+
232
+ if outCounter == 0 then
233
+ $log.info ""
234
+ end
235
+ end
236
+ }
237
+
238
+ @log.info ("logfilter: errors = #{errorCounter}")
239
+ @log.info ("logfilter: warnings = #{warningCounter}")
240
+
241
+ errorCounter + warningCounter
242
+ end
243
+
244
+ end
@@ -1,4 +1,4 @@
1
1
  module Wortsammler
2
2
  PROGNAME="wortsammler"
3
- VERSION = "0.0.9"
3
+ VERSION = "1.0.0"
4
4
  end