docgenerator 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -1,239 +1,46 @@
1
1
  #encoding: utf-8
2
- #This class defines possible elements of a document.
3
- #For each type of elements a class is defined.
4
- #The definition can be done explicite or generic with Element.create.
5
- #
6
- #All types of elements are stored in a hash,
7
- #the elements can be created via the method Element.get (or element() ).
8
- #
9
- #Tracing
10
- #Often there is the problem, that you get an error when you write the element.
11
- #But the error is done, when the element is created.
12
- #When you redefine ELEMENTS_TRACE, some tracing information are stored during creation.
2
+
3
+ #
4
+
5
+ module Docgenerator
6
+ =begin rdoc
7
+ This class defines possible elements of a document.
8
+ For each type of elements a class is defined.
9
+ The definition can be done explicite or generic with Element.create.
10
+
11
+ All types of elements are stored in a hash,
12
+ the elements can be created via the method Element.get (or element() ).
13
+
14
+ Tracing
15
+ Often there is the problem, that you get an error when you write the element.
16
+ But the error is done, when the element is created.
17
+ When you redefine ELEMENTS_TRACE, some tracing information are stored during creation.
18
+ =end
13
19
  class Element
14
20
  include Docgenerator #get VERSION
15
- #Hash with all ids and their corresponding classes.
16
- @@ids = Hash.new( )
17
- #All attributes are stored in this hash.
18
- #The key is the corresponding class.
19
- @@attr = { Element => {} }
20
-
21
- #Flag, if the calling stack should be analysed for each Element
22
- #Only for document debbuging
23
- @@trace = nil
24
- #Set Element tracing on/off
25
- def Element.trace=( val )
26
- @@trace = val
27
- end
28
21
 
29
22
  SUPPORTED_TARGETS = [ :latex, :html, :wiki, :text, :debug ]
30
23
  SUPPORTED_TARGETS << :context #Added later
31
24
  SUPPORTED_TARGETS << :creole #Added later
32
-
33
25
 
