Bayeux 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (238) hide show
  1. data/.hgrc +2 -0
  2. data/.rvmrc +27 -0
  3. data/Gemfile +42 -0
  4. data/Gemfile.lock +42 -0
  5. data/HISTORY +63 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +89 -0
  8. data/VERSION +1 -0
  9. data/bib/Modules.bib +21 -0
  10. data/code/render/latex/active4d.render +132 -0
  11. data/code/render/latex/all_hallows_eve.render +96 -0
  12. data/code/render/latex/amy.render +171 -0
  13. data/code/render/latex/blackboard.render +111 -0
  14. data/code/render/latex/brilliance_black.render +552 -0
  15. data/code/render/latex/brilliance_dull.render +561 -0
  16. data/code/render/latex/cobalt.render +162 -0
  17. data/code/render/latex/dawn.render +126 -0
  18. data/code/render/latex/eiffel.render +132 -0
  19. data/code/render/latex/espresso_libre.render +123 -0
  20. data/code/render/latex/idle.render +93 -0
  21. data/code/render/latex/iplastic.render +99 -0
  22. data/code/render/latex/lazy.render +96 -0
  23. data/code/render/latex/mac_classic.render +135 -0
  24. data/code/render/latex/magicwb_amiga.render +117 -0
  25. data/code/render/latex/pastels_on_dark.render +204 -0
  26. data/code/render/latex/slush_poppies.render +123 -0
  27. data/code/render/latex/spacecadet.render +81 -0
  28. data/code/render/latex/sunburst.render +186 -0
  29. data/code/render/latex/twilight.render +153 -0
  30. data/code/render/latex/zenburnesque.render +126 -0
  31. data/code/render/old/txt2tags.render +131 -0
  32. data/code/render/xhtml/active4d.render +140 -0
  33. data/code/render/xhtml/all_hallows_eve.render +104 -0
  34. data/code/render/xhtml/amy.render +179 -0
  35. data/code/render/xhtml/blackboard.render +119 -0
  36. data/code/render/xhtml/brilliance_black.render +560 -0
  37. data/code/render/xhtml/brilliance_dull.render +569 -0
  38. data/code/render/xhtml/cobalt.render +170 -0
  39. data/code/render/xhtml/dawn.render +134 -0
  40. data/code/render/xhtml/eiffel.render +140 -0
  41. data/code/render/xhtml/espresso_libre.render +131 -0
  42. data/code/render/xhtml/files/css/active4d.css +114 -0
  43. data/code/render/xhtml/files/css/all_hallows_eve.css +72 -0
  44. data/code/render/xhtml/files/css/amy.css +147 -0
  45. data/code/render/xhtml/files/css/blackboard.css +88 -0
  46. data/code/render/xhtml/files/css/brilliance_black.css +605 -0
  47. data/code/render/xhtml/files/css/brilliance_dull.css +599 -0
  48. data/code/render/xhtml/files/css/cobalt.css +149 -0
  49. data/code/render/xhtml/files/css/dawn.css +121 -0
  50. data/code/render/xhtml/files/css/eiffel.css +121 -0
  51. data/code/render/xhtml/files/css/espresso_libre.css +109 -0
  52. data/code/render/xhtml/files/css/idle.css +62 -0
  53. data/code/render/xhtml/files/css/iplastic.css +80 -0
  54. data/code/render/xhtml/files/css/lazy.css +73 -0
  55. data/code/render/xhtml/files/css/mac_classic.css +123 -0
  56. data/code/render/xhtml/files/css/magicwb_amiga.css +104 -0
  57. data/code/render/xhtml/files/css/pastels_on_dark.css +188 -0
  58. data/code/render/xhtml/files/css/slush_poppies.css +85 -0
  59. data/code/render/xhtml/files/css/spacecadet.css +51 -0
  60. data/code/render/xhtml/files/css/sunburst.css +180 -0
  61. data/code/render/xhtml/files/css/twilight.css +137 -0
  62. data/code/render/xhtml/files/css/zenburnesque.css +91 -0
  63. data/code/render/xhtml/idle.render +101 -0
  64. data/code/render/xhtml/iplastic.render +107 -0
  65. data/code/render/xhtml/lazy.render +104 -0
  66. data/code/render/xhtml/mac_classic.render +143 -0
  67. data/code/render/xhtml/magicwb_amiga.render +125 -0
  68. data/code/render/xhtml/pastels_on_dark.render +212 -0
  69. data/code/render/xhtml/slush_poppies.render +131 -0
  70. data/code/render/xhtml/spacecadet.render +89 -0
  71. data/code/render/xhtml/sunburst.render +194 -0
  72. data/code/render/xhtml/twilight.render +161 -0
  73. data/code/render/xhtml/zenburnesque.render +134 -0
  74. data/code/syntax/actionscript.syntax +97 -0
  75. data/code/syntax/active4d.syntax +276 -0
  76. data/code/syntax/active4d_html.syntax +311 -0
  77. data/code/syntax/active4d_ini.syntax +50 -0
  78. data/code/syntax/active4d_library.syntax +21 -0
  79. data/code/syntax/ada.syntax +33 -0
  80. data/code/syntax/antlr.syntax +151 -0
  81. data/code/syntax/apache.syntax +191 -0
  82. data/code/syntax/applescript.syntax +384 -0
  83. data/code/syntax/asp.syntax +70 -0
  84. data/code/syntax/asp_vb.net.syntax +129 -0
  85. data/code/syntax/bibtex.syntax +151 -0
  86. data/code/syntax/blog_html.syntax +41 -0
  87. data/code/syntax/blog_markdown.syntax +42 -0
  88. data/code/syntax/blog_text.syntax +27 -0
  89. data/code/syntax/blog_textile.syntax +27 -0
  90. data/code/syntax/build.syntax +53 -0
  91. data/code/syntax/bulletin_board.syntax +287 -0
  92. data/code/syntax/cake.syntax +55 -0
  93. data/code/syntax/camlp4.syntax +36 -0
  94. data/code/syntax/cm.syntax +32 -0
  95. data/code/syntax/coldfusion.syntax +119 -0
  96. data/code/syntax/context_free.syntax +176 -0
  97. data/code/syntax/cs.syntax +59 -0
  98. data/code/syntax/css.syntax +195 -0
  99. data/code/syntax/css_experimental.syntax +1925 -0
  100. data/code/syntax/csv.syntax +68 -0
  101. data/code/syntax/d.syntax +142 -0
  102. data/code/syntax/diff.syntax +81 -0
  103. data/code/syntax/dokuwiki.syntax +204 -0
  104. data/code/syntax/dot.syntax +47 -0
  105. data/code/syntax/doxygen.syntax +43 -0
  106. data/code/syntax/dylan.syntax +62 -0
  107. data/code/syntax/eiffel.syntax +78 -0
  108. data/code/syntax/erlang.syntax +922 -0
  109. data/code/syntax/f-script.syntax +80 -0
  110. data/code/syntax/fortran.syntax +141 -0
  111. data/code/syntax/fxscript.syntax +142 -0
  112. data/code/syntax/greasemonkey.syntax +34 -0
  113. data/code/syntax/gri.syntax +83 -0
  114. data/code/syntax/groovy.syntax +191 -0
  115. data/code/syntax/gtd.syntax +22 -0
  116. data/code/syntax/gtdalt.syntax +143 -0
  117. data/code/syntax/haml.syntax +88 -0
  118. data/code/syntax/haskell.syntax +88 -0
  119. data/code/syntax/html-asp.syntax +27 -0
  120. data/code/syntax/html.syntax +362 -0
  121. data/code/syntax/html_django.syntax +36 -0
  122. data/code/syntax/html_for_asp.net.syntax +424 -0
  123. data/code/syntax/html_mason.syntax +119 -0
  124. data/code/syntax/html_rails.syntax +40 -0
  125. data/code/syntax/html_tcl.syntax +26 -0
  126. data/code/syntax/icalendar.syntax +32 -0
  127. data/code/syntax/inform.syntax +48 -0
  128. data/code/syntax/ini.syntax +55 -0
  129. data/code/syntax/installer_distribution_script.syntax +77 -0
  130. data/code/syntax/io.syntax +81 -0
  131. data/code/syntax/java.syntax +211 -0
  132. data/code/syntax/javaproperties.syntax +20 -0
  133. data/code/syntax/javascript.syntax +256 -0
  134. data/code/syntax/javascript_+_prototype.syntax +72 -0
  135. data/code/syntax/javascript_+_prototype_bracketed.syntax +140 -0
  136. data/code/syntax/jquery_javascript.syntax +114 -0
  137. data/code/syntax/json.syntax +136 -0
  138. data/code/syntax/languagedefinition.syntax +708 -0
  139. data/code/syntax/latex.syntax +566 -0
  140. data/code/syntax/latex_beamer.syntax +41 -0
  141. data/code/syntax/latex_log.syntax +50 -0
  142. data/code/syntax/latex_memoir.syntax +64 -0
  143. data/code/syntax/lexflex.syntax +219 -0
  144. data/code/syntax/lighttpd.syntax +54 -0
  145. data/code/syntax/lilypond.syntax +492 -0
  146. data/code/syntax/lisp.syntax +61 -0
  147. data/code/syntax/literate_haskell.syntax +24 -0
  148. data/code/syntax/logo.syntax +29 -0
  149. data/code/syntax/logtalk.syntax +152 -0
  150. data/code/syntax/lua.syntax +86 -0
  151. data/code/syntax/m.syntax +142 -0
  152. data/code/syntax/macports_portfile.syntax +163 -0
  153. data/code/syntax/makefile.syntax +36 -0
  154. data/code/syntax/man.syntax +17 -0
  155. data/code/syntax/mediawiki.syntax +567 -0
  156. data/code/syntax/mips.syntax +66 -0
  157. data/code/syntax/mod_perl.syntax +50 -0
  158. data/code/syntax/modula-3.syntax +47 -0
  159. data/code/syntax/moinmoin.syntax +189 -0
  160. data/code/syntax/mootools.syntax +572 -0
  161. data/code/syntax/movable_type.syntax +162 -0
  162. data/code/syntax/multimarkdown.syntax +39 -0
  163. data/code/syntax/objective-c++.syntax +18 -0
  164. data/code/syntax/objective-c.syntax +233 -0
  165. data/code/syntax/ocaml.syntax +764 -0
  166. data/code/syntax/ocamllex.syntax +167 -0
  167. data/code/syntax/ocamlyacc.syntax +184 -0
  168. data/code/syntax/opengl.syntax +14 -0
  169. data/code/syntax/pascal.syntax +77 -0
  170. data/code/syntax/perl.syntax +1115 -0
  171. data/code/syntax/plain_text.syntax +32 -0
  172. data/code/syntax/postscript.syntax +114 -0
  173. data/code/syntax/processing.syntax +106 -0
  174. data/code/syntax/prolog.syntax +40 -0
  175. data/code/syntax/property_list.syntax +635 -0
  176. data/code/syntax/python.syntax +868 -0
  177. data/code/syntax/python_django.syntax +21 -0
  178. data/code/syntax/qmake_project.syntax +114 -0
  179. data/code/syntax/qt_c++.syntax +26 -0
  180. data/code/syntax/quake3_config.syntax +32 -0
  181. data/code/syntax/r.syntax +81 -0
  182. data/code/syntax/r_console.syntax +16 -0
  183. data/code/syntax/ragel.syntax +201 -0
  184. data/code/syntax/rd_r_documentation.syntax +91 -0
  185. data/code/syntax/regexp.syntax +50 -0
  186. data/code/syntax/release_notes.syntax +46 -0
  187. data/code/syntax/remind.syntax +253 -0
  188. data/code/syntax/restructuredtext.syntax +250 -0
  189. data/code/syntax/rez.syntax +80 -0
  190. data/code/syntax/ruby.syntax +1035 -0
  191. data/code/syntax/ruby_experimental.syntax +145 -0
  192. data/code/syntax/ruby_on_rails.syntax +88 -0
  193. data/code/syntax/s5.syntax +69 -0
  194. data/code/syntax/scheme.syntax +347 -0
  195. data/code/syntax/scilab.syntax +41 -0
  196. data/code/syntax/setext.syntax +147 -0
  197. data/code/syntax/shell-unix-generic.syntax +384 -0
  198. data/code/syntax/slate.syntax +149 -0
  199. data/code/syntax/sql.syntax +237 -0
  200. data/code/syntax/sql_rails.syntax +18 -0
  201. data/code/syntax/ssh-config.syntax +33 -0
  202. data/code/syntax/standard_ml.syntax +121 -0
  203. data/code/syntax/strings_file.syntax +39 -0
  204. data/code/syntax/subversion_commit_message.syntax +36 -0
  205. data/code/syntax/sweave.syntax +84 -0
  206. data/code/syntax/swig.syntax +57 -0
  207. data/code/syntax/tcl.syntax +152 -0
  208. data/code/syntax/template_toolkit.syntax +121 -0
  209. data/code/syntax/tex.syntax +86 -0
  210. data/code/syntax/tex_math.syntax +49 -0
  211. data/code/syntax/textile.syntax +215 -0
  212. data/code/syntax/tsv.syntax +50 -0
  213. data/code/syntax/twiki.syntax +241 -0
  214. data/code/syntax/txt2tags.syntax +79 -0
  215. data/code/syntax/vectorscript.syntax +57 -0
  216. data/code/syntax/xhtml_1.0.syntax +4027 -0
  217. data/code/syntax/xml.syntax +180 -0
  218. data/code/syntax/xml_strict.syntax +92 -0
  219. data/code/syntax/xsl.syntax +60 -0
  220. data/code/syntax/yaml.syntax +160 -0
  221. data/code/syntax/yui_javascript.syntax +176 -0
  222. data/lib/bayeux/bayeux.rb +727 -0
  223. data/lib/bayeux/html_gen.rb +506 -0
  224. data/lib/bayeux/latex_gen.rb +333 -0
  225. data/lib/bayeux/para_block.rb +201 -0
  226. data/lib/bayeux/text_gen.rb +307 -0
  227. data/lib/bayeux/tree_walker.rb +166 -0
  228. data/lib/filters/bayeux.rb +44 -0
  229. data/lib/filters/pandoc.rb +23 -0
  230. data/lib/filters/section_id.rb +105 -0
  231. data/lib/helpers/breadcrumbs.rb +64 -0
  232. data/lib/helpers/site_toc.rb +11 -0
  233. data/lib/lib/uv.rb +92 -0
  234. data/lib/lib/uv/render_processor.rb +146 -0
  235. data/lib/lib/uv/utility.rb +67 -0
  236. data/lib/refs/Doc_Blocks.rb +2 -0
  237. data/lib/refs/References.rb +104 -0
  238. metadata +415 -0
