docgenerator 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. data/build_test_and_doc.rb +505 -0
  2. data/examples/creole_example.rb +82 -0
  3. data/examples/creole_example_footnote.rb +67 -0
  4. data/examples/creole_example_placeholder.rb +77 -0
  5. data/examples/creole_example_rail.rb +154 -0
  6. data/examples/creole_example_rubycode.rb +144 -0
  7. data/examples/creole_example_struktex.rb +169 -0
  8. data/examples/docgenerator_example.rb +1 -1
  9. data/examples/docgenerator_example_footnote.rb +1 -0
  10. data/examples/docgenerator_example_list.rb +3 -0
  11. data/examples/docgenerator_example_restrictions.rb +1 -1
  12. data/examples/docgenerator_example_tabular.rb +1 -1
  13. data/examples/docgenerator_example_tripfalls.rb +2 -2
  14. data/examples/results/readme +2 -1
  15. data/examples/wiki2docgenerator_example.rb +61 -32
  16. data/lib/creole/creole2doc.rb +57 -58
  17. data/lib/creole/creole_characters.rb +56 -0
  18. data/lib/creole/creole_inclusion_and_plugins.rb +59 -284
  19. data/lib/creole/creole_inclusions.rb +142 -0
  20. data/lib/creole/creole_placeholder.rb +57 -23
  21. data/lib/creole/creole_plugins.rb +198 -0
  22. data/lib/creole/creole_tabular.rb +16 -8
  23. data/lib/creole/plugins/rail.rb +182 -0
  24. data/lib/creole/plugins/rubycode4creole.rb +136 -0
  25. data/lib/creole/plugins/struktex.rb +59 -0
  26. data/lib/creole/plugins/todonotes.rb +70 -0
  27. data/lib/docgenerator.rb +161 -71
  28. data/lib/docgenerator/attribute.rb +189 -156
  29. data/lib/docgenerator/characters.rb +824 -267
  30. data/lib/docgenerator/compatibility_v1.rb +249 -0
  31. data/lib/docgenerator/css.rb +53 -32
  32. data/lib/docgenerator/document.rb +119 -56
  33. data/lib/docgenerator/element.rb +304 -351
  34. data/lib/docgenerator/element_meta.rb +303 -0
  35. data/lib/docgenerator/elements.rb +1112 -481
  36. data/lib/docgenerator/environments.rb +153 -62
  37. data/lib/docgenerator/footnote.rb +30 -9
  38. data/lib/docgenerator/lists.rb +71 -47
  39. data/lib/docgenerator/packages/attachfile.rb +136 -0
  40. data/lib/{packages/docgenerator_caption.rb → docgenerator/packages/caption.rb} +28 -19
  41. data/lib/docgenerator/packages/hyperref.rb +194 -0
  42. data/lib/docgenerator/packages/listings.rb +179 -0
  43. data/lib/docgenerator/packages/pdfpages.rb +43 -0
  44. data/lib/docgenerator/packages/rubycode4doc.rb +227 -0
  45. data/lib/{packages/docgenerator_scrlettr2.rb → docgenerator/packages/scrlettr2.rb} +25 -16
  46. data/lib/docgenerator/packages/scrpage2.rb +410 -0
  47. data/lib/docgenerator/packages/struktex.rb +447 -0
  48. data/lib/docgenerator/packages/todonotes.rb +85 -0
  49. data/lib/{packages/docgenerator_url.rb → docgenerator/packages/url.rb} +7 -6
  50. data/lib/docgenerator/sections.rb +257 -83
  51. data/lib/docgenerator/standard.rb +19 -11
  52. data/lib/docgenerator/tabular.rb +234 -118
  53. data/lib/{templates → docgenerator/templates}/docgenerator_template.rb +52 -44
  54. data/lib/{templates → docgenerator/templates}/docgenerator_template.yaml +0 -0
  55. data/lib/{templates → docgenerator/templates}/docgenerator_template_css.rb +22 -16
  56. data/lib/wiki2doc/plugins/rubycode4wiki.rb +53 -0
  57. data/lib/wiki2doc/plugins/struktex.rb +12 -0
  58. data/lib/wiki2doc/wiki2docgenerator.rb +39 -38
  59. data/lib/wiki2doc/wikimedia_document.rb +24 -0
  60. data/manpage_elements.rb +10411 -0
  61. data/readme.rd +34 -24
  62. data/unittest/creole_testtext.creole +11 -0
  63. data/unittest/expected/test_document_usepackage_undefined.log +2 -2
  64. data/unittest/expected/test_runtex.stdout +0 -1
  65. data/unittest/expected/test_runtex_2.stdout +0 -1
  66. data/unittest/expected/toc_css.css +3 -2
  67. data/unittest/expected_creole/test_creole_characters_all.creole +28 -0
  68. data/unittest/expected_creole/test_creole_characters_all.html +15 -15
  69. data/unittest/expected_creole/test_creole_characters_all.latex +15 -15
  70. data/unittest/expected_creole/test_creole_footnotes_groupid.html +15 -0
  71. data/unittest/expected_creole/test_creole_links_file.html +2 -2
  72. data/unittest/expected_creole/test_creole_links_file.latex +2 -2
  73. data/unittest/expected_creole/test_creole_links_file.text +2 -2
  74. data/unittest/expected_creole/test_creole_picture_link.html +1 -1
  75. data/unittest/expected_creole_rail/test_rail_creole_object.tex +33 -0
  76. data/unittest/expected_creole_rail/test_rail_creole_placeholder.tex +40 -0
  77. data/unittest/expected_rubycode4doc/creole_complete.html +26 -0
  78. data/unittest/expected_rubycode4doc/creole_complete.tex +40 -0
  79. data/unittest/expected_rubycode4doc/creole_in_tab.html +4 -0
  80. data/unittest/expected_rubycode4doc/creole_in_tab.tex +6 -0
  81. data/unittest/expected_rubycode4doc/creole_inline_ruby.html +7 -0
  82. data/unittest/expected_rubycode4doc/creole_output.html +2 -0
  83. data/unittest/expected_rubycode4doc/creole_output.tex +4 -0
  84. data/unittest/expected_rubycode4doc/creole_rubycode.html +1 -0
  85. data/unittest/expected_rubycode4doc/creole_rubycode.tex +3 -0
  86. data/unittest/expected_rubycode4doc/creole_rubycode_evaluated.html +1 -0
  87. data/unittest/expected_rubycode4doc/creole_rubycode_evaluated.tex +3 -0
  88. data/unittest/expected_rubycode4doc/creole_rubycode_evaluated_listings.html +3 -0
  89. data/unittest/expected_rubycode4doc/creole_rubycode_evaluated_listings.tex +5 -0
  90. data/unittest/expected_rubycode4doc/wiki_1.html +8 -0
  91. data/unittest/expected_rubycode4doc/wiki_2.html +8 -0
  92. data/unittest/expected_rubycode4doc/wiki_3.html +9 -0
  93. data/unittest/expected_rubycode4doc/wiki_immediate_1.html +5 -0
  94. data/unittest/expected_rubycode4doc/wiki_immediate_2.html +5 -0
  95. data/unittest/expected_rubycode4doc/wiki_immediate_3.html +8 -0
  96. data/unittest/expected_rubycode4doc/wiki_immediate_full.html +21 -0
  97. data/unittest/expected_struktex/test_struktex_krug.creole +15 -0
  98. data/unittest/expected_struktex/test_struktex_krug.tex +19 -0
  99. data/unittest/expected_struktex/test_struktex_krug.wiki +15 -0
  100. data/unittest/expected_struktex/test_struktex_statement.creole +7 -0
  101. data/unittest/expected_struktex/test_struktex_statement.tex +9 -0
  102. data/unittest/expected_struktex/test_struktex_statement.wiki +7 -0
  103. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki.html +0 -0
  104. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki.latex +0 -0
  105. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki.text +0 -0
  106. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki.wiki +0 -0
  107. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_description.html +1 -1
  108. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_description.latex +1 -1
  109. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_description.text +1 -1
  110. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_description.wiki +1 -1
  111. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_footnote.html +0 -0
  112. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_footnote.latex +0 -0
  113. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_footnote.text +0 -0
  114. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_footnote.wiki +0 -0
  115. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_footnote_2.html +0 -0
  116. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_footnote_groupid.html +0 -0
  117. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_html_code.html +0 -0
  118. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_html_code.latex +0 -0
  119. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_html_code.text +0 -0
  120. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_html_code.wiki +0 -0
  121. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_inline.html +0 -0
  122. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_inline.latex +0 -0
  123. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_inline.text +0 -0
  124. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_inline.wiki +0 -0
  125. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_label.html +0 -0
  126. data/unittest/expected_wikimedia/test_wiki_link.html +8 -0
  127. data/unittest/expected_wikimedia/test_wiki_link.latex +17 -0
  128. data/unittest/expected_wikimedia/test_wiki_link.wiki +11 -0
  129. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol.html +0 -0
  130. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol.latex +0 -0
  131. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol.text +0 -0
  132. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol.wiki +0 -0
  133. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_after_ul.html +0 -0
  134. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_after_ul.latex +0 -0
  135. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_after_ul.text +0 -0
  136. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_after_ul.wiki +0 -0
  137. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_ul.html +0 -0
  138. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_ul.latex +0 -0
  139. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_ul.text +0 -0
  140. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ol_ul.wiki +0 -0
  141. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul.html +0 -0
  142. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul.latex +0 -0
  143. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul.text +0 -0
  144. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul.wiki +0 -0
  145. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul_too_much.html +0 -0
  146. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul_too_much.latex +0 -0
  147. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul_too_much.text +0 -0
  148. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_list_ul_too_much.wiki +0 -0
  149. data/unittest/expected_wikimedia/test_wiki_picture.html +55 -0
  150. data/unittest/expected_wikimedia/test_wiki_picture.latex +76 -0
  151. data/unittest/expected_wikimedia/test_wiki_picture_thumb.html +5 -0
  152. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_tab1.html +0 -0
  153. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_tab1.latex +0 -0
  154. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_tab1.wiki +0 -0
  155. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_textformatting.html +0 -0
  156. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_textformatting.latex +0 -0
  157. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_textformatting.text +0 -0
  158. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_textformatting.wiki +0 -0
  159. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_toc.html +0 -0
  160. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_toc.latex +0 -0
  161. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_toc.text +0 -0
  162. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_toc.wiki +0 -0
  163. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_ul_multiple_line.html +0 -0
  164. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_ul_multiple_line.latex +0 -0
  165. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_ul_multiple_line.text +0 -0
  166. data/unittest/{expected_wiki → expected_wikimedia}/test_wiki_ul_multiple_line.wiki +0 -0
  167. data/unittest/{unittest_creole2doc.rb → unittest_creole.rb} +385 -476
  168. data/unittest/unittest_creole_placeholders.rb +272 -0
  169. data/unittest/unittest_creole_plugin_rail.rb +147 -0
  170. data/unittest/unittest_docgenerator.rb +206 -332
  171. data/unittest/unittest_docgenerator_characters.rb +650 -0
  172. data/unittest/unittest_docgenerator_runtex.rb +48 -20
  173. data/unittest/unittest_packages_struktex.rb +187 -0
  174. data/unittest/unittest_rubycode4doc.rb +275 -0
  175. data/unittest/unittest_wikimedia.rb +479 -0
  176. metadata +245 -172
  177. data/examples/results_expected/docgenerator_example.html +0 -39
  178. data/examples/results_expected/docgenerator_example.pdf +0 -0
  179. data/examples/results_expected/docgenerator_example.tex +0 -56
  180. data/examples/results_expected/docgenerator_example_footnote.html +0 -40
  181. data/examples/results_expected/docgenerator_example_footnote.pdf +0 -0
  182. data/examples/results_expected/docgenerator_example_footnote.tex +0 -50
  183. data/examples/results_expected/docgenerator_example_list.html +0 -18
  184. data/examples/results_expected/docgenerator_example_list.pdf +0 -0
  185. data/examples/results_expected/docgenerator_example_list.tex +0 -46
  186. data/examples/results_expected/docgenerator_example_restrictions.html +0 -22
  187. data/examples/results_expected/docgenerator_example_restrictions.pdf +0 -0
  188. data/examples/results_expected/docgenerator_example_restrictions.tex +0 -31
  189. data/examples/results_expected/docgenerator_example_tabular.html +0 -37
  190. data/examples/results_expected/docgenerator_example_tabular.pdf +0 -0
  191. data/examples/results_expected/docgenerator_example_tabular.tex +0 -41
  192. data/examples/results_expected/docgenerator_example_tripfalls.html +0 -27
  193. data/examples/results_expected/docgenerator_example_tripfalls.pdf +0 -0
  194. data/examples/results_expected/docgenerator_example_tripfalls.tex +0 -31
  195. data/lib/packages/docgenerator_attachfile.rb +0 -71
  196. data/lib/packages/docgenerator_hyperref.rb +0 -109
  197. data/lib/packages/docgenerator_listings.rb +0 -103
  198. data/lib/packages/docgenerator_pdfpages.rb +0 -24
  199. data/lib/packages/docgenerator_scrpage2.rb +0 -172
  200. data/self_docgenerator.rb +0 -163
  201. data/unittest/expected_wiki/test_wiki_link.html +0 -8
  202. data/unittest/expected_wiki/test_wiki_link.latex +0 -17
  203. data/unittest/expected_wiki/test_wiki_link.wiki +0 -11
  204. data/unittest/expected_wiki/test_wiki_picture.html +0 -55
  205. data/unittest/expected_wiki/test_wiki_picture.latex +0 -76
  206. data/unittest/expected_wiki/test_wiki_picture_thumb.html +0 -5
  207. data/unittest/test_rakefile_docgenerator.rb +0 -43
  208. data/unittest/unittest_versions.rb +0 -44
  209. data/unittest/unittest_wiki2doc.rb +0 -464
