1 # $Id: node.rb,v 1.14 2012/04/17 02:49:40 machan Exp $
2
3 require 'tmdoc/tmstd'
4 require 'tmdoc/constant'
5 require 'tmdoc/tmstd/docbook'
6 require 'tmdoc/model/document'
7
8
9 module TmDoc
10
11 module Transformer::DocumentIntoDocBook
12
13 module Node
14
15 module_function
16
17 def transform_logical_structure(
18 md_node, title, id, section_name, opts = {}
19 )
20 ASSERT.kind_of md_node, MDA::Node::LogicalStructure
21 ASSERT.kind_of title, String
22 ASSERT.kind_of id, String
23 ASSERT.kind_of section_name, String
24 ASSERT.kind_of opts, Hash
25
26 DBOOK.section(:id => id) {
27 [
28 DBOOK.section_info {
29 [ DBOOK.title(title) ]
30 },
31
32 DBOOK.variable_list {
33 [
34 transform(
35 md_node,
36 Id.transform_focus(id),
37 section_name,
38 opts
39 )
40 ]
41 }
42 ]
43 }
44 end
45
46
47 def transform(md_node, focus_id, section_name, opts = {})
48 ASSERT.kind_of md_node, MDA::Node::LogicalStructure
49 ASSERT.kind_of focus_id, String
50 ASSERT.kind_of section_name, String
51 ASSERT.kind_of opts, Hash
52
53 show_type_label = false
54 show_above_link = false
55 show_line_num_in_infobox = false
56 show_code = false
57 for key, val in opts
58 ASSERT.kind_of key, Symbol
59
60 case key
61 when :show_type_label
62 ASSERT.boolean val
63
64 show_type_label = val
65 when :show_above_link
66 ASSERT.boolean val
67
68 show_above_link = val
69 when :show_line_num_in_infobox
70 ASSERT.boolean val
71
72 show_line_num_in_infobox = val
73 when :show_code
74 ASSERT.boolean val
75
76 show_code = val
77 else
78 ASSERT.abort "Unknown option: %s", key
79 end
80 end
81
82
83 md_link_to_node_module = md_node.a_link_to_module
84 link_opts = {
85 :focus_id => (
86 if md_node.focused? then focus_id else nil end
87 ),
88 :show_type_label => show_type_label,
89 :show_above_link => show_above_link,
90 :show_code => show_code,
91 :links_to_line => md_node.links_to_line
92 }.reject { |key, val| val.nil? }
93
94 mb_link_to_node_module = transform_link_to_module(
95 md_link_to_node_module, section_name, link_opts
96 )
97
98 md_infobox = md_node.a_infobox
99 mb_infobox =
100 if md_infobox
101 Module::InfoBox.transform(
102 md_infobox,
103 Id.transform_module(
104 md_infobox.module_above_path,
105 md_infobox.module_name
106 ),
107 show_line_num_in_infobox,
108 show_code
109 )
110 else
111 nil
112 end
113
114 DBOOK.var_list_entry {
115 [
116 DBOOK.term { mb_link_to_node_module }
117 ] + (
118 if mb_infobox
119 [ DBOOK.list_item { [mb_infobox] } ]
120 else
121 []
122 end
123 ) + (
124 unless md_node.elements.empty?
125 [
126 DBOOK.list_item {
127 [
128 transform_node(
129 md_node, focus_id, section_name, opts
130 )
131 ]
132 }
133 ]
134 else
135 []
136 end
137 )
138 }
139 end
140
141
142 def transform_link_to_module(md_link_to_module, section_name, opts = {})
143 ASSERT.kind_of md_link_to_module, MDL::Module
144 ASSERT.kind_of section_name, String
145 ASSERT.kind_of opts, Hash
146
147 name = md_link_to_module.name
148 display_name = Link.display_name_of_module(
149 md_link_to_module, name
150 )
151
152 focus_id = nil
153 show_type_label = true
154 show_above_link = true
155 show_code = true
156 md_links_to_line = nil
157 for key, val in opts
158 ASSERT.kind_of key, Symbol
159
160 case key
161 when :focus_id
162 ASSERT.kind_of val, String
163
164 focus_id = val
165 when :show_type_label
166 ASSERT.boolean val
167
168 show_type_label = val
169 when :show_above_link
170 ASSERT.boolean val
171
172 show_above_link = val
173 when :show_code
174 ASSERT.boolean val
175
176 show_code = val
177 when :links_to_line
178 ASSERT.opt_kind_of val, MDL::SeqOfLine
179
180 md_links_to_line = val
181 else
182 ASSERT.abort "Unknown option: %s", key
183 end
184 end
185
186 array_of_db_link_to_module = (
187 if focus_id
188 [
189 DBOOK.anchor(:id => focus_id),
190
191 DBOOK.raw_text('✗')
192 ]
193 else
194 [ DBOOK.raw_text(' ') ]
195 end
196 ) + (
197 if show_type_label
198 [
199 DBOOK.text(
200 format(
201 "%s:\n",
202 if md_link_to_module.kind_of?(MDL::Class)
203 TLS::CLASS
204 else
205 TLS::MODULE
206 end
207 )
208 )
209 ]
210 else
211 []
212 end
213 ) + [
214 if focus_id
215 DBOOK.class_name display_name
216 else
217 link_id_of_focus = Id.transform_focus(
218 Id.transform_module_section(
219 Id.transform_module(
220 md_link_to_module.above_path, name
221 ),
222 section_name
223 )
224 )
225
226 Link.transform_module(link_id_of_focus, display_name)
227 end
228 ] + (
229 if show_above_link && md_link_to_module.a_link_to_above_module
230 [
231 DBOOK.text('('),
232
233 Link.transform_link_to_module(
234 md_link_to_module.a_link_to_above_module
235 ),
236
237 DBOOK.text(')')
238 ]
239 else
240 []
241 end
242 ) + (
243 if md_links_to_line && (! md_links_to_line.empty? )
244 [
245 DBOOK.raw_text(' — '),
246
247 Link.transform_lines(md_links_to_line, show_code),
248 ]
249 else
250 []
251 end
252 )
253
254 ASSERT.kind_of array_of_db_link_to_module, Array
255 end
256
257
258 def transform_node(md_node, focus_id, section_name, opts = {})
259 ASSERT.kind_of md_node, MDA::Node::LogicalStructure
260 ASSERT.kind_of focus_id, String
261 ASSERT.kind_of section_name, String
262 ASSERT.kind_of opts, Hash
263
264 db_node =
265 if md_node.all_elements_are_leaf?
266 DBOOKEX.informal_table('lrlllll', :frame => 'none') {
267 md_node.elements.map { |elem_node|
268 transform_node_into_row(
269 elem_node, focus_id, section_name, opts
270 )
271 }
272 }
273 else
274 DBOOK.variable_list {
275 md_node.elements.map { |elem_node|
276 transform(elem_node, focus_id, section_name, opts)
277 }
278 }
279 end
280
281 ASSERT.kind_of db_node, TmStd::DocBook::Abstraction::Element
282 end
283
284
285 def transform_node_into_row(md_node, focus_id, section_name, opts = {})
286 ASSERT.kind_of md_node, MDA::Node::LogicalStructure
287 ASSERT.kind_of focus_id, String
288 ASSERT.kind_of section_name, String
289 ASSERT.kind_of opts, Hash
290
291 show_type_label = false
292 arg_show_above_link = false
293 show_code = false
294 for key, val in opts
295 ASSERT.kind_of key, Symbol
296
297 case key
298 when :show_type_label
299 ASSERT.boolean val
300
301 show_type_label = val
302 when :show_above_link
303 ASSERT.boolean val
304
305 arg_show_above_link = val
306 when :show_line_num_in_infobox
307 ASSERT.boolean val
308
309 ; # Nothing to do
310 when :show_code
311 ASSERT.boolean val
312
313 show_code = val
314 else
315 ASSERT.abort "Unknown option: %s", key
316 end
317 end
318
319
320 md_link_to_node_module = md_node.a_link_to_module
321 name = md_link_to_node_module.name
322 display_name = Link.display_name_of_module(
323 md_link_to_node_module, name
324 )
325
326 show_above_link =
327 if arg_show_above_link &&
328 md_link_to_node_module.a_link_to_above_module
329 case md_node
330 when MDN::ModuleStructure
331 true
332 when MDN::ClassHierarchy
333 ! md_node.above_module_equal_to_superclass?
334 else
335 ASSERT.abort "Unknown md_node: %s", md_node.to_s
336 end
337 else
338 false
339 end
340
341 md_links_to_line = md_node.links_to_line
342
343
344 DBOOK.row {
345 [
346 if md_node.focused?
347 [
348 DBOOK.anchor(:id => focus_id),
349
350 DBOOK.raw_text('✗')
351 ]
352 else
353 [ DBOOK.raw_text(' ') ]
354 end,
355
356 if show_type_label
357 type_label =
358 if md_link_to_node_module.kind_of?(MDL::Class)
359 TLS::CLASS
360 else
361 TLS::MODULE
362 end
363
364 [ DBOOK.text(format("%s:", type_label)) ]
365 else
366 []
367 end,
368
369 [
370 if md_node.focused?
371 DBOOK.class_name display_name
372 else
373 link_id_of_focus = Id.transform_focus(
374 Id.transform_module_section(
375 Id.transform_module(
376 md_link_to_node_module.above_path,
377 name
378 ),
379 section_name
380 )
381 )
382
383 Link.transform_module(
384 link_id_of_focus, display_name
385 )
386 end
387 ],
388
389 if show_above_link
390 [ DBOOK.text('(') ]
391 else
392 []
393 end,
394
395 if show_above_link
396 [
397 Link.transform_link_to_module(
398 md_link_to_node_module.a_link_to_above_module
399 ),
400
401 DBOOK.text(')')
402 ]
403 else
404 []
405 end,
406
407 if md_links_to_line && (! md_links_to_line.empty? )
408 [ DBOOK.raw_text(' — ') ]
409 else
410 []
411 end,
412
413 if md_links_to_line && (! md_links_to_line.empty? )
414 [
415 Link.transform_lines(md_links_to_line, show_code)
416 ]
417 else
418 []
419 end
420 ].map { |contents| DBOOK.entry { contents } }
421 }
422 end
423 end
424
425 end # TmDoc::Transformer::DocumentIntoDocBook
426
427 end # TmDoc