docgenerator 1.1.1 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. data/examples/docgenerator_example.rb +34 -17
  2. data/examples/docgenerator_example_footnote.rb +82 -61
  3. data/examples/docgenerator_example_list.rb +24 -18
  4. data/examples/docgenerator_example_restrictions.rb +17 -27
  5. data/examples/docgenerator_example_tabular.rb +20 -20
  6. data/examples/docgenerator_example_tripfalls.rb +28 -20
  7. data/examples/results/readme +1 -0
  8. data/examples/results_expected/docgenerator_example.html +39 -0
  9. data/examples/results_expected/docgenerator_example.pdf +0 -0
  10. data/examples/results_expected/docgenerator_example.tex +56 -0
  11. data/examples/results_expected/docgenerator_example_footnote.html +40 -0
  12. data/examples/results_expected/docgenerator_example_footnote.pdf +0 -0
  13. data/examples/results_expected/docgenerator_example_footnote.tex +50 -0
  14. data/examples/results_expected/docgenerator_example_list.html +18 -0
  15. data/examples/results_expected/docgenerator_example_list.pdf +0 -0
  16. data/examples/results_expected/docgenerator_example_list.tex +46 -0
  17. data/examples/results_expected/docgenerator_example_restrictions.html +22 -0
  18. data/examples/results_expected/docgenerator_example_restrictions.pdf +0 -0
  19. data/examples/results_expected/docgenerator_example_restrictions.tex +31 -0
  20. data/examples/results_expected/docgenerator_example_tabular.html +37 -0
  21. data/examples/results_expected/docgenerator_example_tabular.pdf +0 -0
  22. data/examples/results_expected/docgenerator_example_tabular.tex +41 -0
  23. data/examples/results_expected/docgenerator_example_tripfalls.html +27 -0
  24. data/examples/results_expected/docgenerator_example_tripfalls.pdf +0 -0
  25. data/examples/results_expected/docgenerator_example_tripfalls.tex +31 -0
  26. data/lib/creole/creole2doc.rb +291 -140
  27. data/lib/creole/creole_inclusion_and_plugins.rb +142 -39
  28. data/lib/creole/creole_placeholder.rb +92 -30
  29. data/lib/creole/creole_tabular.rb +119 -20
  30. data/lib/docgenerator.rb +209 -118
  31. data/lib/{docgenerator_attribute.rb → docgenerator/attribute.rb} +2 -1
  32. data/lib/{docgenerator_characters.rb → docgenerator/characters.rb} +75 -6
  33. data/lib/{docgenerator_css.rb → docgenerator/css.rb} +0 -0
  34. data/lib/docgenerator/document.rb +588 -0
  35. data/lib/{docgenerator_element.rb → docgenerator/element.rb} +52 -80
  36. data/lib/{docgenerator_elements.rb → docgenerator/elements.rb} +43 -17
  37. data/lib/{docgenerator_environments.rb → docgenerator/environments.rb} +20 -6
  38. data/lib/{docgenerator_footnote.rb → docgenerator/footnote.rb} +22 -18
  39. data/lib/{docgenerator_lists.rb → docgenerator/lists.rb} +17 -1
  40. data/lib/{docgenerator_sections.rb → docgenerator/sections.rb} +9 -1
  41. data/lib/docgenerator/standard.rb +81 -0
  42. data/lib/{docgenerator_tabular.rb → docgenerator/tabular.rb} +9 -5
  43. data/lib/packages/docgenerator_listings.rb +9 -5
  44. data/lib/packages/docgenerator_pdfpages.rb +17 -11
  45. data/lib/packages/docgenerator_url.rb +0 -2
  46. data/lib/templates/docgenerator_template.rb +66 -29
  47. data/lib/templates/docgenerator_template.yaml +18 -0
  48. data/lib/wiki2doc/wiki2docgenerator.rb +6 -2
  49. data/readme.rd +132 -0
  50. data/unittest/expected/test_document_usepackage_undefined.log +2 -0
  51. data/unittest/expected/test_enumerate.context +4 -0
  52. data/unittest/expected/test_footnote.html +4 -4
  53. data/unittest/expected/test_footnote.latex +4 -4
  54. data/unittest/expected/test_footnote_group.html +6 -6
  55. data/unittest/expected/test_footnote_group.latex +6 -6
  56. data/unittest/expected/test_href.html +2 -2
  57. data/unittest/expected/test_href.latex +2 -2
  58. data/unittest/expected/test_href.text +2 -2
  59. data/unittest/expected/test_itemize.context +4 -0
  60. data/unittest/expected/test_runtex.stdout +3 -0
  61. data/unittest/expected/test_runtex_2.stdout +3 -0
  62. data/unittest/expected/test_section.context +20 -0
  63. data/unittest/expected/test_tabular.html +2 -2
  64. data/unittest/expected/test_verbatim.html +3 -0
  65. data/unittest/expected/test_verbatim.latex +4 -0
  66. data/unittest/expected/test_verbatim_array.html +1 -0
  67. data/unittest/expected/test_verbatim_array.latex +2 -0
  68. data/unittest/expected_creole/test_creole_characters_all.html +12 -5
  69. data/unittest/expected_creole/test_creole_characters_all.latex +20 -6
  70. data/unittest/expected_creole/test_creole_comment.context +11 -0
  71. data/unittest/expected_creole/test_creole_comment.creole +12 -0
  72. data/unittest/expected_creole/test_creole_comment.html +9 -0
  73. data/unittest/expected_creole/test_creole_comment.latex +11 -0
  74. data/unittest/expected_creole/test_creole_creole1.0test.html +3 -3
  75. data/unittest/expected_creole/test_creole_creole1.0test.latex +3 -3
  76. data/unittest/expected_creole/test_creole_creole1.0test.text +4 -4
  77. data/unittest/expected_creole/test_creole_ignore.html +3 -0
  78. data/unittest/expected_creole/test_creole_ignore.latex +4 -0
  79. data/unittest/expected_creole/test_creole_ignore.text +2 -0
  80. data/unittest/expected_creole/test_creole_input.normsource +12 -12
  81. data/unittest/expected_creole/test_creole_input_file_simple.html +15 -0
  82. data/unittest/expected_creole/test_creole_input_file_simple_readlines.html +15 -0
  83. data/unittest/expected_creole/test_creole_links_external_implicit.html +2 -2
  84. data/unittest/expected_creole/test_creole_links_external_implicit.latex +2 -2
  85. data/unittest/expected_creole/test_creole_links_external_implicit.text +2 -2
  86. data/unittest/expected_creole/test_creole_links_implicit_end.creole +4 -0
  87. data/unittest/expected_creole/test_creole_links_implicit_end.html +3 -0
  88. data/unittest/expected_creole/test_creole_links_implicit_end.latex +4 -0
  89. data/unittest/expected_creole/test_creole_list_ul.normsource +42 -42
  90. data/unittest/expected_creole/test_creole_mix_titles_list.html +10 -0
  91. data/unittest/expected_creole/test_creole_mix_titles_list.latex +18 -0
  92. data/unittest/expected_creole/test_creole_mix_titles_list.text +12 -0
  93. data/unittest/expected_creole/test_creole_paragraphs.normsource +15 -15
  94. data/unittest/expected_creole/test_creole_pictures_css.html +4 -1
  95. data/unittest/expected_creole/test_creole_pictures_css.latex +5 -1
  96. data/unittest/expected_creole/test_creole_pictures_longdesc.html +3 -0
  97. data/unittest/expected_creole/test_creole_pictures_width.html +3 -0
  98. data/unittest/expected_creole/test_creole_pictures_width.latex +4 -0
  99. data/unittest/expected_creole/test_creole_short_html.html +3 -0
  100. data/unittest/expected_creole/test_creole_short_html.latex +4 -0
  101. data/unittest/expected_creole/test_creole_short_html.text +2 -0
  102. data/unittest/expected_creole/test_creole_shy.creole +6 -0
  103. data/unittest/expected_creole/test_creole_shy.html +6 -0
  104. data/unittest/expected_creole/test_creole_shy.latex +8 -0
  105. data/unittest/expected_creole/test_creole_shy.text +4 -0
  106. data/unittest/expected_creole/test_creole_tabular_with_cell_option.html +20 -0
  107. data/unittest/expected_creole/test_creole_toc.html +3 -1
  108. data/unittest/expected_creole/test_creole_toc.latex +1 -1
  109. data/unittest/expected_creole/test_creole_toc.text +1 -1
  110. data/unittest/expected_creole/test_creole_toc_level.html +7 -0
  111. data/unittest/expected_creole/test_creole_toc_level.latex +10 -0
  112. data/unittest/expected_creole/test_creole_toc_level.text +3 -0
  113. data/unittest/expected_creole/test_creole_toc_level_text.html +8 -0
  114. data/unittest/expected_creole/test_creole_toc_level_text.latex +9 -0
  115. data/unittest/expected_creole/test_creole_verbatim.html +1 -1
  116. data/unittest/expected_creole/test_creole_verbatim.latex +1 -1
  117. data/unittest/expected_creole/test_creole_verbatim.text +1 -1
  118. data/unittest/expected_creole/test_creole_verbatim_inline.html +1 -1
  119. data/unittest/expected_creole/test_creole_verbatim_inline.latex +1 -1
  120. data/unittest/expected_wiki/test_wiki_description.html +5 -5
  121. data/unittest/expected_wiki/test_wiki_description.latex +5 -5
  122. data/unittest/expected_wiki/test_wiki_description.text +5 -5
  123. data/unittest/expected_wiki/test_wiki_description.wiki +5 -5
  124. data/unittest/test_rakefile_docgenerator.rb +43 -0
  125. data/unittest/unittest_creole2doc.rb +415 -27
  126. data/unittest/unittest_docgenerator.rb +256 -23
  127. data/unittest/unittest_docgenerator_runtex.rb +83 -0
  128. data/unittest/unittest_versions.rb +44 -0
  129. data/unittest/unittest_wiki2doc.rb +28 -27
  130. metadata +473 -106
  131. data/lib/docgenerator_document.rb +0 -525
  132. data/lib/packages/docgenerator_beamer.rb +0 -253
  133. data/lib/yaml2presentation/yaml2presentation.rb +0 -1091
  134. data/unittest/expected/beamer_01_article.tex +0 -13
  135. data/unittest/expected/beamer_01_attachment.tex +0 -15
  136. data/unittest/expected/beamer_01_doc.html +0 -13
  137. data/unittest/expected/beamer_01_doc.tex +0 -18
  138. data/unittest/expected/beamer_01_notes_only.tex +0 -13
  139. data/unittest/expected/beamer_01_notes_onlyslideswithnotes.tex +0 -13
  140. data/unittest/expected/beamer_01_notes_show.tex +0 -13
  141. data/unittest/expected/beamer_01_presentation.tex +0 -13
  142. data/unittest/expected/beamer_02_doc.html +0 -29
  143. data/unittest/expected/beamer_02_doc.tex +0 -34
  144. data/unittest/expected/beamer_block.html +0 -1
  145. data/unittest/expected/beamer_block.latex +0 -1
  146. data/unittest/expected/beamer_doc_fragile_doc.tex +0 -33
  147. data/unittest/expected/beamer_doc_html_overview_with_detailpic_and_text_doc.html +0 -34
  148. data/unittest/expected/beamer_doc_html_overview_with_detailpic_doc.html +0 -34
  149. data/unittest/expected/beamer_doc_key_doc.html +0 -20
  150. data/unittest/expected/beamer_doc_key_doc.tex +0 -29
  151. data/unittest/expected/beamer_doc_note_doc.html +0 -30
  152. data/unittest/expected/beamer_doc_note_doc.tex +0 -37
  153. data/unittest/expected/beamer_doc_pic_bottom_doc.html +0 -24
  154. data/unittest/expected/beamer_doc_pic_doc.html +0 -24
  155. data/unittest/expected/beamer_doc_pic_doc.tex +0 -28
  156. data/unittest/expected/beamer_doc_pic_left_doc.html +0 -24
  157. data/unittest/expected/beamer_doc_pic_left_doc.tex +0 -28
  158. data/unittest/expected/beamer_doc_pic_ratio_doc.tex +0 -29
  159. data/unittest/expected/beamer_doc_pic_right_doc.html +0 -24
  160. data/unittest/expected/beamer_doc_pic_right_doc.tex +0 -28
  161. data/unittest/expected/beamer_doc_pic_top_doc.html +0 -24
  162. data/unittest/expected/beamer_frame.html +0 -5
  163. data/unittest/expected/beamer_frame.tex +0 -11
  164. data/unittest/expected/beamer_frame_fragile.tex +0 -7
  165. data/unittest/expected/beamer_frame_id.html +0 -1
  166. data/unittest/expected/beamer_frame_id.tex +0 -4
  167. data/unittest/expected/beamer_framepic.html +0 -5
  168. data/unittest/expected/beamer_framepic.latex +0 -1
  169. data/unittest/expected/beamer_framepic_link.html +0 -5
  170. data/unittest/expected/beamer_framepic_link.latex +0 -1
  171. data/unittest/expected/beamer_frametitle.html +0 -1
  172. data/unittest/expected/beamer_frametitle.latex +0 -1
  173. data/unittest/expected/beamer_note.html +0 -1
  174. data/unittest/expected/beamer_note.latex +0 -1
  175. data/unittest/expected_privat/test_creole_test_document.html +0 -6
  176. data/unittest/expected_wiki/test_wiki_amazon.html +0 -10
  177. data/unittest/expected_wiki/test_wiki_link.log +0 -3
  178. data/unittest/test_docgenerator.rb +0 -107
  179. data/unittest/unittest_yaml2pres.rb +0 -336