@@ -0,0 +1,249 @@
1
+ #encoding: utf-8
2
+ =begin rdoc
3
+ Collection of some "old" coding.
4
+
5
+ You can load this code to get:
6
+ * Element.create - a dynamic command to define a new Element
7
+ =end
8
+
9
+ Docgenerator::DOCGENERATOR_LOGGER.warn("Load compatibility_v1.rb")
10
+
11
+ #
12
+ module Docgenerator
13
+ =begin rdoc
14
+ This class defines possible elements of a document.
15
+ For each type of elements a class is defined.
16
+ The definition can be done explicite or generic with Element.create.
17
+
18
+ All types of elements are stored in a hash,
19
+ the elements can be created via the method Element.get (or element() ).
20
+ =end
21
+ class Element
22
+ =begin rdoc
23
+ #Set Element tracing on/off.
24
+
25
+ Obsolete. Please use
26
+ Docgenerator.trace_on
27
+ =end
28
+ def self.trace=( val )
29
+ Docgenerator.trace_on
30
+ end
31
+ =begin rdoc
32
+ Return all id's of the class.
33
+ @@ids is expanded in Element.add.
34
+
35
+ Replaced by Element.element_ids.
36
+ =end
37
+ def ids( )
38
+ myids = []
39
+ @@ids.each{|k,v| myids << k if v == self.class and k.class != Class }
40
+ return myids
41
+ end
42
+ #Prepares an overview on all Elements.
43
+ #Can be used for some debugging.
44
+ def self.overview( list = @@ids.values.uniq )
45
+ if ! list.kind_of?(Array)
46
+ list = [ list ]
47
+ end
48
+ result = '=' * 10 + "\nElement overview:"
49
+ list.each{ |k|
50
+ result += "\n#{k}\n"
51
+ result += "\tId's:\t\t"
52
+ result += k.new.element_ids.join("\n\t\t\t")
53
+ result += "\n\tAttributes:\t"
54
+ result += "can contain "
55
+ result += "no " if ! k.new.content?
56
+ result += "content\n\t\t\t"
57
+ self.class.attributes.each{ |k2,v|
58
+ result += "#{k2}:\t#{v.inspect}\n\t\t\t"
59
+ }
60
+ }
61
+ return result
62
+ end
63
+
64
+ =begin rdoc
65
+ Add a new element class or assign another name (synonym) for a class.
66
+ The initial call is made by Element.inherited.
67
+
68
+ Element.add( [:element], Element )
69
+
70
+ Replaced by meta method Element.add_id
71
+ =end
72
+ def self.add( idlist, elementClass )
73
+ #~ DOCGENERATOR_LOGGER.warn("Element.add called -> to be replaced") if DOCGENERATOR_LOGGER.warn?
74
+ if ! elementClass.new.kind_of?( Element )
75
+ raise "Element.add get no Element-class #{elementClass}"
76
+ end
77
+ idlist = [ idlist ] if ! idlist.kind_of?( Array )
78
+ raise "Empty idlist for #{elementClass}" if idlist.empty?
79
+
80
+ idlist.each{|id|
81
+ elementClass.add_id(id)
82
+ }
83
+ end
84
+
85
+ =begin rdoc
86
+ Generic creation of a new class to define a new element.
87
+ - name must be defined.
88
+ - attr is a hash with all attributes.
89
+ For details see Element.add_attributes
90
+ - content is a flag, which defines if the element contains "content".
91
+ Valid values are:
92
+ - true: content available and necessary (e.g. <p>)
93
+ - :empty_ok: content available, but not necessary (e.g. <td> or iframe)
94
+ - false: no content, no endtag, but tag closed with / (example: <br />)
95
+ - nil: no content, no endtag, no closing (example: <br>)
96
+ - output contains a hash with logic, how to handle the output.
97
+ -:htmltag Tag for html-output.
98
+ -:latex Template for LaTeX-output
99
+ -:html Template for HTML-output
100
+
101
+ This code is obsolete.
102
+ Please use Element.create_convert_to_code to get a template to replace your Element#create.
103
+ =end
104
+ def self.create( name, attr = {}, content = false, output = {} )
105
+ DOCGENERATOR_LOGGER.warn("Element.create called -> to be replaced") if DOCGENERATOR_LOGGER.warn?
106
+ create_convert_to_code( [name].flatten, attr, content, output ) if DOCGENERATOR_LOGGER.warn?
107
+ #First some checks
108
+ if ! attr.kind_of?( Hash )
109
+ raise "Type error Element.create: Expected Hash, get #{attr.class}"
110
+ end
111
+ #Generic class creation
112
+ elementclass = Class.new( Element )
113
+ #Add the id of the new class to central collection.
114
+ Element.add( name, elementclass )
115
+
116
+ #Set a flag, if the class can contain 'content'.
117
+ #-true: content available and necessary (e.g. <p>)
118
+ #-:empty_ok: content available, but not necessary (e.g. <td>)
119
+ #-false: no content, no endtag, but tag closed with / (example: <br />)
120
+ #-nil: no content, no endtag, no closing (example: <br>)
121
+ elementclass.class_eval( %Q|
122
+ def content?()
123
+ return #{content.inspect}
124
+ end|)
125
+
126
+ output.each{ |k,v|
127
+ case k
128
+ when :latex
129
+ elementclass.add_output( :latex, v )
130
+ when :context
131
+ elementclass.add_output( :context, v )
132
+ when :html
133
+ elementclass.add_output( :html, v )
134
+ when :text
135
+ elementclass.add_output( :text, v )
136
+ when :wiki
137
+ elementclass.add_output( :wiki, v )
138
+ when :creole
139
+ elementclass.add_output( :creole, v )
140
+ when :htmltag
141
+ if v
142
+ elementclass.class_eval( "def htmltag()\n'#{v}'\nend" )
143
+ else
144
+ elementclass.class_eval( "def htmltag()\nnil\nend" )
145
+ end
146
+ else
147
+ puts "#{__FILE__}##{__LINE__}: Unknown format #{k} for #{name}"
148
+ end
149
+ }
150
+ elementclass.add_attributes( attr )
151
+ #Return the class.
152
+ return elementclass
153
+ end #Element.create
154
+ =begin rdoc
155
+ Transformer of old Element.create-Logic to metaprogramming.
156
+
157
+ Requires a manual postprocess to define Attributes correct.
158
+
159
+ =end
160
+ def self.create_convert_to_code( name, attr = {}, content = false, output = {} )
161
+ #First some checks
162
+ if ! attr.kind_of?( Hash )
163
+ raise "Type error Element.create: Expected Hash, get #{attr.class}"
164
+ end
165
+ #Build code for class creation
166
+ code = "\n"
167
+ code << <<comment
168
+ =begin rdoc
169
+ Define Element #{name.map{|x|x.inspect}.join(', ')}
170
+
171
+ Create an instance with
172
+ #{name.map{|x|
173
+ " element( #{x.inspect}, [ attributes, [content]] )"
174
+ }.join("\n")
175
+ }
176
+ or
177
+ #{name.first.capitalize}.new( [ attributes, [content]] )
178
+ comment
179
+ if attr.size == 0
180
+ code << "Attributes are not defined for this element.\n"
181
+ else
182
+ code << "Attributes may be:\n"
183
+ end
184
+ attr.each{|key, att|
185
+ code << "* #{key.inspect}: \n" #fixme #{att.new.allowed_values.inspect}
186
+ }
187
+ code << "=end\n"
188
+ code << "class #{name.first.capitalize} < Element\n"
189
+ name[1..-1].each{|n|
190
+ code << " add_id #{n.inspect}\n"
191
+ }
192
+ if ! content
193
+ code << " has_no_content #{content.inspect}\n"
194
+ end
195
+ if ( HTML_ATTR_CORE.keys & attr.keys ) == HTML_ATTR_CORE.keys
196
+ code << " add_attributes HTML_ATTR_CORE\n"
197
+ end
198
+ if ( HTML_ATTR_I18N.keys & attr.keys ) == HTML_ATTR_I18N.keys
199
+ code << " add_attributes HTML_ATTR_I18N\n"
200
+ end
201
+ if ( HTML_ATTR_EVENTS.keys & attr.keys ) == HTML_ATTR_EVENTS.keys
202
+ code << " add_attributes HTML_ATTR_EVENTS\n"
203
+ end
204
+ if attr.has_value?(ATTR_LANG)
205
+ code << " add_attribute #{attr.key(ATTR_LANG).inspect}, ATTR_LANG\n"
206
+ end
207
+ if attr.has_value?(HTML_ATTR_ALIGN)
208
+ code << " add_attribute #{attr.key(HTML_ATTR_ALIGN).inspect}, HTML_ATTR_ALIGN\n"
209
+ end
210
+ if attr.has_value?(HTML_ATTR_VALIGN)
211
+ code << " add_attribute #{attr.key(HTML_ATTR_VALIGN).inspect}, HTML_ATTR_VALIGN\n"
212
+ end
213
+ ( attr.keys - HTML_ATTR_CORE.keys - HTML_ATTR_I18N.keys - HTML_ATTR_EVENTS.keys
214
+ ).each{|key|
215
+ code << " add_attribute #{key.inspect}, ?? )\n" #?? - Definition aus Vorlag holen
216
+ }
217
+ output.each{ |k,v|
218
+ case k
219
+ when :latex
220
+ code << " add_latex_output '#{v}'\n"
221
+ when :context
222
+ code << " add_context_output '#{v}'\n"
223
+ when :html
224
+ code << " add_html_output '#{v}'\n"
225
+ when :text
226
+ code << " add_text_output '#{v}'\n"
227
+ when :wiki
228
+ code << " add_wiki_output '#{v}'\n"
229
+ when :creole
230
+ code << " add_creole_output '#{v}'\n"
231
+ when :htmltag
232
+ if v
233
+ code << " add_html_tag '#{v}'\n"
234
+ else
235
+ #~ code << " def htmltag(); nil; end\n"
236
+ end
237
+ else
238
+ puts "#{__FILE__}##{__LINE__}: Unknown format #{k} for #{name}"
239
+ end
240
+ }
241
+ code << "end ##{name.first.capitalize}\n"
242
+ puts code
243
+ #~ class_eval(code)
244
+ #Return the class.
245
+ return code
246
+ end
247
+
248
+ end #Element
249
+ end
@@ -1,25 +1,29 @@
1
- if __FILE__ == $0
2
- require 'docgenerator'
3
- end
1
+ =begin rdoc
2
+ Define classes to use cascading style sheets (CSS) for HTML-documents.
3
+ =end
4
+
5
+ #
6
+ module Docgenerator
7
+ =begin rdoc
8
+ Define Element ':style'
4
9
 