34
- #Return a element class.
35
- def Element.get( name )
36
- return @@ids[name]
37
- end
38
- #This method is called, when a subclass of this class is defined.
39
- #This can happen via Element.create or in another programm.
40
- #
41
- #Add subclasses to the list of all element classes and initialize some internal hashes.
42
- def Element.inherited( subclass )
43
- DOCGENERATOR_LOGGER.debug("New subclass for 'Element' created: '#{subclass}'") if DOCGENERATOR_LOGGER.debug?
44
- #All attributes of a class are collected in a hash.
45
- @@attr[subclass] = {}
46
- #Fill @@ids
47
- #There is no possibility to give a list of id's or names to a 'inherit'-method.
48
- #So a special method Element.add is used.
49
- Element.add( [subclass], subclass )
50
- end
51
- #Add a new element class or assign another name (synonym) for a class.
52
- #The initial call is made by Element.inherited.
53
- #
54
- #Element.add( [:element], Element )
55
- def Element.add( idlist, elementClass )
56
- if ! elementClass.new.kind_of?( Element )
57
- raise "Element.add get no Element-class #{elementClass}"
58
- end
59
- idlist = [ idlist ] if ! idlist.kind_of?( Array )
60
- raise "Empty idlist for #{elementClass}" if idlist.empty?
61
-
62
- idlist.each{|id|
63
- if @@ids[ id ] == nil
64
- DOCGENERATOR_LOGGER.debug("Element class '#{id}' is new: #{elementClass}") if DOCGENERATOR_LOGGER.debug?
65
- #All new ids are collected
66
- @@ids[ id ] = elementClass
67
- elsif @@ids[ id ] == elementClass
68
- DOCGENERATOR_LOGGER.warn("Element class '#{id}' is defined double: #{elementClass}") if DOCGENERATOR_LOGGER.warn?
69
- else
70
- DOCGENERATOR_LOGGER.error("Error: ID '#{id}' is redefined #{@@ids[id]} -> #{elementClass}") if DOCGENERATOR_LOGGER.error?
71
- @@ids[id] = elementClass
72
- end
73
- }
74
- end
75
-
76
- #Generic creation of a new class to define a new element.
77
- #- name must be defined.
78
- #- attr is a hash with all attributes.
79
- # For details see Element.add_attributes
80
- #- content is a flag, which defines if the element contains "content".
81
- # Valid values are:
82
- # - true: content available and necessary (e.g. <p>)
83
- # - :empty_ok: content available, but not necessary (e.g. <td> or iframe)
84
- # - false: no content, no endtag, but tag closed with / (example: <br />)
85
- # - nil: no content, no endtag, no closing (example: <br>)
86
- #- output contains a hash with logic, how to handle the output.
87
- # -:htmltag Tag for html-output.
88
- # -:latex Template for LaTeX-output
89
- # -:html Template for HTML-output
90
- def Element.create( name, attr = {}, content = false, output = {} )
91
- #First some checks
92
- if ! attr.kind_of?( Hash )
93
- raise "Type error Element.create: Expected Hash, get #{attr.class}"
94
- end
95
- #Generic class creation
96
- elementclass = Class.new( Element )
97
- #Add the id of the new class to central collection.
98
- Element.add( name, elementclass )
99
-
100
- #Set a flag, if the class can contain 'content'.
101
- #-true: content available and necessary (e.g. <p>)
102
- #-:empty_ok: content available, but not necessary (e.g. <td>)
103
- #-false: no content, no endtag, but tag closed with / (example: <br />)
104
- #-nil: no content, no endtag, no closing (example: <br>)
105
- elementclass.class_eval( %Q|
106
- def content?()
107
- return #{content.inspect}
108
- end|)
109
-
110
- output.each{ |k,v|
111
- case k
112
- when :latex
113
- elementclass.add_output( :latex, v )
114
- when :context
115
- elementclass.add_output( :context, v )
116
- when :html
117
- elementclass.add_output( :html, v )
118
- when :text
119
- elementclass.add_output( :text, v )
120
- when :wiki
121
- elementclass.add_output( :wiki, v )
122
- when :creole
123
- elementclass.add_output( :creole, v )
124
- when :htmltag
125
- if v
126
- elementclass.class_eval( "def htmltag()\n'#{v}'\nend" )
127
- else
128
- elementclass.class_eval( "def htmltag()\nnil\nend" )
129
- end
130
- else
131
- puts "#{__FILE__}##{__LINE__}: Unknown format #{k} for #{name}"
132
- end
133
- }
134
- elementclass.add_attributes( attr )
135
- #Return the class.
136
- return elementclass
137
- end
138
- #Return all id's of the class.
139
- #@@ids is expanded in Element.add.
140
- def ids( )
141
- myids = []
142
- @@ids.each{|k,v| myids << k if v == self.class and k.class != Class }
143
- return myids
144
- end
145
- #Prepares an overview on all Elements.
146
- #Can be used for some debugging.
147
- def Element.overview( list = @@ids.values.uniq )
148
- if ! list.kind_of?(Array)
149
- list = [ list ]
150
- end
151
- result = '=' * 10 + "\nElement overview:"
152
- list.each{ |k|
153
- result += "\n#{k}\n"
154
- result += "\tId's:\t\t"
155
- result += k.new.ids.join("\n\t\t\t")
156
- result += "\n\tAttributes:\t"
157
- result += "can contain "
158
- result += "no " if ! k.new.content?
159
- result += "content\n\t\t\t"
160
- @@attr[k].each{ |k2,v|
161
- result += "#{k2}:\t#{v.inspect}\n\t\t\t"
162
- }
163
- }
164
- return result
165
- end
166
- #Add possible attributes to an element class.
167
- #Attributes are defined in a hash, each key get a array with values.
168
- #The values can be:
169
- #- OBLIGATORY/OPTIONAL
170
- #- Alias (this allows the usage of a position and a name for a parameter).
171
- #- allowed elements ( e.g. list content only list items)
172
- #Problem: Attributes are not inherited. See Element.get_attribute_list
173
- #
174
- #This method is called from a subclass.
175
- #Fixme: add_attributes overwrites everything.
176
- def Element.add_attributes( attr )
177
- elattr = @@attr[self] #self is the class
178
- attr.each{ |k,a |
179
- elattr[k] = a
180
- }
181
- end
182
- #Returns list of attributes.
183
- #Can be used for copying attributes from one class to another class.
184
- def Element.get_attribute_list( elementclass )
185
- return @@attr[elementclass]
186
- end
187
- #Add an output routine.
188
- def Element.add_output( target, string )
189
- case target
190
- when :latex
191
- cmd = "def to_latex(options = {})\n"
192
- when :context
193
- cmd = "def to_context(options = {})\n"
194
- when :html
195
- cmd = "def to_html(options = {})\n"
196
- when :text
197
- cmd = "def to_text(options = {})\n"
198
- when :wiki
199
- cmd = "def to_wiki(options = {})\n"
200
- when :creole
201
- cmd = "def to_creole(options = {})\n"
202
- else
203
- puts "#{self}: Undefined target format #{target}"
204
- end
205
- if ! string.kind_of?( String )
206
- puts "Error element <#{self.new.ids}>: #{string.inspect} is no String"
207
- end
208
- cmd << <<code
209
- o = Docgenerator_logger.set_option_defaults(options)
210
- o[:log].debug("enter to_doc(#{target}) for #{self.inspect}, options: \#{options.keys.inspect}") if o[:log].debug?
211
- code
212
- template = string.gsub(/\\/, '\\\\\\')
213
- template.gsub!(/"/, '\"')
214
- template.gsub!(/@content\}/, "@content.to_doc(#{target.inspect}, o)}")
215
- cmd << " \"#{template}\"\n"
216
- cmd << "end\n"
217
- class_eval( cmd )
218
- cmd #return cmd for unit test
219
- end
220
- #Defines an element.
221
- #
222
- #There are two ways to add values:
223
- #- "named" values in an hash.
224
- # This named values can be attributes of a HTML-Tag or Parameters of a TeX-Makro.
225
- # There is a check, if the attribute exist.
226
- #- Content. Values "inside" the element.
227
- # The content can be the content of a HTML-Tag or the content of a TeX-Environment.
228
- # There is a check, if this class allows content.
229
- #:log is the default attribute for the logger.
230
- #In Element#to_doc you can give another logger!
26
+ =begin rdoc
27
+ Defines an element.
28
+
29
+ There are two ways to add values:
30
+ - "named" values in an hash.
31
+ This named values can be attributes of a HTML-Tag or Parameters of a TeX-Makro.
32
+ There is a check, if the attribute exist.
33
+ - Content. Values "inside" the element.
34
+ The content can be the content of a HTML-Tag or the content of a TeX-Environment.
35
+ There is a check, if this class allows content.
36
+ :log is the default attribute for the logger.
37
+ In Elementto_doc you can give another logger!
38
+ =end
231
39
  def initialize( attr={}, content = nil)
