docgenerator 1.0.2 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/lib/docgenerator.rb +27 -1
  2. data/lib/docgenerator_css.rb +26 -23
  3. data/lib/docgenerator_document.rb +78 -16
  4. data/lib/docgenerator_element.rb +10 -25
  5. data/lib/docgenerator_elements.rb +78 -13
  6. data/lib/templates/docgenerator_template_css.rb +73 -0
  7. data/lib/wiki2doc/wiki2docgenerator.rb +12 -19
  8. data/unittest/expected/beamer_01_article.tex +13 -0
  9. data/unittest/expected/beamer_01_attachment.tex +15 -0
  10. data/unittest/expected/beamer_01_doc.html +13 -0
  11. data/unittest/expected/beamer_01_doc.tex +18 -0
  12. data/unittest/expected/beamer_01_notes_only.tex +13 -0
  13. data/unittest/expected/beamer_01_notes_onlyslideswithnotes.tex +13 -0
  14. data/unittest/expected/beamer_01_notes_show.tex +13 -0
  15. data/unittest/expected/beamer_01_presentation.tex +13 -0
  16. data/unittest/expected/beamer_02_doc.html +29 -0
  17. data/unittest/expected/beamer_02_doc.tex +34 -0
  18. data/unittest/expected/beamer_block.html +1 -0
  19. data/unittest/expected/beamer_block.latex +1 -0
  20. data/unittest/expected/beamer_doc_fragile_doc.tex +33 -0
  21. data/unittest/expected/beamer_doc_key_doc.html +20 -0
  22. data/unittest/expected/beamer_doc_key_doc.tex +29 -0
  23. data/unittest/expected/beamer_doc_note_doc.html +30 -0
  24. data/unittest/expected/beamer_doc_note_doc.tex +37 -0
  25. data/unittest/expected/beamer_doc_pic_bottom_doc.html +24 -0
  26. data/unittest/expected/beamer_doc_pic_doc.html +24 -0
  27. data/unittest/expected/beamer_doc_pic_doc.tex +28 -0
  28. data/unittest/expected/beamer_doc_pic_left_doc.html +24 -0
  29. data/unittest/expected/beamer_doc_pic_left_doc.tex +28 -0
  30. data/unittest/expected/beamer_doc_pic_ratio_doc.tex +29 -0
  31. data/unittest/expected/beamer_doc_pic_right_doc.html +24 -0
  32. data/unittest/expected/beamer_doc_pic_right_doc.tex +28 -0
  33. data/unittest/expected/beamer_doc_pic_top_doc.html +24 -0
  34. data/unittest/expected/beamer_frame.html +5 -0
  35. data/unittest/expected/beamer_frame.tex +11 -0
  36. data/unittest/expected/beamer_frame_fragile.tex +7 -0
  37. data/unittest/expected/beamer_frame_id.html +1 -0
  38. data/unittest/expected/beamer_frame_id.tex +4 -0
  39. data/unittest/expected/beamer_framepic.html +5 -0
  40. data/unittest/expected/beamer_framepic.latex +1 -0
  41. data/unittest/expected/beamer_framepic_link.html +5 -0
  42. data/unittest/expected/beamer_framepic_link.latex +1 -0
  43. data/unittest/expected/beamer_frametitle.html +1 -0
  44. data/unittest/expected/beamer_frametitle.latex +1 -0
  45. data/unittest/expected/beamer_note.html +1 -0
  46. data/unittest/expected/{test_beamer_note.latex → beamer_note.latex} +0 -0
  47. data/unittest/expected/css_collection.html +9 -0
  48. data/unittest/expected/css_collection_anonym.html +9 -0
  49. data/unittest/expected/test_css.css +1 -1
  50. data/unittest/expected/test_css2.css +1 -1
  51. data/unittest/expected/test_document_toc.html +14 -0
  52. data/unittest/expected/test_document_toc_article.latex +64 -0
  53. data/unittest/expected/test_document_toc_deep.html +18 -0
  54. data/unittest/expected/test_document_toc_deep.latex +35 -0
  55. data/unittest/expected/test_document_toc_deep_1.html +6 -0
  56. data/unittest/expected/test_document_toc_deep_1.latex +11 -0
  57. data/unittest/expected/test_document_toc_deep_4.html +24 -0
  58. data/unittest/expected/test_document_toc_deep_4.latex +47 -0
  59. data/unittest/expected/test_document_toc_deep_err.html +34 -0
  60. data/unittest/expected/test_document_toc_deep_err.latex +37 -0
  61. data/unittest/expected/test_document_toc_deep_err.log +4 -0
  62. data/unittest/expected/test_document_toc_deep_single.html +30 -0
  63. data/unittest/expected/test_document_toc_html.html +34 -0
  64. data/unittest/expected/test_document_toc_single.html +14 -0
  65. data/unittest/expected/test_document_toc_single.latex +27 -0
  66. data/unittest/expected/test_document_toc_single_pre.html +16 -0
  67. data/unittest/expected/test_document_toc_single_pre.latex +35 -0
  68. data/unittest/expected/test_document_toc_single_pre2.html +15 -0
  69. data/unittest/expected/test_document_toc_single_pre2.latex +35 -0
  70. data/unittest/expected/test_html_css.html +1 -1
  71. data/unittest/expected/test_tabular.html +2 -2
  72. data/unittest/expected/test_wiki_amazon.html +2 -2
  73. data/unittest/expected/test_wiki_link.html +6 -6
  74. data/unittest/expected/test_wiki_link.latex +7 -4
  75. data/unittest/expected/test_wiki_link.wiki +6 -1
  76. data/unittest/expected/test_wiki_picture.html +3 -3
  77. data/unittest/expected/toc_css.css +15 -0
  78. data/unittest/test_docgenerator.rb +24 -1
  79. data/unittest/unittest_docgenerator.rb +166 -37
  80. data/unittest/unittest_wiki2doc.rb +9 -1
  81. metadata +75 -8
  82. data/unittest/expected/test_beamer_note.html +0 -1
  83. data/unittest/expected/test_beamer_note.text +0 -1
  84. data/unittest/expected/test_beamer_note.wiki +0 -1