5
- #~ Element.create( [:style], {
6
- #~ :type => Attribute.create( [ :html, :required ], "text/css", 1 ),
7
- #~ }, true,
8
- #~ { :htmltag => 'style',
9
- #~ :html => "\n<style type=\"text/css\">\n" + '#{@content}' + "</style>\n",
10
- #~ :latex => nil
11
- #~ } )
10
+ Create an instance with
11
+ element( :style, [ attributes, [content]] )
12
+
13
+ Style.new( [ attributes, [content]] )
12
14
 
15
+ Only for HTML.
16
+ =end
13
17
  class Style < Element
14
- Element.add( [:style], self)
15
18
  #~ add_attributes( HTML_ATTR_ALL )
16
- add_output( :latex, '')
17
- add_output( :text, '')
18
- add_output( :wiki, '')
19
+ add_latex_output ''
20
+ add_text_output ''
21
+ add_wiki_output ''
22
+ add_creole_output ''
19
23
  #Prepare HTML-Output for Style-Tag.
20
24
  #The values can be overwritten, if different CSS-Elements are inside.
21
25
  def to_html( options = {} )
22
- o = Docgenerator_logger.set_option_defaults(options)
26
+ o = set_option_defaults(options)
23
27
  o[:log].debug("Enter style.to_html") if o[:log].debug?