@@ -0,0 +1,506 @@
1
+ require 'tidy_ffi'
2
+ require 'uv'
3
+
4
+ require 'log4r'
5
+ include Log4r
6
+
7
+ class BayeuxHTMLGen
8
+
9
+ # Default Constructor
10
+ def initialize(syntax_tree)
11
+ @syntax_tree = syntax_tree
12
+ @html_string = String.new
13
+ end
14
+
15
+ # Return the AST as an HTML string (stored in @html_string)
16
+ def generate
17
+
18
+ # Set-up the logger
19
+ @html_gen_log = Logger.new('bayex_html_gen')
20
+ @html_gen_log.outputters = Outputter.stdout
21
+
22
+ # Create a walker for the trees in the forest
23
+ walker = TreeWalker.new
24
+
25
+ walker.on_before_down = self.method(:generate_node_start)
26
+ walker.on_after_up = self.method(:generate_node_end)
27
+
28
+ walker.on_no_siblings = self.method(:generate_full_node)
29
+ walker.on_no_children = self.method(:generate_full_node)
30
+
31
+ # Clear the internal HTML representation
32
+ @html_string.clear
33
+
34
+ # Walk the forest
35
+ @syntax_tree.block_forest.each{|tree|
36
+ walker.walk_tree(tree)
37
+ }
38
+
39
+ #@html_gen_log.debug {@syntax_tree.to_s}
40
+ #@html_gen_log.info {@html_string}
41
+
42
+ # Remove extra spaces between entities and tags
43
+ @html_string.gsub!(/;[\s]+</,';<')
44
+
45
+ # Return the generated string to the caller
46
+ tidy = TidyFFI::Tidy.new(@html_string)
47
+
48
+ tidy.options.fix_uri = 1
49
+ tidy.options.indent = 1
50
+ tidy.options.join_classes = 1
51
+ tidy.options.markup = 1
52
+ tidy.options.output_html = 1
53
+ tidy.options.punctuation_wrap = 1
54
+ tidy.options.show_body_only = 1
55
+
56
+ return tidy.clean
57
+ end
58
+
59
+ # Return the table of contents, extract from the AST
60
+ def doc_toc
61
+
62
+ # ToC to return to the caller
63
+ toc = String.new
64
+
65
+ # The current heading level
66
+ current_level = 0
67
+
68
+ # The last heading level
69
+ # Note: The very top level is provided
70
+ # by the enclosing template. Effectivly
71
+ # we are skipping the enclosures for the L1
72
+ # headers
73
+ last_level = 2
74
+
75
+ # Set containing valid header tags (ignore level 1 tags)
76
+ header_tags = Set.new [:h2, :h3, :h4, :h5, :h6]
77
+
78
+ # Walk the forest
79
+ @syntax_tree.block_forest.each{|tree|
80
+
81
+ # Ignore if not a header
82
+ if header_tags.include?(tree.content.type) then
83
+
84
+ # Set the current level based on the header
85
+ case tree.content.type
86
+ when :h1
87
+ current_level = 1
88
+ when :h2
89
+ current_level = 2
90
+ when :h3
91
+ current_level = 3
92
+ when :h4
93
+ current_level = 4
94
+ when :h5
95
+ current_level = 5
96
+ when :h6
97
+ current_level = 6
98
+ end
99
+
100
+ # Write out the toc
101
+ if current_level < last_level then
102
+
103
+ # Moving up: so close off the last level,
104
+ # create a new level, and record the current
105
+ # item
106
+
107
+ unless last_level == 0 then
108
+ toc << "</ul>"
109
+ end
110
+
111
+ toc << "#{indent(last_level)}<ul>\n"
112
+ toc << "#{indent(current_level)}<li><a href=\"##{header_id(tree.content.content)}\">#{tree.content.content}</a></li>\n"
113
+
114
+ elsif current_level > last_level then
115
+
116
+ # Moving down: so add a new list as a sub-list of
117
+ # the current list, and record the current item
118
+
119
+ toc << "#{indent(last_level)}<ul>\n"
120
+ toc << "#{indent(current_level)}<li><a href=\"##{header_id(tree.content.content)}\">#{tree.content.content}</a></li>\n"
121
+
122
+ else
123
+ # This header is at the same level, so just output the
124
+ # list item
125
+ toc << "#{indent(current_level)}<li><a href=\"##{header_id(tree.content.content)}\">#{tree.content.content}</a></li>\n"
126
+
127
+ end
128
+
129
+ # Record the current level
130
+ last_level = current_level
131
+ end
132
+ }
133
+
134
+ # Close off the lists
135
+ current_level.downto(3){|index|
136
+ toc << "#{indent(index)}</ul>\n"
137
+ }
138
+
139
+ return toc
140
+ end
141
+
142
+ ###
143
+ ### Walker Hooks. These are called by the tree walker on specific
144
+ ### events
145
+ ###
146
+
147
+ # Output the full contents of the node, properly bracketed as an
148
+ # HTML expression. This is only called if we have no sub-nodes to
149
+ # deal with
150
+ def generate_full_node(block)
151
+
152
+ # Check if we need to add a space
153
+ # Check if we need to add a space
154
+ if not block.content[0] =~ /\s|[:;.,?!]/
155
+ @html_string << " "
156
+ end
157
+
158
+ case block.type
159
+
160
+ # Headers
161
+ when :h1
162
+ @html_string << "<h1 id=\"#{header_id(block.content)}\">#{block.content}</h1>"
163
+ when :h2
164
+ @html_string << "<h2 id=\"#{header_id(block.content)}\">#{block.content}</h2>"
165
+ when :h3
166
+ @html_string << "<h3 id=\"#{header_id(block.content)}\">#{block.content}</h3>"
167
+ when :h4
168
+ @html_string << "<h4 id=\"#{header_id(block.content)}\">#{block.content}</h4>"
169
+ when :h5
170
+ @html_string << "<h5 id=\"#{header_id(block.content)}\">#{block.content}</h5>"
171
+ when :h5
172
+ @html_string << "<h6 id=\"#{header_id(block.content)}\">#{block.content}</h6>"
173
+
174
+ # Ordinary paragraphs
175
+ when :paragraph
176
+ @html_string << "<p>#{typeset(block.content)}</p>"
177
+
178
+ when :none
179
+ @html_string << "#{typeset(block.content)}"
180
+
181
+ # Special paragraphs
182
+ when :block_quote
183
+ @html_string << "<blockquote>#{typeset(block.content)}</blockquote>"
184
+ when :single_quote
185
+ @html_string << "&lsquo;&#8202;#{typeset(block.content)}&#8202;&rsquo;"
186
+ when :double_quote
187
+ @html_string << "&ldquo;&#8202;#{typeset(block.content)}&#8202;&rdquo;"
188
+
189
+ when :note
190
+ @html_string << "<p class=\"note\"><span class=\"note_header\">Note:</span>#{typeset(block.content)}</span></p>"
191
+
192
+ when :command
193
+ @html_string << "<p class=\"command\">#{block.content}</span>"
194
+
195
+ when :code_language
196
+ @code_language = block.content
197
+ when :code_start_number
198
+ @code_start_number = block.content
199
+
200
+ when :file
201
+ @html_string << "<pre class=\"file\">#{block.content}</pre>"
202
+ when :output
203
+ @html_string << "<pre class=\"output\">#{block.content}</pre>"
204
+
205
+ # Special Characters
206
+ when :em_dash
207
+ @html_string << "&mdash;"
208
+ when :en_dash
209
+ @html_string << "&ndash;"
210
+ when :elipses
211
+ @html_string << "&#8202;.&thinsp;&#8202;.&thinsp;&#8202;.&thinsp;"
212
+ when :elipses_stop
213
+ @html_string << "&#8202;.&thinsp;&#8202;.&thinsp;&#8202;.&thinsp;."
214
+
215
+ # Links
216
+ when :link_target
217
+ @link_target = block.content
218
+ when :link_text
219
+ @link_text = block.content
220
+
221
+ # Lists
222
+ when :item
223
+ @html_string << "<li>#{typeset(block.content)}</li>"
224
+
225
+ when :dl_header
226
+ @html_string << "<dt>#{block.content}</dt>"
227
+ when :dl_text
228
+ @html_string << "<dd>#{block.content}</dd>"
229
+
230
+ # Tags
231
+ when :ac
232
+ # Do we know anything about this acronymn?
233
+ if $reference.acronym_list.include?(block.content) then
234
+
235
+ # Assemble from the reference list
236
+ if $reference.acronym_list[block.content].include?('text_html') then
237
+ acronym = $reference.acronym_list[block.content]['text_html']
238
+ else
239
+ acronym = $reference.acronym_list[block.content]['text']
240
+ end
241
+
242
+ definition = $reference.acronym_list[block.content]['def']
243
+
244
+ @html_string << "<acronym title=\"#{definition}\">#{acronym}</acronym>"
245
+ else
246
+ # Do what we can
247
+ @html_string << "<acronym>#{block.content}</acronym>"
248
+ end
249
+
250
+ when :emph
251
+ @html_string << "<em>#{block.content}</em>"
252
+
253
+ when :tt
254
+ @html_string << "<tt>#{block.content}</tt>"
255
+
256
+ end
257
+ end
258
+
259
+ # Output only the start of a node
260
+ def generate_node_start(block)
261
+
262
+ # Check if we need to add a space
263
+ if not block.content[0] =~ /\s|[:;.,?!]/
264
+ @html_string << " "
265
+ end
266
+
267
+ case block.type
268
+
269
+ # Headers
270
+ when :h1
271
+ @html_string << "<h1 id=\"#{header_id(block.content)}\">"
272
+ when :h2
273
+ @html_string << "<h2 id=\"#{header_id(block.content)}\">"
274
+ when :h3
275
+ @html_string << "<h3 id=\"#{header_id(block.content)}\">"
276
+ when :h4
277
+ @html_string << "<h4 id=\"#{header_id(block.content)}\">"
278
+ when :h5
279
+ @html_string << "<h5 id=\"#{header_id(block.content)}\">"
280
+ when :h5
281
+ @html_string << "<h6 id=\"#{header_id(block.content)}\">"
282
+
283
+ # Ordinary paragraphs
284
+ when :paragraph
285
+ @html_string << "<p>#{typeset(block.content)}"
286
+
287
+ when :none
288
+ @html_string << "#{block.content}"
289
+
290
+ # Special paragraphs
291
+ when :block_quote
292
+ @html_string << "<blockquote>#{typeset(block.content)}"
293
+ when :single_quote
294
+ @html_string << "&lsquo;&#8202;#{typeset(block.content)}"
295
+ when :double_quote
296
+ @html_string << "&ldquo;&#8202;#{typeset(block.content)}"
297
+
298
+ when :note
299
+ @html_string << "<p class=\"note\"><span class=\"note_header\">Note:</span>#{typeset(block.content)}"
300
+
301
+ when :command
302
+ @html_string << "<p class=\"command\">#{typeset(block.content)}"
303
+
304
+ when :code_language
305
+ @code_language = block.content
306
+ when :code_start_number
307
+ @code_start_number = block.content
308
+
309
+ # Special Characters
310
+ when :em_dash
311
+ @html_string << "&mdash;"
312
+ when :en_dash
313
+ @html_string << "&ndash;"
314
+ when :elipses
315
+ @html_string << "&#8202;.&thinsp;&#8202;.&thinsp;&#8202;.&thinsp;"
316
+ when :elipses_stop
317
+ @html_string << "&#8202;.&thinsp;&#8202;.&thinsp;&#8202;.&thinsp;."
318
+
319
+ # Links
320
+ when :link_target
321
+ @link_target = block.content
322
+ when :link_text
323
+ @link_text = block.content
324
+
325
+ # Lists
326
+ when :ol
327
+ @html_string << "<ol>"
328
+ when :ul
329
+ @html_string << "<ul>"
330
+ when :item
331
+ @html_string << "<li>#{block.content}"
332
+
333
+ when :dl
334
+ @html_string << "<dl>"
335
+ when :dl_header
336
+ @html_string << "<dt>#{block.content}"
337
+ when :dl_text
338
+ @html_string << "<dd>#{block.content}"
339
+
340
+ # Tags
341
+ when :ac
342
+ # Do we know anything about this acronymn?
343
+ if $reference.acronym_list.include?(block.content) then
344
+
345
+ # Assemble from the reference list
346
+ if $reference.acronym_list[block.content].include?('text_html') then
347
+ acronym = $reference.acronym_list[block.content]['text_html']
348
+ else
349
+ acronym = $reference.acronym_list[block.content]['text']
350
+ end
351
+
352
+ definition = $reference.acronym_list[block.content]['def']
353
+
354
+ @html_string << "<acronym title=\"#{definition}\">#{acronym}"
355
+ else
356
+ # Do what we can
357
+ @html_string << "<acronym>#{block.content}"
358
+ end
359
+
360
+ when :emph
361
+ @html_string << "<em>#{block.content}"
362
+
363
+ when :tt
364
+ @html_string << "<tt>#{block.content}"
365
+
366
+ end
367
+ end
368
+
369
+ def generate_node_end(block)
370
+
371
+ case block.type
372
+
373
+ # Headers
374
+ when :h1
375
+ @html_string << "</h1>"
376
+ when :h2
377
+ @html_string << "</h2>"
378
+ when :h3
379
+ @html_string << "</h3>"
380
+ when :h4
381
+ @html_string << "</h4>"
382
+ when :h5
383
+ @html_string << "</h5>"
384
+ when :h6
385
+ @html_string << "</h6>"
386
+
387
+ # Ordinary paragraphs
388
+ when :paragraph
389
+ @html_string << "</p>"
390
+
391
+ # Special paragraphs
392
+ when :block_quote
393
+ @html_string << "</blockquote>"
394
+ when :single_quote
395
+ @html_string << "&#8202;&rsquo;"
396
+ when :double_quote
397
+ @html_string << "&#8202;&rdquo;"
398
+
399
+ when :note, :command
400
+ @html_string << "</p>"
401
+
402
+ when :code
403
+ # Assemble the code block from the sub-tree nodes
404
+ begin
405
+ pretty_code = Uv.parse(block.content, "xhtml", @code_language, @code_start_number.to_i, "dawn")
406
+ @html_string << pretty_code
407
+ rescue
408
+ pretty_code = Uv.parse(block.content, "xhtml", "plain_text", @code_start_number.to_i, "dawn")
409
+ @html_string << pretty_code
410
+ end
411
+
412
+ # Special Characters
413
+ when :em_dash
414
+ @html_string << "&mdash;"
415
+ when :en_dash
416
+ @html_string << "&ndash;"
417
+ when :elipses
418
+ @html_string << "&#8202;.&thinsp;&#8202;.&thinsp;&#8202;.&thinsp;"
419
+ when :elipses_stop
420
+ @html_string << "&#8202;.&thinsp;&#8202;.&thinsp;&#8202;.&thinsp;."
421
+
422
+ # Links
423
+ when :link
424
+ # Assemble the link from the sub-tree nodes
425
+ @html_string << "<a href=\"#{@link_target}\">#{@link_text}</a>"
426
+ when :link_target
427
+ @link_target = block.content
428
+ when :link_text
429
+ @link_text = block.content
430
+
431
+ # Lists
432
+ when :ol
433
+ @html_string << "</ol>"
434
+ when :ul
435
+ @html_string << "</ul>"
436
+ when :item
437
+ @html_string << "</li>"
438
+
439
+ when :dl
440
+ @html_string << "</dl>"
441
+ when :dl_header
442
+ @html_string << "</dt>"
443
+ when :dl_text
444
+ @html_string << "</dd>"
445
+
446
+ # Tags
447
+ when :ac
448
+ @html_string << "</acronym>"
449
+
450
+ when :emph
451
+ @html_string << "</em>"
452
+
453
+ when :tt
454
+ @html_string << "</tt>"
455
+ end
456
+ end
457
+
458
+ ###
459
+ ### Helper functions
460
+ ###
461
+
462
+ # Return the header id, given a string of text
463
+ def self.header_id(header_text)
464
+ return header_text.gsub(" ", "_").downcase
465
+ end
466
+
467
+ # Fix Typography, according to HTML standards
468
+ def typeset(string)
469
+ return_str = string
470
+
471
+ return_str.gsub!(';','&#8202;:')
472
+ return_str.gsub!(':','&#8202;:')
473
+
474
+ return_str.gsub!("'", "&rsquo;")
475
+
476
+ return_str.gsub!('.','&#8202;.&thinsp;')
477
+ return_str.gsub!('?','&#8202;?&thinsp;')
478
+ return_str.gsub!('!','&#8202;!&thinsp;')
479
+
480
+ return_str.gsub!('e&#8202;.&thinsp;g&#8202;.&thinsp;','e.g. ')
481
+ return_str.gsub!('i&#8202;.&thinsp;e&#8202;.&thinsp;','i.e. ')
482
+
483
+ return return_str
484
+ end
485
+
486
+ # Return the correct indent for the given level
487
+ def indent(level)
488
+ case level
489
+ when 1
490
+ return ""
491
+ when 2
492
+ return " "
493
+ when 3
494
+ return " "
495
+ when 4
496
+ return " "
497
+ when 5
498
+ return " "
499
+ when 6
500
+ return " "
501
+ else
502
+ return ""
503
+ end
504
+ end
505
+
506
+ end