summaryrefslogtreecommitdiff
path: root/sphinx
diff options
context:
space:
mode:
authorTakayuki Shimizukawa <shimizukawa+bitbucket@gmail.com>2012-12-10 18:38:06 +0900
committerTakayuki Shimizukawa <shimizukawa+bitbucket@gmail.com>2012-12-10 18:38:06 +0900
commitb2f50bb3a5223c8007657e1528ac3b407bf09ab0 (patch)
tree9901e2da8e2aef1d99fdcedeeda497d8748c8757 /sphinx
parent140b786e22bdcbdc97f6ef57d18dc4c10caeeaa7 (diff)
parentd45dcfbd7e5add4495a7e31ee53e672ee180d534 (diff)
downloadsphinx-b2f50bb3a5223c8007657e1528ac3b407bf09ab0.tar.gz
Merged in shimizukawa/sphinx-multibyte-filename-fork (pull request #61)
Diffstat (limited to 'sphinx')
-rw-r--r--sphinx/builders/epub.py9
-rw-r--r--sphinx/cmdline.py16
-rw-r--r--sphinx/config.py7
-rw-r--r--sphinx/environment.py6
-rw-r--r--sphinx/util/osutil.py3
5 files changed, 29 insertions, 12 deletions
diff --git a/sphinx/builders/epub.py b/sphinx/builders/epub.py
index b4c3b277..c30fe735 100644
--- a/sphinx/builders/epub.py
+++ b/sphinx/builders/epub.py
@@ -662,7 +662,12 @@ class EpubBuilder(StandaloneHTMLBuilder):
zipfile.ZIP_STORED)
for file in projectfiles:
fp = path.join(outdir, file)
- if isinstance(fp, unicode):
- fp = fp.encode(sys.getfilesystemencoding())
+ if sys.version_info < (2, 6):
+ # When zipile.ZipFile.write call with unicode filename, ZipFile
+ # encode filename to 'utf-8' (only after Python-2.6).
+ if isinstance(file, unicode):
+ # OEBPS Container Format (OCF) 2.0.1 specification require
+ # "File Names MUST be UTF-8 encoded".
+ file = file.encode('utf-8')
epub.write(fp, file, zipfile.ZIP_DEFLATED)
epub.close()
diff --git a/sphinx/cmdline.py b/sphinx/cmdline.py
index eff89b94..eb05d176 100644
--- a/sphinx/cmdline.py
+++ b/sphinx/cmdline.py
@@ -22,9 +22,17 @@ from sphinx.errors import SphinxError
from sphinx.application import Sphinx
from sphinx.util import Tee, format_exception_cut_frames, save_traceback
from sphinx.util.console import red, nocolor, color_terminal
+from sphinx.util.osutil import fs_encoding
from sphinx.util.pycompat import terminal_safe, bytes
+def abspath(pathdir):
+ pathdir = path.abspath(pathdir)
+ if isinstance(pathdir, bytes):
+ pathdir = pathdir.decode(fs_encoding)
+ return pathdir
+
+
def usage(argv, msg=None):
if msg:
print >>sys.stderr, msg
@@ -65,7 +73,7 @@ def main(argv):
try:
opts, args = getopt.getopt(argv[1:], 'ab:t:d:c:CD:A:ng:NEqQWw:P')
allopts = set(opt[0] for opt in opts)
- srcdir = confdir = path.abspath(args[0])
+ srcdir = confdir = abspath(args[0])
if not path.isdir(srcdir):
print >>sys.stderr, 'Error: Cannot find source directory `%s\'.' % (
srcdir,)
@@ -75,7 +83,7 @@ def main(argv):
print >>sys.stderr, ('Error: Source directory doesn\'t '
'contain conf.py file.')
return 1
- outdir = path.abspath(args[1])
+ outdir = abspath(args[1])
if not path.isdir(outdir):
print >>sys.stderr, 'Making output directory...'
os.makedirs(outdir)
@@ -119,9 +127,9 @@ def main(argv):
elif opt == '-t':
tags.append(val)
elif opt == '-d':
- doctreedir = path.abspath(val)
+ doctreedir = abspath(val)
elif opt == '-c':
- confdir = path.abspath(val)
+ confdir = abspath(val)
if not path.isfile(path.join(confdir, 'conf.py')):
print >>sys.stderr, ('Error: Configuration directory '
'doesn\'t contain conf.py file.')
diff --git a/sphinx/config.py b/sphinx/config.py
index eef8d31c..3599ccfc 100644
--- a/sphinx/config.py
+++ b/sphinx/config.py
@@ -16,7 +16,7 @@ from os import path
from sphinx.errors import ConfigError
from sphinx.locale import l_
-from sphinx.util.osutil import make_filename
+from sphinx.util.osutil import make_filename, fs_encoding
from sphinx.util.pycompat import bytes, b, convert_with_2to3
nonascii_re = re.compile(b(r'[\x80-\xff]'))
@@ -211,14 +211,15 @@ class Config(object):
f.close()
try:
# compile to a code object, handle syntax errors
+ config_file_enc = config_file.encode(fs_encoding)
try:
- code = compile(source, config_file, 'exec')
+ code = compile(source, config_file_enc, 'exec')
except SyntaxError:
if convert_with_2to3:
# maybe the file uses 2.x syntax; try to refactor to
# 3.x syntax using 2to3
source = convert_with_2to3(config_file)
- code = compile(source, config_file, 'exec')
+ code = compile(source, config_file_enc, 'exec')
else:
raise
exec code in config
diff --git a/sphinx/environment.py b/sphinx/environment.py
index 1adc6809..cada082d 100644
--- a/sphinx/environment.py
+++ b/sphinx/environment.py
@@ -41,7 +41,8 @@ from sphinx.util import url_re, get_matching_docs, docname_join, split_into, \
FilenameUniqDict
from sphinx.util.nodes import clean_astext, make_refnode, extract_messages, \
WarningStream
-from sphinx.util.osutil import movefile, SEP, ustrftime, find_catalog
+from sphinx.util.osutil import movefile, SEP, ustrftime, find_catalog, \
+ fs_encoding
from sphinx.util.matching import compile_matchers
from sphinx.util.pycompat import all, class_types
from sphinx.util.websupport import is_commentable
@@ -49,7 +50,6 @@ from sphinx.errors import SphinxError, ExtensionError
from sphinx.locale import _, init as init_locale
from sphinx.versioning import add_uids, merge_doctrees
-fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
orig_role_function = roles.role
orig_directive_function = directives.directive
@@ -1373,7 +1373,7 @@ class BuildEnvironment:
def _entries_from_toctree(toctreenode, parents,
separate=False, subtree=False):
"""Return TOC entries for a toctree node."""
- refs = [(e[0], str(e[1])) for e in toctreenode['entries']]
+ refs = [(e[0], e[1]) for e in toctreenode['entries']]
entries = []
for (title, ref) in refs:
try:
diff --git a/sphinx/util/osutil.py b/sphinx/util/osutil.py
index 8ecfe692..17619ee1 100644
--- a/sphinx/util/osutil.py
+++ b/sphinx/util/osutil.py
@@ -157,3 +157,6 @@ def find_catalog(docname, compaction):
ret = docname
return ret
+
+fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
+