File: transformer/document-into-docbook/node.rb

Overview
Module Structure
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: TmDoc#9
  module: Transformer
  module: DocumentIntoDocBook#11
  module: Node#13
has properties
function: transform_logical_structure / 5 #17
function: transform / 4 #47
function: transform_link_to_module / 3 #142
function: transform_node / 4 #258
function: transform_node_into_row / 4 #285

Code

   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('&cross;')
 192                  ]
 193              else
 194                  [ DBOOK.raw_text('&ensp;') ]
 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(' &mdash; '),
 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('&cross;')
 351                      ]
 352                  else
 353                      [ DBOOK.raw_text('&ensp;') ]
 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(' &mdash; ') ]
 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