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
@@ -0,0 +1,447 @@
1
+ =begin rdoc
2
+ Code-generator for structex, a TeX-package to create Nassi-Shneidermann diagramms.
3
+
4
+ See examples a demonstration.
5
+
6
+ This plugin is defined for Creole and Wikitext.
7
+ Depending which classes are already defined, they are added as plugins.
8
+
9
+ =end
10
+ require 'docgenerator'
11
+
12
+ =begin rdoc
13
+ Extend Array class to build structogramms.
14
+ =end
15
+ class Array
16
+ =begin rdoc
17
+ Recursive extension for all structogramm elements.
18
+ So we can avoid a check, if the method is available.
19
+ =end
20
+ def to_structex
21
+ return self.map{|e|
22
+ if e.respond_to?( :to_structex )
23
+ e.to_structex
24
+ else
25
+ e
26
+ end
27
+ }.flatten
28
+ end
29
+ end
30
+
31
+
32
+ module Docgenerator
33
+ module Packages
34
+ =begin rdoc
35
+ Classes to provide support for the LaTeX-class struktex.
36
+
37
+ * http://www.ctan.org/tex-archive/macros/latex/contrib/struktex/
38
+ =end
39
+ module Struktex
40
+ USEPACKAGE_STRUKTEX = element(:usepackage,{}, 'struktex').cr
41
+ USEPACKAGE_STRUKTEX_PROOF = '\sProofOn '
42
+
43
+ #Bug: \pVar mag entgegen der Doku keine _ mag
44
+ REPL_UNDERSCORE = false
45
+
46
+ =begin rdoc
47
+ Code-generator for structex, a TeX-package to create Nassi-Shneidermann diagramms.
48
+
49
+ This is no subclass of Element, the initialize-method should get it's own
50
+ parameters.
51
+
52
+ To define define ele Element-methods, module Element_methods is included.
53
+ =end
54
+ class Structogramm
55
+
56
+ include Docgenerator::Element_methods #defines to_doc
57
+
58
+ PARSTRUCT = Struct.new('PARSTRUCT', :dir, :name, :text )
59
+ def self.head()
60
+ USEPACKAGE_STRUKTEX
61
+ end
62
+ attr_accessor :sourcecode
63
+ =begin rdoc
64
+ Define a structogramm.
65
+ =end
66
+ def initialize( title, x, y, code = String.new )
67
+ @title = title
68
+ @sourcecode = code
69
+ @x = x
70
+ @y = y
71
+ @elements = []
72
+
73
+ @log = Log4r::Logger.new("Structogramm #{title}")
74
+ @log.outputters = Log4r::StdoutOutputter.new('log_stdout')
75
+ end
76
+
77
+ def <<(code)
78
+ @sourcecode << code
79
+ @sourcecode << "\n"
80
+ end
81
+ #
82
+ #Analyse sourcecode and fill @elements
83
+ def analyse_sourcecode( code = @sourcecode )
84
+ stack = [ @elements ]
85
+ lastcmd = nil
86
+ code.each_line{|l|
87
+ l.strip!
88
+ case l
89
+ when /\A\s*#~/ #comment
90
+ when /\A%/
91
+ stack.last << l
92
+ when /ENDIF\s*(.*)/, /ENDCASE\s*(.*)/,
93
+ /ENDWHILE\s*(.*)/, /ENDFOREVER\s*(.*)/,
94
+ /ENDSELECT\s*(.*)/
95
+ #~ @elements << "\\ifend"
96
+ stack.pop #close actual IF
97
+ lastcmd = nil
98
+ when /IF\s*(.*)/
99
+ #~ @elements << "\\ifthenelse{3}{3}{#{$1}}{\\pTrue}{\\pFalse}"
100
+ struct = Structogramm_IF.new(inline($1))
101
+ stack.last << struct
102
+ stack << struct
103
+ lastcmd = nil
104
+ when /THEN\s*(\d)?\s*(.*)/
105
+ stack.last.thensize = $1 if $1
106
+ stack.last.thentext = inline($2) if $2 and ! $2.empty?
107
+ lastcmd = nil
108
+ when /ELSE\s*(\d)?\s*(.*)/
109
+ stack.last.elsesize = $1 if $1
110
+ stack.last.elsetext = inline($2) if $2 and ! $2.empty?
111
+ #~ @elements << "\\change"
112
+ stack.last.else
113
+ lastcmd = nil
114
+ when /CASE\s*(\d)?\s*(.*)/
115
+ struct = Structogramm_CASE.new( inline($2), $1, @log)
116
+ stack.last << struct
117
+ stack << struct
118
+ lastcmd = nil
119
+ when /(?:SWITCH|WHEN)(?:\[([crl])\])?\s*(.*)/
120
+ stack.last.switch(inline($2), $1)
121
+ lastcmd = nil
122
+ when /WHILE\s*(.*)/, /SELECT\s*(.*)/
123
+ struct = Structogramm_WHILE.new(inline($1))
124
+ stack.last << struct
125
+ stack << struct
126
+ lastcmd = nil
127
+ when /REPEAT\s*(.*)/
128
+ struct = Structogramm_REPEAT.new(inline($1))
129
+ stack.last << struct
130
+ stack << struct
131
+ lastcmd = nil
132
+ when /UNTIL\s*(.*)/
133
+ stack.last.condition = $1
134
+ stack.pop #close actual IF
135
+ lastcmd = nil
136
+ when /FOREVER\s*(.*)/
137
+ struct = Structogramm_FOREVER.new()
138
+ stack.last << struct
139
+ stack << struct
140
+ lastcmd = nil
141
+ when /<=\s*(.*)/
142
+ stack.last << lastcmd = Structogramm_CMD.new( "exit", inline($1) )
143
+ when /=>\s*(.*)/
144
+ stack.last << lastcmd = Structogramm_CMD.new( "sub", inline($1) )
145
+ when /<>\s*(.*)/
146
+ stack.last << lastcmd = Structogramm_CMD.new( "return", inline($1) )
147
+ when /(<->|<-|->)\s*(\S+)\s*(.*)/
148
+ if ! lastcmd
149
+ @log.warn("description #{l} without command") if @log.warn?
150
+ else
151
+ lastcmd.par << PARSTRUCT.new($1, inline($2), $3 )
152
+ end
153
+ else
154
+ stack.last << lastcmd = Structogramm_CMD.new( "assign", inline(l) )
155
+ end
156
+ }
157
+ end
158
+ def inline( inp )
159
+ #~ return inp.gsub(/'(.*?)'/, '\\pKey{\1}')
160
+ return Document.texify(inp).gsub(/'(.*?)'/, '\\pKey{\1}').gsub(/->/, '$\to$')
161
+ end
162
+ def to_s()
163
+ @sourcecode
164
+ end
165
+ #Print the source code in a verbatim environmet
166
+ def verbatim()
167
+ return element(:verbatim,{},@sourcecode.gsub(/\t/, ' ')).cR
168
+ end
169
+ #
170
+ #Option:
171
+ #-:centernss Flag if the structogramm should be entered in an environment.
172
+ def to_latex( options = {} )
173
+ options = options.merge( :centernss => true )
174
+ analyse_sourcecode()
175
+ tex = [nil]
176
+ tex << '\begin{centernss}' if options[:centernss]
177
+ tex << "\\begin{struktogramm}(#{@x},#{@y})[#{@title}]"
178
+ tex << @elements.to_structex.map{|e|
179
+ #~ "\t#{e}"
180
+ "#{e}"
181
+ }
182
+ tex << '\end{struktogramm}'
183
+ tex << '\end{centernss}' if options[:centernss]
184
+ tex << nil
185
+ #Gsub notwendig, da \pVar entgegen der Doku keine _ mag
186
+ if REPL_UNDERSCORE
187
+ return tex.join("\n").gsub(/_/, '\_')
188
+ else
189
+ return tex.join("\n")
190
+ end
191
+ end
192
+ #Return for wiki2docgenerator
193
+ def to_wiki( options = {} )
194
+ return <<xx
195
+ >>>structogramm{#{@title};#{@x};#{@y}}
196
+ #{@sourcecode}
197
+ <<<
198
+ xx
199
+ end #to_wiki
200
+ #Return for creole2doc
201
+ def to_creole( options = {} )
202
+ return <<xx
203
+ <<<structogramm|#{@title};#{@x};#{@y}
204
+ #{@sourcecode}
205
+ >>>
206
+ xx
207
+ end #to_creole
208
+
209
+
210
+ #Save TEX-code
211
+ def save( filename, overwrite = false )
212
+
213
+ old = nil
214
+ File.open( filename ){|f| old = f.readlines.to_s } if File.exists?(filename)
215
+
216
+ if /\.nss/ =~ filename
217
+ new = self.to_latex(:centernss => false)
218
+ else
219
+ new = self.to_latex()
220
+ end
221
+ if old != new
222
+ if overwrite or old == nil
223
+ File.open( filename, 'w'){|f|
224
+ f << new
225
+ }
226
+ @log.INFO("Save changed #{filename}") if @log.INFO?
227
+ else
228
+ @log.info("Changed #{filename}")
229
+ end
230
+ else
231
+ @log.INFO("Unchanged #{filename}") if @log.INFO?
232
+ end
233
+ #~ doc = Document.new(:include)
234
+ #~ doc.body << self.to_tex()
235
+ #~ doc.save( filename, overwrite )
236
+ end
237
+ end #Structogramm
238
+
239
+
240
+ class Structogramm_CMD
241
+ def initialize( type, cmd )
242
+ @type = type
243
+ @cmd = [ cmd ]
244
+ @par = []
245
+ end
246
+ #Interface definition of command.
247
+ attr_reader :par
248
+ #Add command... into if or else-branch
249
+ #~ def << (add)
250
+ #~ @cmd << add
251
+ #~ end
252
+ def to_structex()
253
+ tex = []
254
+ tex << "\\#{@type}{#{@cmd.join}"
255
+ if ! @par.empty?
256
+ #~ tex << "\\\\\\\\\n"
257
+ tex << "\\\\\n"
258
+ tex << interface(@par, nil)
259
+ #~ tex << interface(@par, 'Interface')
260
+ end
261
+ tex << "}"
262
+ return tex.join()
263
+ end
264
+ def interface( list, text )
265
+ return nil if list.empty?
266
+ interface = [ "\\begin{declaration}[#{text}]" ]
267
+ list.each{|par|
268
+ dir = nil
269
+ case par.dir
270
+ when '->'; dir = '$\\Rightarrow$'
271
+ when '<-'; dir = '$\\Leftarrow$'
272
+ when '<->'; dir = '$\\Leftrightarrow$'
273
+ end
274
+ #par.name may contain _
275
+ interface << "\\description{#{dir}\t#{par.name}}{#{par.text}}"
276
+ }
277
+ interface << "\\end{declaration}\n"
278
+ return interface.join("\n")
279
+ end
280
+ def inspect()
281
+ return "#<Structogramm_CMD: #{@type}>"
282
+ #~ return "#<IF: #{@ifstatement}>"
283
+ end
284
+ end
285
+
286
+ class Structogramm_WHILE
287
+ def initialize( whilestatement )
288
+ @whilestatement = whilestatement
289
+ @cmd = []
290
+ end
291
+ #Add command... into if or else-branch
292
+ def << (add)
293
+ @cmd << add
294
+ end
295
+ def to_structex()
296
+ tex = []
297
+ tex << "\\while{#{@whilestatement}}"
298
+ tex << @cmd.to_structex
299
+ tex << "\\whileend"
300
+ return tex.join("\n")
301
+ end
302
+ def inspect()
303
+ return "#<Structogramm_WHILE: #{@whilestatement}>"
304
+ #~ return "#<IF: #{@ifstatement}>"
305
+ end
306
+ end
307
+
308
+ class Structogramm_REPEAT
309
+ def initialize( repeatstatement )
310
+ @condition = repeatstatement
311
+ @cmd = []
312
+ end
313
+ attr_accessor :condition
314
+ #Add command... into if or else-branch
315
+ def << (add)
316
+ @cmd << add
317
+ end
318
+ def to_structex()
319
+ tex = []
320
+ tex << "\\until{#{@condition}}"
321
+ tex << @cmd.to_structex
322
+ tex << "\\untilend"
323
+ return tex.join("\n")
324
+ end
325
+ def inspect()
326
+ return "#<Structogramm_REPEAT: #{@condition}>"
327
+ #~ return "#<IF: #{@ifstatement}>"
328
+ end
329
+ end
330
+
331
+ class Structogramm_FOREVER
332
+ def initialize()
333
+ @cmd = []
334
+ end
335
+ #Add command... into if or else-branch
336
+ def << (add)
337
+ @cmd << add
338
+ end
339
+ def to_structex()
340
+ tex = []
341
+ tex << "\\forever"
342
+ tex << @cmd.to_structex
343
+ tex << "\\foreverend"
344
+ return tex.join("\n")
345
+ end
346
+ def inspect()
347
+ return "#<Structogramm_FOREVER>"
348
+ #~ return "#<IF: #{@ifstatement}>"
349
+ end
350
+ end
351
+
352
+ class Structogramm_IF
353
+ def initialize( ifstatement )
354
+ @ifstatement = ifstatement
355
+ @then = []
356
+ @else = nil #keep it empty, until method 'else' is called
357
+ @thentext = '\\pTrue'
358
+ @elsetext = '\\pFalse'
359
+ @thensize = 3
360
+ @elsesize = 3
361
+ end
362
+ #Text for 'then'-Branch. default: \pTrue
363
+ attr_writer :thentext
364
+ #Text for 'else'-Branch
365
+ attr_writer :elsetext
366
+ #Textwidth for 'then'-Branch
367
+ attr_writer :thensize
368
+ #Textwidth for 'else'-Branch
369
+ attr_writer :elsesize
370
+ #Add command... into if or else-branch
371
+ def << (add)
372
+ @else ? @else << add : @then << add
373
+ end
374
+ #Change from then-branch to else-branch
375
+ def else()
376
+ @else = []
377
+ end
378
+ def to_structex()
379
+ tex = []
380
+ tex << "\\ifthenelse{#{@thensize}}{#{@elsesize}}{#{@ifstatement}}{#{@thentext}}{#{@elsetext}}"
381
+ tex << @then.to_structex
382
+ tex << "\\change"
383
+ tex << @else.to_structex
384
+ tex << "\\ifend"
385
+ return tex.join("\n")
386
+ end
387
+ def inspect()
388
+ return "#<Structogramm_IF: #{@ifstatement}>"
389
+ #~ return "#<IF: #{@ifstatement}>"
390
+ end
391
+ end
392
+
393
+ class Structogramm_CASE
394
+ def initialize( casevar, degree = 4, log = Log4r::Logger.new('log') )
395
+ @casevar = casevar
396
+ @degree = degree.to_i
397
+ if @degree == 0
398
+ @log.warn("CASE #{casevar} mit degree 0") if @log.warn?
399
+ end
400
+ @cmd = []
401
+ @switches = [] #List of branches.
402
+ end
403
+ def << (add)
404
+ @cmd << add
405
+ end
406
+ #Change branch.
407
+ def switch( condition, option = nil )
408
+ switch = Structogramm_SWITCH.new( condition, option )
409
+ #The first branch is part of the \case-statement
410
+ @cmd << switch if ! @switches.empty?
411
+ @switches << switch
412
+ end
413
+ def to_structex()
414
+ tex = []
415
+ tex << "\\case{#{@degree}}{#{@switches.size}}{#{@casevar}}{#{@switches.first.value}}"
416
+ tex << @cmd.to_structex
417
+ tex << "\\caseend"
418
+ return tex.join("\n")
419
+ end
420
+ def inspect()
421
+ return "#<Structogramm_CASE: #{@casestatement}>"
422
+ #~ return "#<IF: #{@ifstatement}>"
423
+ end
424
+ end
425
+
426
+ class Structogramm_SWITCH
427
+ def initialize( value, option )
428
+ @value = value
429
+ @option = option
430
+ end
431
+ attr_reader :value
432
+ def to_structex()
433
+ tex = []
434
+ tex << "\\switch"
435
+ tex << "[#{@option}]" if @option
436
+ tex << "{#{@value}}"
437
+ return tex.join()
438
+ end
439
+ def inspect()
440
+ return "#<Structogramm_SWITCH: #{@value}>"
441
+ #~ return "#<IF: #{@ifstatement}>"
442
+ end
443
+ end
444
+
445
+ end #module Struktex
446
+ end #module Packages
447
+ end #module Docgenerator
@@ -0,0 +1,85 @@
1
+ module Docgenerator
2
+ module Packages
3
+ =begin rdoc
4
+ Support of the LaTeX-package todonotes.
5
+
6
+ * http://ctan.org/pkg/todonotes
7
+ =end
8
+ module Todonotes
9
+ =begin rdoc
10
+
11
+ Example:
12
+ ...
13
+ \usepackage{todonotes}
14
+ ...
15
+ \newcommand{\addref}{\todo[color=red!40]{Addreference.}}
16
+ \newcommand{\rewrite}[1]{\todo[color=green!40]{#1}}
17
+ ...
18
+ % ----------------------------------------------------------------
19
+ \begin{document}
20
+ \blindtext\todo{AAA}\todo{BBB}\todo{CCC}\blindtext
21
+
22
+ \blindtext\todo{AAA}\todo[color=yellow]{BBB}\todo[color=green]{CCC}\blindtext
23
+
24
+ \blindtext\todo[inline]{AAA}\blindtext
25
+ =end
26
+ class Todo < Element
27
+
28
+ add_attributes( {
29
+ #~ disable The disable option can be given directly to the todo command. If given the command has no effect.
30
+ :color => Attribute.create( [ :texkeyval], [ String ] ),
31
+ :backgroundcolor => Attribute.create( [ :texkeyval], [ String ] ),
32
+ :linecolor => Attribute.create( [ :texkeyval], [ String ] ),
33
+ :bordercolor => Attribute.create( [ :texkeyval], [ String ] ),
34
+ :inline => Attribute.create( [ :texkeyval], [ true, false ] ),
35
+ =begin
36
+ more options:
37
+ line / noline
38
+ inline / noinline
39
+ size
40
+ list / nolist When the option nolist is given, the todo item will not appear in the list of todos.
41
+ caption For listoftodos
42
+ =end
43
+ }#.update(HTML_ATTR_ALL)
44
+ )
45
+
46
+ add_output( :latex, '#{linebreak(@crbefore)}\todo[#{texkeyval()}]{#{@content}}#{linebreak(@crafter)}')
47
+
48
+ def self.head()
49
+ element(:usepackage, {}, 'todonotes').cr
50
+ end
51
+ end #Todonotes::Todo
52
+
53
+
54
+ =begin rdoc
55
+ Define Element :missingfigure
56
+
57
+ Create an instance with
58
+ element( :missingfigure, [ attributes, [content]] )
59
+ or
60
+ Missingfigure.new( [ attributes, [content]] )
61
+ Attributes may be:
62
+ * :figwidth:
63
+ =end
64
+ class Missingfigure < Element
65
+ add_attribute :figwidth, Attribute.create([:texkeyval], [Integer, String] ) #String for \textwidth... for HTML use CSS
66
+ add_latex_output '\missingfigure{#{@content}}'
67
+ end #Missingfigure
68
+
69
+ =begin rdoc
70
+ Define Element :listoftodos
71
+
72
+ Create an instance with
73
+ element( :listoftodos, [ attributes, [content]] )
74
+ or
75
+ Listoftodos.new( [ attributes, [content]] )
76
+ Attributes are not defined for this element.
77
+ =end
78
+ class Listoftodos < Element
79
+ has_no_content false
80
+ add_latex_output '\listoftodos'
81
+ end #Listoftodos
82
+
83
+ end #module Todonotes
84
+ end #module Packages
85
+ end #Docgenerator