24
28
  res = ""
25
29
  res << "\n" if @crbefore
@@ -31,30 +35,36 @@ class Style < Element
31
35
  res << "\n" if @crafter
32
36
  return res
33
37
  end
34
- end
38
+ end #Style
35
39
 
36
40
  CSS_COLORS = [ /rgb\((\d+%?,?){3,3}\)/,
37
41
  #rgb(R,G,B), rgb(%,%,%) oder #XXXXXX
38
42
  #/gray\d{1,3}/
39
- 'black','gray','maroon','red', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'purple', 'fuchsia', 'teal', 'aqua', 'silver', 'white',
43
+ 'black','gray', 'grey', 'maroon','red', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'purple', 'fuchsia', 'teal', 'aqua', 'silver', 'white',
40
44
  #Netscape-Farbnamen (120 zus�tzliche Farben)
41
45
  #Falsche Darstellungen, siehe http://www.rzuser.uni-heidelberg.de/~x22/ht/farben2.html
42
- 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightsteelblue', 'lightyellow',
46
+ 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgreen',
47
+ 'lightgrey', 'lightgray', 'lightslategray', 'lightslategrey', #yes, both are defined
48
+ 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightsteelblue', 'lightyellow',
43
49
  'greenyellow', 'palegreen', 'darkgreen',
44
50
  'darkred', 'firebrick',
45
51
  'salmon',
46
52
  ]
