70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
""" this contains the code that actually builds the pages using layout.py
 | 
						|
 | 
						|
    building the docs happens in two passes: the first one takes care of
 | 
						|
    collecting contents and navigation items, the second builds the actual
 | 
						|
    HTML
 | 
						|
"""
 | 
						|
 | 
						|
import py
 | 
						|
from layout import LayoutPage
 | 
						|
 | 
						|
# XXX don't import from an internal py lib class
 | 
						|
from py.__.doc import confrest
 | 
						|
 | 
						|
class Project(confrest.Project):
 | 
						|
    """ a full project
 | 
						|
 | 
						|
        this takes care of storing information on the first pass, and building
 | 
						|
        pages + indexes on the second
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        confrest.Project.__init__(self, *args, **kwargs)
 | 
						|
        self.content_items = {}
 | 
						|
    
 | 
						|
    def add_item(self, path, content):
 | 
						|
        """ add a single item (page)
 | 
						|
 | 
						|
            path is a (relative) path to the object, used for building links
 | 
						|
            and navigation
 | 
						|
 | 
						|
            content is an instance of some py.xml.html item
 | 
						|
        """
 | 
						|
        assert path not in self.content_items, 'duplicate path %s' % (path,)
 | 
						|
        self.content_items[path] = content
 | 
						|
 | 
						|
    def build(self, outputpath):
 | 
						|
        """ convert the tree to actual HTML
 | 
						|
        
 | 
						|
            uses the LayoutPage class below for each page and takes care of
 | 
						|
            building index documents for the root and each sub directory
 | 
						|
        """
 | 
						|
        opath = py.path.local(outputpath)
 | 
						|
        opath.ensure(dir=True)
 | 
						|
        paths = self.content_items.keys()
 | 
						|
        paths.sort()
 | 
						|
        for path in paths:
 | 
						|
            # build the page using the LayoutPage class
 | 
						|
            page = self.Page(self, path, stylesheeturl=self.stylesheet)
 | 
						|
            page.contentspace.append(self.content_items[path])
 | 
						|
            ipath = opath.join(path)
 | 
						|
            if not ipath.dirpath().check():
 | 
						|
                # XXX create index.html(?)
 | 
						|
                ipath.ensure(file=True)
 | 
						|
            ipath.write(page.unicode().encode(self.encoding))
 | 
						|
 | 
						|
    def process(self, txtpath):
 | 
						|
        """ this allows using the project from confrest """
 | 
						|
        # XXX not interesting yet, but who knows later (because of the
 | 
						|
        # cool nav)
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    # XXX just to have an idea of how to use this...
 | 
						|
    proj = Project()
 | 
						|
    here = py.path.local('.')
 | 
						|
    for fpath in here.visit():
 | 
						|
        if fpath.check(file=True):
 | 
						|
            proj.add_item(fpath, convert_to_html_somehow(fpath))
 | 
						|
    proj.build()
 | 
						|
 |