data/lib/docgenerator.rb CHANGED
@@ -2,6 +2,7 @@
2
2
  #The target format is generic, supported are LaTeX and HTML.
3
3
  #Plain text and a Wiki-version exist also, but they are not well maintained.
4
4
  #
5
+ #
5
6
  #==Elements
6
7
  #A document is structured by elements.
7
8
  #Each element contains attributes/parameters and content.
@@ -17,8 +18,31 @@
17
18
  #so they will not occur in this generated documentation).
18
19
  #
19
20
  #== Examples
20
- #See the unit tests and the examples-folder of the docgenerator distribution.
21
+ #A document with a paragraph:
22
+ # doc = Document.new
23
+ # doc.body << element(:p,{}, 'Content')
24
+ # doc.save( 'test.tex', true)
25
+ # doc.save( 'test.html', true)
26
+ #
27
+ #A document with a (unnumbered) list:
28
+ # doc = Document.new
29
+ # doc.body << ul = element(:ul)
30
+ # ul << element(:li,{}, 'List content 1')
31
+ # ul << element(:li,{}, 'List content 2')
32
+ # doc.save( 'test.tex', true)
33
+ # doc.save( 'test.html', true)
34
+ #
35
+ #See the unit tests and the examples-folder of the docgenerator distribution for more examples.
36
+ #
37
+ #== Known problems
38
+ #This program is developed under Windows.
39
+ #I expect encoding problems on other systems
40
+ #(It's not a problem of the program, but a test problem on my side).
41
+ #
42
+ #HTML-Versions are not supported properly
43
+ #(main problem: End-Tag for br)
21
44
  #
45
+ #More at http://ruby.lickert.net/docgenerator/index.html
22
46
 
23
47
  #Version information.
24
48
  begin
@@ -31,6 +55,7 @@ rescue NameError #No gems?
31
55
  DOCGENERATOR_VERSION = "#{File.expand_path('docgenerator')} (no Gem)"
32
56
  end
33
57
  require 'log4r'
58
+ require 'yaml' #needed by docgenerator_template.rb
34
59
 
35
60
  #How to handle the End-Tag for br/hr...
36
61
  #- false: set <br /> (XHTML)
@@ -131,6 +156,7 @@ end
131
156
 
132
157
  require 'templates/docgenerator_template'
133
158
  require 'docgenerator_css'
159
+ require 'templates/docgenerator_template_css'
134
160
  require 'docgenerator_attribute'
135
161
  require 'docgenerator_document'
136
162
 
@@ -25,12 +25,7 @@ class Style < Element
25
25
  res << "\n" if @crbefore
26
26
  res << "<style type=\"text/css\">\n"
27
27
  @content.each{|c|
28
- if c.is_a?(CSS)
29
- res << c.to_tab.join(";\n")
30
- res << ";\n"
31
- else #For compatibility
32
- res << "#{c};\n"
33
- end
28
+ res << c.to_html(options)
34
29
  }
35
30
  res << "</style>"