47
53
  CSS_BORDER = [ 'none', 'hidden', 'dotted', 'dashed', 'solid', 'double', 'groove', 'ridge', 'inset', 'outset' ]
48
54
  CSS_WIDTH = [ /\d*(cm|mm|px|em|%)/, 'thin', 'medium', 'thick' ]
49
- #Class to collect css-settings for a Element.
50
- #This values can be used inline (style-Attribute) and inside style>-Tags
55
+
56
+ =begin rdoc
57
+ Class to collect css-settings for a Element.
58
+
59
+ This values can be used inline (style-Attribute) and inside style>-Tags
60
+ =end
51
61
  class CSS
52
62
  #List of all allowed values.
53
63
  #The first value is a regular expression, coninued by fixed values.
54
64
  @@values = {
55
- 'font-size' => [ /\A\d+(pt|px|em)/, 'xx-small', 'x-small', 'small', 'medium', 'large','x-large','xx-large','smaller','larger' ],
65
+ 'font-size' => [ 'xx-small', 'x-small', 'small', 'medium', 'large','x-large','xx-large','smaller','larger', /\A\d+(pt|px|em)/ ],
56
66
  'font-style' => ['italic', 'oblique', 'normal'],
57
- 'font-weight' => ['bold' ], #fixme complete it
67
+ 'font-weight' => ['bold', 'bolder', 'lighter', 'normal', /\A\d00\Z/ ],
58
68
  'color' => CSS_COLORS,
59
69
  'background-color' => CSS_COLORS,
60
70
  'visibility' => ['hidden', 'visible' ],
@@ -124,7 +134,8 @@ class CSS
124
134
  }
