mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
145 lines
5.0 KiB
Python
145 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Documentation converter - high level functions
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
:copyright: 2007-2008 by Georg Brandl.
|
|
:license: BSD.
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import glob
|
|
import shutil
|
|
import codecs
|
|
from os import path
|
|
|
|
from .tokenizer import Tokenizer
|
|
from .latexparser import DocParser
|
|
from .restwriter import RestWriter
|
|
from .filenamemap import (fn_mapping, copyfiles_mapping, newfiles_mapping,
|
|
rename_mapping, dirs_to_make, toctree_mapping,
|
|
amendments_mapping)
|
|
from .console import red, green
|
|
|
|
def convert_file(infile, outfile, doraise=True, splitchap=False,
|
|
toctree=None, deflang=None, labelprefix=''):
|
|
inf = codecs.open(infile, 'r', 'latin1')
|
|
p = DocParser(Tokenizer(inf.read()).tokenize(), infile)
|
|
if not splitchap:
|
|
outf = codecs.open(outfile, 'w', 'utf-8')
|
|
else:
|
|
outf = None
|
|
r = RestWriter(outf, splitchap, toctree, deflang, labelprefix)
|
|
try:
|
|
r.write_document(p.parse())
|
|
if splitchap:
|
|
for i, chapter in enumerate(r.chapters[1:]):
|
|
coutf = codecs.open('%s/%d_%s' % (
|
|
path.dirname(outfile), i+1, path.basename(outfile)),
|
|
'w', 'utf-8')
|
|
coutf.write(chapter.getvalue())
|
|
coutf.close()
|
|
else:
|
|
outf.close()
|
|
return 1, r.warnings
|
|
except Exception, err:
|
|
if doraise:
|
|
raise
|
|
return 0, str(err)
|
|
|
|
|
|
def convert_dir(outdirname, *args):
|
|
# make directories
|
|
for dirname in dirs_to_make:
|
|
try:
|
|
os.mkdir(path.join(outdirname, dirname))
|
|
except OSError:
|
|
pass
|
|
|
|
# copy files (currently only non-tex includes)
|
|
for oldfn, newfn in copyfiles_mapping.iteritems():
|
|
newpathfn = path.join(outdirname, newfn)
|
|
globfns = glob.glob(oldfn)
|
|
if len(globfns) == 1 and not path.isdir(newpathfn):
|
|
shutil.copyfile(globfns[0], newpathfn)
|
|
else:
|
|
for globfn in globfns:
|
|
shutil.copyfile(globfn, path.join(newpathfn,
|
|
path.basename(globfn)))
|
|
|
|
# convert tex files
|
|
# "doc" is not converted. It must be rewritten anyway.
|
|
for subdir in ('api', 'dist', 'ext', 'inst', 'commontex',
|
|
'lib', 'mac', 'ref', 'tut', 'whatsnew'):
|
|
if args and subdir not in args:
|
|
continue
|
|
if subdir not in fn_mapping:
|
|
continue
|
|
newsubdir = fn_mapping[subdir]['__newname__']
|
|
deflang = fn_mapping[subdir].get('__defaulthighlightlang__')
|
|
labelprefix = fn_mapping[subdir].get('__labelprefix__', '')
|
|
for filename in sorted(os.listdir(subdir)):
|
|
if not filename.endswith('.tex'):
|
|
continue
|
|
filename = filename[:-4] # strip extension
|
|
newname = fn_mapping[subdir][filename]
|
|
if newname is None:
|
|
continue
|
|
if newname.endswith(':split'):
|
|
newname = newname[:-6]
|
|
splitchap = True
|
|
else:
|
|
splitchap = False
|
|
if '/' not in newname:
|
|
outfilename = path.join(outdirname, newsubdir, newname + '.rst')
|
|
else:
|
|
outfilename = path.join(outdirname, newname + '.rst')
|
|
toctree = toctree_mapping.get(path.join(subdir, filename))
|
|
infilename = path.join(subdir, filename + '.tex')
|
|
print green(infilename),
|
|
success, state = convert_file(infilename, outfilename, False,
|
|
splitchap, toctree, deflang, labelprefix)
|
|
if not success:
|
|
print red("ERROR:")
|
|
print red(" " + state)
|
|
else:
|
|
if state:
|
|
print "warnings:"
|
|
for warning in state:
|
|
print " " + warning
|
|
|
|
# rename files, e.g. splitted ones
|
|
for oldfn, newfn in rename_mapping.iteritems():
|
|
try:
|
|
if newfn is None:
|
|
os.unlink(path.join(outdirname, oldfn))
|
|
else:
|
|
os.rename(path.join(outdirname, oldfn),
|
|
path.join(outdirname, newfn))
|
|
except OSError, err:
|
|
if err.errno == 2:
|
|
continue
|
|
raise
|
|
|
|
# copy new files
|
|
srcdirname = path.join(path.dirname(__file__), 'newfiles')
|
|
for fn, newfn in newfiles_mapping.iteritems():
|
|
shutil.copyfile(path.join(srcdirname, fn),
|
|
path.join(outdirname, newfn))
|
|
|
|
# make amendments
|
|
for newfn, (pre, post) in amendments_mapping.iteritems():
|
|
fn = path.join(outdirname, newfn)
|
|
try:
|
|
ft = open(fn).read()
|
|
except Exception, err:
|
|
print "Error making amendments to %s: %s" % (newfn, err)
|
|
continue
|
|
else:
|
|
fw = open(fn, 'w')
|
|
fw.write(pre)
|
|
fw.write(ft)
|
|
fw.write(post)
|
|
fw.close()
|