36
31
  res << "\n" if @crafter
@@ -129,6 +124,9 @@ class CSS
129
124
  }
130
125
  def initialize( values ={} )
131
126
  @values = {}
127
+ @log = values[:log] ? values[:log] : DOCGENERATOR_LOGGER #fixme
128
+ values.delete(:log)
129
+
132
130
  values.each{|k,v|
133
131
  self[k] = v
134
132
  }
@@ -155,26 +153,32 @@ class CSS
155
153
  def []=( k, v )
156
154
  key = generalize_key( k )
157
155
  if @values[key]
158
- puts "CSS: Overwrite #{k.inspect}"
156
+ @log.warn("CSS: Overwrite #{k.inspect}") if @log.warn?
159
157
  end
160
158
  if ! @@values[key]
161
- puts "CSS: Undefined key #{k.inspect}"
159
+ @log.error("CSS: Undefined key #{k.inspect}") if @log.error?
162
160
  elsif @@values[key].include?(v) #Fine
163
161
  elsif @@values[key][0].is_a?(Regexp) and @@values[key][0] =~ v.to_s
164
162
  else
165
- puts "CSS: #{v} not allowed for #{key}"
163
+ @log.error("CSS: #{v} not allowed for #{key}") if @log.error?
166
164
  end
167
165
 
168
166
  @values[key] = v
169
167
  end
170
168
  #returns the values for a direct css in the style-attribute for a HTML-tag.
169
+ def to_html(options={})
170
+ o = {
171
+ :map => "%s;",
172
+ }.update(options)
173
+ return self.to_tab.map{|p| o[:map] % p}.join()
174
+ end
171
175
  def to_s()
172
- return self.to_tab.join(';')
176
+ return self.to_html
173
177
  end
174
178
  #Returns a tab with the textes for each characteristic.
175
179
  def to_tab()
176
180
  s = []
177
- @values.each{|k,v|
181
+ @values.sort.each{|k,v|
178
182
  s << "#{k}: #{v}"
179
183
  }
180
184
  return s
@@ -182,19 +186,18 @@ class CSS
182
186
  end
183
187
 
184
188
  if __FILE__ == $0
185
- require 'docgenerator'
186
- css = CSS.new({ :text_align => 'AA', :font_size => 'large'})
187
- css2 = CSS.new({ :font_size => '12px'})
188
- puts '-'*10
189
- style = element(:style)
190
- style << 'a'
191
- style << css
192
- style << css
193
- puts css.to_s()
194
- puts '-'*5
195
- puts style.to_s(:html)
189
+ #~ DOCGENERATOR_LOGGER.level = Log4r::DEBUG
190
+ #~ css = CSS.new({ :text_align => 'AA', :font_size => 'large'})
191
+ #~ css2 = CSS.new({ :font_size => '12px'})
192
+ #~ puts '-'*10
193
+ #~ style = element(:style)
194
+ #~ style << 'a'
195
+ #~ style << css
196
+ #~ style << css
197
+ #~ puts css.to_s()
198
+ #~ puts '-'*5
199
+ #~ puts style.to_html
196
200
  #~ puts style.to_s(:latex)
197
-
198
201
  end
199
202
 
200
203
  __END__
@@ -56,7 +56,7 @@ class Document
56
56
  when Symbol
57
57
  templ = DocumentTemplate[template]
58
58
  if ! templ.is_a?( DocumentTemplate )
59
- puts "Unknown template #{template}, valid:\n\t#{DocumentTemplate.keys.join("\n\t")}" #fixme raise
59
+ @log.fatal("Unknown template #{template}, valid:\n\t#{DocumentTemplate.keys.join("\n\t")}") if @log.fatal?
60
60
  else
61
61
  @template[templ.target] = templ
62
62
  end
@@ -64,8 +64,9 @@ class Document
64
64
  } #templates
65
65
  when :maketitle
66
66
  @body << element(:maketitle ).cr
67
+ when :log
67
68
  else
68
- puts "Document.new: Unknown setting #{key.inspect} (=#{value.inspect})"
69
+ @log.error("Document.new: Unknown setting #{key.inspect} (=#{value.inspect})") if @log.error?
69
70
  end
70
71
  } #settings
71
72
 
@@ -136,27 +137,85 @@ class Document
136
137
  @options << option
137
138
  end
138
139
  #Prepare a table of content.