125
135
  def initialize( values ={} )
126
136
  @values = {}
127
- @log = values[:log] ? values[:log] : DOCGENERATOR_LOGGER #fixme
137
+ #~ set_option_defaults(values) #guarantee :log
138
+ @log = values[:log] || DOCGENERATOR_DEFAULT_LOGGER
128
139
  values.delete(:log)
129
140
 
130
141
  values.each{|k,v|
@@ -132,7 +143,9 @@ class CSS
132
143
  }
133
144
  @cr = nil
134
145
  end
135
- #Make key unique. convert symbol to String...
146
+ =begin rdoc
147
+ Make key unique. convert symbol to String...
148
+ =end
136
149
  def generalize_key( k )
137
150
  key = nil
138
151
  if k.is_a?(Symbol)
@@ -145,11 +158,13 @@ class CSS
145
158
  def []( k )
146
159
  return @values[generalize_key( k )]
147
160
  end
148
- #Add a setting.
149
- #
150
- #If an existing value is overwritten, you get a warning.
151
- #To replace a value, use
152
- # css[key].replace( value ) (But the you have no check)
161
+ =begin rdoc
162
+ Add a setting.
163
+
164
+ If an existing value is overwritten, you get a warning.
165
+ To replace a value, use
166
+ css[key].replace( value ) (But the you have no check)
167
+ =end
153
168
  def []=( k, v )
154
169
  key = generalize_key( k )
155
170
  if @values[key]
@@ -165,7 +180,9 @@ class CSS
165
180
 
166
181
  @values[key] = v
167
182
  end
168
- #returns the values for a direct css in the style-attribute for a HTML-tag.
183
+ =begin rdoc
184
+ Returns the values for a direct css in the style-attribute for a HTML-tag.
185
+ =end
169
186
  def to_html(options={})
