<reponame>QuentinTournier40/AnimationFreeCAD
#! /usr/bin/env python

# $Id: test_include.py 8851 2021-10-12 17:33:24Z milde $
# Author: <NAME> <<EMAIL>>
# Copyright: This module has been placed in the public domain.

"""
Tests for misc.py "include" directive.
"""
from __future__ import absolute_import

import os.path
import sys
if __name__ == '__main__':
    import __init__
from test_parsers import DocutilsTestSupport
from docutils.parsers.rst import states
from docutils.parsers import recommonmark_wrapper
from docutils.utils.code_analyzer import with_pygments

if sys.version_info >= (3, 0):
    unichr = chr  # noqa


def suite():
    s = DocutilsTestSupport.ParserTestSuite()
    if not with_pygments:
        del(totest['include-code'])
    s.generateTests(totest)
    return s

# prepend this directory (relative to the test root):
def mydir(path):
    return os.path.join('test_parsers/test_rst/test_directives/', path)
# make `path` relative with utils.relative_path():
def reldir(path):
    return DocutilsTestSupport.utils.relative_path(None, path)

include1 = mydir('include1.txt')
include2 = mydir('include2.txt')
include3 = mydir('include3.txt')
include6 = mydir('includes/more/include6.txt')
include8 = mydir('include8.txt')
include10 = mydir('include10.txt')
include11 = mydir('include 11.txt')
include12 = mydir('include12.txt')
include13 = mydir('include13.txt')
include14 = mydir('includes/include14.txt')
include15 = mydir('includes/include15.txt')
include16 = mydir('includes/include16.txt')
include_literal = mydir('include_literal.txt')
include_md = mydir('include.md')
utf_16_file = mydir('utf-16.csv')
utf_16_error_str = ("UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe "
                    "in position 0: ordinal not in range(128)")
if sys.version_info < (3, 0):
    utf_16_error_str = ("UnicodeError: Unable to decode input data.  "
                        "Tried the following encodings: 'ascii'.\n"
                        "            (%s)" % utf_16_error_str)
nonexistent = os.path.join(os.path.dirname(states.__file__),
                           'include', 'nonexistent')
nonexistent_rel = DocutilsTestSupport.utils.relative_path(
    os.path.join(DocutilsTestSupport.testroot, 'dummy'), nonexistent)

# Different error for path with 8bit chars with locale == C or None:
try:
    open(u'\u043c\u0438\u0440.txt')
except UnicodeEncodeError:
    errstr_8bit_path = u"""\
Cannot encode input file path "\u043c\u0438\u0440.txt" (wrong locale?).\
"""
except:
    errstr_8bit_path = u"""\
InputError: [Errno 2] No such file or directory: '\u043c\u0438\u0440.txt'.\
"""

# Parsing with Markdown (recommonmark) is an optional feature depending
# on 3rd-party modules:
if recommonmark_wrapper.CommonMarkParser:
    markdown_parsing_result = """\
    <section ids="title-1" names="title\\ 1">
        <title>
            Title 1
        <paragraph>
            <emphasis>
                emphasis
             and \n\
            <emphasis>
                also emphasis
        <paragraph>
            No whitespace required around a
            <reference name="phrase reference" refuri="/uri">
                phrase reference
            ."""
else:
    markdown_parsing_result = """\
    <system_message level="2" source="test_parsers/test_rst/test_directives/include.md" type="WARNING">
        <paragraph>
            Missing dependency: MarkDown input is processed by a 3rd party parser but Python did not find the required module "recommonmark" (https://pypi.org/project/recommonmark/).\
"""


totest = {}