139
- #More or less a test.
140
- #Use it for element :tableofcontents?
141
- def toc()
142
- toc = []
140
+ #
141
+ #There is no sense to use it with LaTeX, better you use \tableofcontents
142
+ #
143
+ #Options:
144
+ #- id: Id of div, needed for CSS-formatting
145
+ #- tocfilename: Added as prefix to link.
146
+ # can be used to make toc for in another file (cross-referencing)
147
+ #- level: Depth of toc
148
+ def toc( options = {} )
149
+ opt = {
150
+ :id => 'toc',
151
+ :tocfilename => nil, #Can be used to build cross references
152
+ :level => 3,
153
+ :log => @log
154
+ }.update(options)
155
+
156
+ opt[:level] = 3 unless opt[:level]
157
+ opt[:log].info("Prepare Table of contents, options: #{options.keys.inspect}") if opt[:log].info?
158
+ opt[:log].debug("Options: #{[:id, :level, :tocfilename].map{|k| "#{k}: #{opt[k].inspect}"}.join(',')}") if opt[:log].debug?
159
+
160
+ toc = element(:div, { :id => opt[:id] }).cR
161
+ opt[:pre].is_a?(String) ? toc << element(:p, {}, opt[:pre] ).cr : toc << opt[:pre]
162
+
163
+ toc_uls = [ toc ]
164
+
165
+ #fixme
166
+ #It would be nicer to get something like 1-1-1 instead of a counter.
143
167
  toccnt = 0
144
- #~ toc = element(:ul).cR
145
168
  toc_ids = [ :chapter, :section,:subsection, :subsubsection, :paragraph, :subparagraph,:minisec]
146
169
  @body.content.flatten.each{|el|
170
+ if ! el.respond_to?(:ids)
171
+ #e.g. Wikitext. Has a to_doc, but doesn't react on flatten.
172
+ opt[:log].error("Toc: Element ohne :ids #{el.class}") if opt[:log].error?
173
+ next
174
+ end
147
175
  depth = toc_ids.index((el.ids & toc_ids)[0])
148
- #~ puts "#{depth.inspect}\t#{el.content}"
176
+ next if ! depth #Element is no header
177
+
178
+ opt[:log].debug("Toc: Found entry on level #{depth}: <#{el.content}>") if opt[:log].debug?
179
+ #Create an id if not already defined
149
180
  if el[:id].content.empty?
150
181
  el[:id] << "toc#{toccnt += 1}"
151
182
  end
152
- if depth
153
- #~ toc << element(:li,{},[ el.content])
154
- toc << element(:a, {:href => "#{el[:id]}" }, [ '*' * depth, el.content ])
155
- toc << element(:br).cr
156
- end
157
- }
183
+ if depth > opt[:level]
184
+ opt[:log].debug("Toc: Reject by level #{el.content}") if opt[:log].debug?
185
+ next
186
+ end
187
+
188
+ #Check missing levels
189
+ (depth - toc_uls.size).times{|i|
190
+ opt[:log].warn("Toc: Jump over section level #{depth-1+i} (#{opt[:tocfilename]})") if opt[:log].warn?
191
+ toc_uls << element(:ul, {}, element(:li ).cr ).cR
192
+ if toc_uls.size == 2 #First entry
193
+ toc_uls.first << toc_uls.last
194
+ else
195
+ toc_uls[-2].content.last << toc_uls.last
196
+ end
197
+ }
198
+
199
+ #Build new toc-list and deletet bigger ones
200
+ if ! toc_uls[depth]
201
+ opt[:log].debug("Toc: Start new level #{depth}") if opt[:log].debug?
202
+ toc_uls << element(:ul).cR
203
+ if depth == 1
204
+ toc << toc_uls[depth]
205
+ else
206
+ toc_uls[depth -1 ].content.last << toc_uls[depth]
207
+ end
208
+ else #delete levels under actual level
209
+ if toc_uls.slice!(depth+1..toc_uls.size+1)
210
+ opt[:log].debug("Toc: Stop level > #{depth}") if opt[:log].debug?
211
+ end
212
+ end
213
+ toc_uls[depth] << element(:li, {}, element(:a, {:href => "#{opt[:tocfilename]}##{el[:id]}" }, el.content ) ).cr
214
+ }
215
+ opt[:post].is_a?(String) ? toc << element(:p, {}, opt[:post] ).cr : toc << opt[:post]
216
+
158
217
  return toc
159
- end
218
+ end #toc
160
219
  #Save the file.
161
220
  #The type of the document is determined by the file extensison.
162
221
  #Supported document types are:
@@ -209,7 +268,6 @@ class Document
209
268
 
