| 
 
                   
                    Site Generation
                    Page Generation
 Page class hierarchy
 Creating xml content
 Element class hierarchy
 Make transform
 Write result
 Make Self Page Class
 
 Site Generation
                  
                    | Site generation diagram |  
                    |  |  
                  There is classes 
                  Page,PageFactory,SiteGeneratorandPageRepository. 
                  Main class 
                  SiteGeneratorand functiongenerate()it takes fromPageRepositoryeachpageIdof site, and by thispageIdtake fromPageFactoryobject of classPage, and call methodgenerate()of classPage: 
                  But 
                  PageFactoryreturn notPage:).
                  ForpageId = 'fp'PageFactoryreturn object ofPageFP, for other:PageSite. 
                    
                      | from PageFactory.py 
  def getPageById( self, pageId ):
    if pageId == 'fp':
      return PageFP()
    return PageSite( pageId )
 |  Some words about 
                  PageRepositoryhe generatepageIdArrayfrompages.xmlby xslt transformationpages2text.xsl(content/xslt/other/). But 'fp' dont exists inpages.xmlitpageIdadds by hands. 
                    
                      | from PageRepository.py 
  def __init__(self):
    self.pageIds = []
    self.initPageIds()
    self.pageIds.append( "fp" )
 |  Page Generation
                  
                    | Page generation diagram |  
                    |  |  Page class hierarchy
                  There is hierarchy of pages:
                   
                    Inheritance classes differs from
                      | Page classes diagram |  
                      |  |  Pageonly by constructor.
                  class Page makes next:
                   
                      
                    make self xml-contentmake transformation by xsltwrite result Creating xml content
                    Xml content are created by aggregation different xml sources.
                 
                    xml-content start from 
                   
                    
                      | from Page.py 
    self.xml = """<?xml version="1.0"?>
<page-of-site>
#add_elements_here#
</page-of-site>
"""
 |  
                  Class 
                  Pagecontain array of objects of classElement.
                  They are added in constructors of inheritance classes (PageBase,PageFP,PageSite). 
                  Function 
                  makeXml()are dead simple: 
                    
                      | from Page.py 
  def makeXml( self ):
    for self.element in self.elements:
      self.element.makeContent()
      self.insertIntoXml()
 |  
                  Each object of class 
                  Elementhave attributesnameandcontent. And in functioninsertIntoXml()by itsnamexml-content-of-page are replaced bycontentofelement: 
                    
                      | from Page.py 
  def insertIntoXml( self ):
    import string
    name = '#' + self.element.getName() + '#'
    self.xml = string.replace( 
                    self.xml, 
                    name, 
                    self.element.getContent() 
               )
 |  Element class hierarchy
                  Hierarchy of elements:
                   
                    By manipulation this elements performs creation of xml-content-of-page.
                      | Element classes diagram |  
                      |  |  
                  F.e. class 
                  PageBaseconstructor: 
                    Element
                      | from PageBase.py 
  def __init__( self ):
    Page.__init__( self )
    self.elements.append( 
      ElementForStub( 
        { 'params': 
          { 'text': "#common#\n#pages#\n#banners#\n#add_elements_here#\n" }
        } 
      )
    )
    self.elements.append( 
      ElementFromFile(
        { "name": "common", 
          "params": { "fileName": "db-xml:common.xml" }
        }
      )
    )
    self.elements.append(
      ElementFromFile(
        { 'name': 'pages', 
          'params': { 'fileName': 'db-xml:pages.xml' }
        }
      )
    )
    self.elements.append(
      ElementFromFile(
        { 'name': 'banners', 
          'params': { 'fileName': 'db-xml:banners.xml' }
        }
      )
    )
 |  ElementForStubreplace#add_elements_here#,
                  then each next element replace self token: firstElementFromFilereplace#common#(which was added by previousElementForStubelement),
                  secondElementFromFilereplace#pages#(note different between params are passed in constructors).
                  Element 
                  ElementFromFileworking with classContentwhich have functiongetContent(): 
                    where
                      | from Content.py 
  def getContent( self, fileRequest ):
    import string
    ( area, file ) = string.split( fileRequest, ':' )
    fileName = self.root + area + '/' + file
    self.file.setFileName( fileName )
    self.file.load()
    return self.file.getData()
 |  self.rootare path to'content'folder.
                  In that folder (if you remember) we have 3 folders (directories):db-xml,pages,xslt.
                  And 
                  fileRequestfor functiongetContent()are formed as{area}:{fileName}. F.e. if we want to get content of
                  filepages.xmlin directorydb-xml, we must make call:
 contentOfPagesXml = self.objContent.getContent( 'xml:pages.xml' ).And by same manner to directory
 pagesorxslt.  And again about 
                  PageBase. 
                  As you may note element 
                  ElementForStubadd token#add_elements_here#in xml-content-of-page. This mean that
                  we have not finished xml-content. And we must to make inheritance from
                  this class. 
                  Let's inheritance 
                  PageFPclass. His constructor: 
                    As you may note in this case element
                      | from PageFP.py 
  def __init__( self ):
    PageBase.__init__( self )
    self.pageId = 'index'
    self.elements.append(
      ElementForStub(
        { 'params': 
          { 'text' : "#page_content#\n#news#" }
        }
      )
    )
    self.elements.append(
      ElementFromFile(
        { 'name': 'page_content', 
          'params': { 'fileName': 'pages:fp.xml' }
        }
      )
    )
    self.elements.append(
      ElementFromFile(
        { 'name': 'news', 
          'params': { 'fileName': 'db-xml:news.xml' }
        }
      )
    )
    self.xsltName = 'fp-page.xsl'
 |  ElementForStub(which replace token#add_elements_here#) dosnt have token#add_elements_here#, i.e. in result we have finished xml-content.
                  xml-content will be contained from files 
                  pages/fp.xml,db-xml/news.xml.
                  And xslt transformation will be made byfp-page.xsl. 
                  For Page-package class 
                  PageSite, constructor: 
                    Note that there is element
                      | from PageSite.py 
  def __init__( self, pageId ):
    PageBase.__init__( self )
    self.pageId = pageId
    self.elements.append(
      ElementForStub(
        { 'params':
          { 'text': "#page_id#\n#page_content#\n" }
        }
      )
    )
    self.elements.append( ElementPageId( pageId ) )
    self.elements.append(
      ElementFromFile(
        { 'name': 'page_content', 
          'params': { 'fileName': 'pages:' + pageId + '.xml' }
        }
      )
    )
    self.xsltName = 'site-page.xsl'
 |  ElementPageIdwhich add tag<pageId>.After 
                  makeXml()we will have (I add comments): 
                    
                      | from result of makeXml() 
<?xml version="1.0"?>
<page-of-site>
<!-- xml-header and 'page-of-site' are from Page -->
<!-- 'common' was added in PageBase -->
  <!-- this is file '/content/db-xml/common.xml' -->
  <common>
    <year>2003</year>
    <name>xmlSiteMakerPy</name>
    <email>nemilya@mail.ru</email>
  </common>
<!-- 'pages' was added in PageBase -->
  <!-- this is file '/content/db-xml/pages.xml' -->
  <pages>
    <page id="123" name="Name" descr="Description"/>
    ...
  </pages>
<!-- 'pageId' was added in PageSite -->
  <!-- this parameter passed in constructor by PageFactory -->
  <pageId>about</pageId>
<!-- 'page-content' was added in PageSite -->
  <!-- this is file '/content/page/{pageId}.xml' -->
  <page-content>
  
  <p>
  This application for offline generation.
  From xml documents by xslt transformation.
  </p>
  
  <p>
   <sectionList/>
  </p>
  ...
  </page-content>
</page-of-site>
 |  Make transform
                  Each class 
                  Pagehave attributexsltNameby which
                  xml-content are transformed:PageFP- 'fp-page.xsl',PageSite- 'site-page.xsl'. You can see this in constructor. Write result
                  For writing result there is class 
                  PageWriter. ClassPagein functionwrite()call it: 
                    
                      | from Page.py 
  def writePage( self ):
    self.pageWriter.setContent( self.page )
    self.pageWriter.setPageId( self.pageId )
    self.pageWriter.write()
 |  Make Self Page ClassOf course you can write self class. Inheritance them from 
                  PageorPageBase. And add toPageFactoryin functiongetPageById'if' for yourpageId. 
                  Diagrams was maded by ObjectDomain R3.
                 |