@@ -1,253 +0,0 @@
1
- #
2
- # The text 'Beamer' must be part of this template.
3
- # Without it, the title-Class will not use the short version for title.#
4
- #
5
- DocumentTemplate.new(:beamer, :latex, %q|<<prefix>>
6
- % ----------------------------------------------------------------
7
- % For Usage with Beamer
8
- % ----------------------------------------------------------------
9
- <<head>>
10
- % ----------------------------------------------------------------
11
- \begin{document}
12
- <<body>>
13
- \end{document}
14
- % ----------------------------------------------------------------
15
- |.gsub(/^\s*/, ''))
16
- DocumentTemplate.new(:beamerhead, :latex, %q|<<prefix>>
17
- \documentclass[<<classoptions>>]{beamer}
18
- %<<theme>>
19
- \usepackage{babel}
20
- \usepackage[ansinew]{inputenc}
21
- \usepackage{beamertool}
22
- \usepackage{hyperref}
23
- % ----------------------------------------------------------------
24
- <<head>>
25
- |.gsub(/^\s*/, ''))
26
- [
27
- :beamerthemebars, :beamerthemeboxes, :beamerthemeclassic,
28
- :beamerthemelined, :beamerthemeplain, :beamerthemesidebar,
29
- :beamerthemesidebardark, :beamerthemesidebardarktab,
30
- :beamerthemesidebartab, :beamerthemesplit,
31
- :beamerthemesplitcondensed, :beamerthemetree,
32
- :beamerthemevcd,
33
- :beamerthemegemeinschaftsauto
34
- ].each{ |theme|
35
- DocumentTemplate.new(theme, :latex, DocumentTemplate[:beamerhead].template.sub(/%<<theme>>/, "\\usepackage{#{theme}}"))
36
- }
37
- DocumentTemplate.new(:beamerarticle, :latex, %q|<<prefix>>
38
- \documentclass[class=scrartcl,<<classoptions>>]{beamer}
39
- \usepackage{babel}
40
- \usepackage{beamerbasearticle}
41
- \usepackage[article]{beamertool}
42
- \usepackage[ansinew]{inputenc}
43
- \usepackage{hyperref}
44
- % ----------------------------------------------------------------
45
- <<head>>
46
- |.gsub(/^\s*/, ''))
47
-
48
-
49
- #Define TeX-Kommands
50
-
51
- #frame -- environment.
52
- #options
53
- #~ Element.create( :frame, {}, true, {
54
- #~ :latex => '#{linebreak(@crbefore)}\frame{#{@content}}#{linebreak(@crafter)}'
55
- #~ } )
56
-
57
- class Frame < Element
58
- add_attributes( {
59
- :options => Attribute.create( [ :latex ], [nil, 'fragile', 't', 'b'] ),
60
- }.update( HTML_ATTR_ALL ) )
61
- Element.add( [:frame], Frame)
62
- #Returns a div-element.
63
- #The class for the css is set to 'frame' (if not defined before).
64
- def htmltag( )
65
- if @attr[:class].content.empty?
66
- @attr[:class] << :frame
67
- end
68
- 'div'
69
- end
70
- def to_latex( options = {} )
71
- option = "[#{@attr[:options].content.join(',')}]"
72
- option = nil if option == '[]'
73
- label = nil
74
- label = element(:label,{:name => @attr[:id]}).cr.to_latex(options) unless @attr[:id].content.empty?
75
- #~ return "#{linebreak(@crbefore)}\\frame#{option}{\n#{@content}}#{linebreak(@crafter)}"
76
- return "#{linebreak(@crbefore)}\\begin{frame}#{option}\n#{label}#{@content.to_latex(options)}\n\\end{frame}#{linebreak(@crafter)}"
77
- end
78
- end
79
-
80
- #
81
- #Frametitle.
82
- #Can be changed by
83
- # Element.get( :frametitle ).class_eval( "def htmltag(); 'h4'; end")
84
- Element.create( :frametitle, { }, true, {
85
- :latex => '#{linebreak(@crbefore)}\frametitle{#{@content}}#{linebreak(@crafter)}',
86
- :htmltag => 'p', #'h4',
87
- :html => '#{linebreak(@crbefore)}<#{htmltag} class = "frametitle">#{@content}</#{htmltag}>#{linebreak(@crafter)}',
88
- } )
89
-
90
- Element.create( :block, {
91
- :title => Attribute.create( [ :latex ] ),
92
- }, true, {
93
- :latex => '#{linebreak(@crbefore)}' + '\begin{block}{#{@attr[:title]}}' + '#{linebreak(@crmid)}' + '#{@content}\end{block}' + '#{linebreak(@crafter)}'
94
- } )
95
-
96
- #
97
- # Notes in Beamer.
98
- #
99
- Element.create( :note, { }, true, {
100
- :latex => '#{linebreak(@crbefore)}\note{#{@content}}#{linebreak(@crafter)}',
101
- :htmltag => 'p', #'h4',
102
- :html => '#{linebreak(@crbefore)}<#{htmltag} class = "note">#{@content}</#{htmltag}>#{linebreak(@crafter)}',
103
- } )
104
-
105
- #\framePic{filename}{
106
- # description
107
- #}
108
- #~ Element.create( :framepic, { :file => Attribute.create( [ :required ] ),
109
- #~ :link => Attribute.create( )
110
- #~ }, true, {
111
- #~ :latex => '\framePic{#{@attr[:file]}}{#{@content}}'
112
- #~ } )
113
-
114
- Element.create( :institute, {
115
- }, true, {
116
- :latex => '#{linebreak(@crbefore)}' + '\institute{#{@content}}' + '#{linebreak(@crafter)}'
117
- } )
118
-
119
- Element.create( :subtitle, {
120
- }, true, {
121
- :latex => '#{linebreak(@crbefore)}' + '\subtitle{#{@content}}' + '#{linebreak(@crafter)}'
122
- } )
123
-
124
- begin
125
- #define Knut::Picture
126
- require 'knut_picture'
127
- rescue
128
- #Define Knut::Picture with reduced functionality
129
- module Knut
130
- class Picture
131
- def initialize( filename )
132
- @filename = filename
133
- @basename = File.basename(@filename)
134
- @dir = File.dirname(@filename)
135
- if ! File.exists?( @filename )
136
- puts "#{self.class}: #{@filename} not found"
137
- else
138
- @size = File.size(@filename)
139
- @sizekb = @size / 1024
140
- end
141
- end
142
- #Filename including the path
143
- attr_reader :filename
144
- #Directory of the picture
145
- attr_reader :dir
146
- attr_reader :basename
147
- def tech_description()
148
- "#{@basename} (#{@sizekb}KB)"
149
- end
150
- end
151
- end
152
- end
153
-
154
- class Framepic < Element
155
- Element.add( [:framepic], Framepic)
156
- add_attributes( {
157
- :file => Attribute.create( [ :required ] ),
158
- :link => Attribute.create( [ :latex ]), #Hyperlink
159
- }.update( HTML_ATTR_ALL ) )
160
- #container for the picture
161
- def picture()
162
- @picture = Knut::Picture.new( @attr[:file].content.first ) if ! @picture
163
- @picture
164
- end
165
- attr_accessor :div_css
166
- attr_accessor :img_css
167
- attr_accessor :div_class
168
- attr_accessor :img_class
169
- attr_accessor :picwithname
170
- def to_html( options = {})
171
- html = [] #element(:div, {:class => :framepic })
172
- #~ if @attr[:link].content.size > 0
173
- #~ html << "[#{@attr[:link]}]"
174
- #~ end
175
-
176
- html << div_img = element(:div ).CR
177
- if self.picture.href
178
- div_img << element(:a, { :href => self.picture.href },
179
- img = element(:img )
180
- )
181
- else
182
- div_img << img = element(:img )
183
- end
184
- if self.picture.thumbname and self.picture.usethumb?
185
- img[:src] << self.picture.thumbname
186
- else
187
- img[:src] << self.picture.filename
188
- end
189
- @div_css = CSS.new() if ! @div_css
190
- div_img[:class] << @div_class if @div_class
191
- div_img[:style] << @div_css
192
- div_img[:align] << 'center' if div_img[:align].content.empty?
193
- img[:class] << @img_class if @img_class
194
- img[:style] << @img_css if @img_css
195
- if picwithname
196
- div_img << element(:br ).cr
197
- div_img << element(:footnotesize, {}, self.picture.tech_description)
198
- end
199
- html << @content
200
- return html.to_html(options)
201
- end
202
- def to_latex( options = {} )
203
- result = ""
204
- result << "\n" if @crbefore
205
- result << "\\framePic"
206
- if self.div_css #Check alignment
207
- case self.div_css[:float]
208
- when nil, 'left' #standard
209
- when 'right'
210
- result << "[right]"
211
- else
212
- puts "#{__FILE__}##{__LINE__}: Undefined float '#{self.div_css[:float]}' for TeX"
213
- end
214
- end
215
- result << "{#{self.picture.filename}}"
216
- if @attr[:link].content.size > 0
217
- result << "[#{@attr[:link]}]"
218
- end
219
- result << "{"
220
- result << "\n" if @crmid
221
- result << "#{@content.to_latex(options)}"
222
- result << "\n" if @crmid
223
- result << "}"
224
- result << "\n" if @crafter
225
- return result
226
- end
227
- end
228
-
229
-
230
- Element.create( :includegraphicsJustified, {}, true, {
231
- :latex => '\includegraphicsJustified{#{@content}}',
232
- :html => '<img src = "#{@content}" style = "max-width: 80%" />',
233
- } )
234
-
235
- #fixme --> docgenerator_color ?
236
- class Textcolor < Element
237
- Element.add( [:textcolor], Textcolor)
238
- add_attributes( { :mode => Attribute.create( [ :required ], [:rgb] ),
239
- :color => Attribute.create( [ :required ], [String] ),
240
- } )
241
- def to_latex( options = {})
242
- result = ""
243
- result << "\n" if @crbefore
244
- result << "\\textcolor[#{attr[:mode]}]{#{@attr[:color]}}"
245
- result << "\n" if @crmid
246
- result << "{"
247
- result << "#{@content.to_latex(options)}"
248
- result << "\n" if @crmid
249
- result << "}"
250
- result << "\n" if @crafter
251
- return result
252
- end
253
- end
@@ -1,1091 +0,0 @@
1
- #~ fixmes:
2
- #~ Frame: puts in log umsetzte
3
-
4
- #~ require 'docgenerator'
5
- require 'wiki2doc/wiki2docgenerator.rb'
6
- require 'creole/creole2doc.rb'
7
- require 'packages/docgenerator_beamer.rb'
8
- require 'yaml'
9
-
10
- #Analyse Wiki-text inside a frame.
11
- class WikiFrame < Wikitext
12
- def wiki_macro( macro, parameters )
13
- case macro
14
- #Special feature, requires additional scripts.
15
- when 'note'
16
- element(:note,{}, parameters)
17
- when 'rail'
18
- raise "require rails parts" if ! Rail_diagramm
19
- Rail_diagramm[parameters.to_sym]
20
- else
21
- super(macro, parameters)
22
- end
23
- end
24
- end
25
-
26
- #Redefinition of docgenerator-Frame class (or better extension.)
27
- #
28
- #Generell Problems:
29
- #-no lists outside a frame for LaTeX-Output
30
- #-frames with verbatim must contain the option ''fragile''
31
- class Frame
32
- attr_accessor :title
33
- attr_accessor :html_link
34
- #Filename of a preview thumb
35
- attr_reader :thumb
36
- attr_accessor :framepic
37
- attr_accessor :picname
38
- attr_accessor :key
39
- #Settings of Presentation
40
- #contains things like "picwithframe"
41
- attr_accessor :settings
42
- #Presentation, where frame is part of.
43
- #Used to add detail pages of pictures
44
- attr_accessor :presentation
45
-
46
- #Add a picture to the frame
47
- def pic=( picname )
48
- if ! File.exist?(picname)
49
- @log.error("Picture #{picname} missing") if @log.error?
50
- end
51
- @picname = picname
52
- self << @framepic = Framepic.new( { :file => picname } )
53
- @framepic.picture.thumbname = @thumb if @thumb
54
- return @framepic
55
- end
56
- #Add a picture with link to a 'fullpage-mode'.
57
- def picfull=( picname )
58
- self.pic= picname
59
- if self.presentation
60
- self.presentation.attachment << picname
61
- @framepic[:link] << "pic:#{picname}"
62
- end
63
- #not really functional. Is set later again with beamer_save
64
- @framepic.picwithname = @settings[:picwithname]
65
- end
66
- #Add a picture in 'fullpage-mode'.
67
- def piconly=( picname )
68
- if ! File.exist?(picname)
69
- @log.warn("Picture #{picname} missing")if @log.warn?
70
- end
71
- @picname = picname
72
- self << element(:includegraphicsJustified, {}, picname)
73
- #~ return @framepic
74
- end
75
- def thumb=( thumbname )
76
- raise "Thumb without picture (#{title}" if ! @framepic
77
- if ! File.exist?(thumbname)
78
- @log.warn("Thumb #{thumbname} missing") if @log.warn?
79
- end
80
- @thumb = thumbname
81
- @framepic.picture.thumbname = thumbname if @framepic.picture
82
- end #Add option.
83
-
84
- #CSS-options for surrounding div
85
- def pos=( pos )
86
- if ! @framepic
87
- @log.warn("Set pos #{pos} for undefined picture in #{@title}") if @log.warn?
88
- return false
89
- end
90
- @framepic.div_css = CSS.new() if ! @framepic.div_css
91
- case pos
92
- when 'left', 'right'
93
- @framepic.div_css[:float] = pos
94
- @framepic.div_css[:padding] = '10px'
95
- when 'top', 'bottom'
96
- @framepic.div_css[:float] = 'none'
97
- else
98
- @log.warn("Undefined option #{pos} in #{@title}") if @log.warn?
99
- end
100
- end #pos=
101
- #Set picture width
102
- def picwidth= (width )
103
- if ! @framepic
104
- @log.warn("Set width for undefined picture in #{@title}") if @log.warn?
105
- return false
106
- end
107
- @framepic.img_css = CSS.new() if ! @framepic.img_css
108
- @framepic.img_css[:width] = width
109
- end
110
- def framepicratio=( value )
111
- vals = value.strip.split(/[,;]/)
112
- vals.each{|val|
113
- case val
114
- when /\d*\.\d+/
115
- else
116
- @log.warn("Wrong ratio #{val} given with #{value}") if @log.warn?
117
- end
118
- }
119
- @framepicratio = "\\framepicratio{#{vals[0]}}{#{vals[1]}}\n"
120
- end
121
- def img_class=( value )
122
- if ! @framepic
123
- @log.warn("Set width for undefined picture in #{@title}") if @log.warn?
124
- return false
125
- end
126
- @framepic.img_class = value
127
- end
128
- #Set CSS-class for the div
129
- def html_class=( value )
130
- if ! @framepic
131
- @log.warn("Set #{key} for undefined picture in #{@title}") if @log.warn?
132
- return false
133
- end
134
- @framepic.div_class = value
135
- end
136
- def fragile=( value );
137
- self[:options] << 'fragile'
138
- end
139
- #Alignment top/bottom of page
140
- def alignment= (value)
141
- case value
142
- when 't', 'b'
143
- self[:options] << value
144
- else
145
- @log.warn("Undefined alignment #{value} (allowed: t/b)" ) if @log.warn?
146
- end
147
- end
148
- #If there is a pic, move the content of the frame to the content of the pic.
149
- def rearrange_content()
150
- newcontent = []
151
- @content.each{|e|
152
- if e.is_a?(:framepic) or e.is_a?(:frametitle)
153
- newcontent << e
154
- else
155
- @framepic << e
156
- end
157
- }
158
- return newcontent
159
- end
160
- def to_doc(target, options = {})
161
- if self.key and @attr[:id].content.empty?
162
- @attr[:id] << self.key
163
- end
164
- super
165
- end
166
- #Store old logic of to_latex
167
- alias :old_to_latex :to_latex
168
- #Move content into TeX-Macro.
169
- #Not nice, but so we can use << in frame and don't need an additional step.
170
- def to_latex(options = {})
171
- @content = rearrange_content() if @framepic
172
- @content.unshift(@framepicratio) if @framepicratio
173
- old_to_latex(options)
174
- end
175
- #~ def to_html(options = {})
176
- #~ if self.key and @attr[:id].content.empty?
177
- #~ @attr[:id] << self.key
178
- #~ end
179
- #~ super
180
- #~ end
181
- end #Frame
182
-
183
- #Class to create
184
- #-Presentation (Using beamer-class for LaTeX)
185
- #
186
- class Presentation
187
- #Little elp for me.
188
- #Avoid the automatic generation of TeX-Entries
189
- EMPTYBIBTEX = "\n%BibTeX-Entry>\n%BibTeX-Entry<\n"
190
- #
191
- #Defaults settings for Presentation, used in Presentation#save_beamer.
192
- #
193
- DEF_SETTINGS = {
194
- #Values for Document
195
- :template => :emptyTemplate,
196
- :splitscreen => nil,
197
- :language => ['ngerman'], #Default
198
- :author => nil,
199
- :defaultoptions => {}, #Defaults for each frame
200
- :wikiframe => WikiFrame, #Wiki-type
201
- #~ :shortauthor => nil,
202
- :institute => nil,
203
- :date => nil,
204
- :shorttitle => nil,
205
- :subtitle => nil, #used for beamer
206
- :logo => nil,
207
- :maketitle => nil,
208
- :maketoc => nil,
209
- :keywords => nil, #copied to @keywords
210
- :description=> nil, #copied to @description
211
- :id => nil, #copied to @description
212
- :altlang => nil, #copied to @description
213
- #Outputs (true, nil)
214
- :presentation => false,
215
- :beamer_article => false,
216
- :beamer_notes => false, #one value of BEAMER_NOTES
217
- :beamer_include=> false,
218
- :html => false,#valid parameter: true, :overview_with_singlepages, :with_detailpic :with_detailpic_and_text
219
- :pdftk => false,#Additional pdftk-process
220
- #Options for TeX
221
- :runtex => false,
222
- :fullpage => false,
223
- #Picture name under picture
224
- :picwithname => false,
225
- :classoption => [],
226
- :log => Log4r::Logger.new( 'presentation', Log4r::WARN ),
227
- #Valid keys - suppress the "Unknown key"-Warning for additional keys.
228
- :valid_keys => []
229
- }
230
- DEF_SETTINGS[:log].outputters = Log4r::StdoutOutputter.new('Presentation')
231
-
232
- #show - Include notes in the output file. Normal slides are also included.
233
- #only - Include only the notes in the output file and suppresses all frames.
234
- #onlyslideswithnotes - This includes all notes and those slides that contain a \note.
235
- BEAMER_NOTES = [
236
- 'show', #Normal presentation, including notes pages
237
- 'only', #only notes pages
238
- 'onlyslideswithnotes', #Normal page and notes page, only pages with comments
239
- ]
240
- #Option splitscreen/Taking Advantage of Multiple Screens
241
- BEAMER_SPLIT_POSITIONS = [
242
- 'right',
243
- 'left',
244
- 'top',
245
- 'bottom',
246
- ]
247
- #Define a presentation/picture galery
248
- def initialize( title, settings = {})
249
- @title = title
250
- @settings = DEF_SETTINGS.merge(settings)
251
-
252
- @log = @settings[:log]
253
- @log.info("Build Presentation #{title}") if @log.info?
254
-
255
- @head = []
256
- @attachment = []
257
- @content = []
258
- @frames = [] #u.a. f�r Navigation
259
- @bibtex = nil
260
- @description = @settings[:description]
261
- @keywords = @settings[:keywords]
262
- #~ log.level = Log4r::ERROR
263
- #~ log.level = Log4r::DEBUG
264
- #~ log.outputters = Log4r::StdoutOutputter.new('test_document_toc')
265
-
266
- if ! [WikiFrame, Creole].include?(@settings[:wikiframe])
267
- @log.error("Wrong type for wikiframe (#{@settings[:wikiframe]})") if @log.error?
268
- end
269
-
270
- end
271
- attr_accessor :title
272
- #Some global settings.
273
- #Can be set via macros in WikiPresentation.
274
- #Allowed values, see method check_settings
275
- attr_reader :settings
276
- #Attachments.
277
- #Contains "big" pictures
278
- attr_accessor :attachment
279
- #Additional heading information.
280
- #Is a list.
281
- attr_reader :head
282
- #Definition for a bibtex-entry
283
- attr_accessor :bibtex
284
- attr_accessor :keywords
285
- attr_accessor :description
286
- #Logger for the presentation
287
- attr_reader :log
288
-
289
- #Allowed keys and methods to be called.
290
- #:main is a dummy method
291
- KEYS = {
292
- 'section' => :main,
293
- 'sectionshort' => :main,
294
- 'subsection' => :main,
295
- 'subsectionshort'=> :main,
296
- 'title' => :main,
297
- 'wiki' => :main,
298
- 'notes' => :main,
299
- 'restrict' => :main, #Allowed values: :latex, :html
300
- 'thumb' => :thumb=,
301
- 'pic' => :pic=,
302
- 'pic*' => :picfull=,
303
- 'PIC' => :piconly=,
304
- 'picwidth' => :picwidth=,
305
- 'pos' => :pos=,
306
- 'alignment' => :alignment=,
307
- 'fragile' => :fragile=,
308
- 'key' => :key=,
309
- 'html_class'=> :html_class=,
310
- 'img_class' => :img_class=,
311
- 'framepicratio' => :framepicratio=,
312
- }
313
- #Add contents to Presentation.
314
- #fixme2yaml
315
- def <<(input)
316
- data = input
317
- data = YAML.load(input) if input.is_a?( String ) or input.is_a?( File )
318
- data = [data] if input.is_a?( Hash )
319
- raise "Wrong datatype in Presentation << (#{input.class}, converted to #{data.class}" if ! data.is_a?(Array)
320
-
321
- data.each{|properties|
322
- props = @settings[:defaultoptions].merge(properties)
323
- if props['section']
324
- @content << element(:section, {}, props['section']).cr
325
- if props['sectionshort']
326
- @content.last[:short] << props['sectionshort']
327
- end
328
- end
329
- if props['subsection']
330
- @content << element(:subsection, {}, props['subsection']).cr
331
- if props['subsectionshort']
332
- @content.last[:short] << props['subsectionshort']
333
- end
334
- end
335
-
336
- #Add in frames
337
- @content << frame = element(:frame, :log => @log).CR
338
- @frames << frame
339
- frame.presentation = self
340
- frame.settings = @settings
341
- frame.restrict_to(props['restrict']) if props['restrict']
342
- if props['title']
343
- frame.title = props['title']
344
- frame << element(:frametitle, {}, frame.title ).cr
345
- else
346
- @log.error("No title available(#{props.inspect})") if @log.error?
347
- end
348
- #Call methods for settings.
349
- #The sequence is important (thumb, pos... requires a pic.
350
- [ "pic", "pic*", "PIC", "thumb",
351
- "pos", "picwidth",
352
- "fragile", "alignment",
353
- "key",
354
- "html_class", "img_class",
355
- "framepicratio"
356
- ].each{|key|
357
- if props[key]
358
- frame.send( KEYS[key], props[key] )
359
- end
360
- }
361
- frame << @settings[:wikiframe].new(:content => props['wiki']) if props['wiki']
362
- if props['notes']
363
- frame << element(:note,{},
364
- @settings[:wikiframe].new(:content => props['notes'])
365
- )
366
- end
367
-
368
- #Check for unknown parameters (Typo?)
369
- (props.keys - KEYS.keys - @settings[:valid_keys]).each{|key|
370
- @log.warn("Unknown key '#{key}' in #{props.inspect}") if @log.warn?
371
- }
372
- @content << element(:newline, {:clear=>'all'}).restrict_to(:html).cr
373
- }
374
- return self
375
- end
376
-
377
- #The result are different files:
378
- #-The presentation content (beamer_include)
379
- #-The article version
380
- #-the beamer version
381
- #-the notes version
382
- #-the HTML version
383
- #The flags are used to write "true" to the documentsettings.
384
- #-runtex (:pdflualatex, :latex, :pdflatex, :xelatex)
385
- #-fullpage
386
- def save( filename, *args )
387
- settings = DEF_SETTINGS.dup.update(@settings)
388
- args.flatten.each{|arg|
389
- if arg.is_a?(Hash) #max. einmal, letzte Element
390
- settings.update(arg)
391
- else
392
- settings[arg] = true
393
- end
394
- }
395
-
396
- #check settings
397
- settings[:beamer_include] = ( settings[:presentation] or settings[:beamer_article] or settings[:beamer_notes] )
398
- if ! (settings.keys - DEF_SETTINGS.keys).empty?
399
- puts "Undefined setting #{(settings.keys - DEF_SETTINGS.keys ).inspect}"
400
- end
401
- @content.each{|frame|
402
- next if ! frame.is_a?(Frame)
403
- frame.settings = settings
404
- frame.framepic.picwithname = settings[:picwithname] if settings[:picwithname] and frame.framepic
405
- }
406
-
407
- #fixme: Parameter zum setzen.
408
- overwrite = true
409
-
410
- dir = File.dirname(filename) + '/'
411
- filename_base = File.basename(filename, '.tex')
412
-
413
- filename_html = "#{filename_base}.html"
414
- filename_tex = "#{filename_base}.tex"
415
- filename_pres = "#{filename_base}_screen.tex"
416
- filename_artcl = "#{filename_base}_print.tex"
417
- filename_note = "#{filename_base}_notes.tex"
418
- filename_att = "#{filename_base}_attachment.tex"
419
-
420
- settings[:filename_att] = filename_att
421
- document = build_document(settings)
422
- attachment = build_attachment_doc(settings) if @attachment.size > 0
423
-
424
- presentation = nil
425
- presentation = build_presentation(filename, settings) if settings[:presentation]
426
-
427
- article = nil
428
- article = build_article(filename, settings) if settings[:beamer_article]
429
-
430
- notes = nil
431
- notes = build_notes(filename, settings) if settings[:beamer_notes]
432
-
433
- #Save HTML
434
- #~ Parameter zum einstellen:
435
- #~ �bersicht mit
436
- #~ -text
437
- #~ -bild
438
- #~ -link zu detail
439
- #~ detail mit
440
- #~ -bild
441
- #~ -text
442
- #~ -Aufbau Filename
443
- case settings[:html]
444
- #Overview contains the title and a link to the detail page
445
- when :overview_with_singlepages
446
- html_overview = build_html_overview_with_singlepages(dir, filename_html, settings)
447
- html_overview.save( dir + filename_html, :overwrite => overwrite )
448
- #Overview containes picture-thumb and text.
449
- #The thumb is linked to a html with picture
450
- when :with_detailpic, :with_detailpic_and_text
451
- #Build all picture-HTMLS, named with numbers
452
- build_html_with_detailpic(filename_html, settings)
453
- document.save( dir + filename_html, :overwrite => overwrite )
454
- when true
455
- document.save( dir + filename_html, :overwrite => overwrite )
456
- when false #No action
457
- else
458
- @log.error("Unknown feature for :html (#{@option[:html]}, #{__FILE__}##{__LINE__})") if @log.error?
459
- end
460
-
461
- #Save TeX/Beamer-class
462
- changed = false
463
- changed = true if document.save( dir + filename_tex, :overwrite => overwrite ) if settings[:beamer_include]
464
- changed = true if presentation.save( dir + filename_pres, :overwrite => overwrite ) if presentation
465
- changed = true if article.save( dir + filename_artcl, :overwrite => overwrite ) if article
466
- changed = true if notes.save( dir + filename_note, :overwrite => overwrite ) if notes
467
- changed = true if attachment.save( dir + filename_att, :overwrite => overwrite ) if attachment
468
-
469
- if settings[:runtex]
470
- if changed
471
- Document.runtex( filename_pres, settings[:runtex] ) if presentation
472
- Document.runtex( filename_artcl, settings[:runtex] ) if article
473
- Document.runtex( filename_note, settings[:runtex] ) if notes
474
- else
475
- @log.info('No TeX-call (no change in documents)') if @log.info?
476
- end
477
- end #runtex
478
- if pdftk = settings[:pdftk]
479
- pdftk_base = filename_pres.gsub(/\.tex/, '')
480
- call_pdftk( "#{pdftk_base}.pdf", "#{pdftk_base}2.pdf", settings[:pdftk])
481
- end
482
- end #save_beamer
483
- #
484
- #Build the content of the presentation.
485
- #Will be included to the different main documents.
486
- def build_document(settings)
487
-
488
- document = Document.new(
489
- :template => :beamer,
490
- :title => title,
491
- :shorttitle => settings[:shorttitle],
492
- :log => @log
493
- )
494
- document.description = @description
495
- document.keywords = @keywords
496
- if @bibtex
497
- document.head << EMPTYBIBTEX.sub(/>\n/, ">\n%#{@bibtex.gsub(/\n/, "\n%")}\n")
498
- else #Avoid the automatic generation of BibTeX-Entries
499
- document.head << element(:span,{},EMPTYBIBTEX).restrict_to(:latex)
500
- end
501
-
502
- if settings[:author].respond_to?(:join)
503
- document.author = settings[:author].join(', ')
504
- elsif settings[:author]
505
- document.author = settings[:author]
506
- end
507
- document.head<< element(:institute, {}, settings[:institute]) if settings[:institute]
508
- document.date = settings[:date] if settings[:date]
509
- #~ document.logo = settings[:logo] if settings[:logo]
510
- [ :id, :altlang ].each{|setting|
511
- document.meta( setting, settings[setting]) if settings[setting]
512
- }
513
-
514
- document.head << element(:subtitle, {}, settings[:subtitle]).restrict_to(:latex) if settings[:subtitle]
515
-
516
- document.body << element(:maketitle).cr if settings[:maketitle]
517
- case settings[:maketoc]
518
- when true
519
- document.body << element(:tableofcontents).cr
520
- when :article
521
- document.body << [
522
- '\only<article>{',
523
- element(:tableofcontents),
524
- "}\n"
525
- ]
526
- end #settings[:maketoc]
527
- document.body << @content
528
-
529
- #Collection of attachments
530
- if @attachment.size > 0
531
- document.body << element(:span,{},[ '\only<presentation>{',
532
- %q|
533
- \appendix
534
- |.gsub(/^\t*/, ''),
535
- element(:input,{}, settings[:filename_att] ).cr,
536
- '}%Big Pictures' ]
537
- ).restrict_to(:latex)
538
- end
539
- return document
540
- end #build_document
541
- #
542
- #Build the include to be attached at the end.
543
- #This document contains the full-page pictures.
544
- def build_attachment_doc(settings)
545
- attachment = Document.new(:template => :include, :log => @log)
546
- attachment.head << EMPTYBIBTEX
547
- attachment.body << %q|
548
- %
549
- % Big Pictures / Plainframes
550
- \section{Enlarged Pictures}%\frame{\sectionpage}
551
-
552
- \usebackgroundtemplate{}
553
- |.gsub(/^\t*/, '')
554
- @attachment.each{|picname|
555
- attachment.body << <<-FRAME
556
- \\frame<handout:0>[plain]{%\\frametitle{#{picname}}
557
- \\hypertarget{pic:#{picname}}{}
558
- \\includegraphicsJustified{#{picname}}
559
- }
560
- FRAME
561
- }
562
- return attachment
563
- end #build_attachment_doc
564
- #
565
- #Build the main-tex-document for presentation.
566
- def build_presentation(filename, settings)
567
- presentation = Document.new( :template => @settings[:template], :log => @log )
568
- if settings[:language].respond_to?(:join)
569
- presentation.language = settings[:language].join(',')
570
- elsif !settings[:language]
571
- presentation.language = 'ngerman'
572
- else
573
- presentation.language = settings[:language]
574
- end
575
- presentation.add_option(:picwithname) if settings[:picwithname]
576
- presentation.add_option( settings[:classoption] ) if settings[:classoption]
577
-
578
- #~ @classoptions.each{|opt| presentation.add_option( opt ) }
579
- presentation.head << EMPTYBIBTEX
580
-
581
- if settings[:fullpage]
582
- presentation.head << "\\hypersetup{\n"
583
- presentation.head << "\tpdfpagemode=FullScreen,\n"
584
- presentation.head << "}\n"
585
- end
586
- presentation.head << @head
587
-
588
- presentation.head << element(:input, {}, filename).cr
589
- presentation
590
- end #def build_presentation
591
- #
592
- #Build the main-tex-document for article.
593
- def build_article(filename, settings)
594
- if @settings[:template].to_s =~ /festo/i
595
- article = Document.new( :template => :beamerFestoarticle, :log => @log )
596
- else
597
- article = Document.new( :template => :beamerarticle, :log => @log )
598
- end
599
- article.head << EMPTYBIBTEX
600
- article.head << @head
601
-
602
- article.head << "\\input{#{filename}}\n"
603
- article.language = settings[:language].join(',')
604
- article.add_option(:picwithname) if settings[:picwithname]
605
- article.add_option( settings[:classoption] ) if settings[:classoption]
606
- return article
607
- end #build_article
608
- #
609
- #Build the main-tex-document for notes.
610
- #
611
- #The following settings are possible:
612
- #- show - Include notes in the output file. Normal slides are also included.
613
- #- only - Include only the notes in the output file and suppresses all frames.
614
- #- onlyslideswithnotes - This includes all notes and those slides that contain a \note.
615
- def build_notes(filename, settings)
616
- settings[:beamer_notes] = 'only' if settings[:beamer_notes] == true
617
- if ! BEAMER_NOTES.include?(settings[:beamer_notes])
618
- @log.error("Beamer_Notes settings: unknown #{settings[:beamer_notes].inspect} - use #{BEAMER_NOTES.inspect}") if @log.error?
619
- end
620
-
621
- #~ notes = Document.new( :template => DocumentTemplate[settings[:template]].sub(/<<classoptions>>/, "notes=#{settings[:beamer_notes]},<<classoptions>>") )
622
- notes = Document.new( :template => DocumentTemplate[settings[:template]], :log => @log )
623
- notes.add_option("notes=#{settings[:beamer_notes]}")
624
- notes.head << EMPTYBIBTEX
625
- notes.head << @head
626
-
627
- if settings[:splitscreen]
628
- if ! BEAMER_SPLIT_POSITIONS.include?(settings[:splitscreen])
629
- @log.error("Undefined option for splitscreen, use 'right'. (allowed: #{BEAMER_SPLIT_POSITIONS.inspect})") if @log.error?
630
- settings[:splitscreen] = 'right'
631
- end
632
- if settings[:beamer_notes] != 'show'
633
- @log.info("Use splitscreen without all frames") if @log.info?
634
- end
635
- notes.head << <<SPLITSCREEN
636
- \\usepackage{pgfpages}
637
- \\setbeameroption{show notes on second screen=#{settings[:splitscreen]}}
638
- SPLITSCREEN
639
- end
640
-
641
- notes.head << "\\input{#{filename}}\n"
642
- notes.language = settings[:language].join(',')
643
- notes.add_option(:picwithname) if settings[:picwithname]
644
- notes.add_option( settings[:classoption] ) if settings[:classoption]
645
- return notes
646
- end #build_notes
647
- #Overview contains the title and a link to the detail page
648
- def build_html_overview_with_singlepages(dir, filename_html, settings)
649
- #Links needed for navigation
650
- @frames.each_with_index{|frame,count|
651
- if frame.key
652
- frame.html_link = filename_html.sub(/\.htm/, "_#{frame.key}.htm" )
653
- else
654
- frame.html_link = filename_html.sub(/\.htm/, "_#{count}.htm" )
655
- end
656
- }
657
- #Build single files.
658
- Knut::Picture.usethumbs = false
659
- @frames.each_with_index{|frame,count|
660
- singleframe = Document.new()
661
- singleframe.title = frame.title
662
- singleframe.body << html_navigation( count, filename_html )
663
- singleframe.body << frame
664
- singleframe.body << html_navigation( count, filename_html )
665
- singleframe.save( dir + frame.html_link, :overwrite => true )
666
- }
667
- Knut::Picture.usethumbs = true
668
- #Build main-File
669
- html_overview = Document.new( :log => @log)
670
- html_overview.title = title
671
- html_overview.description = @description
672
- html_overview.keywords = @keywords
673
- [ :shorttitle, :id, :altlang ].each{|setting|
674
- html_overview.meta( setting, settings[setting]) if settings[setting]
675
- }
676
- @content.each{|frame|
677
- if frame.is_a?(Frame)
678
- html_overview.body << element(:p,{},[
679
- element(:Rightarrow),
680
- preview = element(:a,{:href=>frame.html_link}, frame.title)
681
- ]).cr
682
- #Add thumb
683
- if frame.thumb
684
- preview << element(:br )
685
- preview << element(:img,{ :src =>frame.thumb} )
686
- end
687
- else
688
- html_overview.body << frame
689
- end
690
- }
691
- return html_overview
692
- end #build_html_overview_with_singlepages
693
- #Build all picture-HTMLS, named with numbers
694
- def build_html_with_detailpic(filename_html, settings)
695
- @frames.each_with_index{|frame,count|
696
- filename = frame.title
697
- if frame.framepic
698
- filename = File.basename(frame.framepic.picture.filename, '.jpg')
699
- #~ filename.gsub!(/\.(jpg|png)/i, '')
700
- frame.framepic.picture.href = "./#{filename}.html"
701
- frame.framepic.picture.title = frame.title
702
- end
703
- frame.html_link = "#{filename}.html"
704
- }
705
- #Save all HTML for Pictures
706
- @frames.each_with_index{|frame,count|
707
- next if ! frame.framepic
708
- post = []
709
- case settings[:html]
710
- # only navigation
711
- when :with_detailpic
712
- post << html_navigation( count, filename_html )
713
- # complete content added (Preview + Text
714
- when :with_detailpic_and_text
715
- frame.content.each{|c|
716
- #0=Titel
717
- #1=framepic
718
- #2=Description in Array
719
- case c
720
- when Framepic, element(:frametitle).class
721
- when Array, WikiFrame, Creole
722
- post << c
723
- else
724
- #~ puts #{__FILE__}##{__LINE__} c.class, c.inspect
725
- end
726
- }
727
- post << html_navigation( count, filename_html )
728
- end
729
-
730
- frame.framepic.picture.html(
731
- :filename => frame.html_link,
732
- :id => settings[:id] ? "#{File.basename(frame.html_link, 'html')}#{settings[:id]}" : nil,
733
- :altlang => settings[:altlang] ? "#{File.basename(frame.html_link, 'html')}#{settings[:altlang]}" : nil,
734
- :pre => html_navigation( count, filename_html ),
735
- :post => post
736
- )
737
- }
738
- end #build_html_with_detailpic
739
- alias :save_beamer :save
740
- #
741
- def call_pdftk(source, output, pdftksettings)
742
- (pdftksettings.keys - [:owner_pw, :user_pw, :allow] ).each{|opt|
743
- puts "PDFTK: Undefined option #{opt.inspect}"
744
- }
745
- pdftkcmd = ["pdftk #{source}"]
746
- #~ pdftk << "output #{pdftk_base}_save.pdf"
747
- pdftkcmd << "output #{output}"
748
- pdftkcmd << "owner_pw #{pdftksettings[:owner_pw]}" if pdftksettings[:owner_pw]
749
- pdftkcmd << "user_pw #{pdftksettings[:user_pw]}" if pdftksettings[:user_pw]
750
- if pdftksettings[:allow]
751
- ([pdftksettings[:allow]].flatten - [
752
- 'Printing', 'DegradedPrinting',
753
- 'ModifyContents', # Also allows Assembly
754
- 'Assembly',
755
- 'CopyContents', #Also allows ScreenReaders
756
- 'ScreenReaders',
757
- 'ModifyAnnotations', #Also allows FillIn
758
- 'FillIn',
759
- 'AllFeatures',
760
- ]).each{|opt|
761
- puts "PDFTK/allow: Undefined option #{opt.inspect}"
762
- }
763
- pdftkcmd << "allow"
764
- pdftkcmd << pdftksettings[:allow]
765
- end
766
- pdftkcmd << "dont_ask"
767
- pdftkcmd << "verbose"
768
- puts pdftkcmd.join(" ")
769
- system(pdftkcmd.join(" "))
770
- end #call_pdftk
771
-
772
- #Return a HTML-element with links to pre- and successor
773
- # <= ^ =>
774
- #
775
- def html_navigation( count, filename_html )
776
- nav = element(:div, { :style => CSS.new( :text_align => 'center', :clear=>'both' )})
777
- if @frames[count - 1] and count > 0
778
- nav << element(:a, { :href=> @frames[count - 1].html_link }, element(:Leftarrow)).cr
779
- end
780
- nav << element(:a, { :href=> filename_html }, element(:Uparrow)).cr
781
- if @frames[count + 1]
782
- nav << element(:a, { :href=> @frames[count + 1].html_link }, element(:Rightarrow)).cr
783
- end
784
- return nav
785
- end
786
- #Return all used pics.
787
- #Can be used to detect new/obsolete pictures in a directory.
788
- def used_pics()
789
- pics = []
790
- @frames.each{|frame|
791
- #~ if frame.framepic
792
- #~ pics << frame.framepic.picture.filename
793
- #~ end
794
- if frame.picname
795
- pics << frame.picname
796
- end
797
- }
798
- return pics
799
- end
800
- end
801
-
802
-
803
- #
804
- #Read pictures and build yaml-Template.
805
- def dir2yaml( pattern, defaults = ''
806
- #~ <<-DEFAULTS
807
- #~ picwidth: 100%
808
- #~ option: left
809
- #~ list:
810
- #~ # - Punkt 1
811
- #~ DEFAULTS
812
- )
813
- defaults.gsub!(/^\s*/, ' ')
814
- files2yaml(Dir[pattern])
815
- end #dir2yaml
816
- def files2yaml( files, defaults = '')
817
- yaml = []
818
- files.each{|f|
819
- yaml << '-'
820
- yaml << "\tpic: #{f}"
821
- yaml << "\ttitle: #{f.gsub(/_|\.png|\.jpg/, ' ')}" if /title:/ !~ defaults
822
- yaml << "\twiki: |\n\t\t#~ content" if /wiki:/ !~ defaults
823
- yaml << defaults
824
-
825
- }
826
- return yaml.join("\n")
827
- end
828
-
829
- #Get something and build the data.
830
- #input can be:
831
- #-A file -> read it
832
- #-A string -> call YAML
833
- #-Else: I expect a valid array/hash
834
- def prepare_data( input )
835
- data = input
836
- lineno = 0
837
- if input.is_a?(File)
838
- #This is normally DATA, so we start with an offset.
839
- lineno = input.lineno
840
- input = input.readlines.to_s
841
- end
842
- if input.is_a?(String)
843
- begin
844
- data = YAML.load( input.gsub(/\t/, ' ') )
845
- rescue ArgumentError
846
- if /syntax error on line (.*), col/ =~ $!.to_s
847
- lineno += $1.to_i
848
- raise "Error in YAML-Input (Line #{lineno}?)"
849
- end
850
- raise "Error in YAML-Input: #{$!}"
851
- raise "Error in YAML-Input: #{$!}\n#{input}"
852
- end
853
- end
854
- return data
855
- end
856
- #Takes the yaml-data and make some corrections on it.
857
- #
858
- #Example:
859
- #Add a thumb on each value
860
- # puts yaml2yaml(DATA, Proc.new{|y|
861
- # y['thumb'] = "thumb_#{y['pic']}"
862
- # y
863
- # }).to_yaml
864
- #Problem: Umlaute are converted
865
- def yaml2yaml( input, corrections )
866
- data = prepare_data( input ) #Array of hashes
867
- puts "yaml2yaml: No Proc-element given" if ! corrections.is_a?(Proc)
868
-
869
- newdata = []
870
- data.each{|props|
871
- if ! props.is_a?(Hash)
872
- raise "yaml2pres: props is no Hash (#{props.inspect})"
873
- next
874
- end
875
-
876
- newdata << corrections.call( props )
877
- }
878
- newdata
879
- end
880
-
881
-
882
-
883
-
884
- if __FILE__ == $0
885
- <<TEMPLATE
886
- require 'C:/usr/Script/MyScripts' if File.exist?('C:/usr/Script/MyScripts.rb')
887
- require 'yaml2presentation'
888
-
889
- #~ Dir['*.JPG'].each{|f| Knut::Picture.new(f).mk_thumb }
890
- #~ Dir['*.jpg'].each{|f| Knut::Picture.new(f).mk_thumb }
891
- TEMPLATE
892
-
893
- pres = Presentation.new( 'Pr�sentationen mit yaml2presentation.rb',
894
- :template => :beamerthemetree
895
- )
896
- pres.settings[:shorttitle] = 'yaml2presentation.rb'
897
- pres.settings[:author] = 'Knut Lickert'
898
- pres.settings[:date] = Date.today
899
- #~ pres.settings[:language] << 'Sprache'
900
- #~ pres.settings[:subtitle] = ''
901
- pres.head << <<HEADER
902
- \\AtBeginSection[] % Do nothing for \\section*
903
- {
904
- \\frame<beamer>{\\tableofcontents[current]}
905
- }
906
-
907
- \\AtBeginSubsection[]
908
- {
909
- \\frame<beamer>{\\tableofcontents[currentsection,currentsubsection]}
910
- }
911
- HEADER
912
-
913
- pres << DATA.readlines.to_s.gsub(/\t/, ' ')
914
- puts pres.build_presentation('XX',{}).to_latex(:log=>pres.log)
915
-
916
- pres.save('doc_yaml2presentation',
917
- #~ :presentation => true,
918
- #~ :pdftk => {
919
- #~ :owner_pw => 'pw',
920
- #~ :user_pw => 'pw2',
921
- #~ :allow => [
922
- #~ 'CopyContents',
923
- #~ 'Printing',
924
- #~ ]
925
- #~ },
926
- #~ :beamer_article => true,
927
- :beamer_notes => 'show', #/ 'only' / 'onlyslideswithnotes'
928
- #~ :splitscreen => 'bottom'
929
- #~ :splitscreen => 'right'
930
- #~ :html => true, #:overview_with_singlepages :with_detailpic
931
- :runtex => true, #:fullpage => true,
932
- #~ :picwithname => true,
933
- :maketitle => true,
934
- :maketoc => true
935
- )
936
-
937
- end
938
-
939
- #~ -
940
- #~ section: �berschrift
941
- #~ subsection: �berschrift 2
942
- #~ title: Titel
943
- #~ key: key
944
- #~ pic: test.jpg
945
- #~ pic*: test.jpg
946
- #~ picwidth: 12px
947
- #~ thumb: thumb.png
948
- #~ fragile: true
949
- #~ alignment: t
950
- #~ pos: left
951
- #~ wiki: |
952
- #~ Vorher
953
- #~ *punkt 1
954
- #~ *Punkt 2
955
- #~ Nachher
956
- #~ notes: |
957
- #~ Notizen
958
-
959
- __END__
960
- -
961
- section: Grunds�tzliche Idee
962
- title: Einleitung
963
- wiki: |
964
- Yaml-Syntax zur Erstellung
965
- *Beamer-Pr�sentation (LaTeX) (Ersatz mkpres.rb)
966
- *Webgalerie (HTML) (Ersatz web-gallery.rb)
967
- Darstellung eines Frames wahlweise:
968
- *Links ein Bild, rechts kurze Beschreibung
969
- *Rechts ein Bild, links kurze Beschreibung
970
- *Nur Text
971
- -
972
- section: Features
973
- subsection: HTML-Galerie
974
- title: HTML-Galerie
975
- wiki: |
976
- *Thumb/Kurzfassung
977
- *Langfassung auf Detailseite
978
- -
979
- subsection: TeX/Beamer.sty
980
- title: TeX/Beamer
981
- #~ pic: c:/usr/wwwHostEurope/Stummfilm/source/Tonfilm_Kitsch.jpg
982
- pos: right
983
- wiki: |
984
- *Text in Wiki-Notation
985
- *Link auf Detailbild am Ende
986
- -
987
- section: Parameter
988
- subsection: Gliederung
989
- title: Gliederung
990
- wiki: |
991
- Parameter f�r Gliederungen:
992
- *section
993
- **sectionshort
994
- *subsection
995
- **subsectionshort
996
- Jeweils in Frames integriert
997
- -
998
- subsection: Optionen zum Frame
999
- title: Optionen zum Frame
1000
- fragile: true
1001
- wiki: |
1002
- Bsp:
1003
- title: Titel
1004
- key: key
1005
- *title: Titel des Frames
1006
- *key: Optional, f�r label/Link genutzt
1007
- -
1008
- subsection: Optionen zum Text
1009
- title: Optionen zum Text
1010
- fragile: true
1011
- wiki: |
1012
- Bsp:
1013
- fragile: true
1014
- wiki: |
1015
- Vorher
1016
- *punkt 1
1017
- *Punkt 2
1018
- Nachher
1019
- notes: |
1020
- Notizen
1021
-
1022
- *notes: Anmerkungen zum Frame (LaTeX)
1023
- *fragile: LaTeX, falls Wiki verbatim-Text enth�lt.
1024
- -
1025
- subsection: Optionen von Bildern
1026
- title: Bild einf�gen
1027
- fragile: true
1028
- wiki: |
1029
- Bsp:
1030
- pic: test.jpg
1031
- pic*: test.jpg
1032
- PIC: test.jpg
1033
- thumb: thumb.png
1034
- *pic: Bildadresse
1035
- *pic*: Bild mit Link zu Bild in Fullpage am Dokumentende
1036
- *PIC: Bild in Fullpage
1037
- *thumb: Vorlage f�r ''pic*'' (sinnvoll f�r HTML)
1038
- -
1039
- title: Bildoptionen
1040
- fragile: true
1041
- wiki: |
1042
- Bsp:
1043
- href: http://...
1044
- picwidth: 12px
1045
- alignment: t
1046
- html_class: xx
1047
- img_class: xx
1048
- *href: Link auf externe Adresse
1049
- *alt (HTML)
1050
- *html\_class (HTML)
1051
- *img\_class (HTML)
1052
-
1053
- -
1054
- title: Bildposition
1055
- fragile: true
1056
- wiki: |
1057
- Bsp:
1058
- pos: left
1059
- Bildposition relativ zum Text
1060
- *'''left'''
1061
- *right
1062
- *top
1063
- *bottom
1064
- Anordnung des Bildes. F�r TeX nur links.
1065
- -
1066
- title: Bild/Textverh�ltnis
1067
- fragile: true
1068
- wiki: |
1069
- Nur f�r LaTeX.
1070
-
1071
- Bsp:
1072
- framepicratio: 0.25;0.5
1073
- Bildgr��e und Textgr��e im Verh�ltnis zur Textbreite.
1074
- -
1075
- subsection: Weitere Optionen
1076
- title: Option Restrict
1077
- wiki: |
1078
- Werte f�r restrict
1079
- *:latex
1080
- *:html
1081
- Ausgabe auf ein Format begrenzen.
1082
- -
1083
- title: Option pdftk
1084
- wiki: |
1085
- Mit der Option ''pdftk'' wird mittels pdftk eine zweite
1086
- Screen-Version erzeugt.
1087
-
1088
- Optionen:
1089
- *owner\_pw
1090
- *user\_pw
1091
- *allow: Ausnahmen f�r Verbote, wenn Passwort gesetzt.