"""Tests sphinx.util.rst functions.""" from __future__ import annotations from docutils.statemachine import StringList from jinja2 import Environment from sphinx.util.rst import append_epilog, escape, heading, prepend_prolog, textwidth def test_escape(): assert escape(':ref:`id`') == r'\:ref\:\`id\`' assert escape('footnote [#]_') == r'footnote \[\#\]\_' assert escape('sphinx.application') == r'sphinx.application' assert escape('.. toctree::') == r'\.. toctree\:\:' def test_append_epilog(): epilog = 'this is rst_epilog\ngood-bye reST!' content = StringList( ['hello Sphinx world', 'Sphinx is a document generator'], 'dummy.rst', ) append_epilog(content, epilog) assert list(content.xitems()) == [ ('dummy.rst', 0, 'hello Sphinx world'), ('dummy.rst', 1, 'Sphinx is a document generator'), ('dummy.rst', 2, ''), ('', 0, 'this is rst_epilog'), ('', 1, 'good-bye reST!'), ] def test_prepend_prolog(): prolog = 'this is rst_prolog\nhello reST!' content = StringList( [ ':title: test of SphinxFileInput', ':author: Sphinx team', '', 'hello Sphinx world', 'Sphinx is a document generator', ], 'dummy.rst', ) prepend_prolog(content, prolog) assert list(content.xitems()) == [ ('dummy.rst', 0, ':title: test of SphinxFileInput'), ('dummy.rst', 1, ':author: Sphinx team'), ('', 0, ''), ('', 0, 'this is rst_prolog'), ('', 1, 'hello reST!'), ('', 0, ''), ('dummy.rst', 2, ''), ('dummy.rst', 3, 'hello Sphinx world'), ('dummy.rst', 4, 'Sphinx is a document generator'), ] def test_prepend_prolog_with_CR(): # prolog having CR at tail prolog = 'this is rst_prolog\nhello reST!\n' content = StringList( ['hello Sphinx world', 'Sphinx is a document generator'], 'dummy.rst', ) prepend_prolog(content, prolog) assert list(content.xitems()) == [ ('', 0, 'this is rst_prolog'), ('', 1, 'hello reST!'), ('', 0, ''), ('dummy.rst', 0, 'hello Sphinx world'), ('dummy.rst', 1, 'Sphinx is a document generator'), ] def test_prepend_prolog_without_CR(): # prolog not having CR at tail prolog = 'this is rst_prolog\nhello reST!' content = StringList( ['hello Sphinx world', 'Sphinx is a document generator'], 'dummy.rst', ) prepend_prolog(content, prolog) assert list(content.xitems()) == [ ('', 0, 'this is rst_prolog'), ('', 1, 'hello reST!'), ('', 0, ''), ('dummy.rst', 0, 'hello Sphinx world'), ('dummy.rst', 1, 'Sphinx is a document generator'), ] def test_prepend_prolog_with_roles_in_sections(): prolog = 'this is rst_prolog\nhello reST!' content = StringList( [ ':title: test of SphinxFileInput', ':author: Sphinx team', '', # this newline is required ':mod:`foo`', '----------', '', 'hello', ], 'dummy.rst', ) prepend_prolog(content, prolog) assert list(content.xitems()) == [ ('dummy.rst', 0, ':title: test of SphinxFileInput'), ('dummy.rst', 1, ':author: Sphinx team'), ('', 0, ''), ('', 0, 'this is rst_prolog'), ('', 1, 'hello reST!'), ('', 0, ''), ('dummy.rst', 2, ''), ('dummy.rst', 3, ':mod:`foo`'), ('dummy.rst', 4, '----------'), ('dummy.rst', 5, ''), ('dummy.rst', 6, 'hello'), ] def test_prepend_prolog_with_roles_in_sections_with_newline(): # prologue with trailing line break prolog = 'this is rst_prolog\nhello reST!\n' content = StringList([':mod:`foo`', '-' * 10, '', 'hello'], 'dummy.rst') prepend_prolog(content, prolog) assert list(content.xitems()) == [ ('', 0, 'this is rst_prolog'), ('', 1, 'hello reST!'), ('', 0, ''), ('dummy.rst', 0, ':mod:`foo`'), ('dummy.rst', 1, '----------'), ('dummy.rst', 2, ''), ('dummy.rst', 3, 'hello'), ] def test_prepend_prolog_with_roles_in_sections_without_newline(): # prologue with no trailing line break prolog = 'this is rst_prolog\nhello reST!' content = StringList([':mod:`foo`', '-' * 10, '', 'hello'], 'dummy.rst') prepend_prolog(content, prolog) assert list(content.xitems()) == [ ('', 0, 'this is rst_prolog'), ('', 1, 'hello reST!'), ('', 0, ''), ('dummy.rst', 0, ':mod:`foo`'), ('dummy.rst', 1, '----------'), ('dummy.rst', 2, ''), ('dummy.rst', 3, 'hello'), ] def test_textwidth(): assert textwidth('Hello') == 5 assert textwidth('русский язык') == 12 assert textwidth('русский язык', 'WFA') == 23 # Cyrillic are ambiguous chars def test_heading(): env = Environment(autoescape=True) env.extend(language=None) assert heading(env, 'Hello') == 'Hello\n=====' assert heading(env, 'Hello', 1) == 'Hello\n=====' assert heading(env, 'Hello', 2) == 'Hello\n-----' assert heading(env, 'Hello', 3) == 'Hello\n~~~~~' assert heading(env, 'русский язык', 1) == 'русский язык\n============' # language=ja: ambiguous env.language = 'ja' assert heading(env, 'русский язык', 1) == 'русский язык\n======================='