Commits

Takayuki Shimizukawa committed cd09513

Fix text builder did not respect wide/fullwidth charactors for title line.

  • Participants
  • Parent commits 9902d52

Comments (0)

Files changed (4)

 Release 1.2 (in development)
 ============================
 
+* Fix text builder did not respect wide/fullwidth charactors.
+
 * #1062: sphinx.ext.autodoc use __init__ method signature for class signature.
 
 * PR#111: Respect add_autodoc_attrgetter() even when inherited-members is set.

File sphinx/writers/text.py

 import textwrap
 
 from docutils import nodes, writers
+from docutils.utils import column_width
 
 from sphinx import addnodes
 from sphinx.locale import admonitionlabels, versionlabels, _
             char = '^'
         text = ''.join(x[1] for x in self.states.pop() if x[0] == -1)
         self.stateindent.pop()
-        self.states[-1].append((0, ['', text, '%s' % (char * len(text)), '']))
+        self.states[-1].append(
+                (0, ['', text, '%s' % (char * column_width(text)), '']))
 
     def visit_subtitle(self, node):
         pass

File tests/test_build_text.py

+# -*- coding: utf-8 -*-
+"""
+    test_build_text
+    ~~~~~~~~~~~~~~~
+
+    Test the build process with Text builder with the test root.
+
+    :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from textwrap import dedent
+
+from docutils.utils import column_width
+
+from util import *
+
+
+def with_text_app(*args, **kw):
+    default_kw = {
+        'buildername': 'text',
+        'srcdir': '(empty)',
+        'confoverrides': {
+            'project': 'text',
+            'master_doc': 'contents',
+        },
+    }
+    default_kw.update(kw)
+    return with_app(*args, **default_kw)
+
+
+@with_text_app()
+def test_multibyte_title_line(app):
+    title = u'\u65e5\u672c\u8a9e'
+    underline = u'=' * column_width(title)
+    content = u'\n'.join((title, underline, u''))
+
+    (app.srcdir / 'contents.rst').write_text(content, encoding='utf-8')
+    app.builder.build_all()
+    result = (app.outdir / 'contents.txt').text(encoding='utf-8')
+
+    expect_underline = underline.replace('=', '*')
+    result_underline = result.splitlines()[2].strip()
+    assert expect_underline == result_underline

File tests/util.py

             temproot = tempdir / 'root'
             test_root.copytree(temproot)
             srcdir = temproot
+        elif srcdir == '(empty)':
+            tempdir = path(tempfile.mkdtemp())
+            self.cleanup_trees.append(tempdir)
+            temproot = tempdir / 'root'
+            temproot.makedirs()
+            (temproot / 'conf.py').write_text('')
+            srcdir = temproot
         else:
             srcdir = path(srcdir)
         self.builddir = srcdir.joinpath('_build')