# Copyright (c) Aleksey Gurtovoy 2001-2009 # # 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 fnmatch import os import sys import re import string underlines = ['+', '/'] special_cases = [ 'inserter', '_1,_2,..._n' ] def __section_header(section): parts = section.split('/') underline = underlines[len(parts) - 1] * len(parts[-1]) if len(parts) > 0: hidden_target = '.. _`label-%s`:' % '-'.join( parts ) return '\n%s\n%s\n%s\n\n' % (parts[-1], underline, hidden_target ) else: return '\n%s\n%s\n\n' % (parts[-1], underline ) def __section_intro(section): parts = section.split('/') return '%s.rst' % '-'.join( [x.split(' ')[0] for x in parts] ) def __include_page( output, src_dir, page, name = None ): output.write( '.. include:: %s\n' % os.path.join( src_dir, page ) ) # output.write( '.. raw:: LaTeX\n\n' ) # output.write( ' \\newpage\n\n') if name and name not in special_cases: ref = name else: ref = '/'.join( page.split('.')[0].split('-') ) if ref.upper() == ref or ref.lower() == ref: output.write( ( '.. |%(ref)s| replace:: `%(ref)s`_\n' ) % { 'ref': ref } ) else: if ref.find( '/' ) == -1: ref = ' '.join( filter( lambda x: len( x.strip() ) > 0, re.split( '([A-Z][a-z]+)', ref ) ) ) output.write( '.. |%(ref)s| replace:: `%(ref)s`_\n' % { 'ref': ref } ) output.write( '\n' ) def __write_index( filename, index ): index_file = open( filename, 'w' ) index.sort() for x in index: index_file.write( '* |%s|\n' % x ) index_file.close() def main( filename, src_dir, build_dir ): sources = filter( lambda x: fnmatch.fnmatch(x,"*.rst") and x != filename , os.listdir( src_dir ) ) toc = [ t.strip() for t in open( os.path.join( src_dir, '%s.toc' % filename) ).readlines() ] topics = {} for t in toc: topics[t] = [] concept_index = [] index = [] output = open( os.path.join( build_dir, '%s.gen' % filename ), 'w') output.writelines( open( os.path.join( src_dir, '%s.rst' % filename ), 'r' ).readlines() ) re_topic = re.compile(r'^..\s+(.+?)//(.+?)(\s*\|\s*(\d+))?\s*$') for src in sources: placement_spec = open( os.path.join( src_dir, src ), 'r' ).readline() topic = 'Unclassified' name = None order = -1 match = re_topic.match(placement_spec) if match: topic = match.group(1) name = match.group(2) if match.group(3): order = int(match.group(4)) if not topics.has_key(topic): topics[topic] = [] topics[topic].append((src, order, name)) if name: if topic.find( '/Concepts' ) == -1: index.append( name ) else: concept_index.append( name ) for t in toc: content = topics[t] content.sort( lambda x,y: x[1] - y[1] ) output.write( __section_header(t) ) intro = __section_intro( t ) if os.path.exists( os.path.join( src_dir, intro ) ): __include_page( output, src_dir, intro ) for src in content: __include_page( output, src_dir, src[0], src[2] ) output.close() __write_index( os.path.join( build_dir, 'concepts.gen' ), concept_index ) __write_index( os.path.join( build_dir, 'index.gen' ), index ) main( 'refmanual', os.path.dirname( __file__ ), sys.argv[1] )