232
40
  #@attr is a hash containing the values for each attribute.
233
41
  @attr = Hash.new( )
234
- #~ @log = DOCGENERATOR_LOGGER
235
42
  #Attention! in to_doc another logger may be given.
236
- @log = attr[:log] ? attr[:log] : DOCGENERATOR_LOGGER
43
+ @log = attr[:log] || DOCGENERATOR_DEFAULT_LOGGER
237
44
  attr.delete(:log) #remove from attr-interface
238
45
  #attr alias
239
46
  @attr_alias = Hash.new( )
@@ -252,7 +59,7 @@ code
252
59
  @suppressed_targets = []
253
60
 
254
61
  #Initialize the attribute hash.
255
- @@attr[self.class].each{ |k,a|
62
+ self.class.attributes.each{ |k,a|
256
63
  #type check on Attribute does not work .
257
64
  if a.kind_of?( Symbol )
258
65
  #Filled in the second run
@@ -264,7 +71,7 @@ code
264
71
  end
265
72
  }
266
73
  #Assign Alias-Attributes
267
- @@attr[self.class].each{ |k,a|
74
+ self.class.attributes.each{ |k,a|
268
75
  next if !a.kind_of?( Symbol )
269
76
  if @attr[a]
270
77
  @attr_alias[k] = @attr[a]
@@ -279,20 +86,59 @@ code
279
86
  elsif @attr_alias[k]
280
87
  @attr_alias[k] << v
281
88
  else
282
- @log.warn("Usage of unknown attribute '#{k}' in '#{self.ids.join(',')}'") if @log.warn?
89
+ @log.warn("Usage of unknown attribute '#{k}' in #{self.inspect}") if @log.warn?
90
+ #~ @log.debug(caller) if @log.debug?
283
91
  end
284
92
  }
285
- @called_by = prepare_tracing_info( @@trace )
93
+ #store info, where the element was created
94
+ @creation_caller = prepare_tracing_info() if Docgenerator.trace_on?
286
95
  self << content if content
287
96
  end
288
- #List (array) of targets, where the element can be used.
289
- #Default are all supported targets.
290
- #
291
- #With restrictions of this attribute, elements can be restricted on special documents.
97
+ =begin rdoc
98
+ Only for debbuging reasons.
99
+
100
+ This method analyse the caller-stack and provides
101
+ the first "no lib/docgenerator-place".
102
+ This should be the location, where the element is created.
103
+
104
+ Via Element#inspect you get access to this information.
105
+ =end
106
+ def prepare_tracing_info()
107
+ caller().each{|c|
108
+ next if ( /lib\/(docgenerator|creole|wiki2doc)/ =~ c )
109
+ return c
110
+ }
111
+ #--> No calling stack outside lib/docgenerator found --> Error
112
+ @log.error('Element#prepare_tracing_info: Found no starting place in caller stack') if @log.error?
113
+ caller().each{|c| @log.debug("\t#{c}") } if @log.debug?
114
+ return caller()
115
+ end
116
+ =begin rdoc
117
+ Set a text for the inspect command.
118
+
119
+ Nil if the information was not collected at Element#new.
120
+ =end
121
+ def inspect_creation_caller
122
+ if @creation_caller
123
+ ", created at #{@creation_caller}"
124
+ else
125
+ nil #'unknown. Please set Elements.trace if needed'
126
+ end
127
+ end
128
+ def inspect()
129
+ return "<#{self.class}#{inspect_creation_caller}>"
130
+ end
131
+
132
+ =begin rdoc
133
+ List (array) of targets, where the element can be used.
134
+ Default are all supported targets.
135
+
136
+ With restrictions of this attribute, elements can be restricted on special documents.
137
+ =end
292
138
  def restrict_to( *argv )
293
139
  @targets = []
294
140
  @suppressed_targets = SUPPORTED_TARGETS.dup
295
- @log.warn("Element#restrict_to: #{self.inspect} restrict to #{argv.inspect}") if @log.warn?
141
+ @log.info("Element#restrict_to: #{self.inspect} restrict to #{argv.inspect}") if @log.warn?
296
142
  argv.each{ |arg|
297
143
  #~ if ! SUPPORTED_TARGETS.include?( arg )
298
144
  if ! @suppressed_targets.delete( arg )
@@ -302,149 +148,176 @@ code
302
148
  }
303
149
  self
304
150
  end
305
- #Only for debbuging reasons.
306
- #Should contain the first "no docgenerator.rb-place, where part is called
307
- #if @@trace is on, some tracing information is stored during creation.
308
- def prepare_tracing_info( doit = @@trace )
309
- return nil if ! doit
310
- caller().each{|c|
311
- next if ( /DocumentGenerator/ =~ c )
312
- return c
313
- }
314
- #--> No calling stack found --> Error
315
- puts '----'*10
316
- puts 'Element#prepare_tracing_info: Found no starting place in caller stack'
317
- caller().each{|c| puts c }
318
- puts '----'*10
319
- return caller()
320
- end
321
- def inspect()
322
- if @@trace
323
- called_by = ", Created in #{@called_by}"
324
- else
325
- called_by = nil #'unknown. Please set Elements.trace if needed'
326
- end
327
- return "<Class Element(#{self.ids.join(',')})#{called_by}>"
328
- #~ if @content
329
- #~ return "<Class Element(#{self.ids.join(',')}) @content=#{@content.inspect}>"
330
- #~ else
331
- #~ return "<Class Element(#{self.ids.join(',')}) @attr=#{@attr.inspect}>"
332
- #~ end
333
- end
334
151
  #Accessor on content
335
152
  attr_reader :content
336
- #Add something to the content.
337
- #Only possible on elements, which supports "content".
153
+ #Logger of the element
154
+ attr_reader :log
155
+ =begin rdoc
156
+ Add something to the content.
157
+ Only possible on elements, which supports "content".
158
+ =end
338
159
  def << ( content )
339
160
  if @content
340
161
  @content << content
341
162
  else
342
- @log.warn("Add content to an element without this feature #{self.ids.inspect}, #{content.inspect}") if @log.warn?
163
+ @log.warn("Add content to an element without this feature #{self.inspect}, #{content.inspect}") if @log.warn?
343
164
  end
344
165
  end
345
166
 
346
- #Add content after a target (other content)
347
- # insertafter(target,*obj)
348
- #Requires the ability of "content".
349
- def insertafter(target,*obj)
350
- self.insert(target, 1, obj)
351
- end
352
- #Add content before a target (other content)
353
- # insertbefore(target,*obj)
354
- #Requires the ability of "content".
355
- def insertbefore(target,*obj)
356
- self.insert(target, 0, obj)
357
- end
358
- #Insert content relative to a given target.
359
- #The target must exist, pos defines the relative position (0=before, 1=one after the element).
360
- #Method called by Element#insertbefore and Element#insertafter.
167
+ =begin rdoc
168
+ Add content after a target (other content)
169
+ insertafter(target,*obj)
170
+ Requires the ability of "content".
171
+ =end
172
+ def insertafter(target,*obj)
173
+ self.insert(target, 1, obj)
174
+ end
175
+ =begin rdoc
176
+ Add content before a target (other content)
177
+ insertbefore(target,*obj)
178
+ Requires the ability of "content".
179
+ =end
180
+ def insertbefore(target,*obj)
181
+ self.insert(target, 0, obj)
182
+ end
183
+ =begin rdoc
184
+ Insert content relative to a given target.
185
+ The target must exist, pos defines the relative position (0=before, 1=one after the element).
186
+ Method called by Element#insertbefore and Element#insertafter.
187
+ =end
361
188
  def insert(target,pos,*obj )
362
189
  if @content
363
190
  if @content.include?( target )
364
191
  @content[@content.index(target)+pos ,0] = obj
365
192
  else
366
193
  @log.warn("Insert content not possible. Reference object does not exist (#{target.inspect})") if @log.warn?
367
- end
194
+ end
368
195
  else
369
196
  @log.warn("Add content to an element without this feature") if @log.warn?
370
197
  end
371
- self
198
+ self
372
199
  end
373
- #Delete the given object.
200
+ =begin rdoc
201
+ Delete the given object from content.
202
+ =end
374
203
  def delete(target )
375
204
  if @content
376
205
  @content.delete( target )
377
206
  else
378
207
  @log.warn("Delete content of an element without this feature") if @log.warn?
379
208
  end
380
- self
209
+ self
381
210
  end
382
- #Insert an empty line after the last entry
211
+ =begin rdoc
212
+ Insert an empty line after the last entry.
213
+
214
+ Example:
215
+ <tag>content</tag>[CR]
216
+ =end
383
217
  def cr()
384
218
  @crafter = true
385
219
  self
386
220
  end
387
- #Insert an empty line before and after the last entry
221
+ =begin rdoc
222
+ Insert an empty line before and after the last entry.
223
+
224
+ Example:
225
+ [CR]<tag>content</tag>[CR]
226
+ =end
388
227
  def Cr()
389
228
  @crbefore = true
390
229
  @crafter = true
391
230
  self
392
231
  end
393
- #Insert an empty line after the last entry and after the opening of the tag.
394
- #This feature has it reason for lists, when each :li-tag gets a cr.
395
- #The first item gets also a cr.
232
+ =begin rdoc
233
+ Insert an empty line after the last entry and after the opening of the tag.
234
+
235
+ Example:
236
+ <tag>[CR]content</tag>[CR]
237
+
238
+ This feature has it reason for lists, when each :li-tag gets a cr.
239
+ The first item gets also a cR.
240
+
241
+ Example:
242
+ <ul>
243
+ <li>item with cR</li>
244
+ <li>item with cr</li>
245
+ </ul>
246
+ =end
396
247
  def cR()
397
248
  @crbefore = false
398
249
  @crmid = true
399
250
  @crafter = true
400
251
  self
401
252
  end
402
- #Insert an empty line before and after the last entry and after the opening of the tag.
253
+ =begin rdoc
254
+ Insert an empty line before and after the last entry and after the opening of the tag.
255
+
256
+ Example:
257
+ [CR]<tag>[CR]content</tag>[CR]
258
+ =end
403
259
  def CR()
404
260
  @crbefore = true
405
261
  @crmid = true
406
262
  @crafter = true
407
263
  self
408
264
  end
409
- #Accessor on attribute list
265
+ =begin rdoc
266
+ Accessor on attribute list
267
+ =end
410
268
  attr_reader :attr
411
- #Return an attribute to add content.
269
+ =begin rdoc
270
+ Return an attribute to add content.
271
+
272
+ Example:
273
+ sec = element(:section, {}, 'title' )
274
+ sec[:shorttitle] << 'shorttitle'
275
+
276
+ Normally, this is the better solution:
277
+ sec = element(:section, { :shorttitle => 'shorttitle'}, 'title' )
278
+ =end
412
279
  def [] (key)
413
280
  attr = @attr[key]
414
281
  #If Attribute does not exist, take a look, if it is an alias-name.
415
282
  attr = @attr_alias[key] if !attr
416
- if !attr
417
- puts "Request unknown attribute '#{key}', return a dummy"
283
+ if ! attr
284
+ @log.warn("Request unknown attribute '#{key}', return a dummy (#{self.inspect})") if @log.warn?
418
285
  attr = Attribute.create( ).new(key, self)
419
286
  end
420
287
  return attr
421
288
  end
422
- #Default setting, each element class may contain contents.
423
- #Can be redefined by Elements.create.
424
- #-true: content available and necessary (e.g. <p>)
425
- #-:empty_ok: content available, but not necessary (e.g. <td>)
426
- #-false: no content, no endtag, but tag closed with / (example: <br />)
427
- #-nil: no content, no endtag, no closing (example: <br>)
289
+ =begin rdoc
290
+ Default setting, each element class may contain contents.
291
+ Can be redefined by meta-method Elements.has_no_content
292
+ - true: content available and necessary (e.g. Docgenerator::Elements::Paragraph)
293
+ - :empty_ok: content available, but not necessary (e.g. Docgenerator::Tables::Column)
294
+ - false: no content, no endtag, but tag closed with / (example: Docgenerator::Elements::Newline as < br/>)
295
+ - nil: no content, no endtag, no closing (example: Docgenerator::Elements::Newline as < br>)
296
+ =end
428
297
  def content?()
429
298
  return true
430
299
  end
431
- #check if there is content assigned.
300
+ =begin rdoc
301
+ check if there is content assigned.
302
+ =end
432
303
  def empty?()
433
304
  return @content.empty?
434
305
  end
435
306
  @@level = 0
436
- #Build a String to be used for the target document.
437
- #Calls
438
- #-Element#to_latex (target :latex),
439
- #-Element#to_context (target :context)
440
- #-Element#to_html (target :html)
441
- #-Element#to_wiki (target :wiki) (support stopped)
442
- #-Element#to_creole (target :creole) (not really good results)
443
- #-Element#to_text (target :text) (not really good results)
444
- #
445
- #Via the options-hash, you can transport additional information.
307
+ =begin rdoc
308
+ Build a String to be used for the target document.
309
+ Calls
310
+ * Element#to_latex (target :latex),
311
+ * Element#to_context (target :context)
312
+ * Element#to_html (target :html)
313
+ * Element#to_wiki (target :wiki) (support stopped)
314
+ * Element#to_creole (target :creole) (not really good results)
315
+ * Element#to_text (target :text) (not really good results)
316
+
317
+ Via the options-hash, you can transport additional information.
318
+ =end
446
319
  def to_doc( target, options = {} )
447
- o = Docgenerator_logger.set_option_defaults(options)
320
+ o = set_option_defaults(options)
448
321
  o[:log].debug("enter to_doc(#{target}) for #{self.inspect}, options: #{options.keys.inspect}") if o[:log].debug?
449
322
  #Return empty string, if target is not requested.
450
323
  if ! @targets.include?( target )
@@ -458,7 +331,7 @@ code
458
331
  #Some checks
459
332
  @attr.each{|k,v|
460
333
  if v.required? and v.to_s == '' and v.settings.include?(target)
461
- o[:log].error "#{self.ids}: Attribut '#{k}' without required value" if o[:log].error?
334
+ o[:log].error "#{self.inspect}: Attribut '#{k}' without required value" if o[:log].error?
462
335
  end
463
336
  }
464
337
  #Build the string.
@@ -485,82 +358,131 @@ code
485
358
  #~ result << "\n" if @crafter
486
359
  return result
487
360
  end
488
- #This is a dummy method, called from Element#to_s for the target format LaTeX.
489
- #This method must be overwritten from the element class.
490
- #
491
- #By default, the concatenation of all ids and the content is taken.
361
+ =begin rdoc
362
+ This is a dummy method, called from Element#to_s for the target format LaTeX.
363
+ This method must be overwritten from the element class.
364
+
365
+ By default, the concatenation of all ids and the content is taken.
366
+ =end
492
367
  def to_latex(options = {})
493
- o = Docgenerator_logger.set_option_defaults(options)
494
- o[:log].error("Missing output routine for LaTeX (#{self.ids.join(',')}) [#{@called_by}]") if o[:log].error?
368
+ o = set_option_defaults(options)
495
369
  makroname = 'dummy'
496
- self.ids.each{|id|
370
+ self.element_ids.each{|id|
497
371
  makroname = id if id.is_a?(Symbol) or id.is_a?(String)
498
372
  }
373
+ o[:log].error("Missing output routine for LaTeX, use \\#{makroname} (#{self.inspect})")
499
374
  cmd = ''
500
375
  cmd << "\n" if @crbefore
501
- cmd << "\\#{makroname}{#{@content}}"
376
+ cmd << "\\#{makroname}{#{@content.to_latex(options)}}"
502
377
  cmd << "\n" if @crafter
503
378
  return cmd
504
379
  end
505
- #Create context-output.
506
- #
507
- #ConTeXt-support is added later and there are a lot of gaps (2009-07-01)
380
+ =begin rdoc
381
+ Create context-output.
382
+
383
+ ConTeXt-support is added later and there are a lot of gaps (2009-07-01)
384
+ =end
508
385
  def to_context(options = {})
509
- o = Docgenerator_logger.set_option_defaults(options)
510
- o[:log].error("Missing output routine for ConTeXt (#{self.ids.join(',')}) [#{@called_by}]") if o[:log].error?
386
+ o = set_option_defaults(options)
511
387
  makroname = 'dummy'
512
- self.ids.each{|id|
388
+ self.element_ids.each{|id|
513
389
  makroname = id if id.is_a?(Symbol) or id.is_a?(String)
514
390
  }
391
+ o[:log].error("Missing output routine for ConTeXt, use \\#{makroname} (#{self.inspect})")
392
+
515
393
  cmd = ''
516
394
  cmd << "\n" if @crbefore
517
- cmd << "\\#{makroname}{#{@content}}"
395
+ cmd << "\\#{makroname}{#{@content.to_context(options)}}"
518
396
  cmd << "\n" if @crafter
519
397
  return cmd
520
398
  end
521
- #Method for definition inside Element.create.
399
+ =begin rdoc
400
+ Method for definition inside Element.create.
401
+ =end
522
402
  def linebreak( flag = true )
523
403
  flag ? "\n" : ''
524
404
  end
525
- #Prints the optional attribut key inside []. If empty, nil is returned
405
+ =begin rdoc
406
+ Prints the optional attribut key inside []. If empty, nil is returned
407
+ =end
526
408
  def texoptional(key)
527
- return nil if ! @attr[key].filled?
409
+ return nil unless @attr[key].filled?
528
410
  return "[#{@attr[key]}]"
529
411
  end
530
- #Build key-val options from attributs.
531
- #Used e.g. by includegraphics.
412
+ =begin rdoc
413
+ Build key-val options from attributs.
414
+ Used e.g. by includegraphics.
415
+
416
+ If the value is true, the value is added without '='.
417
+ false-values are ignored.
418
+
419
+ If you need a "value=true", then add 'true' as a string.
420
+
421
+ Example (Packages::IncludePDF):
422
+ class IncludePDF < Element
423
+ add_attribute :pages, Attribute.create( [ :texkeyval], [ String ] )
424
+ add_attribute :nup, Attribute.create( [ :texkeyval], [ /\d+x\d+/ ] ) #multiple logical pages onto each sheet of paper.
425
+ add_attribute :landscape, Attribute.create( [ :texkeyval], [ true, false ] ) #multiple logical pages onto each sheet of paper.
426
+ #...
427
+ add_output( :latex, '#{linebreak(@crbefore)}\includepdf[#{texkeyval()}]{#{@content}}#{linebreak(@crafter)}')
428
+ end
429
+
430
+ x = element(:includepdf, { :pages => '1-5', :nup => '2x2', :landscape => true }, 'filename')
431
+ puts x.texkeyval #pages={1-5}, nup={2x2}, landscape
432
+
433
+ x = element(:includepdf, { :pages => '1-5', :nup => '2x2', :landscape => false }, 'filename')
434
+ puts x.texkeyval #pages={1-5}, nup={2x2}
435
+
436
+
437
+ =end
532
438
  def texkeyval()
533
439
  keyval = []
534
440
  @attr.sort_by{|k,v| v.sortkey }.each{|k,v|
535
- keyval << "#{k}={#{v}}" if v.to_s != '' and v.texkeyval?
441
+ next unless v.texkeyval?
442
+ case v.content
443
+ when true, [true]; keyval << "#{k}"
444
+ when false, [false] #ignore
445
+ else #take the value
446
+ keyval << "#{k}={#{v}}" unless v.to_s.empty?
447
+ end
536
448
  }
537
449
  return keyval.join(', ')
538
450
  end
539
- #Method for html-output.
540
- #If the method is redefined, the result is taken as a tag.
451
+ =begin rdoc
452
+ Define the tag for html-output.
453
+
454
+ If the method is redefined, the result is taken as a tag.
455
+ Redfinition is made by Element.add_html_tag.
456
+
457
+ htmltag nil/false supress the output.
458
+ =end
541
459
  def htmltag()
542
460
  ''
543
461
  end
544
- #This is a dummy method, called from Element#to_doc for the target format HTML.
545
- #The tag from Element.htmltag is taken and all attributes and the content are used.
546
- #
547
- #This method can be overwritten from the element class.
462
+ =begin rdoc
463
+ This is a dummy method, called from Element#to_doc for the target format HTML.
464
+
465
+ The tag from Element#htmltag is taken and all attributes and the content are used.
466
+ If Element#htmltag is nil/false, nothing '' is returned.
467
+
468
+ This method can be overwritten from the element class.
469
+ =end
548
470
  def to_html(options = {})
549
- o = Docgenerator_logger.set_option_defaults(options)
471
+ o = set_option_defaults(options)
550
472
  tag = htmltag()
551
473
  if ! tag
552
- o[:log].error("No HTML element available (#{self.ids.join(',')})") if o[:log].error?
474
+ o[:log].error("No HTML element available (#{self.inspect})") if o[:log].error?
553
475
  return ''
554
476
  elsif tag == ''
555
477
  tag = 'span'
556
- o[:log].error("Missing output routine for HTML (#{self.ids.join(',')}) [#{@called_by}]") if o[:log].error?
478
+ o[:log].error("Missing output routine for HTML (#{self.inspect})") if o[:log].error?
557
479
  end
558
480
  #Test if the HTML-Tag should contain something, but there is nothing.
559
481
  #If :empty_ok it is ok, that there is no content (e.g <td>)
560
482
  #May make problems, if an empty tag is used to set a id-mark.
561
483
  if content?() and content? != :empty_ok and
562
484
  ( ! @content or @content == [] or @content == [nil] )
563
- o[:log].warn("HTML-Tag #{tag} without content -> ignored #{self.inspect if @@trace}") if o[:log].warn?
485
+ o[:log].warn("HTML-Tag #{tag} without content -> ignored #{self.inspect}") if o[:log].warn?
564
486
  return ''
565
487
  end
566
488
  html = String.new()
@@ -583,19 +505,29 @@ code
583
505
  html << "\n" if @crafter
584
506
  return html
585
507
  end #to_html
508
+ =begin rdoc
509
+ Return content in Wikimedia-Syntax.
510
+ Support stopped.
511
+ =end
586
512
  def to_wiki(options = {})
587
- o = Docgenerator_logger.set_option_defaults(options)
588
- o[:log].error("Missing output routine for Wiki (#{self.ids.join(',')}) [#{@called_by}]") if o[:log].error?
513
+ o = set_option_defaults(options)
514
+ o[:log].error("Missing output routine for Wiki (#{self.inspect})") if o[:log].error?
589
515
  return "#{@content.to_wiki(options)}\n"
590
516
  end
517
+ =begin rdoc
518
+ Return content in creole-Syntax.
519
+ =end
591
520
  def to_creole(options = {})
592
- o = Docgenerator_logger.set_option_defaults(options)
593
- o[:log].error("Missing output routine for creole (#{self.ids.join(',')}) [#{@called_by}]") if o[:log].error?
521
+ o = set_option_defaults(options)
522
+ o[:log].error("Missing output routine for creole (#{self.inspect})") if o[:log].error?
594
523
  return "#{@content.to_creole(options)}\n"
595
524
  end
525
+ =begin rdoc
526
+ Make an Text-Representation of the content.
527
+ =end
596
528
  def to_text(options = {})
597
- o = Docgenerator_logger.set_option_defaults(options)
598
- o[:log].error("Missing output routine for Text (#{self.ids.join(',')}) [#{@called_by}]") if o[:log].error?
529
+ o = set_option_defaults(options)
530
+ o[:log].error("Missing output routine for Text (#{self.inspect})") if o[:log].error?
599
531
  text = String.new()
600
532
  text << "\n" if @crbefore
601
533
  text = "#{@content.to_text(options)}".strip
@@ -605,4 +537,25 @@ code
605
537
  def to_s()
606
538
  return self.inspect
607
539
  end
608
- end #Element
540
+ end #Element
541
+ end #module Docgenerator
542
+
543
+ =begin rdoc
544
+ Returns an element of a type "name".
545
+ Attributes and content are optional parameter.
546
+
547
+ This method is defined global (outside Docgenerator-module)
548
+
549
+ If you call element with an undefined 'name',
550
+ you get an error message and an anonymous dummy class is created.
551
+ =end
552
+ def element( name, attr = {}, content = nil )
553
+ elementclass = Docgenerator::Element.get( name )
554
+ if ! elementclass #Create a dummy element.
555
+ #~ element = Docgenerator::Element.create( name, {}, true ).new(attr, content )
556
+ Docgenerator::DOCGENERATOR_LOGGER.error( "Usage of undefined element #{name}. Create an anonymous class")
557
+ elementclass = Class.new(Docgenerator::Element)
558
+ elementclass.add_id name
559
+ end
560
+ return elementclass.new(attr, content )
561
+ end