170
187
  o = {
171
188
  :map => "%s;",
@@ -175,7 +192,9 @@ class CSS
175
192
  def to_s()
176
193
  return self.to_html
177
194
  end
178
- #Returns a tab with the textes for each characteristic.
195
+ =begin rdoc
196
+ Returns a tab with the textes for each characteristic.
197
+ =end
179
198
  def to_tab()
180
199
  s = []
181
200
  @values.sort.each{|k,v|
@@ -183,7 +202,9 @@ class CSS
183
202
  }
184
203
  return s
185
204
  end
186
- end
205
+ end #CSS
206
+
207
+ end #module Docgenerator
187
208
 
188
209
  if __FILE__ == $0
189
210
  #~ DOCGENERATOR_LOGGER.level = Log4r::DEBUG
@@ -1,4 +1,27 @@
1
1
  #encoding: utf-8
2
+
3
+ #
4
+ module Docgenerator
5
+ =begin rdoc
6
+ Extension for Log4r::Logger (#INFO)
7
+ =end
8
+ module Logger_INFO
9
+ #Print INFO-message, if logging level is WARN
10
+ def INFO?()
11
+ Log4r::WARN >= self.level
12
+ end #INFO?()
13
+ =begin rdoc
14
+ INFO is a *important* information.
15
+ It's like a warning, but outputted as information.
16
+ =end
17
+ def INFO(*args)
18
+ return unless INFO?
19
+ level = self.level #remember previous level
20
+ self.level = Log4r::INFO #temporary level change
21
+ self.info(*args)
22
+ self.level = level
23
+ end
24
+ end
2
25
  =begin rdoc
3
26
  Container for a document.
4
27
 
@@ -29,12 +52,14 @@ class Document
29
52
  end
30
53
  end
31
54
 
32
- #Create a new document.
33
- #There are different document templates supported.
34
- #The templates refer to the corresponding TeX-classes.
35
- #- article
36
- #- report
37
- #- book
55
+ =begin rdoc
56
+ Create a new document.
57
+ There are different document templates supported.
58
+ The templates refer to the corresponding TeX-classes.
59
+ - article
60
+ - report
61
+ - book
62
+ =end
38
63
  def initialize( settings = {} )
39
64
  #Set template defaults
40
65
  @template = {
@@ -60,6 +85,8 @@ class Document
60
85
  @log = Log4r::Logger.new( 'Doc', Log4r::WARN )
61
86
  @log.outputters = Log4r::StdoutOutputter.new('log_xxx')
62
87
  end
88
+ @log.extend(Logger_INFO) unless @log.respond_to?(:INFO)
89
+
63
90
  @meta = {} #some meta-Tags for HTML
64
91
  @body = element( :body, { :log => @log } )
65
92
  @head = element( :head, { :log => @log } )
@@ -137,13 +164,15 @@ class Document
137
164
  #Define, if there should be a message in case of:
138
165
  #-:change Document changed
139
166
  #-:nochange Document existed, but is unchanged
140
- #Give an array with the wanted values.
167
+ #Please provide an array with the wanted values.
141
168
  def Document.givemessage=( value = [:change, :nochange] )
142
169
  @@givemessage = value
143
170
  end
144
171
  @@givemessage = [:change, :nochange]
145
172
  def Document.givemessage(); @@givemessage; end
146
- #Add a meta-tag-information for the HTML-Output.
173
+ =begin rdoc
174
+ Add a meta-tag-information for the HTML-Output.
175
+ =end
147
176
  def meta( key, content )
148
177
  key = key.to_s
149
178
 
@@ -219,12 +248,13 @@ class Document
219
248
  toccnt = 0
220
249
  toc_ids = [ :chapter, :section,:subsection, :subsubsection, :paragraph, :subparagraph,:minisec]
221
250
  @body.content.flatten.each{|el|
222
- if ! el.respond_to?(:ids)
223
- #e.g. Wikitext. Has a to_doc, but doesn't react on flatten.
224
- opt[:log].error("Toc: Element ohne :ids #{el.class}") if opt[:log].error?
225
- next
226
- end
227
- depth = toc_ids.index((el.ids & toc_ids)[0])
251
+ if ! el.respond_to?(:element_ids)
252
+ #e.g. Wikitext. Has a to_doc, but doesn't react on flatten.
253
+ opt[:log].error("Toc: Element without ids #{el.class}") if opt[:log].error?
254
+ next
255
+ end
256
+ #Get section depth. Determine it via the position inside toc_ids.
257
+ depth = toc_ids.index((el.element_ids & toc_ids)[0])
228
258
  next if ! depth #Element is no header
229
259
 
230
260
  opt[:log].debug("Toc: Found entry on level #{depth}: <#{el.content}>") if opt[:log].debug?
@@ -271,11 +301,14 @@ end
271
301
  =begin rdoc
272
302
  Save the file.
273
303
  The type of the document is determined by the file extensison.
304
+
274
305
  Supported document types are:
275
- - tex
276
- - html
277
- - (wiki)
306
+ - tex (*.tex)
307
+ - context (*.mkiv)
308
+ - html (*.htm[l])
309
+ - (wiki wikimedia/creole)
278
310
  - (text)
311
+
279
312
  Depending on a template, different results are created.
280
313
 
281
314
  There is a comparison between an already existing file and the new one.
@@ -288,7 +321,7 @@ Valid options:
288
321
  allows to overwrite
289
322
  - target
290
323
  In most cases this is defined by the extension.
291
- Main usage will be for ConTeXt (shares the extension with LaTeX)
324
+ This attribute allows to set :context for tex-files.
292
325
  - :additional_options
293
326
  List of options.
294
327
  If you want to give parameters to specific 'Element'-objects you can define the keys here.
@@ -329,10 +362,11 @@ Valid options:
329
362
  return false
330
363
  end
331
364
 
365
+
332
366
  prefix = [ nil,
333
367
  "Build by\t#{__FILE__}",
334
368
  "Dir:\t\t#{Dir.pwd}",
335
- "Creator:\t#{$0}",
369
+ "Creator:\tDocgenerator #{Docgenerator::VERSION} - http://rubygems.org/gems/docgenerator",
336
370
  "Target:\t\t#{filename}",
337
371
  "#{Time.now.strftime('%Y/%m/%d %H:%M:%S')}",
338
372
  nil,
@@ -346,7 +380,7 @@ Valid options:
346
380
  target = :latex
347
381
  #Take context if requested.
348
382
  target = :context if options[:target] == :context
349
- when /miv/i #Mark IV
383
+ when /mk(ii|iv)/i #Mark II and IV
350
384
  target = :context
351
385
  when /htm[l]?/i
352
386
  target = :html
@@ -412,19 +446,21 @@ Valid options:
412
446
  if new != old
413
447
  new.sub!( '<<prefix>>', prefix)
414
448
  if ( File.exist?( filename ) and ! options[:overwrite] )
415
- puts "Datei #{filename} exist already \nContinue [yn]?"
416
- answer = $stdin.gets() if $stdin.tty? #only when called in a shell
417
- if ! ( answer =~ /[YyjJ].*/ )
418
- puts "Bye"
419
- @log.info( "Overwrite #{filename} after confirmation" ) if @log.info?
420
- return false
449
+ @log.warn("Datei #{filename} exist already.") if @log.warn?
450
+ if $stdin.tty? #only when called in a shell
451
+ puts "Datei #{filename} exist already \nContinue [yn]?"
452
+ answer = $stdin.gets()
453
+ if ! ( answer =~ /[YyjJ].*/ )
454
+ puts "Bye"
455
+ return false
456
+ end
421
457
  end
458
+ @log.info( "Overwrite #{filename} after confirmation" ) if @log.info?
422
459
  end
423
460
  File.open( filename, 'w', :external_encoding => new.encoding ){|f|
424
461
  f << new
425
462
  }
426
- @log.info( "Save changed\t#{filename}") if @log.info?
427
- puts "Save changed\t#{filename}" if @@givemessage.include?(:change)
463
+ @log.INFO( "Save changed\t#{filename}") if @log.INFO?
428
464
  #Save copy of old version (attention, *.bak makes no control on tex or html)
429
465
  #~ f = File.new( filename.sub( extension, 'bak'), 'w' )
430
466
  #~ f << old
@@ -432,38 +468,48 @@ Valid options:
432
468
  Document.runtex( filename, options[:runtex] ) if options[:runtex] and [:latex, :context].include?(target)
433
469
  return true
434
470
  elsif old
435
- @log.info("Unchanged\t#{filename}") if @log.info?
436
- puts "Unchanged\t#{filename}" if @@givemessage.include?(:nochange)
471
+ @log.INFO("Unchanged\t#{filename}") if @log.INFO?
437
472
  return false
438
473
  end
439
474
  end #Document#save
440
475
  =begin rdoc
441
- Build the content for the target format.
476
+ Build the content of a document for the target format.
477
+
442
478
  Supported target formats are:
443
479
  - :latex
444
480
  - :html
445
481
  - :text
482
+ - :wiki
483
+ - :creole
484
+
485
+ Options are passed in a Hash:
486
+ * :log [required]: a logger
487
+ * :template [required]: a Docgenerator::DocumentTemplate-instance
488
+ * :filename [recommended]: used in logging informations
489
+ * :replacements [optional]: Hash with regexp/result pairs to modify the output.
490
+
446
491
  If the standard templates are used, there is a <<prefix>> left
447
492
  (used from Document#save to include some additional information).
448
493
 
494
+ You may use a String as dummy template.
495
+
449
496
  If the method is called directly to prepare document snipplets, you can use:
450
- puts Document#to_doc( :latex, '<<body>>')
497
+ doc = Document.new()
498
+ # ... fill doc
499
+ puts doc.to_doc( :latex,
500
+ :log => Log4r::Logger.new('testlog'),
501
+ :template=> '<<body>>',
502
+ #~ :template=> doc.template[:latex],
503
+ :filename => 'dummy',
504
+ #~ :replacements => { /xxx/ => 'cc' }
505
+ )
451
506
 
452
- It is possible to give pairs of RegExp (pattern) and a replacement to the result.
453
507
  =end
454
508
  def to_doc( target, options )
455
- #~ o = Docgenerator_logger.set_option_defaults(options)
509
+ #~ o = set_option_defaults(options)
456
510
  options[:log].info( "Build document for #{target.inspect}" ) if options[:log].info?
457
- template = options[:template]
458
- if ! template
459
- options[:log].error( "No template available to create #{target.inspect} #{self.class}" ) if options[:log].error?
460
- return ''
461
- end
462
- replacements = options[:replacements] || {}
463
- options[:log].warn( "No filename given " ) if options[:log].warn? and ! options[:filename]
464
511
 
465
- new = template.template
466
- encoding = template.template.encoding
512
+ #check target
467
513
  case target
468
514
  when :latex
469
515
  add_option( @language )
@@ -472,37 +518,52 @@ It is possible to give pairs of RegExp (pattern) and a replacement to the result
472
518
  when :html
473
519
  when :text
474
520
  when :wiki
521
+ options[:log].warn( "Support for #{target} stopped" ) if options[:log].warn?
475
522
  when :creole
476
523
  options[:log].warn( "Support for #{target} under development" ) if options[:log].warn?
477
524
  else
478
525
  options[:log].fatal( "Unknown target #{target} for #{options[:filename]}" ) if options[:log].fatal?
479
526
  return ''
480
527
  end
528
+
529
+ #set template to variable new
530
+ case options[:template]
531
+ when DocumentTemplate
532
+ new = options[:template].template
533
+ when String
534
+ new = options[:template]
535
+ else
536
+ options[:log].error( "No template available to create #{target.inspect} #{self.class}" ) if options[:log].error?
537
+ return ''
538
+ end
481
539
  if ! new.kind_of?( String )
482
- options[:log].error( "New is wrong type: #{new.inspect}") if options[:log].error?
540
+ options[:log].fatal( "New is wrong type: #{new.inspect}") if options[:log].fatal?
541
+ return ''
483
542
  end
543
+ encoding = new.encoding
544
+
545
+ #Set replacements
546
+ replacements = options[:replacements] || {}
484
547
 
485
548
  options[:document] = self
549
+
486
550
  @head << self.docinfo()
487
551
  options[:log].debug( "Build header data") if options[:log].debug?
488
552
  new.sub!( '<<head>>', @head.to_doc(target, options ).encode(encoding))
553
+
489
554
  options[:log].debug( "Build body") if options[:log].debug?
490
555
  new.sub!( '<<body>>', @body.to_doc(target, options).encode(encoding))
491
- new.sub!( '<<classoptions>>', @options.uniq.join(',').encode(encoding))
492
556
 
557
+ new.sub!( '<<classoptions>>', @options.uniq.join(',').encode(encoding))
493
558
 
559
+ #manipulate result
494
560
  replacements.each{|pattern, replace |
495
561
  options[:log].info("Replace text #{pattern.source} with #{replace}" ) if options[:log].info?
496
562
  new.gsub!( pattern, replace ) if replace
497
563
  }
498
564
  return new
499
565
  end #Document#to_doc
500
- #Return the actual target type.
501
- #Needed by Element#to_s to decide which method is used to prepare the output.
502
- #
503
- #The usage of this technic makes similar processing unposibble.
504
- #Set in Document#save.
505
- attr_reader :target
566
+
506
567
  =begin rdoc
507
568
  Call rake4latex to translate the file.
508
569
  =end
@@ -534,8 +595,6 @@ warning
534
595
  options = [:touch, :statistic, :clean]
535
596
  rescue LoadError
536
597
  puts "Sorry, I didn't find the rake4latex to translate #{filename}"
537
- puts "I try to use the old 'RunTeX'"
538
- runtex_old( filename, options[:format] )
539
598
  return false
540
599
  end unless defined? Rake4LaTeX
541
600
  end # ! defined? Rake4LaTeX
@@ -567,10 +626,14 @@ warning
567
626
  Make some basic replacements for TeX.
568
627
  There is no sense to use it with HTML.
569
628
 
570
- Better solution: Puts String into \path, \verb or similar.
629
+ Better solution:
630
+ * use elements from Docgenerator::Characters
631
+ * Use unicode in TeX-Document.
632
+ * Put string into \path, \verb or similar.
571
633
  =end
572
634
  def Document.texify( input )
573
635
  out = input.strip
636
+
574
637
  #~ out.gsub!( /&/, '\\\&') #geht schief. erzeugt <<body>>...
575
638
  #~ out.gsub!( /\\/, '\\\\')
576
639
  out.gsub!( /%/, '\%')
@@ -578,11 +641,11 @@ Better solution: Puts String into \path, \verb or similar.
578
641
  out.gsub!( /&/, '\\\\&')
579
642
  out.gsub!( /_/, '\_')
580
643
  out.gsub!( /#/, '\#')
581
- out.gsub!( /€/, '\euro ')
644
+ #~ out.gsub!( /€/, '\euro ') #regexp is in utf-8 -- may make problems.
582
645
  return out
583
646
  end
584
647
  def inspect()
585
648
  return "#<Document '#{@title}'>"
586
- #~ return "#<Document '#{@title} #{@body.inspect}>'"
587
649
  end
588
650
  end #Document
651
+ end #module Docgenerator