210
269
  new = to_doc( @target, {
211
270
  :template=> @template[target],
212
- :document => self,
213
271
  :filename => filename,
214
272
  :replacements => replacements,
215
273
  :log => @log
@@ -304,8 +362,11 @@ class Document
304
362
  options[:log].error( "New is wrong type: #{new.inspect}") if options[:log].error?
305
363
  end
306
364
 
365
+ options[:document] = self
307
366
  @head << self.docinfo()
367
+ options[:log].debug( "Build header data") if options[:log].debug?
308
368
  new.sub!( '<<head>>', @head.to_doc(target, options ))
369
+ options[:log].debug( "Build body") if options[:log].debug?
309
370
  new.sub!( '<<body>>', @body.to_doc(target, options))
310
371
  new.sub!( '<<classoptions>>', @options.uniq.join(','))
311
372
 
@@ -363,6 +424,7 @@ class Document
363
424
  out.gsub!( /\$/, '\$')
364
425
  out.gsub!( /&/, '\\\\&')
365
426
  out.gsub!( /_/, '\_')
427
+ out.gsub!( /#/, '\#')
366
428
  out.gsub!( /�/, '\euro ')
367
429
  return out
368
430
  end
@@ -50,7 +50,7 @@ class Array
50
50
  #
51
51
  def to_doc(target, options = {})
52
52
  o = Docgenerator_logger.set_option_defaults(options)
53
- o[:log].debug("enter to_doc in array for #{target}") if o[:log].debug?
53
+ o[:log].debug("enter to_doc(#{target}) for Array, options: #{options.keys.inspect}") if o[:log].debug?
54
54
  str = ""
55
55
  self.each{|el|
56
56
  begin
@@ -266,14 +266,15 @@ class Element
266
266
  end
267
267
  cmd << <<code
268
268
  o = Docgenerator_logger.set_option_defaults(options)
269
- o[:log].debug("enter to_doc for #{self.inspect}") if o[:log].debug?
269
+ o[:log].debug("enter to_doc(#{target}) for #{self.inspect}, options: \#{options.keys.inspect}") if o[:log].debug?
270
270
  code
271
271
  template = string.gsub(/\\/, '\\\\\\')
272
272
  template.gsub!(/"/, '\"')
273
- template.gsub!(/@content\}/, "@content.to_doc(#{target.inspect}, options)}")
273
+ template.gsub!(/@content\}/, "@content.to_doc(#{target.inspect}, o)}")
274
274
  cmd << " \"#{template}\"\n"
275
275
  cmd << "end\n"
276
276
  class_eval( cmd )
277
+ cmd #return cmd for unit test
277
278
  end
278
279
  #Defines an element.
279
280
  #
@@ -491,7 +492,7 @@ code
491
492
  #~ def to_s( target = Document.target( self ) )
492
493
  def to_doc( target, options = {} )
493
494
  o = Docgenerator_logger.set_option_defaults(options)
494
- o[:log].debug("enter to_doc for #{self.inspect}") if o[:log].debug?
495
+ o[:log].debug("enter to_doc(#{target}) for #{self.inspect}, options: #{options.keys.inspect}") if o[:log].debug?
495
496
  #Return empty string, if target is not requested.
496
497
  if ! @targets.include?( target )
497
498
  if @suppressed_targets.include?(target)
@@ -511,29 +512,13 @@ code
511
512
  result = ''
512
513
  case target
513
514
  when :latex
514
- result = to_latex(options)
515
+ result = to_latex(o)
515
516
  when :html
516
- result = to_html(options)
517
+ result = to_html(o)
517
518
  when :wiki
518
- result = to_wiki(options)
519
+ result = to_wiki(o)
519
520
  when :text
520
- result = to_text(options)
521
- when :debug
522
- @@level += 1
523
- result = "\n<element #{self.ids.join(',')} begin>"
524
- @attr.each{|k,v|
525
- #result += "\n\t#{k}: #{v.inspect}"
526
- if v != []
527
- result << "\n\t#{k}:"
528
- v.each{|v2|
529
- result << v2.to_s
530
- }
531
- end
532
- }
533
- result << @content.to_s
534
- result << "\n<element #{self.ids.join(',')} end>"
535
- @@level -= 1
536
- result.gsub!(/^/, "\t" * @@level )
521
+ result = to_text(o)
537
522
  else
538
523
  o[:log].fatal("Undefined target format '#{target}'") if o[:log].fatal?
539
524
  end
@@ -613,7 +598,7 @@ code
613
598
  if @content
614
599
  html << ">"
615
600
  html <<"\n" if @crmid
616
- html << "#{@content.to_html(options = {})}"
601
+ html << "#{@content.to_html(options)}"
617
602
  html << "\n" if @crmid and @content.size > 0 and html[-1,1] != "\n"
618
603
  html << "</#{tag}>"
619
604
  elsif content?() == nil
@@ -14,7 +14,7 @@ Element.create( [:head], {}, true,
14
14
  { :htmltag => 'head',
15
15
  :latex => '#{@content}',
16
16
  :text => '#{@content}',
17
- :wiki => '<!-- #{@content} -->',
17
+ :wiki => '#{@content}',
18
18
  } )
19
19
  Element.create( [:body], {
20
20
  :bgcolor => Attribute.create( [ :html ] ),
@@ -53,17 +53,21 @@ class Title < Element
53
53
  }.update(HTML_ATTR_ALL)
54
54
  )
55
55
  #Unsaubere realisierung .. fixme
56
- def shortoption()
56
+ def shortoption( options = {} )
57
57
  @attr[:short].content.compact! #delete nils.
58
58
  return nil if ! @attr[:short].filled?
59
- @part_of_doc.each{|doc|
60
- if doc.template[:latex].template.include?('Beamer')
59
+ o = Docgenerator_logger.set_option_defaults(options)
60
+ o[:log].debug("enter shortoption") if o[:log].debug?
61
+ if o[:document]
62
+ if o[:document].template[:latex].template.include?('Beamer')
61
63
  return "[#{@attr[:short].content}]"
62
- end
63
- }
64
- return nil
64
+ end
65
+ else
66
+ o[:log].info("No related document for shortoption") if o[:log].info?
67
+ end
68
+ return nil
65
69
  end
66
- add_output( :latex, '#{linebreak(@crbefore)}\title#{shortoption}{#{@content}}#{linebreak(@crmid)}\hypersetup{pdftitle={#{@content}}}#{linebreak(@crafter)}')
70
+ add_output( :latex, '#{linebreak(@crbefore)}\title#{shortoption(o)}{#{@content}}#{linebreak(@crmid)}\hypersetup{pdftitle={#{@content}}}#{linebreak(@crafter)}')
67
71
  #~ add_output( :latex, '#{linebreak(@crbefore)}\title{#{@content}}#{linebreak(@crmid)}\hypersetup{pdftitle={#{@content}}}#{linebreak(@crafter)}')
68
72
  add_output( :html, '#{linebreak(@crbefore)}<title>#{@content}</title>#{linebreak(@crafter)}')
69
73
  add_output( :text, "\n" + '#{linebreak(@crbefore)}#{@content}#{linebreak(@crafter)}' + "\n")
@@ -121,11 +125,72 @@ Element.create( [:maketitle], {}, false,
121
125
  :html => "<!-- maketitle -->\n",
122
126
  :latex => '#{linebreak(@crbefore)}' + '\maketitle #{linebreak(@crafter)}'
123
127
  } )
124
- Element.create( [:tableofcontents], {}, false,
125
- { :htmltag => 'span', #Empty span
126
- :html => "<!-- tableofcontents -->\n",
127
- :latex => '#{linebreak(@crbefore)}' + '\tableofcontents ' + ' #{linebreak(@crafter)}'
128
- } )
128
+ #~ Element.create( [:tableofcontents], {}, false,
129
+ #~ { :htmltag => 'span', #Empty span
130
+ #~ :html => '#{linebreak(@crbefore)}<!-- tableofcontents -->#{linebreak(@crafter)}',
131
+ #~ :latex => '#{linebreak(@crbefore)}' + '\tableofcontents ' + ' #{linebreak(@crafter)}'
132
+ #~ } )
133
+
134
+ #Build table of contents.
135
+ #
136
+ #This element requires a related document.
137
+ #
138
+ #For LaTeX \tableofcontents is created, with attribute :as_list you can create a list.
139
+ class Tableofcontents < Element
140
+ Element.add( [:tableofcontents], Tableofcontents)
141
+ add_attributes( {
142
+ :level => Attribute.create( [ :html, :latex ], [Fixnum], 1 ),
143
+ :pre => Attribute.create( [ :html, :latex ], nil, 2 ),
144
+ :post => Attribute.create( [ :html, :latex ], nil, 2 ),
145
+ :as_list => Attribute.create( [ :latex ], [true, false], 2 ),
146
+ }.update(HTML_ATTR_ALL)
147
+ )
148
+ def content?(); return false; end
149
+ def to_doc( target, options = {} )
150
+ o = Docgenerator_logger.set_option_defaults(options)
151
+ o[:log].debug("enter to_doc(#{target}) for #{self.inspect}, options: #{options.keys.inspect}") if o[:log].debug?
152
+ tocoptions = {
153
+ :level => @attr[:level].content.first,
154
+ :pre => @attr[:pre].content,
155
+ :post => @attr[:post].content,
156
+ :as_list => @attr[:as_list].content.first,
157
+ }.update(o)
158
+ tocoptions[:level] = 3 unless tocoptions[:level]
159
+ case target
160
+ when :latex
161
+ if @attr[:as_list].content.first
162
+ if o[:document]
163
+ return o[:document].toc(tocoptions).to_doc(target, options)
164
+ else
165
+ o[:log].error("No related document for tableofcontents") if o[:log].error?
166
+ return ''
167
+ end
168
+ else
169
+ return "#{linebreak(@crbefore)}\\tableofcontents #{linebreak(@crafter)}"
170
+ end
171
+ when :html
172
+ return to_html(tocoptions)
173
+ when :wiki, :text
174
+ if o[:document]
175
+ return o[:document].toc(tocoptions).to_doc(target, options)
176
+ else
177
+ o[:log].error("No related document for tableofcontents") if o[:log].error?
178
+ return ''
179
+ end
180
+ end
181
+ end
182
+ #Build toc, if there is a related document.
183
+ def to_html( options = {} )
184
+ o = Docgenerator_logger.set_option_defaults(options)
185
+ o[:log].debug("enter to_html for #{self.inspect}, options: #{options.keys.inspect}") if o[:log].debug?
186
+ if o[:document]
187
+ return o[:document].toc(options).to_html(options)
188
+ else
189
+ o[:log].error("No related document for tableofcontents") if o[:log].error?
190
+ return "#{linebreak(@crbefore)}<!-- tableofcontents -->#{linebreak(@crafter)}"
191
+ end
192
+ end
193
+ end
129
194
  Element.create( [:addcontentsline], {
130
195
  :file => Attribute.create( [ :latex, :required ], [ 'toc', 'lof', 'lot' ] ),
131
196
  :depth => Attribute.create( [ :latex, :required ], [ -1, 0,1,2,3,4,5,6] ),
@@ -0,0 +1,73 @@
1
+ #
2
+ #Definition of templates.
3
+ #
4
+ #This templates are used for document types.
5
+ #
6
+ class CSS_collection
7
+ @@templates = {}
8
+ #
9
+ #Define a CSS template.
10
+ #
11
+ #If key is nil (or false), an anonym CSS-Collection is made
12
+ def initialize( key, descr )
13
+ @key = key
14
+ @descr = descr
15
+ @css = {}
16
+ if @@templates[key]
17
+ puts "DocumentTemplateCSS: Double definition of template #{key.inspect}"
18
+ end
19
+ @@templates[key] = self if @key
20
+ end
21
+ #Add a css definition to the collection.
22
+ #key is the CSS-locator, e.g. "div.toc ul li a"
23
+ def add( key, css)
24
+ @css[key] = css
25
+ end
26
+ #Returns the complete CSS-definition.
27
+ def css()
28
+ css_coll = "/*\n"
29
+ css_coll << "\t#{@descr}"
30
+ css_coll << "\n*/\n"
31
+ @css.each{|k,css|
32
+ css_coll << "#{k}\t{\n"
33
+ css_coll << css.to_html(:map => "\t%s;\n")
34
+ css_coll << "}\n"
35
+ }
36
+ css_coll
37
+ end
38
+ #Returns the Style definition for the HTTP-Head.
39
+ #
40
+ #Use it like this:
41
+ # doc.head << CSS_collection[:toc].style
42
+ def style()
43
+ return element(:style, {}, self.css )
44
+ end
45
+ #Get CSS_Collection.
46
+ def self.[]( key )
47
+ if @@templates[key]
48
+ return @@templates[key]
49
+ else
50
+ return nil
51
+ end
52
+ end
53
+ #Returns array with all defined template keys.
54
+ def self.keys()
55
+ return @@templates.keys
56
+ end
57
+ end
58
+
59
+ #
60
+ #Use it as:
61
+ # doc.head << CSS_collection[:toc].style
62
+ CSS_collection.new(:toc, 'CSS for table of contents')
63
+ CSS_collection[:toc].add('div.toc', CSS.new(
64
+ :float => 'right',
65
+ :width => '45%',
66
+ :background => 'lightgray',
67
+ :border => '2px solid'
68
+ ))
69
+ CSS_collection[:toc].add('div.toc ul li a', CSS.new(
70
+ :font_size => 'xx-small',
71
+ :font_weight => 'normal'
72
+ ))
73
+
@@ -17,7 +17,6 @@
17
17
  # http://de.wikipedia.org/wiki/Wikipedia:Textbausteine/Schwesterprojekte
18
18
  #- http://de.wikipedia.org/wiki/Wikipedia:Textbausteine
19
19
 
20
- require 'C:/usr/Script/MyScripts' if File.exist?('C:/usr/Script/MyScripts.rb')
21
20
  require 'docgenerator'
22
21
  require 'log4r'
23
22
  begin
@@ -168,7 +167,7 @@ WIKI_INLINE_REPLACEMENTS = [
168
167
  linktext = m[1].sub(/http:\/\//, '').sub(/\/$/, '')
169
168
  end
170
169
  [ oo.inline(m.pre_match, log),
171
- element(:a, {:href=> link_url }, oo.inline(linktext, log) ).Cr,
170
+ element(:a, {:href=> link_url }, oo.inline(linktext, log) ),
172
171
  oo.inline(m.post_match, log)
173
172
  ]
174
173
  }
@@ -570,11 +569,17 @@ class Wikitext
570
569
  when 'math'; return element(:ensuremath,{}, value )
571
570
  #>>>requires privat/affiliate.rb
572
571
  when 'asin'
573
- return Amazon.new.asin_in_iframe( value )
572
+ return Amazon.new.asin_in_iframe( value ) if defined? JPC
573
+ log.error( "#{self.class}#wiki_macro: No privat/docgenerator_affiliate available (line #{@lineno})" ) if log.error?
574
+ return ''
574
575
  when 'amazon' #~ {{amazon|produktlinie|keywords}}
575
- return Amazon.make_link(val)
576
+ return Amazon.make_link(val) if defined? JPC
577
+ log.error( "#{self.class}#wiki_macro: No privat/docgenerator_affiliate available (line #{@lineno})" ) if log.error?
578
+ return ''
576
579
  when 'jpc' #~ {{amazon|produktlinie|keywords}}
577
- return JPC.make_link(val)
580
+ return JPC.make_link(val) if defined? JPC
581
+ log.error( "#{self.class}#wiki_macro: No privat/docgenerator_affiliate available (line #{@lineno})" ) if log.error?
582
+ return ''
578
583
  #<<<requires privat/affiliate.rb
579
584
  when 'fixme'
580
585
  log.info( "Fixme: #{value}" ) if log.info?
@@ -939,20 +944,8 @@ class Wikitext
939
944
  return intext
940
945
  end
941
946
  def toccss()
942
- return <<wikitoc
943
- <style type="text/css">
944
- div.toc {
945
- float: right;
946
- width: 45%;
947
- background: lightgray;
948
- border: 2px solid;
949
- }
950
- div.toc ul li a {
951
- font-size: xx-small;
952
- font-weight: normal;
953
- }
954
- </style>
955
- wikitoc
947
+ @log.error("Usage of obsolete toccss, use CSS_collection[:toc]") if @log.error?
948
+ return CSS_collection[:toc].style.to_html
956
949
  end
957
950
  #Make a table of contents
958
951
  #
@@ -0,0 +1,13 @@
1
+ <<prefix>>
2
+ \documentclass[class=scrartcl,ngerman]{beamer}
3
+ \usepackage{babel}
4
+ \usepackage{beamerbasearticle}
5
+ \usepackage[article]{beamertool}
6
+ \usepackage[ansinew]{inputenc}
7
+ \usepackage{hyperref}
8
+ % ----------------------------------------------------------------
9
+
10
+ %BibTeX-Entry>
11
+ %BibTeX-Entry<
12
+ \input{beamer_01_article.tex}
13
+
@@ -0,0 +1,15 @@
1
+ <<prefix>>
2
+ % ----------------------------------------------------------------
3
+
4
+ %BibTeX-Entry>
5
+ %BibTeX-Entry<
6
+
7
+ % ----------------------------------------------------------------
8
+
9
+ %
10
+ % Big Pictures / Plainframes
11
+ \section{Enlarged Pictures}%\frame{\sectionpage}
12
+
13
+ \usebackgroundtemplate{}
14
+
15
+ % ----------------------------------------------------------------
@@ -0,0 +1,13 @@
1
+ <!--
2
+ <<prefix>>
3
+ -->
4
+ <!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
5
+ <html>
6
+ <head >
7
+ <title>Title</title>
8
+ <meta name="author" content="Knut Lickert">
9
+ <meta name="creation-date" content="2008-05-15">
10
+ <meta name = "shorttitle" content = "Short title" />
11
+ </head>
12
+ <body ></body>
13
+ </html>