blob: cda0c228bdd56e1bfc8ac683988daa38cdafc498 [file] [log] [blame]
# 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] )