[pygccxml-commit] SF.net SVN: pygccxml: [823] website
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-12-31 08:43:42
|
Revision: 823 http://svn.sourceforge.net/pygccxml/?rev=823&view=rev Author: roman_yakovenko Date: 2006-12-31 00:43:40 -0800 (Sun, 31 Dec 2006) Log Message: ----------- adding website build scripts Added Paths: ----------- website/ website/site_creator/ website/site_creator/create_sitemap.bat website/site_creator/environment.py website/site_creator/file_system_iter.py website/site_creator/main.py website/site_creator/page_creator.py website/site_creator/template_wrapper.py website/site_creator/topics_creator.py website/site_creator/transform_html.py website/site_creator/utils.py website/site_creator/www_configuration_reader.py website/templates/ website/templates/css_cheat_sheet.pdf website/templates/offline/ website/templates/offline/language_binding.css website/templates/offline/page_template.html website/templates/offline/source_code.css website/templates/offline/topics_template.html website/templates/online/ website/templates/online/language_binding.css website/templates/online/page_template.html website/templates/online/topics_template.html website/tools/ website/tools/kid-svn-12-10-2006.zip website/tools/pykleur-svn-11-11-2006.zip Added: website/site_creator/create_sitemap.bat =================================================================== --- website/site_creator/create_sitemap.bat (rev 0) +++ website/site_creator/create_sitemap.bat 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1 @@ +c:\python\python.exe "D:\language-binding\dev\tools\sitemap_gen-1.4\sitemap_gen.py" --config="D:\language-binding\dev\site_creator\sitemap.xml" \ No newline at end of file Added: website/site_creator/environment.py =================================================================== --- website/site_creator/environment.py (rev 0) +++ website/site_creator/environment.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,33 @@ +import os +import sys + +class settings: + project_root = None + sources_root = None + pygccxml_sources_root = None + pyplusplus_sources_root = None + pydsc_sources_root = None + if sys.platform == 'win32': + project_root = 'd:/dev/language-binding/sources/website' + sources_root = 'd:/dev/language-binding/sources' + pygccxml_sources_root = 'd:/dev/language-binding/sources/pygccxml_dev' + pyplusplus_sources_root = 'd:/dev/language-binding/sources/pyplusplus_dev' + pydsc_sources_root = 'd:/dev/language-binding/sources/pydsc_dev' + else: + project_root = '/home/roman/language-binding/website' + sources_root = '/home/roman/language-binding/sources' + pygccxml_sources_root = '/home/roman/language-binding/sources/pygccxml_dev' + pyplusplus_sources_root = '/home/roman/language-binding/sources/pyplusplus_dev' + pydsc_sources_root = '/home/roman/language-binding/sources/pydsc_dev' + temp_dir = os.path.join( project_root, 'dev', 'tmp' ) + development_dir = project_root#os.path.join( project_root, 'dev') + development_www_dir = os.path.join( development_dir, 'www') + production_dir = r'D:\dev\language-binding\website\production'#os.path.join( project_root, 'production') + production_www_dir = os.path.join( production_dir, 'www') + configuration_file = 'www_configuration' + templates_dir = os.path.join( development_dir, 'templates', 'offline' ) + templates_dir = os.path.join( development_dir, 'templates', 'online' ) + site_css = 'language_binding.css' + home_url = 'http://www.language-binding.net' +sys.path.append( os.path.join( settings.development_dir, 'tools', 'kid-svn-12-10-2006' ) ) +sys.path.append( os.path.join( settings.development_dir, 'tools', 'pykleur-svn-11-11-2006' ) ) Added: website/site_creator/file_system_iter.py =================================================================== --- website/site_creator/file_system_iter.py (rev 0) +++ website/site_creator/file_system_iter.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,141 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +from types import * + +##If you want include files that doesn't have extension then use filter like '*.' + +def _make_list( argument ): + if type(argument) in StringTypes: + if argument: + return [argument] + else: + return [] + elif type(argument) is ListType: + return argument + else: + raise TypeError( 'Argument "%s" must be or list of strings or string.' % argument ) + +class base_files_iterator: + def __init__(self, file_exts, is_include_exts = True): + self.__file_exts = _make_list( file_exts ) + self.__is_include_exts = is_include_exts + + def _is_to_skip(self, file_path): + if not self.__file_exts: + return 0 + file_ext = os.path.splitext( file_path )[1] + if not file_ext: + file_ext = '.' + file_ext + file_ext = '*' + file_ext + if file_ext.lower() in self.__file_exts: + return not self.__is_include_exts + else: + return self.__is_include_exts + + def _subfolders_and_files(self, folder_path): + files, folders = [], [] + folder_contents = os.listdir(folder_path) + for object_name in folder_contents: + object_path = os.path.join(folder_path, object_name) + if os.path.isfile( object_path ) and not self._is_to_skip( object_path ): + files.append( object_path ) + elif os.path.isdir( object_path ): + folders.append( object_path ) + else: + pass + return folders, files + + def __iter__(self): + raise NotImplementedError + + def next(self): + raise NotImplementedError + + def restart(self): + raise NotImplementedError + +class files_iterator_generator(base_files_iterator): + def __init__(self, folders, file_ext_filter = '', is_include_filter = True, is_recursive = True): + base_files_iterator.__init__(self, file_ext_filter, is_include_filter) + self.__folders = _make_list( folders ) + self.__is_recursive = is_recursive + self.__file_generator = None + + def __walk(self): + folders = self.__folders[:] + while folders: + sub_folders, files = self._subfolders_and_files( folders.pop(0) ) + if self.__is_recursive: + for folder in sub_folders: + folders.append( folder ) + for file_os in files: + yield file_os + + def __iter__(self): + self.__file_generator = self.__walk() + return self + + def next(self): + return self.__file_generator.next() + + def restart(self): + self.__file_generator = None + + +class folders_iterator_generator: + def __init__(self, folders, is_recursive = 1): + self.__folders = [] + for root in _make_list( folders ): + self.__folders.extend( self.__sub_folders( root ) ) + self.__is_recursive = is_recursive + self.__folder_generator = None + + def __sub_folders(self, folder_path): + sub_folders = [] + folder_contains = os.listdir(folder_path) + for object_in_folder in folder_contains: + full_path = os.path.join(folder_path, object_in_folder) + if os.path.isdir( full_path ): + sub_folders.append( full_path ) + return sub_folders + + def __walk(self): + folders = self.__folders[:] + for curr_folder in folders: + yield curr_folder + if self.__is_recursive: + for f in folders_iterator_generator( [curr_folder], True ): + yield f + + def __iter__(self): + self.__folder_generator = self.__walk() + return self + + def next(self): + return self.__folder_generator.next() + + def restart(self): + self.__folder_generator = None + +#preserving backward computability names +file_iter = files_iterator_generator +folder_iter = folders_iterator_generator +#new names +files_iterator = files_iterator_generator +folders_iterator = folders_iterator_generator + +if '__main__' == __name__: + #lFileCount = 0 + #for file_os in files_iterator( r'C:\Program Files\Microsoft Visual Studio\VC98\Include\stlport', ['*.h', '*.'], True, False): + #print file_os + #lFileCount += 1 + #print lFileCount + + for folder in folders_iterator( '/home/roman/language-binding', False ): + print folder + for folder in folders_iterator( '/home/roman/language-binding', True ): + print folder Added: website/site_creator/main.py =================================================================== --- website/site_creator/main.py (rev 0) +++ website/site_creator/main.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,108 @@ +import os +import sys +import stat +import utils +import shutil +from environment import settings +from file_system_iter import folders_iterator, files_iterator +import page_creator +from docutils import core +import www_configuration_reader +import transform_html +#import codecs +#import cStringIO +#from docutils.core import publish_file + +class creator_t: + def __init__( self ): + self.adsence_injector = transform_html.adsence_injector_t() + + def make_deletable( self, path_ ): + mode = stat.S_IRWXU + if os.path.isdir( path_ ): + for dir_ in folders_iterator( path_ ): + os.chmod( dir_, mode ) + for file_ in files_iterator( path_ ): + os.chmod( file_, mode ) + else: + os.chmod( path_, mode ) + + def create_dirs(self): + shutil.copyfile( os.path.join( settings.sources_root, 'index.rest' ) + , os.path.join( settings.development_www_dir, 'index.rest' ) ) + + pygccxml_dev_www = os.path.join( settings.development_www_dir, 'pygccxml' ) + if os.path.exists( pygccxml_dev_www ): + self.make_deletable( pygccxml_dev_www ) + shutil.rmtree( pygccxml_dev_www ) + utils.path.copytree( os.path.join( settings.pygccxml_sources_root, 'docs' ) + , pygccxml_dev_www) + + pyplusplus_dev_www = os.path.join( settings.development_www_dir, 'pyplusplus' ) + if os.path.exists( pyplusplus_dev_www ): + self.make_deletable( pyplusplus_dev_www ) + shutil.rmtree( pyplusplus_dev_www ) + utils.path.copytree( os.path.join( settings.pyplusplus_sources_root, 'docs' ) + , pyplusplus_dev_www) + + pydsc_dev_www = os.path.join( settings.development_www_dir, 'pydsc' ) + if os.path.exists( pydsc_dev_www ): + self.make_deletable( pydsc_dev_www ) + shutil.rmtree( pydsc_dev_www ) + utils.path.copytree( os.path.join( settings.pydsc_sources_root, 'docs' ) + , pydsc_dev_www) + + if os.path.exists( settings.production_www_dir ): + self.make_deletable( settings.production_www_dir ) + shutil.rmtree( settings.production_www_dir ) + utils.path.copytree( settings.development_www_dir, settings.production_www_dir ) + + to_be_removed = [] + for dir_ in folders_iterator( [settings.production_www_dir, settings.development_www_dir] ): + name = os.path.split( dir_ )[1] + if name.lower() == '.svn': + to_be_removed.append( dir_ ) + map( self.make_deletable, to_be_removed ) + for dir_ in to_be_removed: + if os.path.exists( dir_ ): + shutil.rmtree( dir_ ) + + def copy_css(self): + shutil.copyfile( os.path.join( settings.templates_dir, settings.site_css ) + , os.path.join( settings.production_www_dir, settings.site_css ) ) + + def visit_file( self, rest_file ): + dir_, rest_file_name = os.path.split( rest_file ) + www_c_reader = www_configuration_reader.reader_t( dir_ ) + if rest_file_name in www_c_reader.files_to_skip: + return + destrination_file_name = os.path.splitext( rest_file_name )[0] + '.html' + destrination_file_name = os.path.join( utils.path.production_dir( dir_ ) + , destrination_file_name ) + + curr_work_dir = os.path.abspath( os.curdir ) + try: + print 'file: ', destrination_file_name + os.chdir( dir_ ) + tmpl = page_creator.Template( rest_file ) + tmpl.write( destrination_file_name, encoding='utf-8', output='xhtml' ) + finally: + os.chdir( curr_work_dir ) + + def create_html_files(self): + for rest_file in files_iterator(settings.development_www_dir, ['*.rest'] ): + self.visit_file( rest_file ) + + def clean_www_dir( self ): + exts = [ '*.rest', '*.rest~', '*.bak', '*.pyc', '*.py', '*.py~' + , '*.vsd', '*.txt' ] + for file_ in files_iterator( settings.production_www_dir, exts ): + os.remove( file_ ) + +if __name__ == '__main__': + c = creator_t() + c.create_dirs() + c.copy_css() + c.create_html_files() + c.clean_www_dir() + print 'done' \ No newline at end of file Added: website/site_creator/page_creator.py =================================================================== --- website/site_creator/page_creator.py (rev 0) +++ website/site_creator/page_creator.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,161 @@ +import os +from environment import settings + +import utils +import cStringIO +import xml.dom.minidom +import template_wrapper +from docutils import core +import docutils.parsers.rst +import www_configuration_reader + +import sys +sys.path.append( 'D:\pykleur' ) + +import pykleur + +def code_block( name, arguments, options, content, lineno, content_offset, block_text, state, state_machine ): + """ + The code-block directive provides syntax highlighting for blocks of code. + + .. code-block:: CPP + + #include <iostream> + + int main( int argc, char* argv[] ) + { + std::cout << "Hello world" << std::endl; + } + + The directive can also be told to include a source file directly:: + + .. code-block:: + :language: Python + :source-file: ../myfile.py + + You cannot both specify a source-file and include code directly. + """ + + try: + language = arguments[0] + except IndexError: + language = options['language'] + + if content and 'source-file' in options: + error = state_machine.reporter.error( "You cannot both specify a source-file and include code directly.", + docutils.nodes.literal_block(block_text,block_text), line=lineno) + return [error] + + source_code = None + if content: + source_code = os.linesep.join( map( lambda s: s.rstrip(), content ) ) + else: + source_code = file( options['source-file'] ).read() + + html = pykleur.highlight( source_code + , pykleur.lexers.get_lexer_by_name( language.lower() ) + , pykleur.formatters.HtmlFormatter(noclasses=True, style='friendly') ) + + raw = docutils.nodes.raw('', html, format='html') + return [raw] + +code_block.arguments = (0,2,1) +code_block.options = {'language' : docutils.parsers.rst.directives.unchanged, + 'source-file' : docutils.parsers.rst.directives.path,} +code_block.content = 1 + + +# Simply importing this module will make the directive available. +docutils.parsers.rst.directives.register_directive( 'code-block', code_block ) + +class Template( template_wrapper.Template ): + def __init__( self, rest_file_path ): + self._rest_file_path = rest_file_path + self.__html_template = os.path.join( settings.templates_dir, 'page_template.html' ) + template_wrapper.Template.__init__( self, file=self.__html_template ) + self.template_inst.content_colspan={'colspan':2} + if rest_file_path == os.path.join( settings.development_www_dir, 'index.rest' ): + self.template_inst.content_colspan={'colspan':1} + self.template_inst.rest_file_path=rest_file_path + self.template_inst.site_css = self.findout_site_css() + self.template_inst.page_title = "" + self.template_inst.page_content = "" + self.template_inst.title_items = self.findout_title_items() + #self.template_inst.meta_tags = {} + html = self.rest2html( rest_file_path ) + self.update_page( html ) + + def rest_dir_path(self): + return os.path.split( self._rest_file_path )[0] + + def findout_site_css(self): + production_dir = utils.path.production_dir( os.path.split( self.template_inst.rest_file_path )[0] ) + relative_path = utils.path.relative_path( production_dir + , settings.production_www_dir ) + return utils.path.normalize( os.path.join( relative_path, settings.site_css ) ) + + def update_page(self, html): + html_document = xml.dom.minidom.parseString( html ) + title_elem = html_document.getElementsByTagName( 'title' )[0] + if title_elem.hasChildNodes(): + self.template_inst.page_title = title_elem.childNodes[0].data + body_elem = html_document.getElementsByTagName( 'body' )[0] + body_div_elem = body_elem.getElementsByTagName( 'div' )[0] + for elem in body_div_elem.childNodes[:]: + try: + if isinstance( elem, xml.dom.minidom.Text ) \ + and elem.data == os.linesep: + body_div_elem.removeChild( elem ) + continue + elif elem.tagName == 'h1' and elem.getAttribute('class') == 'title': + body_div_elem.removeChild( elem ) + else: + pass + except IndexError: + pass + except AttributeError: + pass + self.template_inst.page_content = body_div_elem.toxml() + + #meta_elems = html_document.getElementsByTagName( 'meta' ) + #meta_tags = {} + #for meta_elem in meta_elems: + #meta_tags[ 'content' ] = meta_elem.getAttribute( 'content' ) + #meta_tags[ 'name' ] = meta_elem.getAttribute( 'name' ) + #self.template_inst.meta_tags = meta_tags + + def findout_title_items( self ): + title_items = [] + + parent_dir = self.rest_dir_path() + while parent_dir != settings.development_www_dir: + current_name = www_configuration_reader.reader_t( parent_dir ).name + #if parent_dir == self.rest_dir_path(): + # title_items.append( (None, current_name) ) + #else: + title_items.append( ( self.findout_href(parent_dir), current_name) ) + parent_dir = os.path.split( parent_dir )[0] + title_items.append( (self.findout_href(parent_dir), 'Home') ) + title_items.reverse() + return title_items + + def findout_href(self, dir_ ): + fname = www_configuration_reader.reader_t( dir_ ).main_html_file + href = os.path.join( utils.path.relative_path( utils.path.production_dir( self.rest_dir_path() ) + , utils.path.production_dir( dir_ ) ) + , fname ) + return href.replace( '\\', '/' ) + + def rest2html( self, rest_file_name ): + content = core.publish_file( source_path=rest_file_name + , destination=cStringIO.StringIO() + , writer_name='html' ) + return content + +if __name__ == '__main__': + f = file( os.path.join( settings.temp_dir, 'page.html' ), 'w+' ) + template = Template( settings.development_www_dir + , os.path.join( settings.development_www_dir, 'main.rest' ) ) + f.write( template.serialize() ) + f.close() + print 'done' Added: website/site_creator/template_wrapper.py =================================================================== --- website/site_creator/template_wrapper.py (rev 0) +++ website/site_creator/template_wrapper.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,50 @@ +import environment +import kid + +class Template( kid.BaseTemplate ): + def __init__( self, file=None, source=None, name=None, **kw ): + self.template_inst = kid.Template( file, source, name, **kw ) + + def write(self, file, encoding=None, fragment=0, output=None): + return self.template_inst.write( file, encoding, fragment, output) + + def serialize(self, encoding=None, fragment=0, output=None): + if output == None: + output = 'xhtml-strict' + return self.template_inst.serialize(encoding, fragment, output) + + def generate(self, encoding=None, fragment=0, output=None): + return self.template_inst.generate(encoding, fragment, output) + + def __iter__(self): + return iter( self.template_inst ) + + def __str__(self): + return str( self.template_inst ) + + def __unicode__(self): + return unicode( self.template_inst ) + + def initialize(self): + return self.template_inst.initialize() + + def pull(self): + return self.template_inst.pull() + + def _pull(self): + return self.template_inst._pull() + + def content(self): + return self.template_inst.content() + + def transform(self, stream=None, filters=[]): + return self.template_inst.transform(stream, filters) + + def _get_match_templates(self): + return self.template_inst._get_match_templates() + + def _get_serializer(self, serializer): + return self.template_inst._get_serializer( serializer ) + + def _get_assume_encoding(self): + return self.template_inst._get_assume_encoding() Added: website/site_creator/topics_creator.py =================================================================== --- website/site_creator/topics_creator.py (rev 0) +++ website/site_creator/topics_creator.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,84 @@ +import os +from environment import settings +import template_wrapper +import kid +import utils +from file_system_iter import folders_iterator, files_iterator +import www_configuration_reader + +class Template( template_wrapper.Template ): + def __init__( self, rest_file_path ): + self._html = os.path.join( settings.templates_dir, 'topics_template.html' ) + self._rest_file_path = rest_file_path + self._www_config_reader = www_configuration_reader.reader_t( self.rest_dir_path() ) + template_wrapper.Template.__init__( self, file=self._html ) + self.template_inst.title_items = self.findout_title_items() + self.template_inst.items = self.findout_items() + + def rest_dir_path(self): + return os.path.split( self._rest_file_path )[0] + + def rest_file_name( self ): + return os.path.split( self._rest_file_path )[1] + + def findout_title_items( self ): + title_items = [] + + parent_dir = self.rest_dir_path() + while parent_dir != settings.development_www_dir: + current_name = www_configuration_reader.reader_t( parent_dir ).name + if parent_dir == self.rest_dir_path(): + title_items.append( (None, current_name) ) + else: + title_items.append( ( self.findout_href(parent_dir), current_name) ) + parent_dir = os.path.split( parent_dir )[0] + title_items.append( (self.findout_href(parent_dir), 'Home') ) + title_items.reverse() + return title_items + + def findout_items(self): + if len( self.template_inst.title_items ) == 1: #Main page + return [] + star = '* ' + items = [] + + #if len( self.template_inst.title_items ) == 1: + # items.append( self.template_inst.title_items[0] ) + #else: + # items.append( ( self.findout_href( self.rest_dir_path() ) + # , www_configuration_reader.reader_t( self.rest_dir_path() ).name ) ) + + main_html_file_name_only = os.path.splitext( self._www_config_reader.main_html_file )[0] + for file_ in files_iterator( self.rest_dir_path(), ['*.rest'], True, False ): + file_name = os.path.split( file_ )[1] + file_name_only = os.path.splitext( file_name )[0] + if file_name_only == main_html_file_name_only: + continue #don't add link to main file + if ( file_name_only == 'index' and self.rest_dir_path() == settings.development_www_dir ) \ + or file_name in self._www_config_reader.files_to_skip: + continue + name = self._www_config_reader.find_out_name( file_name ) + if file_name == self.rest_file_name(): + items.append( (file_name_only + '.html', star + name) ) + else: + items.append( (file_name_only + '.html', name) ) + + for dir_ in folders_iterator( self.rest_dir_path(), is_recursive=False ): + www_config_reader = www_configuration_reader.reader_t( dir_ ) + if www_config_reader.expose_to_web: + items.append( (self.findout_href(dir_), www_config_reader.name ) ) + + def remove_star( name ): + if name.startswith( star ): + return name[len(star):] + return name + + items.sort( lambda x, y: cmp( remove_star(x[1]), remove_star(y[1]) ) ) + return items + + def findout_href(self, dir_ ): + fname = www_configuration_reader.reader_t( dir_ ).main_html_file + href = os.path.join( utils.path.relative_path( utils.path.production_dir( self.rest_dir_path() ) + , utils.path.production_dir( dir_ ) ) + , fname ) + return href.replace( '\\', '/' ) Added: website/site_creator/transform_html.py =================================================================== --- website/site_creator/transform_html.py (rev 0) +++ website/site_creator/transform_html.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,127 @@ +import os +import xml.dom.minidom + +#I should find next xml +""" +<p class="topic-title first"> +<a id="table-of-contents" name="table-of-contents">Table of contents</a> +</p> +""" +class adsence_injector_t: + #'<span style="margin-left: 23px; margin-bottom: 0; font-size: +1;">' + link_unit = os.linesep.join([ + '<li>' + , ' <script type="text/javascript"><!--' + , ' google_ad_client = "pub-0886572017808006";' + , ' google_alternate_color = "0000FF";' + , ' google_ad_width = 200;' + , ' google_ad_height = 95;' + , ' google_ad_format = "200x90_0ads_al_s";' + , ' google_ad_channel ="2925640868";' + , ' google_color_border = "FFFFFF";' + , ' google_color_bg = "FFFFFF";' + , ' google_color_link = "0033CC";' + , ' google_color_url = "0033CC";' + , ' google_color_text = "000000";' + , ' //--></script>' + , ' <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">' + , ' </script>' + , '</li>']) + + content = os.linesep.join([ + '<root>' + , '<script type="text/javascript"><!--' + , ' google_ad_client = "pub-0886572017808006";' + , ' google_alternate_color = "0000FF";' + , ' google_ad_width = 728;' + , ' google_ad_height = 90;' + , ' google_ad_format = "728x90_as";' + , ' google_ad_type = "text_image";' + , ' google_ad_channel ="8135159582";' + , ' google_color_border = "FFFFFF";' + , ' google_color_bg = "FFFFFF";' + , ' google_color_link = "0033CC";' + , ' google_color_url = "0033CC";' + , ' google_color_text = "000000";' + , ' //--></script>' + , ' <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">' + , ' </script>' + , '</root>']) + + def __init__( self ): + self.link_unit_xml = xml.dom.minidom.parseString( self.link_unit ) + self.content_xml = xml.dom.minidom.parseString( self.content ) + + def is_my_case( self, elem ): + if not elem.hasAttribute('id') or not elem.hasAttribute('name'): + return False + if elem.getAttribute('id') != "table-of-contents": + return False + if elem.getAttribute('name') != "table-of-contents": + return False + if not elem.hasChildNodes(): + return False + if 1 != len( elem.childNodes ): + return False + child = elem.childNodes[0] + if not isinstance( child, xml.dom.minidom.Text ): + return False + if child.data != "Table of contents": + return False + parent = elem.parentNode + if not parent.hasAttribute( 'class' ): + return False + if not parent.hasAttribute('class'): + return False + if parent.getAttribute('class') != "topic-title first": + return False + return True + + def __replace_elem( self, elem ): + elem = elem.parentNode.parentNode + ul_elems = elem.getElementsByTagName("ul") + relevant_ul = filter( lambda node: node.parentNode is elem, ul_elems )[0] + link_unit_elem = relevant_ul.ownerDocument.importNode( self.link_unit_xml.documentElement, True ) + relevant_ul.insertBefore( link_unit_elem, relevant_ul.firstChild ) + #parent = elem.parentNode + #parent.removeChild( elem ) + #link_unit_elem = parent.ownerDocument.importNode( self.link_unit_xml.documentElement, True ) + #parent.appendChild( link_unit_elem ) + content_elem = relevant_ul.ownerDocument.importNode( self.content_xml.documentElement, True ) + relevant_ul.parentNode.appendChild( content_elem ) + + def buitify( self, doc ): + answer = [] + for line in doc.split('\n'): + if line.strip(): + answer.append( line ) + return '\n'.join( answer ) + + def rename_contents_topic(self, doc): + #class="contents topic"==> contents topic + cls_elems = doc.documentElement.getElementsByTagName("div") + for elem in cls_elems: + if not elem.hasAttribute( 'class' ): + continue + if elem.getAttribute('class') != "contents topic": + continue + else: + elem.setAttribute('class', 'contentstopic' ) + + def inject( self, html_document ): + doc = xml.dom.minidom.parseString( html_document ) + root_elem = doc.documentElement + a_elems = root_elem.getElementsByTagName("a") + relevant_elems = filter( self.is_my_case, a_elems ) + if 1 == len( relevant_elems ): + self.__replace_elem( relevant_elems[0] ) + else: + print 'relevant <a> element has not been found or there is more then 1 relvant element.' + self.rename_contents_topic( doc ) + #new_html_document = doc.toprettyxml() + new_html_document = doc.toxml() + return self.buitify( new_html_document ) + +if __name__ == "__main__": + t = adsence_injector_t( ) + t.inject('/home/roman/language-binding/production/www/pyplusplus/pyplusplus.html') \ No newline at end of file Added: website/site_creator/utils.py =================================================================== --- website/site_creator/utils.py (rev 0) +++ website/site_creator/utils.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,146 @@ +import os +import sys +import shutil +import webbrowser +from sets import Set as set +from environment import settings + +class path: + def normalize( some_path ): + n = os.path.normpath( os.path.normcase( some_path ) ) + return n.replace( '\\', '/' ) + normalize = staticmethod( normalize ) + + def is_parent_and_child( root_dir, child_dir ): + root_dir = path.normalize( root_dir ) + child_dir = path.normalize( child_dir ) + return root_dir in child_dir and len( root_dir ) < len( child_dir ) + is_parent_and_child = staticmethod( is_parent_and_child ) + + def is_same( path1, path2 ): + path1 = path.normalize( path1 ) + path2 = path.normalize( path2 ) + return path1 == path2 + is_same = staticmethod( is_same ) + + def suffix( root_dir, child_dir ): + root_dir = path.normalize( root_dir ) + child_dir = path.normalize( child_dir ) + suffix = child_dir[ len( root_dir ): ] + if suffix.startswith( '/' ): + suffix = suffix[1:] + return suffix + suffix = staticmethod( suffix ) + + def production_dir( development_dir ): + development_dir = path.normalize( development_dir ) + suffix = path.suffix( settings.development_dir, development_dir ) + return path.normalize( os.path.join( settings.production_dir, suffix ) ) + production_dir = staticmethod( production_dir ) + + def development_dir( production_dir ): + production_dir = path.normalize( production_dir ) + suffix = path.suffix( settings.production_dir, production_dir ) + return path.normalize( os.path.join( settings.development_dir, suffix ) ) + development_dir = staticmethod( development_dir ) + + def components( p ): + answer = [] + root = p + while root: + root, leaf = os.path.split( root ) + if not leaf: + answer.append( root ) + break + else: + answer.append( leaf ) + + answer.reverse() + return answer + + components = staticmethod( components ) + + def common_prefix( path1, path2 ): + #Returns common prefix of 2 pathes as os path + common_prefix = '' + comp1 = path.components(path1) + comp2 = path.components(path2) + for i in range( min( len( comp1 ), len( comp2 ) ) ): + if comp1[i] != comp2[i]: + if not i: + return None + else: + return path.normalize( os.path.join( *comp1[:i] ) ) + else: + if len( comp1 ) < len( comp2 ): + return path.normalize( os.path.join( *comp1 ) ) + else: + return path.normalize( os.path.join( *comp2 ) ) + common_prefix = staticmethod( common_prefix ) + + def relative_path( from_path, to_path ): + from_path = path.normalize( from_path ) + to_path = path.normalize( to_path ) + if from_path == to_path: + return '.' + + common_prefix = path.common_prefix( from_path, to_path ) + if not common_prefix: + return to_path #this could happen on windows machine + + comm_pref_components = path.components( common_prefix ) + fp_components = path.components( from_path ) + tp_components = path.components( to_path ) + if comm_pref_components == fp_components: + return os.path.join( '.', *tp_components[ len( fp_components ): ] ) + else: + #move up until common prefix + temp = ['..'] * ( len( fp_components ) - len( comm_pref_components ) ) + #move down from common component + temp.extend( tp_components[ len( comm_pref_components ): ] ) + relative_path = os.path.join( *temp ) + return relative_path.replace( '\\', '/' ) + relative_path = staticmethod( relative_path ) + + def copytree(src, dst, symlinks=False): + if not os.path.exists( dst ): + os.mkdir(dst) + for name in os.listdir(src): + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + if symlinks and os.path.islink(srcname): + linkto = os.readlink(srcname) + os.symlink(linkto, dstname) + elif os.path.isdir(srcname): + name_only = os.path.split( srcname )[1] + if name.startswith('.'): + continue + path.copytree(srcname, dstname, symlinks) + else: + shutil.copy2(srcname, dstname) + copytree = staticmethod( copytree ) + +def preview_html( html ): + f = os.path.join( settings.temp_dir, 'preview.html' ) + f = file( f, 'w+b' ) + f.write( html ) + f.close() + +def take_sys_snapshot(): + return dict( modules=set( sys.modules.keys() ) + , path=set( sys.path ) ) + +def restore_sys_snapshot( snapshot ): + new_modules = set( sys.modules.keys() ).difference( snapshot['modules'] ) + for x in new_modules: + while x in sys.modules: + sys.modules.pop( x ) + new_paths = set( sys.path ).difference( snapshot['path'] ) + for x in new_paths: + while x in sys.path: + sys.path.remove( x ) + +if __name__ == '__main__': + print path.relative_path( r'C:\AC_SERVER_III_V3_1\acmo\acmo.dsp', r'C:\AC_SERVER_III_V3_1\3rdParty\Boost' ) + print path.relative_path( r'C:\AC_SERVER_III_V3_1\acmo', r'C:\AC_SERVER_III_V3_1\acmo\xyz' ) + \ No newline at end of file Added: website/site_creator/www_configuration_reader.py =================================================================== --- website/site_creator/www_configuration_reader.py (rev 0) +++ website/site_creator/www_configuration_reader.py 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,51 @@ +import os +import sys +from environment import settings +import utils + +class reader_t( object ): + def __init__( self, dir_ ): + object.__init__( self ) + self.__working_dir = dir_ + + def _exists( self ): + return os.path.exists( os.path.join( self.__working_dir, settings.configuration_file + '.py' ) ) + exists = property( _exists ) + + def _get_value( self, name, default_value=None ): + if not self.exists: + return default_value + sys_snapshot = utils.take_sys_snapshot() + try: + sys.path.append( self.__working_dir ) + config = __import__( settings.configuration_file ) + if hasattr( config, name ): + return getattr( config, name ) + else: + return default_value + finally: + utils.restore_sys_snapshot( sys_snapshot ) + + def _name( self ): + return self._get_value( 'name', os.path.split( self.__working_dir )[1] ) + name = property( _name ) + + def find_out_name( self, file_name ): + values = self._get_value( 'names', {} ) + name_only = os.path.splitext( file_name )[0] + return values.get( name_only, name_only ) + + def _expose_to_web( self ): + return self._get_value( 'expose_to_web', True ) + expose_to_web = property( _expose_to_web ) + + def _main_html_file( self ): + if self.__working_dir == settings.development_www_dir: + return 'index.html' + else: + return self._get_value( 'main_html_file', os.path.split( self.__working_dir )[1] + '.html' ) + main_html_file = property( _main_html_file ) + + def _files_to_skip( self ): + return self._get_value( 'files_to_skip', [] ) + files_to_skip = property( _files_to_skip ) \ No newline at end of file Added: website/templates/css_cheat_sheet.pdf =================================================================== --- website/templates/css_cheat_sheet.pdf (rev 0) +++ website/templates/css_cheat_sheet.pdf 2006-12-31 08:43:40 UTC (rev 823) @@ -0,0 +1,8688 @@ +%PDF-1.4 +%\xE2\xE3\xCF\xD3 +10 0 obj <</Linearized 1/L 382999/O 13/E 374243/N 1/T 382752/H [ 29716 1920]>> +endobj + +xref +10 1471 +0000000016 00000 n +0000031636 00000 n +0000031726 00000 n +0000031766 00000 n +0000031952 00000 n +0000045577 00000 n +0000045973 00000 n +0000046471 00000 n +0000046519 00000 n +0000046567 00000 n +0000046615 00000 n +0000046663 00000 n +0000046711 00000 n +0000046759 00000 n +0000046807 00000 n +0000046855 00000 n +0000046903 00000 n +0000046951 00000 n +0000046999 00000 n +0000047047 00000 n +0000047095 00000 n +0000047143 00000 n +0000047191 00000 n +0000047239 00000 n +0000047287 00000 n +0000047335 00000 n +0000047383 00000 n +0000047431 00000 n +0000047479 00000 n +0000047527 00000 n +0000047575 00000 n +0000047623 00000 n +0000047670 00000 n +0000047718 00000 n +0000047765 00000 n +0000047813 00000 n +0000047861 00000 n +0000047908 00000 n +0000047955 00000 n +0000048002 00000 n +0000048050 00000 n +0000048097 00000 n +0000048145 00000 n +0000048193 00000 n +0000048241 00000 n +0000048289 00000 n +0000048337 00000 n +0000048385 00000 n +0000048433 00000 n +0000048481 00000 n +0000048529 00000 n +0000048577 00000 n +0000048625 00000 n +0000048673 00000 n +0000048721 00000 n +0000048769 00000 n +0000048817 00000 n +0000048865 00000 n +0000048913 00000 n +0000048961 00000 n +0000049009 00000 n +0000049057 00000 n +0000049105 00000 n +0000049153 00000 n +0000049201 00000 n +0000049249 00000 n +0000049297 00000 n +0000049345 00000 n +0000049393 00000 n +0000049441 00000 n +0000049489 00000 n +0000049537 00000 n +0000049585 00000 n +0000049633 00000 n +0000049681 00000 n +0000049729 00000 n +0000049777 00000 n +0000049825 00000 n +0000049873 00000 n +0000049921 00000 n +0000049969 00000 n +0000050017 00000 n +0000050065 00000 n +0000050113 00000 n +0000050161 00000 n +0000050209 00000 n +0000050257 00000 n +0000050305 00000 n +0000050353 00000 n +0000050401 00000 n +0000050449 00000 n +0000050498 00000 n +0000050547 00000 n +0000050596 00000 n +0000050645 00000 n +0000050693 00000 n +0000050741 00000 n +0000050790 00000 n +0000050839 00000 n +0000050888 00000 n +0000050936 00000 n +0000050985 00000 n +0000051034 00000 n +0000051083 00000 n +0000051131 00000 n +0000051180 00000 n +0000051229 00000 n +0000051278 00000 n +0000051327 00000 n +0000051376 00000 n +0000051425 00000 n +0000051474 00000 n +0000051523 00000 n +0000051572 00000 n +0000051621 00000 n +0000051670 00000 n +0000051719 00000 n +0000051768 00000 n +0000051817 00000 n +0000051866 00000 n +0000051915 00000 n +0000051964 00000 n +0000052013 00000 n +0000052062 00000 n +0000052111 00000 n +0000052160 00000 n +0000052209 00000 n +0000052258 00000 n +0000052307 00000 n +0000052356 00000 n +0000052405 00000 n +0000052454 00000 n +0000052503 00000 n +0000052552 00000 n +0000052601 00000 n +0000052649 00000 n +0000052698 00000 n +0000052747 00000 n +0000052796 00000 n +0000052845 00000 n +0000052894 00000 n +0000052943 00000 n +0000052992 00000 n +0000053041 00000 n +0000053090 00000 n +0000053139 00000 n +0000053188 00000 n +0000053237 00000 n +0000053286 00000 n +0000053335 00000 n +0000053384 00000 n +0000053433 00000 n +0000053482 00000 n +0000053531 00000 n +0000053580 00000 n +0000053629 00000 n +0000053677 00000 n +0000053726 00000 n +0000053774 00000 n +0000053822 00000 n +0000053870 00000 n +0000053918 00000 n +0000053966 00000 n +0000054014 00000 n +0000054062 00000 n +0000054111 00000 n +0000054159 00000 n +0000054207 00000 n +0000054255 00000 n +0000054303 00000 n +0000054351 00000 n +0000054399 00000 n +0000054447 00000 n +0000054495 00000 n +0000054543 00000 n +0000054591 00000 n +0000054639 00000 n +0000054687 00000 n +0000054734 00000 n +0000054782 00000 n +0000054830 00000 n +0000054878 00000 n +0000054926 00000 n +0000054974 00000 n +0000055022 00000 n +0000055070 00000 n +0000055118 00000 n +0000055166 00000 n +0000055214 00000 n +0000055262 00000 n +0000055310 00000 n +0000055358 00000 n +0000055406 00000 n +0000055454 00000 n +0000055502 00000 n +0000055550 00000 n +0000055598 00000 n +0000055646 00000 n +0000055694 00000 n +0000055742 00000 n +0000055790 00000 n +0000055838 00000 n +0000055886 00000 n +0000055934 00000 n +0000055982 00000 n +0000056029 00000 n +0000056077 00000 n +0000056124 00000 n +0000056172 00000 n +0000056219 00000 n +0000056266 00000 n +0000056313 00000 n +0000056360 00000 n +0000056408 00000 n +0000056456 00000 n +0000056504 00000 n +0000056552 00000 n +0000056600 00000 n +0000056647 00000 n +0000056695 00000 n +0000056743 00000 n +0000056791 00000 n +0000056838 00000 n +0000056886 00000 n +0000056934 00000 n +0000056981 00000 n +0000057029 00000 n +0000057077 00000 n +0000057125 00000 n +0000057173 00000 n +0000057221 00000 n +0000057269 00000 n +0000057317 00000 n +0000057365 00000 n +0000057413 00000 n +0000057461 00000 n +0000057509 00000 n +0000057557 00000 n +0000057605 00000 n +0000057653 00000 n +0000057700 00000 n +0000057747 00000 n +0000057795 00000 n +0000057843 00000 n +0000057891 00000 n +0000057939 00000 n +0000057987 00000 n +0000058035 00000 n +0000058083 00000 n +0000058131 00000 n +0000058179 00000 n +0000058227 00000 n +0000058275 00000 n +0000058323 00000 n +0000058371 00000 n +0000058419 00000 n +0000058467 00000 n +0000058515 00000 n +0000058563 00000 n +0000058611 00000 n +0000058659 00000 n +0000058707 00000 n +0000058755 00000 n +0000058803 00000 n +0000058851 00000 n +0000058899 00000 n +0000058947 00000 n +0000058994 00000 n +0000059042 00000 n +0000059090 00000 n +0000059138 00000 n +0000059186 00000 n +0000059234 00000 n +0000059282 00000 n +0000059330 00000 n +0000059378 00000 n +0000059426 00000 n +0000059474 00000 n +0000059522 00000 n +0000059570 00000 n +0000059618 00000 n +0000059666 00000 n +0000059714 00000 n +0000059762 00000 n +0000059810 00000 n +0000059858 00000 n +0000059906 00000 n +0000059954 00000 n +0000060002 00000 n +0000060049 00000 n +0000060097 00000 n +0000060144 00000 n +0000060192 00000 n +0000060239 00000 n +0000060287 00000 n +0000060334 00000 n +0000060381 00000 n +0000060428 00000 n +0000060475 00000 n +0000060523 00000 n +0000060571 00000 n +0000060619 00000 n +0000060667 00000 n +0000060715 00000 n +0000060763 00000 n +0000060811 00000 n +0000060859 00000 n +0000060907 00000 n +0000060955 00000 n +0000061003 00000 n +0000061051 00000 n +0000061099 00000 n +0000061147 00000 n +0000061195 00000 n +0000061243 00000 n +0000061291 00000 n +0000061339 00000 n +0000061387 00000 n +0000061435 00000 n +0000061483 00000 n +0000061531 00000 n +0000061579 00000 n +0000061627 00000 n +0000061675 00000 n +0000061723 00000 n +0000061771 00000 n +0000061819 00000 n +0000061867 00000 n +0000061915 00000 n +0000061963 00000 n +0000062010 00000 n +0000062058 00000 n +0000062105 00000 n +0000062153 00000 n +0000062200 00000 n +0000062248 00000 n +0000062296 00000 n +0000062344 00000 n +0000062392 00000 n +0000062440 00000 n +0000062488 00000 n +0000062536 00000 n +0000062584 00000 n +0000062631 00000 n +0000062679 00000 n +0000062727 00000 n +0000062775 00000 n +0000062823 00000 n +0000062871 00000 n +0000062919 00000 n +0000062967 00000 n +0000063015 00000 n +0000063063 00000 n +0000063111 00000 n +0000063159 00000 n +0000063207 00000 n +0000063255 00000 n +0000063303 00000 n +0000063351 00000 n +0000063399 00000 n +0000063447 00000 n +0000063495 00000 n +0000063544 00000 n +0000063592 00000 n +0000063641 00000 n +0000063689 00000 n +0000063738 00000 n +0000063786 00000 n +0000063834 00000 n +0000063882 00000 n +0000063930 00000 n +0000063978 00000 n +0000064026 00000 n +0000064074 00000 n +0000064122 00000 n +0000064170 00000 n +0000064218 00000 n +0000064266 00000 n +0000064314 00000 n +0000064362 00000 n +0000064410 00000 n +0000064458 00000 n +0000064506 00000 n +0000064554 00000 n +0000064602 00000 n +0000064650 00000 n +0000064698 00000 n +0000064746 00000 n +0000064794 00000 n +0000064842 00000 n +0000064889 00000 n +0000064936 00000 n +0000064984 00000 n +0000065032 00000 n +0000065080 00000 n +0000065127 00000 n +0000065175 00000 n +0000065222 00000 n +0000065270 00000 n +0000065318 00000 n +0000065365 00000 n +0000065412 00000 n +0000065460 00000 n +0000065508 00000 n +0000065556 00000 n +0000065604 00000 n +0000065653 00000 n +0000065702 00000 n +0000065750 00000 n +0000065798 00000 n +0000065846 00000 n +0000065895 00000 n +0000065943 00000 n +0000065992 00000 n +0000066040 00000 n +0000066088 00000 n +0000066136 00000 n +0000066184 00000 n +0000066232 00000 n +0000066281 00000 n +0000066330 00000 n +0000066379 00000 n +0000066427 00000 n +0000066476 00000 n +0000066525 00000 n +0000066574 00000 n +0000066623 00000 n +0000066672 00000 n +0000066721 00000 n +0000066770 00000 n +0000066819 00000 n +0000066868 00000 n +0000066917 00000 n +0000066966 00000 n +0000067015 00000 n +0000067064 00000 n +0000067113 00000 n +0000067162 00000 n +0000067211 00000 n +0000067260 00000 n +0000067309 00000 n +0000067358 00000 n +0000067407 00000 n +0000067456 00000 n +0000067505 00000 n +0000067554 00000 n +0000067603 00000 n +0000067652 00000 n +0000067701 00000 n +0000067750 00000 n +0000067798 00000 n +0000067846 00000 n +0000067894 00000 n +0000067942 00000 n +0000067990 00000 n +0000068038 00000 n +0000068086 00000 n +0000068134 00000 n +0000068182 00000 n +0000068230 00000 n +0000068278 00000 n +0000068327 00000 n +0000068375 00000 n +0000068423 00000 n +0000068471 00000 n +0000068519 00000 n +0000068568 00000 n +0000068617 00000 n +0000068666 00000 n +0000068715 00000 n +0000068764 00000 n +0000068813 00000 n +0000068862 00000 n +0000068911 00000 n +0000068960 00000 n +0000069009 00000 n +0000069058 00000 n +0000069107 00000 n +0000069156 00000 n +0000069205 00000 n +0000069254 00000 n +0000069303 00000 n +0000069352 00000 n +0000069401 00000 n +0000069450 00000 n +0000069499 00000 n +0000069548 00000 n +0000073723 00000 n +0000074099 00000 n +0000078332 00000 n +0000083172 00000 n +0000088051 00000 n +0000091337 00000 n +0000094236 00000 n +0000094394 00000 n +0000099464 00000 n +0000103557 00000 n +0000103792 00000 n +0000104124 00000 n +0000104350 00000 n +0000104671 00000 n +0000104912 00000 n +0000105239 00000 n +0000105480 00000 n +0000105807 00000 n +0000106030 00000 n +0000106331 00000 n +0000106608 00000 n +0000106974 00000 n +0000107142 00000 n +0000107383 00000 n +0000107624 00000 n +0000107949 00000 n +0000108199 00000 n +0000108531 00000 n +0000108802 00000 n +0000109153 00000 n +0000109406 00000 n +0000109750 00000 n +0000109843 00000 n +0000110049 00000 n +0000110275 00000 n +0000110583 00000 n +0000110700 00000 n +0000110919 00000 n +0000111133 00000 n +0000111441 00000 n +0000111546 00000 n +0000111763 00000 n +0000111971 00000 n +0000112283 00000 n +0000112500 00000 n +0000112812 00000 n +0000113038 00000 n +0000113361 00000 n +0000113584 00000 n +0000113898 00000 n +0000114000 00000 n +0000114205 00000 n +0000114286 00000 n +0000114473 00000 n +0000114572 00000 n +0000114765 00000 n +0000114855 00000 n +0000115048 00000 n +0000115295 00000 n +0000115623 00000 n +0000115725 00000 n +0000115920 00000 n +0000116185 00000 n +0000116542 00000 n +0000116629 00000 n +0000116819 00000 n +0000117051 00000 n +0000117376 00000 n +0000117578 00000 n +0000117887 00000 n +0000118098 00000 n +0000118390 00000 n +0000118652 00000 n +0000119000 00000 n +0000119108 00000 n +0000119325 00000 n +0000119605 00000 n +0000119990 00000 n +0000120098 00000 n +0000120325 00000 n +0000120587 00000 n +0000120948 00000 n +0000121065 00000 n +0000121296 00000 n +0000121404 00000 n +0000121613 00000 n +0000121697 00000 n +0000121886 00000 n +0000121949 00000 n +0000122121 00000 n +0000122365 00000 n +0000122692 00000 n +0000122912 00000 n +0000123235 00000 n +0000123476 00000 n +0000123817 00000 n +0000124055 00000 n +0000124398 00000 n +0000124451 00000 n +0000124621 00000 n +0000124889 00000 n +0000125244 00000 n +0000125307 00000 n +0000125479 00000 n +0000125729 00000 n +0000126063 00000 n +0000126126 00000 n +0000126298 00000 n +0000126578 00000 n +0000126947 00000 n +0000127007 00000 n +0000127178 00000 n +0000127458 00000 n +0000127858 00000 n +0000127921 00000 n +0000128093 00000 n +0000128352 00000 n +0000128704 00000 n +0000128764 00000 n +0000128935 00000 n +0000129143 00000 n +0000129446 00000 n +0000129518 00000 n +0000129696 00000 n +0000129792 00000 n +0000129985 00000 n +0000130078 00000 n +0000130270 00000 n +0000130369 00000 n +0000130562 00000 n +0000130661 00000 n +0000130875 00000 n +0000130977 00000 n +0000131197 00000 n +0000131305 00000 n +0000131528 00000 n +0000131606 00000 n +0000131788 00000 n +0000131884 00000 n +0000132093 00000 n +0000132177 00000 n +0000132364 00000 n +0000132472 00000 n +0000132668 00000 n +0000132954 00000 n +0000133297 00000 n +0000133384 00000 n +0000133575 00000 n +0000133798 00000 n +0000134115 00000 n +0000134241 00000 n +0000134473 00000 n +0000134765 00000 n +0000135115 00000 n +0000135356 00000 n +0000135682 00000 n +0000135914 00000 n +0000136225 00000 n +0000136457 00000 n +0000136780 00000 n +0000137003 00000 n +0000137302 00000 n +0000137543 00000 n +0000137868 00000 n +0000138109 00000 n +0000138421 00000 n +0000138638 00000 n +0000138940 00000 n +0000139172 00000 n +0000139488 00000 n +0000139684 00000 n +0000139964 00000 n +0000140208 00000 n +0000140529 00000 n +0000140725 00000 n +0000141004 00000 n +0000141245 00000 n +0000141561 00000 n +0000141742 00000 n +0000142023 00000 n +0000142285 00000 n +0000142614 00000 n +0000142831 00000 n +0000143126 00000 n +0000143433 00000 n +0000143811 00000 n +0000144022 00000 n +0000144314 00000 n +0000144564 00000 n +0000144891 00000 n +0000145132 00000 n +0000145441 00000 n +0000145724 00000 n +0000146073 00000 n +0000146350 00000 n +0000146691 00000 n +0000146784 00000 n +0000146987 00000 n +0000147216 00000 n +0000147519 00000 n +0000147609 00000 n +0000147810 00000 n +0000148027 00000 n +0000148340 00000 n +0000148424 00000 n +0000148624 00000 n +0000148714 00000 n +0000148913 00000 n +0000149006 00000 n +0000149202 00000 n +0000149292 00000 n +0000149491 00000 n +0000149569 00000 n +0000149753 00000 n +0000149852 00000 n +0000150055 00000 n +0000150145 00000 n +0000150336 00000 n +0000150506 00000 n +0000150569 00000 n +0000150741 00000 n +0000150804 00000 n +0000150976 00000 n +0000151036 00000 n +0000151207 00000 n +0000151270 00000 n +0000151442 00000 n +0000151502 00000 n +0000151673 00000 n +0000151733 00000 n +0000151904 00000 n +0000152027 00000 n +0000152253 00000 n +0000152316 00000 n +0000152488 00000 n +0000152578 00000 n +0000152780 00000 n +0000152846 00000 n +0000153023 00000 n +0000153134 00000 n +0000153343 00000 n +0000153427 00000 n +0000153612 00000 n +0000153735 00000 n +0000153956 00000 n +0000154121 00000 n +0000154347 00000 n +0000154558 00000 n +0000154875 00000 n +0000155155 00000 n +0000155513 00000 n +0000155805 00000 n +0000156214 00000 n +0000156506 00000 n +0000156911 00000 n +0000157182 00000 n +0000157556 00000 n +0000157803 00000 n +0000158145 00000 n +0000158404 00000 n +0000158749 00000 n +0000159002 00000 n +0000159351 00000 n +0000159625 00000 n +0000159998 00000 n +0000160263 00000 n +0000160613 00000 n +0000160887 00000 n +0000161267 00000 n +0000161565 00000 n +0000161967 00000 n +0000162223 00000 n +0000162580 00000 n +0000162836 00000 n +0000163179 00000 n +0000163408 00000 n +0000163712 00000 n +0000163947 00000 n +0000164253 00000 n +0000164506 00000 n +0000164814 00000 n +0000165016 00000 n +0000165286 00000 n +0000165403 00000 n +0000165614 00000 n +0000165674 00000 n +0000165845 00000 n +0000166086 00000 n +0000166385 00000 n +0000166557 00000 n +0000166782 00000 n +0000167044 00000 n +0000167390 00000 n +0000167555 00000 n +0000167785 00000 n +0000168059 00000 n +0000168413 00000 n +0000168533 00000 n +0000168758 00000 n +0000169020 00000 n +0000169366 00000 n +0000169483 00000 n +0000169706 00000 n +0000169947 00000 n +0000170274 00000 n +0000170400 00000 n +0000170623 00000 n +0000170746 00000 n +0000170970 00000 n +0000171099 00000 n +0000171327 00000 n +0000171444 00000 n +0000171670 00000 n +0000171799 00000 n +0000172025 00000 n +0000172254 00000 n +0000172577 00000 n +0000172806 00000 n +0000173132 00000 n +0000173388 00000 n +0000173728 00000 n +0000173990 00000 n +0000174332 00000 n +0000174585 00000 n +0000174912 00000 n +0000175102 00000 n +0000175352 00000 n +0000175623 00000 n +0000175971 00000 n +0000176155 00000 n +0000176397 00000 n +0000176647 00000 n +0000176993 00000 n +0000177183 00000 n +0000177429 00000 n +0000177676 00000 n +0000178017 00000 n +0000178119 00000 n +0000178321 00000 n +0000178544 00000 n +0000178843 00000 n +0000178951 00000 n +0000179157 00000 n +0000179362 00000 n +0000179647 00000 n +0000179746 00000 n +0000179951 00000 n +0000180053 00000 n +0000180256 00000 n +0000180340 00000 n +0000180538 00000 n +0000180652 00000 n +0000180870 00000 n +0000180966 00000 n +0000181157 00000 n +0000181350 00000 n +0000181628 00000 n +0000181845 00000 n +0000182117 00000 n +0000182237 00000 n +0000182448 00000 n +0000182520 00000 n +0000182699 00000 n +0000182786 00000 n +0000182975 00000 n +0000183104 00000 n +0000183329 00000 n +0000183389 00000 n +0000183560 00000 n +0000183677 00000 n +0000183896 00000 n +0000183968 00000 n +0000184147 00000 n +0000184315 00000 n +0000184559 00000 n +0000184640 00000 n +0000184830 00000 n +0000185083 00000 n +0000185420 00000 n +0000185504 00000 n +0000185694 00000 n +0000185953 00000 n +0000186330 00000 n +0000186495 00000 n +0000186732 00000 n +0000187000 00000 n +0000187381 00000 n +0000187631 00000 n +0000187986 00000 n +0000188230 00000 n +0000188572 00000 n +0000188816 00000 n +0000189169 00000 n +0000189401 00000 n +0000189756 00000 n +0000189931 00000 n +0000190179 00000 n +0000190381 00000 n +0000190650 00000 n +0000190840 00000 n +0000191094 00000 n +0000191281 00000 n +0000191531 00000 n +0000191706 00000 n +0000191955 00000 n +0000192120 00000 n +0000192364 00000 n +0000192611 00000 n +0000192971 00000 n +0000193136 00000 n +0000193376 00000 n +0000193632 00000 n +0000193990 00000 n +0000194155 00000 n +0000194395 00000 n +0000194672 00000 n +0000195050 00000 n +0000195228 00000 n +0000195474 00000 n +0000195745 00000 n +0000196146 00000 n +0000196327 00000 n +0000196578 00000 n +0000196852 00000 n +0000197248 00000 n +0000197501 00000 n +0000197873 00000 n +0000198060 00000 n +0000198336 00000 n +0000198444 00000 n +0000198670 00000 n +0000198772 00000 n +0000198998 00000 n +0000199163 00000 n +0000199399 00000 n +0000199525 00000 n +0000199765 00000 n +0000199955 00000 n +0000200213 00000 n +0000200385 00000 n +0000200632 00000 n +0000200825 00000 n +0000201083 00000 n +0000201206 00000 n +0000201448 00000 n +0000201620 00000 n +0000201862 00000 n +0000202052 00000 n +0000202304 00000 n +0000202472 00000 n +0000202700 00000 n +0000202878 00000 n +0000203125 00000 n +0000203245 00000 n +0000203469 00000 n +0000203674 00000 n +0000203934 00000 n +0000204054 00000 n +0000204274 00000 n +0000204488 00000 n +0000204755 00000 n +0000204857 00000 n +0000205067 00000 n +0000205166 00000 n +0000205363 00000 n +0000205565 00000 n +0000205817 00000 n +0000205895 00000 n +0000206083 00000 n +0000206143 00000 n +0000206314 00000 n +0000206437 00000 n +0000206663 00000 n +0000206741 00000 n +0000206929 00000 n +0000206992 00000 n +0000207164 00000 n +0000207251 00000 n +0000207447 00000 n +0000207534 00000 n +0000207725 00000 n +0000207895 00000 n +0000208006 00000 n +0000208231 00000 n +0000208475 00000 n +0000208797 00000 n +0000209068 00000 n +0000209432 00000 n +0000209712 00000 n +0000210086 00000 n +0000210348 00000 n +000021... [truncated message content] |