totest['include'] = [
["""\
Include Test
============

.. include:: %s

A paragraph.
""" % include1,
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <section ids="inclusion-1" names="inclusion\\ 1">
            <title>
                Inclusion 1
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <paragraph>
                A paragraph.
"""],
["""\
Include Test
============

.. include:: %s
   :literal:
   :class: test
   :name: my name

A paragraph.
""" % include1,
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <literal_block classes="test" ids="my-name" names="my\\ name" source="%s" xml:space="preserve">
            Inclusion 1
            -----------
            \n\
            This file is used by ``test_include.py``.
        <paragraph>
            A paragraph.
""" % reldir(include1)],
["""\
Literal include, add line numbers

.. include:: %s
   :literal:
   :number-lines:
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Literal include, add line numbers
    <literal_block source="%s" xml:space="preserve">
        <inline classes="ln">
            1 \n\
        Inclusion 1
        <inline classes="ln">
            2 \n\
        -----------
        <inline classes="ln">
            3 \n\
        \n\
        <inline classes="ln">
            4 \n\
        This file is used by ``test_include.py``.
""" % reldir(include1)],
["""\
Include code

.. include:: %s
   :code:
   :class: test
   :name: <NAME>
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Include code
    <literal_block classes="code test" ids="my-name" names="my\\ name" source="%s" xml:space="preserve">
        Inclusion 1
        -----------
        \n\
        This file is used by ``test_include.py``.
""" % reldir(include1)],
["""\
Include code, add line numbers

.. include:: %s
   :code:
   :number-lines:
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Include code, add line numbers
    <literal_block classes="code" source="%s" xml:space="preserve">
        <inline classes="ln">
            1 \n\
        Inclusion 1
        <inline classes="ln">
            2 \n\
        -----------
        <inline classes="ln">
            3 \n\
        \n\
        <inline classes="ln">
            4 \n\
        This file is used by ``test_include.py``.
""" % reldir(include1)],
["""\
Include markdown (recommonmark).

.. include:: %s
   :parser: markdown

A paragraph.
""" % include_md,
"""\
<document source="test data">
    <paragraph>
        Include markdown (recommonmark).
%s
    <paragraph>
        A paragraph.
""" % markdown_parsing_result],
["""\
Let's test the parse context.

    This paragraph is in a block quote.

    .. include:: %s

The included paragraphs should also be in the block quote.
""" % include2,
"""\
<document source="test data">
    <paragraph>
        Let's test the parse context.
    <block_quote>
        <paragraph>
            This paragraph is in a block quote.
        <paragraph>
            Here are some paragraphs
            that can appear at any level.
        <paragraph>
            This file (include2.txt) is used by
            <literal>
                test_include.py
            .
    <paragraph>
        The included paragraphs should also be in the block quote.
"""],
["""\
Include Test
============

.. include:: nonexistent.txt

A paragraph.
""",
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <system_message level="4" line="4" source="test data" type="SEVERE">
            <paragraph>
                Problems with "include" directive path:
                InputError: [Errno 2] No such file or directory: 'nonexistent.txt'.
            <literal_block xml:space="preserve">
                .. include:: nonexistent.txt
        <paragraph>
            A paragraph.
"""],
["""\
Include Test
============

.. include:: %s

.. include:: %s

A paragraph.
""" % (include1, include1),
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <section dupnames="inclusion\\ 1" ids="inclusion-1">
            <title>
                Inclusion 1
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
        <section dupnames="inclusion\\ 1" ids="inclusion-1-1">
            <title>
                Inclusion 1
            <system_message backrefs="inclusion-1-1" level="1" line="2" source="%s" type="INFO">
                <paragraph>
                    Duplicate implicit target name: "inclusion 1".
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <paragraph>
                A paragraph.
""" % reldir(include1)],
["""\
Include Test
============

.. include:: %s

----------

.. include:: %s

A paragraph.
""" % (include1, include1),
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <section dupnames="inclusion\\ 1" ids="inclusion-1">
            <title>
                Inclusion 1
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <transition>
        <section dupnames="inclusion\\ 1" ids="inclusion-1-1">
            <title>
                Inclusion 1
            <system_message backrefs="inclusion-1-1" level="1" line="2" source="%s" type="INFO">
                <paragraph>
                    Duplicate implicit target name: "inclusion 1".
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <paragraph>
                A paragraph.
""" % reldir(include1)],
["""\
Recursive inclusions: adapt paths.

In test data

.. include:: %s
""" % include3,
"""\
<document source="test data">
    <paragraph>
        Recursive inclusions: adapt paths.
    <paragraph>
        In test data
    <paragraph>
        In include3.txt
    <paragraph>
        In includes/include4.txt
    <paragraph>
        In includes/include5.txt
    <paragraph>
        In includes/more/include6.txt
    <paragraph>
        In includes/sibling/include7.txt
    <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">
        In includes/include5.txt
        \n\
        .. include:: more/include6.txt
    <table>
        <tgroup cols="2">
            <colspec colwidth="50">
            <colspec colwidth="50">
            <tbody>
                <row>
                    <entry>
                        <paragraph>
                            In
                    <entry>
                        <paragraph>
                            includes/sibling/include7.txt
"""],
["""\
Recursive inclusion with specified parser.

In test data

.. include:: %s
   :parser: rst
""" % include3,
"""\
<document source="test data">
    <paragraph>
        Recursive inclusion with specified parser.
    <paragraph>
        In test data
    <paragraph>
        In include3.txt
    <paragraph>
        In includes/include4.txt
    <paragraph>
        In includes/include5.txt
    <paragraph>
        In includes/more/include6.txt
    <paragraph>
        In includes/sibling/include7.txt
    <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">
        In includes/include5.txt
        \n\
        .. include:: more/include6.txt
    <table>
        <tgroup cols="2">
            <colspec colwidth="50">
            <colspec colwidth="50">
            <tbody>
                <row>
                    <entry>
                        <paragraph>
                            In
                    <entry>
                        <paragraph>
                            includes/sibling/include7.txt
"""],
["""\
In test data

Section
=======

(Section contents in nested parse; slice of input_lines ViewList.)

.. include:: %s
""" % include3,
"""\
<document source="test data">
    <paragraph>
        In test data
    <section ids="section" names="section">
        <title>
            Section
        <paragraph>
            (Section contents in nested parse; slice of input_lines ViewList.)
        <paragraph>
            In include3.txt
        <paragraph>
            In includes/include4.txt
        <paragraph>
            In includes/include5.txt
        <paragraph>
            In includes/more/include6.txt
        <paragraph>
            In includes/sibling/include7.txt
        <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">
            In includes/include5.txt
            \n\
            .. include:: more/include6.txt
        <table>
            <tgroup cols="2">
                <colspec colwidth="50">
                <colspec colwidth="50">
                <tbody>
                    <row>
                        <entry>
                            <paragraph>
                                In
                        <entry>
                            <paragraph>
                                includes/sibling/include7.txt
"""],
["""\
Testing relative includes:

.. include:: %s
""" % include8,
"""\
<document source="test data">
    <paragraph>
        Testing relative includes:
    <paragraph>
        In include8.txt
    <paragraph>
        In ../includes/include9.txt.
    <paragraph>
        Here are some paragraphs
        that can appear at any level.
    <paragraph>
        This file (include2.txt) is used by
        <literal>
            test_include.py
        .
"""],
["""\
Encoding:

.. include:: %s
   :encoding: utf-16
""" % reldir(utf_16_file),
b"""\
<document source="test data">
    <paragraph>
        Encoding:
    <paragraph>
        "Treat", "Quantity", "Description"
        "Albatr\xb0\xdf", 2.99, "\xa1On a \\u03c3\\u03c4\\u03b9\\u03ba!"
        "Crunchy Frog", 1.49, "If we took the b\xf6nes out, it wouldn\\u2019t be
        crunchy, now would it?"
        "Gannet Ripple", 1.99, "\xbfOn a \\u03c3\\u03c4\\u03b9\\u03ba?"
""".decode('raw_unicode_escape')],
["""\
Include file is UTF-16-encoded, and is not valid ASCII.

.. include:: %s
   :encoding: ascii
""" % reldir(utf_16_file),
"""\
<document source="test data">
    <paragraph>
        Include file is UTF-16-encoded, and is not valid ASCII.
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problem with "include" directive:
            %s
        <literal_block xml:space="preserve">
            .. include:: %s
               :encoding: ascii
""" % (utf_16_error_str, reldir(utf_16_file))],
[u"""\
cyrillic filename:

.. include:: \u043c\u0438\u0440.txt
""",
u"""\
<document source="test data">
    <paragraph>
        cyrillic filename:
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problems with "include" directive path:
            %s
        <literal_block xml:space="preserve">
            .. include:: \u043c\u0438\u0440.txt
""" % errstr_8bit_path],
["""\
Testing errors in included file:

.. include:: %s
""" % include10,
"""\
<document source="test data">
    <paragraph>
        Testing errors in included file:
    <system_message level="3" line="1" source="%(source)s" type="ERROR">
        <paragraph>
            Invalid character code: 0x11111111
            %(unichr_exception)s
        <literal_block xml:space="preserve">
            unicode:: 0x11111111
    <system_message level="2" line="1" source="%(source)s" type="WARNING">
        <paragraph>
            Substitution definition "bad" empty or invalid.
        <literal_block xml:space="preserve">
            .. |bad| unicode:: 0x11111111
    <section dupnames="hi" ids="hi">
        <title>
            hi
        <block_quote>
            <paragraph>
                indent
        <system_message level="2" line="7" source="%(source)s" type="WARNING">
            <paragraph>
                Block quote ends without a blank line; unexpected unindent.
        <paragraph>
            error
    <section dupnames="hi" ids="hi-1">
        <title>
            hi
        <system_message backrefs="hi-1" level="1" line="10" source="%(source)s" type="INFO">
            <paragraph>
                Duplicate implicit target name: "hi".
        <system_message level="4" line="12" source="%(source)s" type="SEVERE">
            <paragraph>
                Problems with "include" directive path:
                InputError: [Errno 2] No such file or directory: '%(nonexistent)s'.
            <literal_block xml:space="preserve">
                .. include:: <nonexistent>
        <system_message level="3" line="14" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "note" directive; none found.
            <literal_block xml:space="preserve">
                .. note::
        <system_message level="3" line="16" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "admonition" directive; none found.
            <literal_block xml:space="preserve">
                .. admonition::
                   without title
        <system_message level="3" line="19" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "epigraph" directive; none found.
            <literal_block xml:space="preserve">
                .. epigraph::
        <system_message level="3" line="21" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "highlights" directive; none found.
            <literal_block xml:space="preserve">
                .. highlights::
        <system_message level="3" line="23" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "pull-quote" directive; none found.
            <literal_block xml:space="preserve">
                .. pull-quote::
        <system_message level="3" line="25" source="%(source)s" type="ERROR">
            <paragraph>
                Invalid context: the "date" directive can only be used within a substitution definition.
            <literal_block xml:space="preserve">
                .. date::
        <paragraph>
            not a
            definition list:
        <system_message level="3" line="29" source="%(source)s" type="ERROR">
            <paragraph>
                Unexpected indentation.
        <block_quote>
            <paragraph>
                as a term may only be one line long.
        <system_message level="3" line="31" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "admonition" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                .. admonition::
                \n\
                   without title and content following a blank line
    <section ids="section-underline-too-short" names="section\\ underline\\ too\\ short">
        <title>
            section underline too short
        <system_message level="2" line="36" source="%(source)s" type="WARNING">
            <paragraph>
                Title underline too short.
            <literal_block xml:space="preserve">
                section underline too short
                -----
        <table>
            <tgroup cols="2">
                <colspec colwidth="14">
                <colspec colwidth="6">
                <thead>
                    <row>
                        <entry>
                            <paragraph>
                                A simple table
                        <entry>
                            <paragraph>
                                cell 2
                <tbody>
                    <row>
                        <entry>
                            <paragraph>
                                cell 3
                        <entry>
                            <paragraph>
                                cell 4
        <system_message level="2" line="43" source="%(source)s" type="WARNING">
            <paragraph>
                Blank line required after table.
        <paragraph>
            No blank line after table.
        <system_message level="3" line="45" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "unicode" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                unicode::
        <system_message level="2" line="45" source="%(source)s" type="WARNING">
            <paragraph>
                Substitution definition "empty" empty or invalid.
            <literal_block xml:space="preserve">
                .. |empty| unicode::
        <system_message level="3" line="47" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "topic" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                .. topic::
        <system_message level="3" line="49" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "rubric" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                .. rubric::
        <rubric>
            A rubric has no content
        <comment xml:space="preserve">
            _`target: No matching backquote.
        <system_message level="2" line="52" source="%(source)s" type="WARNING">
            <paragraph>
                malformed hyperlink target.
        <comment xml:space="preserve">
            __malformed: no good
        <system_message level="2" line="53" source="%(source)s" type="WARNING">
            <paragraph>
                malformed hyperlink target.
        <definition_list>
            <definition_list_item>
                <term>
                    A literal block::
                <definition>
                    <system_message level="1" line="57" source="%(source)s" type="INFO">
                        <paragraph>
                            Blank line missing before literal block (after the "::")? Interpreted as a definition list item.
                    <paragraph>
                        with no blank line above.
        <literal_block xml:space="preserve">
            > A literal block.
        <system_message level="3" line="61" source="%(source)s" type="ERROR">
            <paragraph>
                Inconsistent literal block quoting.
        <paragraph>
            $ with inconsistent quoting.
        <paragraph>
            <problematic ids="problematic-1" refid="system-message-1">
                :unknown-role:`role`
            \n\
            and \n\
            <problematic ids="problematic-2" refid="system-message-2">
                *
            unbalanced
            <problematic ids="problematic-3" refid="system-message-3">
                `
            inline
            <problematic ids="problematic-4" refid="system-message-4">
                **
            markup
        <system_message level="1" line="63" source="%(source)s" type="INFO">
            <paragraph>
                No role entry for "unknown-role" in module "docutils.parsers.rst.languages.en".
                Trying "unknown-role" as canonical role name.
        <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="63" source="%(source)s" type="ERROR">
            <paragraph>
                Unknown interpreted text role "unknown-role".
        <system_message backrefs="problematic-2" ids="system-message-2" level="2" line="63" source="%(source)s" type="WARNING">
            <paragraph>
                Inline emphasis start-string without end-string.
        <system_message backrefs="problematic-3" ids="system-message-3" level="2" line="63" source="%(source)s" type="WARNING">
            <paragraph>
                Inline interpreted text or phrase reference start-string without end-string.
        <system_message backrefs="problematic-4" ids="system-message-4" level="2" line="63" source="%(source)s" type="WARNING">
            <paragraph>
                Inline strong start-string without end-string.
        <block_quote>
            <paragraph>
                A block quote with \n\
                <problematic ids="problematic-5" refid="system-message-5">
                    *
                inline warning
            <system_message backrefs="problematic-5" ids="system-message-5" level="2" line="68" source="test_parsers/test_rst/test_directives/include10.txt" type="WARNING">
                <paragraph>
                    Inline emphasis start-string without end-string.
            <attribution>
                attribution with \n\
                <problematic ids="problematic-6" refid="system-message-6">
                    *
                inline warning
        <system_message backrefs="problematic-6" ids="system-message-6" level="2" line="70" source="test_parsers/test_rst/test_directives/include10.txt" type="WARNING">
            <paragraph>
                Inline emphasis start-string without end-string.
        <paragraph>
            <problematic ids="problematic-7" refid="system-message-7">
                :PEP:`-1`
        <system_message backrefs="problematic-7" ids="system-message-7" level="3" line="72" source="%(source)s" type="ERROR">
            <paragraph>
                PEP number must be a number from 0 to 9999; "-1" is invalid.
        <system_message level="1" line="70" source="%(source)s" type="INFO">
            <paragraph>
                No directive entry for "unknown" in module "docutils.parsers.rst.languages.en".
                Trying "unknown" as canonical directive name.
        <system_message level="3" line="74" source="%(source)s" type="ERROR">
            <paragraph>
                Unknown directive type "unknown".
            <literal_block xml:space="preserve">
                .. unknown:: directive (TODO: info still reported with wrong line)
        <system_message level="3" line="76" source="%(source)s" type="ERROR">
            <paragraph>
                Malformed table.
                No bottom table border found.
            <literal_block xml:space="preserve">
                ==============  ======
                A simple table  with
                no bottom       border
                
                .. end of inclusion from "test_parsers/test_rst/test_directives/include10.txt"
""" % {'source': reldir(include10), 'nonexistent': reldir(nonexistent),
       'unichr_exception':
       DocutilsTestSupport.exception_data(unichr, int("11111111", 16))[2]
      }],
["""\
Include file with whitespace in the path:

.. include:: %s
""" % reldir(include11),
"""\
<document source="test data">
    <paragraph>
        Include file with whitespace in the path:
    <paragraph>
        some text
"""],
["""\
Standard include data file:

.. include:: <isogrk4.txt>
""",
b"""\
<document source="test data">
    <paragraph>
        Standard include data file:
    <comment xml:space="preserve">
        This data file has been placed in the public domain.
    <comment xml:space="preserve">
        Derived from the Unicode character mappings available from
        <http://www.w3.org/2003/entities/xml/>.
        Processed by unicode2rstsubs.py, part of Docutils:
        <http://docutils.sourceforge.net>.
    <substitution_definition names="b.Gammad">
        \\u03dc
    <substitution_definition names="b.gammad">
        \\u03dd
""".decode('raw_unicode_escape')],
["""\
Nonexistent standard include data file:

.. include:: <nonexistent>
""",
"""\
<document source="test data">
    <paragraph>
        Nonexistent standard include data file:
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problems with "include" directive path:
            InputError: [Errno 2] No such file or directory: '%s'.
        <literal_block xml:space="preserve">
            .. include:: <nonexistent>
""" % nonexistent_rel],
["""\
Include start-line/end-line Test

.. include:: %s
   :start-line: 3
   :end-line: 4
""" % include2,
"""\
<document source="test data">
    <paragraph>
        Include start-line/end-line Test
    <paragraph>
        This file (include2.txt) is used by
"""],
["""\
Include start-line/end-line + start-after Test

.. include:: %s
   :start-line: 2
   :end-line: 5
   :start-after: here

Text search is limited to the specified lines.
""" % include12,
"""\
<document source="test data">
    <paragraph>
        Include start-line/end-line + start-after Test
    <paragraph>
        In include12.txt (after "start here", before "stop here")
    <paragraph>
        Text search is limited to the specified lines.
"""],
["""\
Include start-after/end-before Test

.. include:: %s
   :start-after: .. start here
   :end-before: .. stop here

A paragraph.
""" % include12,
"""\
<document source="test data">
    <paragraph>
        Include start-after/end-before Test
    <paragraph>
        In include12.txt (after "start here", before "stop here")
    <paragraph>
        A paragraph.
"""],
["""\
Include start-after/end-before Test, single option variant

.. include:: %s
   :end-before: .. start here

.. include:: %s
   :start-after: .. stop here

A paragraph.
""" % (include12, include12),
"""\
<document source="test data">
    <paragraph>
        Include start-after/end-before Test, single option variant
    <paragraph>
        In include12.txt (but before "start here")
    <paragraph>
        In include12.txt (after "stop here")
    <paragraph>
        A paragraph.
"""],
["""\
Include start-after/end-before multi-line test.

.. include:: %s
   :start-after: From: me
                 To: you
   :end-before: -------
                -- mork of ork

.. include:: %s
   :start-after: From: me
                 To: you
   :end-before:
       -------
         -- mork of ork

A paragraph.
""" % (include13, include13),
"""\
<document source="test data">
    <paragraph>
        Include start-after/end-before multi-line test.
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problem with "end-before" option of "include" directive:
            Text not found.
        <literal_block xml:space="preserve">
            .. include:: %s
               :start-after: From: me
                             To: you
               :end-before: -------
                            -- mork of ork
    <paragraph>
        In include13.txt (between header and signature)
    <paragraph>
        A paragraph.
""" % include13],
["""\
Error handling test; "end-before" error handling tested in previous test.

.. include:: %s
   :start-after: bad string
   :end-before: mork of ork
""" % include13,
"""\
<document source="test data">
    <paragraph>
        Error handling test; "end-before" error handling tested in previous test.
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problem with "start-after" option of "include" directive:
            Text not found.
        <literal_block xml:space="preserve">
            .. include:: %s
               :start-after: bad string
               :end-before: mork of ork
""" % include13],
["""\
TAB expansion with literal include:

.. include:: %s
   :literal:
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        TAB expansion with literal include:
    <literal_block source="%s" xml:space="preserve">
        Literal included this should **not** be *marked* `up`.
                <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Custom TAB expansion with literal include:

.. include:: %s
   :literal:
   :tab-width: 2
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        Custom TAB expansion with literal include:
    <literal_block source="%s" xml:space="preserve">
        Literal included this should **not** be *marked* `up`.
          <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
No TAB expansion with literal include:

.. include:: %s
   :literal:
   :tab-width: -1
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        No TAB expansion with literal include:
    <literal_block source="%s" xml:space="preserve">
        Literal included this should **not** be *marked* `up`.
        \t<- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
]

totest['include-code'] = [
["""\
Included code

.. include:: %s
   :code: rst
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Included code
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        <inline classes="generic heading">
            Inclusion 1
        \n\
        <inline classes="generic heading">
            -----------
        \n\
        \n\
        This file is used by \n\
        <inline classes="literal string">
            ``test_include.py``
        .
""" % reldir(include1)],
["""\
Included code

.. include:: %s
   :code: rst
   :number-lines:
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Included code
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        <inline classes="ln">
            1 \n\
        <inline classes="generic heading">
            Inclusion 1
        \n\
        <inline classes="ln">
            2 \n\
        <inline classes="generic heading">
            -----------
        \n\
        <inline classes="ln">
            3 \n\
        \n\
        <inline classes="ln">
            4 \n\
        This file is used by \n\
        <inline classes="literal string">
            ``test_include.py``
        .
""" % reldir(include1)],
["""\
TAB expansion with included code:

.. include:: %s
   :code: rst
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        TAB expansion with included code:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        Literal included this should \n\
        <inline classes="generic strong">
            **not**
         be \n\
        <inline classes="generic emph">
            *marked*
         \n\
        <inline classes="name variable">
            `up`
        .
                <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Custom TAB expansion with included code:

.. include:: %s
   :code: rst
   :tab-width: 2
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        Custom TAB expansion with included code:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        Literal included this should \n\
        <inline classes="generic strong">
            **not**
         be \n\
        <inline classes="generic emph">
            *marked*
         \n\
        <inline classes="name variable">
            `up`
        .
          <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Custom TAB expansion with included code:

.. include:: %s
   :code: rst
   :tab-width: -1
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        Custom TAB expansion with included code:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        Literal included this should \n\
        <inline classes="generic strong">
            **not**
         be \n\
        <inline classes="generic emph">
            *marked*
         \n\
        <inline classes="name variable">
            `up`
        .
        \t<- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Including includes/include14.txt

.. include:: %s
""" % include14,
"""\
<document source="test data">
    <paragraph>
        Including includes/include14.txt
    <paragraph>
        Including more/include6.txt as rst-code from includes/include14.txt:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        In includes/more/include6.txt
        \n\
        <inline classes="punctuation">
            ..
         \n\
        <inline classes="operator word">
            include
        <inline classes="punctuation">
            ::
         ../sibling/include7.txt
""" % reldir(include6)],
["""\
Circular inclusion

.. include:: %s
""" % include15,
"""\
<document source="test data">
    <paragraph>
        Circular inclusion
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        File "include16.txt": example of rekursive inclusion.
    <system_message level="2" line="3" source="%s" type="WARNING">
        <paragraph>
            circular inclusion in "include" directive: %s < %s < %s < test data
        <literal_block xml:space="preserve">
            .. include:: include15.txt
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
""" % (reldir(include16), reldir(include15),
       reldir(include16), reldir(include15))],
["""\
Circular inclusion with clipping.

.. include:: %s
   :start-line: 2
""" % include16,
"""\
<document source="test data">
    <paragraph>
        Circular inclusion with clipping.
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        File "include16.txt": example of rekursive inclusion.
    <system_message level="2" line="3" source="%s" type="WARNING">
        <paragraph>
            circular inclusion in "include" directive: %s < %s < %s < %s < test data
        <literal_block xml:space="preserve">
            .. include:: include15.txt
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
""" % (reldir(include16), reldir(include15), reldir(include16),
       reldir(include15), reldir(include16))],
["""\
Circular inclusion with specified parser.

.. include:: %s
   :parser: rst
""" % include15,
"""\
<document source="test data">
    <paragraph>
        Circular inclusion with specified parser.
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        File "include16.txt": example of rekursive inclusion.
    <system_message level="2" line="3" source="%s" type="WARNING">
        <paragraph>
            circular inclusion in "include" directive: %s < %s < %s < test data
        <literal_block xml:space="preserve">
            .. include:: include15.txt
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
""" % (reldir(include16), reldir(include15),
       reldir(include16), reldir(include15))],
["""\
No circular inclusion.

============================= =============================
.. include:: data/include.txt .. include:: data/include.txt
============================= =============================
""",
"""\
<document source="test data">
    <paragraph>
        No circular inclusion.
    <table>
        <tgroup cols="2">
            <colspec colwidth="29">
            <colspec colwidth="29">
            <tbody>
                <row>
                    <entry>
                        <paragraph>
                            Some include text.
                    <entry>
                        <paragraph>
                            Some include text."""],
]

if __name__ == '__main__':
    import unittest
    unittest.main(defaultTest='suite')

#! /usr/bin/env python

# $Id: test_include.py 8851 2021-10-12 17:33:24Z milde $
# Author: <NAME> <<EMAIL>>
# Copyright: This module has been placed in the public domain.

"""
Tests for misc.py "include" directive.
"""
from __future__ import absolute_import

import os.path
import sys
if __name__ == '__main__':
    import __init__
from test_parsers import DocutilsTestSupport
from docutils.parsers.rst import states
from docutils.parsers import recommonmark_wrapper
from docutils.utils.code_analyzer import with_pygments

if sys.version_info >= (3, 0):
    unichr = chr  # noqa


def suite():
    s = DocutilsTestSupport.ParserTestSuite()
    if not with_pygments:
        del(totest['include-code'])
    s.generateTests(totest)
    return s

# prepend this directory (relative to the test root):
def mydir(path):
    return os.path.join('test_parsers/test_rst/test_directives/', path)
# make `path` relative with utils.relative_path():
def reldir(path):
    return DocutilsTestSupport.utils.relative_path(None, path)

include1 = mydir('include1.txt')
include2 = mydir('include2.txt')
include3 = mydir('include3.txt')
include6 = mydir('includes/more/include6.txt')
include8 = mydir('include8.txt')
include10 = mydir('include10.txt')
include11 = mydir('include 11.txt')
include12 = mydir('include12.txt')
include13 = mydir('include13.txt')
include14 = mydir('includes/include14.txt')
include15 = mydir('includes/include15.txt')
include16 = mydir('includes/include16.txt')
include_literal = mydir('include_literal.txt')
include_md = mydir('include.md')
utf_16_file = mydir('utf-16.csv')
utf_16_error_str = ("UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe "
                    "in position 0: ordinal not in range(128)")
if sys.version_info < (3, 0):
    utf_16_error_str = ("UnicodeError: Unable to decode input data.  "
                        "Tried the following encodings: 'ascii'.\n"
                        "            (%s)" % utf_16_error_str)
nonexistent = os.path.join(os.path.dirname(states.__file__),
                           'include', 'nonexistent')
nonexistent_rel = DocutilsTestSupport.utils.relative_path(
    os.path.join(DocutilsTestSupport.testroot, 'dummy'), nonexistent)

# Different error for path with 8bit chars with locale == C or None:
try:
    open(u'\u043c\u0438\u0440.txt')
except UnicodeEncodeError:
    errstr_8bit_path = u"""\
Cannot encode input file path "\u043c\u0438\u0440.txt" (wrong locale?).\
"""
except:
    errstr_8bit_path = u"""\
InputError: [Errno 2] No such file or directory: '\u043c\u0438\u0440.txt'.\
"""

# Parsing with Markdown (recommonmark) is an optional feature depending
# on 3rd-party modules:
if recommonmark_wrapper.CommonMarkParser:
    markdown_parsing_result = """\
    <section ids="title-1" names="title\\ 1">
        <title>
            Title 1
        <paragraph>
            <emphasis>
                emphasis
             and \n\
            <emphasis>
                also emphasis
        <paragraph>
            No whitespace required around a
            <reference name="phrase reference" refuri="/uri">
                phrase reference
            ."""
else:
    markdown_parsing_result = """\
    <system_message level="2" source="test_parsers/test_rst/test_directives/include.md" type="WARNING">
        <paragraph>
            Missing dependency: MarkDown input is processed by a 3rd party parser but Python did not find the required module "recommonmark" (https://pypi.org/project/recommonmark/).\
"""


totest = {}

totest['include'] = [
["""\
Include Test
============

.. include:: %s

A paragraph.
""" % include1,
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <section ids="inclusion-1" names="inclusion\\ 1">
            <title>
                Inclusion 1
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <paragraph>
                A paragraph.
"""],
["""\
Include Test
============

.. include:: %s
   :literal:
   :class: test
   :name: my name

A paragraph.
""" % include1,
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <literal_block classes="test" ids="my-name" names="my\\ name" source="%s" xml:space="preserve">
            Inclusion 1
            -----------
            \n\
            This file is used by ``test_include.py``.
        <paragraph>
            A paragraph.
""" % reldir(include1)],
["""\
Literal include, add line numbers

.. include:: %s
   :literal:
   :number-lines:
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Literal include, add line numbers
    <literal_block source="%s" xml:space="preserve">
        <inline classes="ln">
            1 \n\
        Inclusion 1
        <inline classes="ln">
            2 \n\
        -----------
        <inline classes="ln">
            3 \n\
        \n\
        <inline classes="ln">
            4 \n\
        This file is used by ``test_include.py``.
""" % reldir(include1)],
["""\
Include code

.. include:: %s
   :code:
   :class: test
   :name: <NAME>
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Include code
    <literal_block classes="code test" ids="my-name" names="my\\ name" source="%s" xml:space="preserve">
        Inclusion 1
        -----------
        \n\
        This file is used by ``test_include.py``.
""" % reldir(include1)],
["""\
Include code, add line numbers

.. include:: %s
   :code:
   :number-lines:
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Include code, add line numbers
    <literal_block classes="code" source="%s" xml:space="preserve">
        <inline classes="ln">
            1 \n\
        Inclusion 1
        <inline classes="ln">
            2 \n\
        -----------
        <inline classes="ln">
            3 \n\
        \n\
        <inline classes="ln">
            4 \n\
        This file is used by ``test_include.py``.
""" % reldir(include1)],
["""\
Include markdown (recommonmark).

.. include:: %s
   :parser: markdown

A paragraph.
""" % include_md,
"""\
<document source="test data">
    <paragraph>
        Include markdown (recommonmark).
%s
    <paragraph>
        A paragraph.
""" % markdown_parsing_result],
["""\
Let's test the parse context.

    This paragraph is in a block quote.

    .. include:: %s

The included paragraphs should also be in the block quote.
""" % include2,
"""\
<document source="test data">
    <paragraph>
        Let's test the parse context.
    <block_quote>
        <paragraph>
            This paragraph is in a block quote.
        <paragraph>
            Here are some paragraphs
            that can appear at any level.
        <paragraph>
            This file (include2.txt) is used by
            <literal>
                test_include.py
            .
    <paragraph>
        The included paragraphs should also be in the block quote.
"""],
["""\
Include Test
============

.. include:: nonexistent.txt

A paragraph.
""",
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <system_message level="4" line="4" source="test data" type="SEVERE">
            <paragraph>
                Problems with "include" directive path:
                InputError: [Errno 2] No such file or directory: 'nonexistent.txt'.
            <literal_block xml:space="preserve">
                .. include:: nonexistent.txt
        <paragraph>
            A paragraph.
"""],
["""\
Include Test
============

.. include:: %s

.. include:: %s

A paragraph.
""" % (include1, include1),
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <section dupnames="inclusion\\ 1" ids="inclusion-1">
            <title>
                Inclusion 1
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
        <section dupnames="inclusion\\ 1" ids="inclusion-1-1">
            <title>
                Inclusion 1
            <system_message backrefs="inclusion-1-1" level="1" line="2" source="%s" type="INFO">
                <paragraph>
                    Duplicate implicit target name: "inclusion 1".
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <paragraph>
                A paragraph.
""" % reldir(include1)],
["""\
Include Test
============

.. include:: %s

----------

.. include:: %s

A paragraph.
""" % (include1, include1),
"""\
<document source="test data">
    <section ids="include-test" names="include\\ test">
        <title>
            Include Test
        <section dupnames="inclusion\\ 1" ids="inclusion-1">
            <title>
                Inclusion 1
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <transition>
        <section dupnames="inclusion\\ 1" ids="inclusion-1-1">
            <title>
                Inclusion 1
            <system_message backrefs="inclusion-1-1" level="1" line="2" source="%s" type="INFO">
                <paragraph>
                    Duplicate implicit target name: "inclusion 1".
            <paragraph>
                This file is used by \n\
                <literal>
                    test_include.py
                .
            <paragraph>
                A paragraph.
""" % reldir(include1)],
["""\
Recursive inclusions: adapt paths.

In test data

.. include:: %s
""" % include3,
"""\
<document source="test data">
    <paragraph>
        Recursive inclusions: adapt paths.
    <paragraph>
        In test data
    <paragraph>
        In include3.txt
    <paragraph>
        In includes/include4.txt
    <paragraph>
        In includes/include5.txt
    <paragraph>
        In includes/more/include6.txt
    <paragraph>
        In includes/sibling/include7.txt
    <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">
        In includes/include5.txt
        \n\
        .. include:: more/include6.txt
    <table>
        <tgroup cols="2">
            <colspec colwidth="50">
            <colspec colwidth="50">
            <tbody>
                <row>
                    <entry>
                        <paragraph>
                            In
                    <entry>
                        <paragraph>
                            includes/sibling/include7.txt
"""],
["""\
Recursive inclusion with specified parser.

In test data

.. include:: %s
   :parser: rst
""" % include3,
"""\
<document source="test data">
    <paragraph>
        Recursive inclusion with specified parser.
    <paragraph>
        In test data
    <paragraph>
        In include3.txt
    <paragraph>
        In includes/include4.txt
    <paragraph>
        In includes/include5.txt
    <paragraph>
        In includes/more/include6.txt
    <paragraph>
        In includes/sibling/include7.txt
    <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">
        In includes/include5.txt
        \n\
        .. include:: more/include6.txt
    <table>
        <tgroup cols="2">
            <colspec colwidth="50">
            <colspec colwidth="50">
            <tbody>
                <row>
                    <entry>
                        <paragraph>
                            In
                    <entry>
                        <paragraph>
                            includes/sibling/include7.txt
"""],
["""\
In test data

Section
=======

(Section contents in nested parse; slice of input_lines ViewList.)

.. include:: %s
""" % include3,
"""\
<document source="test data">
    <paragraph>
        In test data
    <section ids="section" names="section">
        <title>
            Section
        <paragraph>
            (Section contents in nested parse; slice of input_lines ViewList.)
        <paragraph>
            In include3.txt
        <paragraph>
            In includes/include4.txt
        <paragraph>
            In includes/include5.txt
        <paragraph>
            In includes/more/include6.txt
        <paragraph>
            In includes/sibling/include7.txt
        <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">
            In includes/include5.txt
            \n\
            .. include:: more/include6.txt
        <table>
            <tgroup cols="2">
                <colspec colwidth="50">
                <colspec colwidth="50">
                <tbody>
                    <row>
                        <entry>
                            <paragraph>
                                In
                        <entry>
                            <paragraph>
                                includes/sibling/include7.txt
"""],
["""\
Testing relative includes:

.. include:: %s
""" % include8,
"""\
<document source="test data">
    <paragraph>
        Testing relative includes:
    <paragraph>
        In include8.txt
    <paragraph>
        In ../includes/include9.txt.
    <paragraph>
        Here are some paragraphs
        that can appear at any level.
    <paragraph>
        This file (include2.txt) is used by
        <literal>
            test_include.py
        .
"""],
["""\
Encoding:

.. include:: %s
   :encoding: utf-16
""" % reldir(utf_16_file),
b"""\
<document source="test data">
    <paragraph>
        Encoding:
    <paragraph>
        "Treat", "Quantity", "Description"
        "Albatr\xb0\xdf", 2.99, "\xa1On a \\u03c3\\u03c4\\u03b9\\u03ba!"
        "Crunchy Frog", 1.49, "If we took the b\xf6nes out, it wouldn\\u2019t be
        crunchy, now would it?"
        "Gannet Ripple", 1.99, "\xbfOn a \\u03c3\\u03c4\\u03b9\\u03ba?"
""".decode('raw_unicode_escape')],
["""\
Include file is UTF-16-encoded, and is not valid ASCII.

.. include:: %s
   :encoding: ascii
""" % reldir(utf_16_file),
"""\
<document source="test data">
    <paragraph>
        Include file is UTF-16-encoded, and is not valid ASCII.
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problem with "include" directive:
            %s
        <literal_block xml:space="preserve">
            .. include:: %s
               :encoding: ascii
""" % (utf_16_error_str, reldir(utf_16_file))],
[u"""\
cyrillic filename:

.. include:: \u043c\u0438\u0440.txt
""",
u"""\
<document source="test data">
    <paragraph>
        cyrillic filename:
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problems with "include" directive path:
            %s
        <literal_block xml:space="preserve">
            .. include:: \u043c\u0438\u0440.txt
""" % errstr_8bit_path],
["""\
Testing errors in included file:

.. include:: %s
""" % include10,
"""\
<document source="test data">
    <paragraph>
        Testing errors in included file:
    <system_message level="3" line="1" source="%(source)s" type="ERROR">
        <paragraph>
            Invalid character code: 0x11111111
            %(unichr_exception)s
        <literal_block xml:space="preserve">
            unicode:: 0x11111111
    <system_message level="2" line="1" source="%(source)s" type="WARNING">
        <paragraph>
            Substitution definition "bad" empty or invalid.
        <literal_block xml:space="preserve">
            .. |bad| unicode:: 0x11111111
    <section dupnames="hi" ids="hi">
        <title>
            hi
        <block_quote>
            <paragraph>
                indent
        <system_message level="2" line="7" source="%(source)s" type="WARNING">
            <paragraph>
                Block quote ends without a blank line; unexpected unindent.
        <paragraph>
            error
    <section dupnames="hi" ids="hi-1">
        <title>
            hi
        <system_message backrefs="hi-1" level="1" line="10" source="%(source)s" type="INFO">
            <paragraph>
                Duplicate implicit target name: "hi".
        <system_message level="4" line="12" source="%(source)s" type="SEVERE">
            <paragraph>
                Problems with "include" directive path:
                InputError: [Errno 2] No such file or directory: '%(nonexistent)s'.
            <literal_block xml:space="preserve">
                .. include:: <nonexistent>
        <system_message level="3" line="14" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "note" directive; none found.
            <literal_block xml:space="preserve">
                .. note::
        <system_message level="3" line="16" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "admonition" directive; none found.
            <literal_block xml:space="preserve">
                .. admonition::
                   without title
        <system_message level="3" line="19" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "epigraph" directive; none found.
            <literal_block xml:space="preserve">
                .. epigraph::
        <system_message level="3" line="21" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "highlights" directive; none found.
            <literal_block xml:space="preserve">
                .. highlights::
        <system_message level="3" line="23" source="%(source)s" type="ERROR">
            <paragraph>
                Content block expected for the "pull-quote" directive; none found.
            <literal_block xml:space="preserve">
                .. pull-quote::
        <system_message level="3" line="25" source="%(source)s" type="ERROR">
            <paragraph>
                Invalid context: the "date" directive can only be used within a substitution definition.
            <literal_block xml:space="preserve">
                .. date::
        <paragraph>
            not a
            definition list:
        <system_message level="3" line="29" source="%(source)s" type="ERROR">
            <paragraph>
                Unexpected indentation.
        <block_quote>
            <paragraph>
                as a term may only be one line long.
        <system_message level="3" line="31" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "admonition" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                .. admonition::
                \n\
                   without title and content following a blank line
    <section ids="section-underline-too-short" names="section\\ underline\\ too\\ short">
        <title>
            section underline too short
        <system_message level="2" line="36" source="%(source)s" type="WARNING">
            <paragraph>
                Title underline too short.
            <literal_block xml:space="preserve">
                section underline too short
                -----
        <table>
            <tgroup cols="2">
                <colspec colwidth="14">
                <colspec colwidth="6">
                <thead>
                    <row>
                        <entry>
                            <paragraph>
                                A simple table
                        <entry>
                            <paragraph>
                                cell 2
                <tbody>
                    <row>
                        <entry>
                            <paragraph>
                                cell 3
                        <entry>
                            <paragraph>
                                cell 4
        <system_message level="2" line="43" source="%(source)s" type="WARNING">
            <paragraph>
                Blank line required after table.
        <paragraph>
            No blank line after table.
        <system_message level="3" line="45" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "unicode" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                unicode::
        <system_message level="2" line="45" source="%(source)s" type="WARNING">
            <paragraph>
                Substitution definition "empty" empty or invalid.
            <literal_block xml:space="preserve">
                .. |empty| unicode::
        <system_message level="3" line="47" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "topic" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                .. topic::
        <system_message level="3" line="49" source="%(source)s" type="ERROR">
            <paragraph>
                Error in "rubric" directive:
                1 argument(s) required, 0 supplied.
            <literal_block xml:space="preserve">
                .. rubric::
        <rubric>
            A rubric has no content
        <comment xml:space="preserve">
            _`target: No matching backquote.
        <system_message level="2" line="52" source="%(source)s" type="WARNING">
            <paragraph>
                malformed hyperlink target.
        <comment xml:space="preserve">
            __malformed: no good
        <system_message level="2" line="53" source="%(source)s" type="WARNING">
            <paragraph>
                malformed hyperlink target.
        <definition_list>
            <definition_list_item>
                <term>
                    A literal block::
                <definition>
                    <system_message level="1" line="57" source="%(source)s" type="INFO">
                        <paragraph>
                            Blank line missing before literal block (after the "::")? Interpreted as a definition list item.
                    <paragraph>
                        with no blank line above.
        <literal_block xml:space="preserve">
            > A literal block.
        <system_message level="3" line="61" source="%(source)s" type="ERROR">
            <paragraph>
                Inconsistent literal block quoting.
        <paragraph>
            $ with inconsistent quoting.
        <paragraph>
            <problematic ids="problematic-1" refid="system-message-1">
                :unknown-role:`role`
            \n\
            and \n\
            <problematic ids="problematic-2" refid="system-message-2">
                *
            unbalanced
            <problematic ids="problematic-3" refid="system-message-3">
                `
            inline
            <problematic ids="problematic-4" refid="system-message-4">
                **
            markup
        <system_message level="1" line="63" source="%(source)s" type="INFO">
            <paragraph>
                No role entry for "unknown-role" in module "docutils.parsers.rst.languages.en".
                Trying "unknown-role" as canonical role name.
        <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="63" source="%(source)s" type="ERROR">
            <paragraph>
                Unknown interpreted text role "unknown-role".
        <system_message backrefs="problematic-2" ids="system-message-2" level="2" line="63" source="%(source)s" type="WARNING">
            <paragraph>
                Inline emphasis start-string without end-string.
        <system_message backrefs="problematic-3" ids="system-message-3" level="2" line="63" source="%(source)s" type="WARNING">
            <paragraph>
                Inline interpreted text or phrase reference start-string without end-string.
        <system_message backrefs="problematic-4" ids="system-message-4" level="2" line="63" source="%(source)s" type="WARNING">
            <paragraph>
                Inline strong start-string without end-string.
        <block_quote>
            <paragraph>
                A block quote with \n\
                <problematic ids="problematic-5" refid="system-message-5">
                    *
                inline warning
            <system_message backrefs="problematic-5" ids="system-message-5" level="2" line="68" source="test_parsers/test_rst/test_directives/include10.txt" type="WARNING">
                <paragraph>
                    Inline emphasis start-string without end-string.
            <attribution>
                attribution with \n\
                <problematic ids="problematic-6" refid="system-message-6">
                    *
                inline warning
        <system_message backrefs="problematic-6" ids="system-message-6" level="2" line="70" source="test_parsers/test_rst/test_directives/include10.txt" type="WARNING">
            <paragraph>
                Inline emphasis start-string without end-string.
        <paragraph>
            <problematic ids="problematic-7" refid="system-message-7">
                :PEP:`-1`
        <system_message backrefs="problematic-7" ids="system-message-7" level="3" line="72" source="%(source)s" type="ERROR">
            <paragraph>
                PEP number must be a number from 0 to 9999; "-1" is invalid.
        <system_message level="1" line="70" source="%(source)s" type="INFO">
            <paragraph>
                No directive entry for "unknown" in module "docutils.parsers.rst.languages.en".
                Trying "unknown" as canonical directive name.
        <system_message level="3" line="74" source="%(source)s" type="ERROR">
            <paragraph>
                Unknown directive type "unknown".
            <literal_block xml:space="preserve">
                .. unknown:: directive (TODO: info still reported with wrong line)
        <system_message level="3" line="76" source="%(source)s" type="ERROR">
            <paragraph>
                Malformed table.
                No bottom table border found.
            <literal_block xml:space="preserve">
                ==============  ======
                A simple table  with
                no bottom       border
                
                .. end of inclusion from "test_parsers/test_rst/test_directives/include10.txt"
""" % {'source': reldir(include10), 'nonexistent': reldir(nonexistent),
       'unichr_exception':
       DocutilsTestSupport.exception_data(unichr, int("11111111", 16))[2]
      }],
["""\
Include file with whitespace in the path:

.. include:: %s
""" % reldir(include11),
"""\
<document source="test data">
    <paragraph>
        Include file with whitespace in the path:
    <paragraph>
        some text
"""],
["""\
Standard include data file:

.. include:: <isogrk4.txt>
""",
b"""\
<document source="test data">
    <paragraph>
        Standard include data file:
    <comment xml:space="preserve">
        This data file has been placed in the public domain.
    <comment xml:space="preserve">
        Derived from the Unicode character mappings available from
        <http://www.w3.org/2003/entities/xml/>.
        Processed by unicode2rstsubs.py, part of Docutils:
        <http://docutils.sourceforge.net>.
    <substitution_definition names="b.Gammad">
        \\u03dc
    <substitution_definition names="b.gammad">
        \\u03dd
""".decode('raw_unicode_escape')],
["""\
Nonexistent standard include data file:

.. include:: <nonexistent>
""",
"""\
<document source="test data">
    <paragraph>
        Nonexistent standard include data file:
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problems with "include" directive path:
            InputError: [Errno 2] No such file or directory: '%s'.
        <literal_block xml:space="preserve">
            .. include:: <nonexistent>
""" % nonexistent_rel],
["""\
Include start-line/end-line Test

.. include:: %s
   :start-line: 3
   :end-line: 4
""" % include2,
"""\
<document source="test data">
    <paragraph>
        Include start-line/end-line Test
    <paragraph>
        This file (include2.txt) is used by
"""],
["""\
Include start-line/end-line + start-after Test

.. include:: %s
   :start-line: 2
   :end-line: 5
   :start-after: here

Text search is limited to the specified lines.
""" % include12,
"""\
<document source="test data">
    <paragraph>
        Include start-line/end-line + start-after Test
    <paragraph>
        In include12.txt (after "start here", before "stop here")
    <paragraph>
        Text search is limited to the specified lines.
"""],
["""\
Include start-after/end-before Test

.. include:: %s
   :start-after: .. start here
   :end-before: .. stop here

A paragraph.
""" % include12,
"""\
<document source="test data">
    <paragraph>
        Include start-after/end-before Test
    <paragraph>
        In include12.txt (after "start here", before "stop here")
    <paragraph>
        A paragraph.
"""],
["""\
Include start-after/end-before Test, single option variant

.. include:: %s
   :end-before: .. start here

.. include:: %s
   :start-after: .. stop here

A paragraph.
""" % (include12, include12),
"""\
<document source="test data">
    <paragraph>
        Include start-after/end-before Test, single option variant
    <paragraph>
        In include12.txt (but before "start here")
    <paragraph>
        In include12.txt (after "stop here")
    <paragraph>
        A paragraph.
"""],
["""\
Include start-after/end-before multi-line test.

.. include:: %s
   :start-after: From: me
                 To: you
   :end-before: -------
                -- mork of ork

.. include:: %s
   :start-after: From: me
                 To: you
   :end-before:
       -------
         -- mork of ork

A paragraph.
""" % (include13, include13),
"""\
<document source="test data">
    <paragraph>
        Include start-after/end-before multi-line test.
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problem with "end-before" option of "include" directive:
            Text not found.
        <literal_block xml:space="preserve">
            .. include:: %s
               :start-after: From: me
                             To: you
               :end-before: -------
                            -- mork of ork
    <paragraph>
        In include13.txt (between header and signature)
    <paragraph>
        A paragraph.
""" % include13],
["""\
Error handling test; "end-before" error handling tested in previous test.

.. include:: %s
   :start-after: bad string
   :end-before: mork of ork
""" % include13,
"""\
<document source="test data">
    <paragraph>
        Error handling test; "end-before" error handling tested in previous test.
    <system_message level="4" line="3" source="test data" type="SEVERE">
        <paragraph>
            Problem with "start-after" option of "include" directive:
            Text not found.
        <literal_block xml:space="preserve">
            .. include:: %s
               :start-after: bad string
               :end-before: mork of ork
""" % include13],
["""\
TAB expansion with literal include:

.. include:: %s
   :literal:
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        TAB expansion with literal include:
    <literal_block source="%s" xml:space="preserve">
        Literal included this should **not** be *marked* `up`.
                <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Custom TAB expansion with literal include:

.. include:: %s
   :literal:
   :tab-width: 2
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        Custom TAB expansion with literal include:
    <literal_block source="%s" xml:space="preserve">
        Literal included this should **not** be *marked* `up`.
          <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
No TAB expansion with literal include:

.. include:: %s
   :literal:
   :tab-width: -1
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        No TAB expansion with literal include:
    <literal_block source="%s" xml:space="preserve">
        Literal included this should **not** be *marked* `up`.
        \t<- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
]

totest['include-code'] = [
["""\
Included code

.. include:: %s
   :code: rst
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Included code
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        <inline classes="generic heading">
            Inclusion 1
        \n\
        <inline classes="generic heading">
            -----------
        \n\
        \n\
        This file is used by \n\
        <inline classes="literal string">
            ``test_include.py``
        .
""" % reldir(include1)],
["""\
Included code

.. include:: %s
   :code: rst
   :number-lines:
""" % include1,
"""\
<document source="test data">
    <paragraph>
        Included code
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        <inline classes="ln">
            1 \n\
        <inline classes="generic heading">
            Inclusion 1
        \n\
        <inline classes="ln">
            2 \n\
        <inline classes="generic heading">
            -----------
        \n\
        <inline classes="ln">
            3 \n\
        \n\
        <inline classes="ln">
            4 \n\
        This file is used by \n\
        <inline classes="literal string">
            ``test_include.py``
        .
""" % reldir(include1)],
["""\
TAB expansion with included code:

.. include:: %s
   :code: rst
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        TAB expansion with included code:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        Literal included this should \n\
        <inline classes="generic strong">
            **not**
         be \n\
        <inline classes="generic emph">
            *marked*
         \n\
        <inline classes="name variable">
            `up`
        .
                <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Custom TAB expansion with included code:

.. include:: %s
   :code: rst
   :tab-width: 2
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        Custom TAB expansion with included code:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        Literal included this should \n\
        <inline classes="generic strong">
            **not**
         be \n\
        <inline classes="generic emph">
            *marked*
         \n\
        <inline classes="name variable">
            `up`
        .
          <- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Custom TAB expansion with included code:

.. include:: %s
   :code: rst
   :tab-width: -1
""" % include_literal,
"""\
<document source="test data">
    <paragraph>
        Custom TAB expansion with included code:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        Literal included this should \n\
        <inline classes="generic strong">
            **not**
         be \n\
        <inline classes="generic emph">
            *marked*
         \n\
        <inline classes="name variable">
            `up`
        .
        \t<- leading raw tab.
        \n\
        Newlines
        are
        normalized.
""" % include_literal],
["""\
Including includes/include14.txt

.. include:: %s
""" % include14,
"""\
<document source="test data">
    <paragraph>
        Including includes/include14.txt
    <paragraph>
        Including more/include6.txt as rst-code from includes/include14.txt:
    <literal_block classes="code rst" source="%s" xml:space="preserve">
        In includes/more/include6.txt
        \n\
        <inline classes="punctuation">
            ..
         \n\
        <inline classes="operator word">
            include
        <inline classes="punctuation">
            ::
         ../sibling/include7.txt
""" % reldir(include6)],
["""\
Circular inclusion

.. include:: %s
""" % include15,
"""\
<document source="test data">
    <paragraph>
        Circular inclusion
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        File "include16.txt": example of rekursive inclusion.
    <system_message level="2" line="3" source="%s" type="WARNING">
        <paragraph>
            circular inclusion in "include" directive: %s < %s < %s < test data
        <literal_block xml:space="preserve">
            .. include:: include15.txt
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
""" % (reldir(include16), reldir(include15),
       reldir(include16), reldir(include15))],
["""\
Circular inclusion with clipping.

.. include:: %s
   :start-line: 2
""" % include16,
"""\
<document source="test data">
    <paragraph>
        Circular inclusion with clipping.
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        File "include16.txt": example of rekursive inclusion.
    <system_message level="2" line="3" source="%s" type="WARNING">
        <paragraph>
            circular inclusion in "include" directive: %s < %s < %s < %s < test data
        <literal_block xml:space="preserve">
            .. include:: include15.txt
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
""" % (reldir(include16), reldir(include15), reldir(include16),
       reldir(include15), reldir(include16))],
["""\
Circular inclusion with specified parser.

.. include:: %s
   :parser: rst
""" % include15,
"""\
<document source="test data">
    <paragraph>
        Circular inclusion with specified parser.
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
    <paragraph>
        File "include16.txt": example of rekursive inclusion.
    <system_message level="2" line="3" source="%s" type="WARNING">
        <paragraph>
            circular inclusion in "include" directive: %s < %s < %s < test data
        <literal_block xml:space="preserve">
            .. include:: include15.txt
    <paragraph>
        No loop when clipping before the "include" directive:
    <paragraph>
        File "include15.txt": example of rekursive inclusion.
""" % (reldir(include16), reldir(include15),
       reldir(include16), reldir(include15))],
["""\
No circular inclusion.

============================= =============================
.. include:: data/include.txt .. include:: data/include.txt
============================= =============================
""",
"""\
<document source="test data">
    <paragraph>
        No circular inclusion.
    <table>
        <tgroup cols="2">
            <colspec colwidth="29">
            <colspec colwidth="29">
            <tbody>
                <row>
                    <entry>
                        <paragraph>
                            Some include text.
                    <entry>
                        <paragraph>
                            Some include text."""],
]

if __name__ == '__main__':
    import unittest
    unittest.main(defaultTest='suite')
#! /usr/bin/env python # $Id: test_include.py 8851 2021-10-12 17:33:24Z milde $ # Author: <NAME> <<EMAIL>> # Copyright: This module has been placed in the public domain. Tests for misc.py "include" directive. # noqa # prepend this directory (relative to the test root): # make `path` relative with utils.relative_path(): # Different error for path with 8bit chars with locale == C or None: \ Cannot encode input file path "\u043c\u0438\u0440.txt" (wrong locale?).\ \ InputError: [Errno 2] No such file or directory: '\u043c\u0438\u0440.txt'.\ # Parsing with Markdown (recommonmark) is an optional feature depending # on 3rd-party modules: \     <section ids="title-1" names="title\\ 1">         <title>             Title 1         <paragraph>             <emphasis>                 emphasis              and \n\             <emphasis>                 also emphasis         <paragraph>             No whitespace required around a             <reference name="phrase reference" refuri="/uri">                 phrase reference             . \     <system_message level="2" source="test_parsers/test_rst/test_directives/include.md" type="WARNING">         <paragraph>             Missing dependency: MarkDown input is processed by a 3rd party parser but Python did not find the required module "recommonmark" (https://pypi.org/project/recommonmark/).\ \ Include Test ============  .. include:: %s  A paragraph. \ <document source="test data">     <section ids="include-test" names="include\\ test">         <title>             Include Test         <section ids="inclusion-1" names="inclusion\\ 1">             <title>                 Inclusion 1             <paragraph>                 This file is used by \n\                 <literal>                     test_include.py                 .             <paragraph>                 A paragraph. \ Include Test ============  .. include:: %s    :literal:    :class: test    :name: my name  A paragraph. \ <document source="test data">     <section ids="include-test" names="include\\ test">         <title>             Include Test         <literal_block classes="test" ids="my-name" names="my\\ name" source="%s" xml:space="preserve">             Inclusion 1             -----------             \n\             This file is used by ``test_include.py``.         <paragraph>             A paragraph. \ Literal include, add line numbers  .. include:: %s    :literal:    :number-lines: \ <document source="test data">     <paragraph>         Literal include, add line numbers     <literal_block source="%s" xml:space="preserve">         <inline classes="ln">             1 \n\         Inclusion 1         <inline classes="ln">             2 \n\         -----------         <inline classes="ln">             3 \n\         \n\         <inline classes="ln">             4 \n\         This file is used by ``test_include.py``. \ Include code  .. include:: %s    :code:    :class: test    :name: <NAME> \ <document source="test data">     <paragraph>         Include code     <literal_block classes="code test" ids="my-name" names="my\\ name" source="%s" xml:space="preserve">         Inclusion 1         -----------         \n\         This file is used by ``test_include.py``. \ Include code, add line numbers  .. include:: %s    :code:    :number-lines: \ <document source="test data">     <paragraph>         Include code, add line numbers     <literal_block classes="code" source="%s" xml:space="preserve">         <inline classes="ln">             1 \n\         Inclusion 1         <inline classes="ln">             2 \n\         -----------         <inline classes="ln">             3 \n\         \n\         <inline classes="ln">             4 \n\         This file is used by ``test_include.py``. \ Include markdown (recommonmark).  .. include:: %s    :parser: markdown  A paragraph. \ <document source="test data">     <paragraph>         Include markdown (recommonmark). %s     <paragraph>         A paragraph. \ Let's test the parse context.      This paragraph is in a block quote.      .. include:: %s  The included paragraphs should also be in the block quote. \ <document source="test data">     <paragraph>         Let's test the parse context.     <block_quote>         <paragraph>             This paragraph is in a block quote.         <paragraph>             Here are some paragraphs             that can appear at any level.         <paragraph>             This file (include2.txt) is used by             <literal>                 test_include.py             .     <paragraph>         The included paragraphs should also be in the block quote. \ Include Test ============  .. include:: nonexistent.txt  A paragraph. \ <document source="test data">     <section ids="include-test" names="include\\ test">         <title>             Include Test         <system_message level="4" line="4" source="test data" type="SEVERE">             <paragraph>                 Problems with "include" directive path:                 InputError: [Errno 2] No such file or directory: 'nonexistent.txt'.             <literal_block xml:space="preserve">                 .. include:: nonexistent.txt         <paragraph>             A paragraph. \ Include Test ============  .. include:: %s  .. include:: %s  A paragraph. \ <document source="test data">     <section ids="include-test" names="include\\ test">         <title>             Include Test         <section dupnames="inclusion\\ 1" ids="inclusion-1">             <title>                 Inclusion 1             <paragraph>                 This file is used by \n\                 <literal>                     test_include.py                 .         <section dupnames="inclusion\\ 1" ids="inclusion-1-1">             <title>                 Inclusion 1             <system_message backrefs="inclusion-1-1" level="1" line="2" source="%s" type="INFO">                 <paragraph>                     Duplicate implicit target name: "inclusion 1".             <paragraph>                 This file is used by \n\                 <literal>                     test_include.py                 .             <paragraph>                 A paragraph. \ Include Test ============  .. include:: %s  ----------  .. include:: %s  A paragraph. \ <document source="test data">     <section ids="include-test" names="include\\ test">         <title>             Include Test         <section dupnames="inclusion\\ 1" ids="inclusion-1">             <title>                 Inclusion 1             <paragraph>                 This file is used by \n\                 <literal>                     test_include.py                 .             <transition>         <section dupnames="inclusion\\ 1" ids="inclusion-1-1">             <title>                 Inclusion 1             <system_message backrefs="inclusion-1-1" level="1" line="2" source="%s" type="INFO">                 <paragraph>                     Duplicate implicit target name: "inclusion 1".             <paragraph>                 This file is used by \n\                 <literal>                     test_include.py                 .             <paragraph>                 A paragraph. \ Recursive inclusions: adapt paths.  In test data  .. include:: %s \ <document source="test data">     <paragraph>         Recursive inclusions: adapt paths.     <paragraph>         In test data     <paragraph>         In include3.txt     <paragraph>         In includes/include4.txt     <paragraph>         In includes/include5.txt     <paragraph>         In includes/more/include6.txt     <paragraph>         In includes/sibling/include7.txt     <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">         In includes/include5.txt         \n\         .. include:: more/include6.txt     <table>         <tgroup cols="2">             <colspec colwidth="50">             <colspec colwidth="50">             <tbody>                 <row>                     <entry>                         <paragraph>                             In                     <entry>                         <paragraph>                             includes/sibling/include7.txt \ Recursive inclusion with specified parser.  In test data  .. include:: %s    :parser: rst \ <document source="test data">     <paragraph>         Recursive inclusion with specified parser.     <paragraph>         In test data     <paragraph>         In include3.txt     <paragraph>         In includes/include4.txt     <paragraph>         In includes/include5.txt     <paragraph>         In includes/more/include6.txt     <paragraph>         In includes/sibling/include7.txt     <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">         In includes/include5.txt         \n\         .. include:: more/include6.txt     <table>         <tgroup cols="2">             <colspec colwidth="50">             <colspec colwidth="50">             <tbody>                 <row>                     <entry>                         <paragraph>                             In                     <entry>                         <paragraph>                             includes/sibling/include7.txt \ In test data  Section =======  (Section contents in nested parse; slice of input_lines ViewList.)  .. include:: %s \ <document source="test data">     <paragraph>         In test data     <section ids="section" names="section">         <title>             Section         <paragraph>             (Section contents in nested parse; slice of input_lines ViewList.)         <paragraph>             In include3.txt         <paragraph>             In includes/include4.txt         <paragraph>             In includes/include5.txt         <paragraph>             In includes/more/include6.txt         <paragraph>             In includes/sibling/include7.txt         <literal_block source="test_parsers/test_rst/test_directives/includes/include5.txt" xml:space="preserve">             In includes/include5.txt             \n\             .. include:: more/include6.txt         <table>             <tgroup cols="2">                 <colspec colwidth="50">                 <colspec colwidth="50">                 <tbody>                     <row>                         <entry>                             <paragraph>                                 In                         <entry>                             <paragraph>                                 includes/sibling/include7.txt \ Testing relative includes:  .. include:: %s \ <document source="test data">     <paragraph>         Testing relative includes:     <paragraph>         In include8.txt     <paragraph>         In ../includes/include9.txt.     <paragraph>         Here are some paragraphs         that can appear at any level.     <paragraph>         This file (include2.txt) is used by         <literal>             test_include.py         . \ Encoding:  .. include:: %s    :encoding: utf-16 \ <document source="test data">     <paragraph>         Encoding:     <paragraph>         "Treat", "Quantity", "Description"         "Albatr\xb0\xdf", 2.99, "\xa1On a \\u03c3\\u03c4\\u03b9\\u03ba!"         "Crunchy Frog", 1.49, "If we took the b\xf6nes out, it wouldn\\u2019t be         crunchy, now would it?"         "Gannet Ripple", 1.99, "\xbfOn a \\u03c3\\u03c4\\u03b9\\u03ba?" \ Include file is UTF-16-encoded, and is not valid ASCII.  .. include:: %s    :encoding: ascii \ <document source="test data">     <paragraph>         Include file is UTF-16-encoded, and is not valid ASCII.     <system_message level="4" line="3" source="test data" type="SEVERE">         <paragraph>             Problem with "include" directive:             %s         <literal_block xml:space="preserve">             .. include:: %s                :encoding: ascii \ cyrillic filename:  .. include:: \u043c\u0438\u0440.txt \ <document source="test data">     <paragraph>         cyrillic filename:     <system_message level="4" line="3" source="test data" type="SEVERE">         <paragraph>             Problems with "include" directive path:             %s         <literal_block xml:space="preserve">             .. include:: \u043c\u0438\u0440.txt \ Testing errors in included file:  .. include:: %s \ <document source="test data">     <paragraph>         Testing errors in included file:     <system_message level="3" line="1" source="%(source)s" type="ERROR">         <paragraph>             Invalid character code: 0x11111111             %(unichr_exception)s         <literal_block xml:space="preserve">             unicode:: 0x11111111     <system_message level="2" line="1" source="%(source)s" type="WARNING">         <paragraph>             Substitution definition "bad" empty or invalid.         <literal_block xml:space="preserve">             .. |bad| unicode:: 0x11111111     <section dupnames="hi" ids="hi">         <title>             hi         <block_quote>             <paragraph>                 indent         <system_message level="2" line="7" source="%(source)s" type="WARNING">             <paragraph>                 Block quote ends without a blank line; unexpected unindent.         <paragraph>             error     <section dupnames="hi" ids="hi-1">         <title>             hi         <system_message backrefs="hi-1" level="1" line="10" source="%(source)s" type="INFO">             <paragraph>                 Duplicate implicit target name: "hi".         <system_message level="4" line="12" source="%(source)s" type="SEVERE">             <paragraph>                 Problems with "include" directive path:                 InputError: [Errno 2] No such file or directory: '%(nonexistent)s'.             <literal_block xml:space="preserve">                 .. include:: <nonexistent>         <system_message level="3" line="14" source="%(source)s" type="ERROR">             <paragraph>                 Content block expected for the "note" directive; none found.             <literal_block xml:space="preserve">                 .. note::         <system_message level="3" line="16" source="%(source)s" type="ERROR">             <paragraph>                 Content block expected for the "admonition" directive; none found.             <literal_block xml:space="preserve">                 .. admonition::                    without title         <system_message level="3" line="19" source="%(source)s" type="ERROR">             <paragraph>                 Content block expected for the "epigraph" directive; none found.             <literal_block xml:space="preserve">                 .. epigraph::         <system_message level="3" line="21" source="%(source)s" type="ERROR">             <paragraph>                 Content block expected for the "highlights" directive; none found.             <literal_block xml:space="preserve">                 .. highlights::         <system_message level="3" line="23" source="%(source)s" type="ERROR">             <paragraph>                 Content block expected for the "pull-quote" directive; none found.             <literal_block xml:space="preserve">                 .. pull-quote::         <system_message level="3" line="25" source="%(source)s" type="ERROR">             <paragraph>                 Invalid context: the "date" directive can only be used within a substitution definition.             <literal_block xml:space="preserve">                 .. date::         <paragraph>             not a             definition list:         <system_message level="3" line="29" source="%(source)s" type="ERROR">             <paragraph>                 Unexpected indentation.         <block_quote>             <paragraph>                 as a term may only be one line long.         <system_message level="3" line="31" source="%(source)s" type="ERROR">             <paragraph>                 Error in "admonition" directive:                 1 argument(s) required, 0 supplied.             <literal_block xml:space="preserve">                 .. admonition::                 \n\                    without title and content following a blank line     <section ids="section-underline-too-short" names="section\\ underline\\ too\\ short">         <title>             section underline too short         <system_message level="2" line="36" source="%(source)s" type="WARNING">             <paragraph>                 Title underline too short.             <literal_block xml:space="preserve">                 section underline too short                 -----         <table>             <tgroup cols="2">                 <colspec colwidth="14">                 <colspec colwidth="6">                 <thead>                     <row>                         <entry>                             <paragraph>                                 A simple table                         <entry>                             <paragraph>                                 cell 2                 <tbody>                     <row>                         <entry>                             <paragraph>                                 cell 3                         <entry>                             <paragraph>                                 cell 4         <system_message level="2" line="43" source="%(source)s" type="WARNING">             <paragraph>                 Blank line required after table.         <paragraph>             No blank line after table.         <system_message level="3" line="45" source="%(source)s" type="ERROR">             <paragraph>                 Error in "unicode" directive:                 1 argument(s) required, 0 supplied.             <literal_block xml:space="preserve">                 unicode::         <system_message level="2" line="45" source="%(source)s" type="WARNING">             <paragraph>                 Substitution definition "empty" empty or invalid.             <literal_block xml:space="preserve">                 .. |empty| unicode::         <system_message level="3" line="47" source="%(source)s" type="ERROR">             <paragraph>                 Error in "topic" directive:                 1 argument(s) required, 0 supplied.             <literal_block xml:space="preserve">                 .. topic::         <system_message level="3" line="49" source="%(source)s" type="ERROR">             <paragraph>                 Error in "rubric" directive:                 1 argument(s) required, 0 supplied.             <literal_block xml:space="preserve">                 .. rubric::         <rubric>             A rubric has no content         <comment xml:space="preserve">             _`target: No matching backquote.         <system_message level="2" line="52" source="%(source)s" type="WARNING">             <paragraph>                 malformed hyperlink target.         <comment xml:space="preserve">             __malformed: no good         <system_message level="2" line="53" source="%(source)s" type="WARNING">             <paragraph>                 malformed hyperlink target.         <definition_list>             <definition_list_item>                 <term>                     A literal block::                 <definition>                     <system_message level="1" line="57" source="%(source)s" type="INFO">                         <paragraph>                             Blank line missing before literal block (after the "::")? Interpreted as a definition list item.                     <paragraph>                         with no blank line above.         <literal_block xml:space="preserve">             > A literal block.         <system_message level="3" line="61" source="%(source)s" type="ERROR">             <paragraph>                 Inconsistent literal block quoting.         <paragraph>             $ with inconsistent quoting.         <paragraph>             <problematic ids="problematic-1" refid="system-message-1">                 :unknown-role:`role`             \n\             and \n\             <problematic ids="problematic-2" refid="system-message-2">                 *             unbalanced             <problematic ids="problematic-3" refid="system-message-3">                 `             inline             <problematic ids="problematic-4" refid="system-message-4">                 **             markup         <system_message level="1" line="63" source="%(source)s" type="INFO">             <paragraph>                 No role entry for "unknown-role" in module "docutils.parsers.rst.languages.en".                 Trying "unknown-role" as canonical role name.         <system_message backrefs="problematic-1" ids="system-message-1" level="3" line="63" source="%(source)s" type="ERROR">             <paragraph>                 Unknown interpreted text role "unknown-role".         <system_message backrefs="problematic-2" ids="system-message-2" level="2" line="63" source="%(source)s" type="WARNING">             <paragraph>                 Inline emphasis start-string without end-string.         <system_message backrefs="problematic-3" ids="system-message-3" level="2" line="63" source="%(source)s" type="WARNING">             <paragraph>                 Inline interpreted text or phrase reference start-string without end-string.         <system_message backrefs="problematic-4" ids="system-message-4" level="2" line="63" source="%(source)s" type="WARNING">             <paragraph>                 Inline strong start-string without end-string.         <block_quote>             <paragraph>                 A block quote with \n\                 <problematic ids="problematic-5" refid="system-message-5">                     *                 inline warning             <system_message backrefs="problematic-5" ids="system-message-5" level="2" line="68" source="test_parsers/test_rst/test_directives/include10.txt" type="WARNING">                 <paragraph>                     Inline emphasis start-string without end-string.             <attribution>                 attribution with \n\                 <problematic ids="problematic-6" refid="system-message-6">                     *                 inline warning         <system_message backrefs="problematic-6" ids="system-message-6" level="2" line="70" source="test_parsers/test_rst/test_directives/include10.txt" type="WARNING">             <paragraph>                 Inline emphasis start-string without end-string.         <paragraph>             <problematic ids="problematic-7" refid="system-message-7">                 :PEP:`-1`         <system_message backrefs="problematic-7" ids="system-message-7" level="3" line="72" source="%(source)s" type="ERROR">             <paragraph>                 PEP number must be a number from 0 to 9999; "-1" is invalid.         <system_message level="1" line="70" source="%(source)s" type="INFO">             <paragraph>                 No directive entry for "unknown" in module "docutils.parsers.rst.languages.en".                 Trying "unknown" as canonical directive name.         <system_message level="3" line="74" source="%(source)s" type="ERROR">             <paragraph>                 Unknown directive type "unknown".             <literal_block xml:space="preserve">                 .. unknown:: directive (TODO: info still reported with wrong line)         <system_message level="3" line="76" source="%(source)s" type="ERROR">             <paragraph>                 Malformed table.                 No bottom table border found.             <literal_block xml:space="preserve">                 ==============  ======                 A simple table  with                 no bottom       border                                  .. end of inclusion from "test_parsers/test_rst/test_directives/include10.txt" \ Include file with whitespace in the path:  .. include:: %s \ <document source="test data">     <paragraph>         Include file with whitespace in the path:     <paragraph>         some text \ Standard include data file:  .. include:: <isogrk4.txt> \ <document source="test data">     <paragraph>         Standard include data file:     <comment xml:space="preserve">         This data file has been placed in the public domain.     <comment xml:space="preserve">         Derived from the Unicode character mappings available from         <http://www.w3.org/2003/entities/xml/>.         Processed by unicode2rstsubs.py, part of Docutils:         <http://docutils.sourceforge.net>.     <substitution_definition names="b.Gammad">         \\u03dc     <substitution_definition names="b.gammad">         \\u03dd \ Nonexistent standard include data file:  .. include:: <nonexistent> \ <document source="test data">     <paragraph>         Nonexistent standard include data file:     <system_message level="4" line="3" source="test data" type="SEVERE">         <paragraph>             Problems with "include" directive path:             InputError: [Errno 2] No such file or directory: '%s'.         <literal_block xml:space="preserve">             .. include:: <nonexistent> \ Include start-line/end-line Test  .. include:: %s    :start-line: 3    :end-line: 4 \ <document source="test data">     <paragraph>         Include start-line/end-line Test     <paragraph>         This file (include2.txt) is used by \ Include start-line/end-line + start-after Test  .. include:: %s    :start-line: 2    :end-line: 5    :start-after: here  Text search is limited to the specified lines. \ <document source="test data">     <paragraph>         Include start-line/end-line + start-after Test     <paragraph>         In include12.txt (after "start here", before "stop here")     <paragraph>         Text search is limited to the specified lines. \ Include start-after/end-before Test  .. include:: %s    :start-after: .. start here    :end-before: .. stop here  A paragraph. \ <document source="test data">     <paragraph>         Include start-after/end-before Test     <paragraph>         In include12.txt (after "start here", before "stop here")     <paragraph>         A paragraph. \ Include start-after/end-before Test, single option variant  .. include:: %s    :end-before: .. start here  .. include:: %s    :start-after: .. stop here  A paragraph. \ <document source="test data">     <paragraph>         Include start-after/end-before Test, single option variant     <paragraph>         In include12.txt (but before "start here")     <paragraph>         In include12.txt (after "stop here")     <paragraph>         A paragraph. \ Include start-after/end-before multi-line test.  .. include:: %s    :start-after: From: me                  To: you    :end-before: -------                 -- mork of ork  .. include:: %s    :start-after: From: me                  To: you    :end-before:        -------          -- mork of ork  A paragraph. \ <document source="test data">     <paragraph>         Include start-after/end-before multi-line test.     <system_message level="4" line="3" source="test data" type="SEVERE">         <paragraph>             Problem with "end-before" option of "include" directive:             Text not found.         <literal_block xml:space="preserve">             .. include:: %s                :start-after: From: me                              To: you                :end-before: -------                             -- mork of ork     <paragraph>         In include13.txt (between header and signature)     <paragraph>         A paragraph. \ Error handling test; "end-before" error handling tested in previous test.  .. include:: %s    :start-after: bad string    :end-before: mork of ork \ <document source="test data">     <paragraph>         Error handling test; "end-before" error handling tested in previous test.     <system_message level="4" line="3" source="test data" type="SEVERE">         <paragraph>             Problem with "start-after" option of "include" directive:             Text not found.         <literal_block xml:space="preserve">             .. include:: %s                :start-after: bad string                :end-before: mork of ork \ TAB expansion with literal include:  .. include:: %s    :literal: \ <document source="test data">     <paragraph>         TAB expansion with literal include:     <literal_block source="%s" xml:space="preserve">         Literal included this should **not** be *marked* `up`.                 <- leading raw tab.         \n\         Newlines         are         normalized. \ Custom TAB expansion with literal include:  .. include:: %s    :literal:    :tab-width: 2 \ <document source="test data">     <paragraph>         Custom TAB expansion with literal include:     <literal_block source="%s" xml:space="preserve">         Literal included this should **not** be *marked* `up`.           <- leading raw tab.         \n\         Newlines         are         normalized. \ No TAB expansion with literal include:  .. include:: %s    :literal:    :tab-width: -1 \ <document source="test data">     <paragraph>         No TAB expansion with literal include:     <literal_block source="%s" xml:space="preserve">         Literal included this should **not** be *marked* `up`.         \t<- leading raw tab.         \n\         Newlines         are         normalized. \ Included code  .. include:: %s    :code: rst \ <document source="test data">     <paragraph>         Included code     <literal_block classes="code rst" source="%s" xml:space="preserve">         <inline classes="generic heading">             Inclusion 1         \n\         <inline classes="generic heading">             -----------         \n\         \n\         This file is used by \n\         <inline classes="literal string">             ``test_include.py``         . \ Included code  .. include:: %s    :code: rst    :number-lines: \ <document source="test data">     <paragraph>         Included code     <literal_block classes="code rst" source="%s" xml:space="preserve">         <inline classes="ln">             1 \n\         <inline classes="generic heading">             Inclusion 1         \n\         <inline classes="ln">             2 \n\         <inline classes="generic heading">             -----------         \n\         <inline classes="ln">             3 \n\         \n\         <inline classes="ln">             4 \n\         This file is used by \n\         <inline classes="literal string">             ``test_include.py``         . \ TAB expansion with included code:  .. include:: %s    :code: rst \ <document source="test data">     <paragraph>         TAB expansion with included code:     <literal_block classes="code rst" source="%s" xml:space="preserve">         Literal included this should \n\         <inline classes="generic strong">             **not**          be \n\         <inline classes="generic emph">             *marked*          \n\         <inline classes="name variable">             `up`         .                 <- leading raw tab.         \n\         Newlines         are         normalized. \ Custom TAB expansion with included code:  .. include:: %s    :code: rst    :tab-width: 2 \ <document source="test data">     <paragraph>         Custom TAB expansion with included code:     <literal_block classes="code rst" source="%s" xml:space="preserve">         Literal included this should \n\         <inline classes="generic strong">             **not**          be \n\         <inline classes="generic emph">             *marked*          \n\         <inline classes="name variable">             `up`         .           <- leading raw tab.         \n\         Newlines         are         normalized. \ Custom TAB expansion with included code:  .. include:: %s    :code: rst    :tab-width: -1 \ <document source="test data">     <paragraph>         Custom TAB expansion with included code:     <literal_block classes="code rst" source="%s" xml:space="preserve">         Literal included this should \n\         <inline classes="generic strong">             **not**          be \n\         <inline classes="generic emph">             *marked*          \n\         <inline classes="name variable">             `up`         .         \t<- leading raw tab.         \n\         Newlines         are         normalized. \ Including includes/include14.txt  .. include:: %s \ <document source="test data">     <paragraph>         Including includes/include14.txt     <paragraph>         Including more/include6.txt as rst-code from includes/include14.txt:     <literal_block classes="code rst" source="%s" xml:space="preserve">         In includes/more/include6.txt         \n\         <inline classes="punctuation">             ..          \n\         <inline classes="operator word">             include         <inline classes="punctuation">             ::          ../sibling/include7.txt \ Circular inclusion  .. include:: %s \ <document source="test data">     <paragraph>         Circular inclusion     <paragraph>         File "include15.txt": example of rekursive inclusion.     <paragraph>         File "include16.txt": example of rekursive inclusion.     <system_message level="2" line="3" source="%s" type="WARNING">         <paragraph>             circular inclusion in "include" directive: %s < %s < %s < test data         <literal_block xml:space="preserve">             .. include:: include15.txt     <paragraph>         No loop when clipping before the "include" directive:     <paragraph>         File "include15.txt": example of rekursive inclusion. \ Circular inclusion with clipping.  .. include:: %s    :start-line: 2 \ <document source="test data">     <paragraph>         Circular inclusion with clipping.     <paragraph>         File "include15.txt": example of rekursive inclusion.     <paragraph>         File "include16.txt": example of rekursive inclusion.     <system_message level="2" line="3" source="%s" type="WARNING">         <paragraph>             circular inclusion in "include" directive: %s < %s < %s < %s < test data         <literal_block xml:space="preserve">             .. include:: include15.txt     <paragraph>         No loop when clipping before the "include" directive:     <paragraph>         File "include15.txt": example of rekursive inclusion.     <paragraph>         No loop when clipping before the "include" directive:     <paragraph>         File "include15.txt": example of rekursive inclusion. \ Circular inclusion with specified parser.  .. include:: %s    :parser: rst \ <document source="test data">     <paragraph>         Circular inclusion with specified parser.     <paragraph>         File "include15.txt": example of rekursive inclusion.     <paragraph>         File "include16.txt": example of rekursive inclusion.     <system_message level="2" line="3" source="%s" type="WARNING">         <paragraph>             circular inclusion in "include" directive: %s < %s < %s < test data         <literal_block xml:space="preserve">             .. include:: include15.txt     <paragraph>         No loop when clipping before the "include" directive:     <paragraph>         File "include15.txt": example of rekursive inclusion. \ No circular inclusion.  ============================= ============================= .. include:: data/include.txt .. include:: data/include.txt ============================= ============================= \ <document source="test data">     <paragraph>         No circular inclusion.     <table>         <tgroup cols="2">             <colspec colwidth="29">             <colspec colwidth="29">             <tbody>                 <row>                     <entry>                         <paragraph>                             Some include text.                     <entry>                         <paragraph>                             Some include text.