Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #  Formatter (c) 2002, 2004, 2007, 2008 David Turner <david@freetype.org>
  2. #
  3.  
  4. from sources import *
  5. from content import *
  6. from utils   import *
  7.  
  8. # This is the base Formatter class.  Its purpose is to convert
  9. # a content processor's data into specific documents (i.e., table of
  10. # contents, global index, and individual API reference indices).
  11. #
  12. # You need to sub-class it to output anything sensible.  For example,
  13. # the file tohtml.py contains the definition of the HtmlFormatter sub-class
  14. # used to output -- you guessed it -- HTML.
  15. #
  16.  
  17. class  Formatter:
  18.  
  19.     def  __init__( self, processor ):
  20.         self.processor   = processor
  21.         self.identifiers = {}
  22.         self.chapters    = processor.chapters
  23.         self.sections    = processor.sections.values()
  24.         self.block_index = []
  25.  
  26.         # store all blocks in a dictionary
  27.         self.blocks = []
  28.         for section in self.sections:
  29.             for block in section.blocks.values():
  30.                 self.add_identifier( block.name, block )
  31.  
  32.                 # add enumeration values to the index, since this is useful
  33.                 for markup in block.markups:
  34.                     if markup.tag == 'values':
  35.                         for field in markup.fields:
  36.                             self.add_identifier( field.name, block )
  37.  
  38.         self.block_index = self.identifiers.keys()
  39.         self.block_index.sort( index_sort )
  40.  
  41.     def  add_identifier( self, name, block ):
  42.         if self.identifiers.has_key( name ):
  43.             # duplicate name!
  44.             sys.stderr.write(                                           \
  45.                "WARNING: duplicate definition for '" + name + "' in " + \
  46.                block.location() + ", previous definition in " +         \
  47.                self.identifiers[name].location() + "\n" )
  48.         else:
  49.             self.identifiers[name] = block
  50.  
  51.     #
  52.     #  Formatting the table of contents
  53.     #
  54.     def  toc_enter( self ):
  55.         pass
  56.  
  57.     def  toc_chapter_enter( self, chapter ):
  58.         pass
  59.  
  60.     def  toc_section_enter( self, section ):
  61.         pass
  62.  
  63.     def  toc_section_exit( self, section ):
  64.         pass
  65.  
  66.     def  toc_chapter_exit( self, chapter ):
  67.         pass
  68.  
  69.     def  toc_index( self, index_filename ):
  70.         pass
  71.  
  72.     def  toc_exit( self ):
  73.         pass
  74.  
  75.     def  toc_dump( self, toc_filename = None, index_filename = None ):
  76.         output = None
  77.         if toc_filename:
  78.             output = open_output( toc_filename )
  79.  
  80.         self.toc_enter()
  81.  
  82.         for chap in self.processor.chapters:
  83.  
  84.             self.toc_chapter_enter( chap )
  85.  
  86.             for section in chap.sections:
  87.                 self.toc_section_enter( section )
  88.                 self.toc_section_exit( section )
  89.  
  90.             self.toc_chapter_exit( chap )
  91.  
  92.         self.toc_index( index_filename )
  93.  
  94.         self.toc_exit()
  95.  
  96.         if output:
  97.             close_output( output )
  98.  
  99.     #
  100.     #  Formatting the index
  101.     #
  102.     def  index_enter( self ):
  103.         pass
  104.  
  105.     def  index_name_enter( self, name ):
  106.         pass
  107.  
  108.     def  index_name_exit( self, name ):
  109.         pass
  110.  
  111.     def  index_exit( self ):
  112.         pass
  113.  
  114.     def  index_dump( self, index_filename = None ):
  115.         output = None
  116.         if index_filename:
  117.             output = open_output( index_filename )
  118.  
  119.         self.index_enter()
  120.  
  121.         for name in self.block_index:
  122.             self.index_name_enter( name )
  123.             self.index_name_exit( name )
  124.  
  125.         self.index_exit()
  126.  
  127.         if output:
  128.             close_output( output )
  129.  
  130.     #
  131.     #  Formatting a section
  132.     #
  133.     def  section_enter( self, section ):
  134.         pass
  135.  
  136.     def  block_enter( self, block ):
  137.         pass
  138.  
  139.     def  markup_enter( self, markup, block = None ):
  140.         pass
  141.  
  142.     def  field_enter( self, field, markup = None, block = None ):
  143.         pass
  144.  
  145.     def  field_exit( self, field, markup = None, block = None ):
  146.         pass
  147.  
  148.     def  markup_exit( self, markup, block = None ):
  149.         pass
  150.  
  151.     def  block_exit( self, block ):
  152.         pass
  153.  
  154.     def  section_exit( self, section ):
  155.         pass
  156.  
  157.     def  section_dump( self, section, section_filename = None ):
  158.         output = None
  159.         if section_filename:
  160.             output = open_output( section_filename )
  161.  
  162.         self.section_enter( section )
  163.  
  164.         for name in section.block_names:
  165.             block = self.identifiers[name]
  166.             self.block_enter( block )
  167.  
  168.             for markup in block.markups[1:]:   # always ignore first markup!
  169.                 self.markup_enter( markup, block )
  170.  
  171.                 for field in markup.fields:
  172.                     self.field_enter( field, markup, block )
  173.                     self.field_exit( field, markup, block )
  174.  
  175.                 self.markup_exit( markup, block )
  176.  
  177.             self.block_exit( block )
  178.  
  179.         self.section_exit( section )
  180.  
  181.         if output:
  182.             close_output( output )
  183.  
  184.     def  section_dump_all( self ):
  185.         for section in self.sections:
  186.             self.section_dump( section )
  187.  
  188. # eof
  189.