Beispiel #1
0
def render_dfn_list(toc_items):
    r = RstCloth()

    r.directive('class', 'toc')
    r.newline()

    for entry in toc_items:
        entry.render()
        idnt = 3 * entry.level

        if entry.text_only is True:
            if 'name' in entry:
                r.definition(entry.name, entry.description, indent=idnt)
            else:
                r.content(entry.description, indent=idnt)
            r.newline()
        else:
            if 'name' in entry:
                dfn_heading = r.role(
                    'doc', "{0} <{1}>".format(entry.name, entry.file))
            else:
                dfn_heading = r.role('doc', entry.file)

            if 'description' in entry:
                description = entry.description
            else:
                description = ''

            r.definition(dfn_heading, description, indent=idnt)
            r.newline()

    return r
Beispiel #2
0
def render_dfn_list(toc_items):
    r = RstCloth()

    r.directive('class', 'toc')
    r.newline()

    for entry in toc_items:
        entry.render()
        idnt = 3 * entry.level

        if entry.text_only is True:
            if 'name' in entry:
                r.definition(entry.name, entry.description, indent=idnt)
            else:
                r.content(entry.description, indent=idnt)
            r.newline()
        else:
            if 'name' in entry:
                dfn_heading = r.role('doc', "{0} <{1}>".format(entry.name, entry.file))
            else:
                dfn_heading = r.role('doc', entry.file)

            if 'description' in entry:
                description = entry.description
            else:
                description = ''

            r.definition(dfn_heading, description, indent=idnt)
            r.newline()

    return r
Beispiel #3
0
def render_glossary(terms):
    r = RstCloth()

    r.directive(name="glossary", fields=[("sorted", "")])
    r.newline()

    for term in terms.ordered_content():
        r.definition(term.term, term.definition, wrap=False, indent=3)

    return r
Beispiel #4
0
class CustomTocTree(object):
    def __init__(self, filename, conf, sort=False):
        if "ref-toc" in filename:
            self._is_ref = True
            sort = True
        else:
            self._is_ref = False

        self.spec = self._process_spec(filename, sort)

        self.conf = conf
        self.table = None
        self.contents = None
        self.dfn = None

        self.final = False

    def build_table(self):
        self.table = TableData()
        self.table.add_header(['Name', 'Description'])

    def build_dfn(self):
        self.dfn = RstCloth()
        self.dfn.directive('class', 'toc')
        self.dfn.newline()

    def build_contents(self):
        self.contents = RstCloth()
        self.contents.directive('class', 'hidden')
        self.contents.newline()
        self.contents.directive('toctree', fields=[('titlesonly', '')], indent=3)
        self.contents.newline()

    def _process_spec(self, spec, sort=False):
        o = []

        with open(spec, 'r') as f:
            data = yaml.safe_load_all(f)

            for datum in data:
                if 'description' not in datum or datum['description'] is None:
                    datum['description'] = ''

                if sort is False:
                    pass
                elif 'name' not in datum:
                    sort = False

                o.append(datum)

        if sort is True:
            o.sort(key=lambda o: o['name'])

        return o

    def finalize(self):
        if not self.final:
            for ref in self.spec:
                if giza.content.helper.edition_check(ref, self.conf) is False:
                    continue

                if self.table is not None:
                    if 'text' in ref:
                        if ref['name'] is None:
                            self.table.add_row( [ '', ref['text'] ] )
                        else:
                            self.table.add_row( [ ref['name'], ref['text'] ])
                    if 'name' in ref:
                        self.table.add_row([ ref['name'], ref['description'] ])
                    else:
                        self.table = None

                if self.contents is not None and 'file' in ref:
                    if 'name' in ref and self._is_ref is False:
                        self.contents.content("{0} <{1}>".format(ref['name'], ref['file']), 6, wrap=False, block='toc')
                    else:
                        self.contents.content(ref['file'], 6, wrap=False, block='toc')

                if self.dfn is not None:
                    if 'name' in ref:
                        text = ref['name']
                    else:
                        text = None

                    if 'level' in ref:
                        idnt = 3 * ref['level']
                    else:
                        idnt = 3

                    if 'class' in ref:
                        self.dfn.directive(name='class', arg=ref['class'], indent=idnt)
                        idnt += 3

                    if 'text' in ref:
                        if ref['name'] is None:
                            self.dfn.content(ref['text'], idnt)
                        else:
                            self.dfn.definition(ref['name'], ref['text'], indent=idnt, bold=False, wrap=False)
                    else:
                        link = self.dfn.role('doc', ref['file'], text)
                        self.dfn.definition(link, ref['description'], indent=idnt, bold=False, wrap=False)

                    self.dfn.newline()
Beispiel #5
0
class TestRstCloth(TestCase):
    @classmethod
    def setUp(self):
        self.r = RstCloth()

    def test_adding_without_blocks(self):
        self.r._add('foo')
        self.assertEqual(self.r.data[0], 'foo')

    def test_newline(self):
        self.r.newline()
        self.assertEqual(len(self.r.data), 1)

    def test_multi_newline(self):
        self.r.newline(count=4)
        self.assertEqual(len(self.r.data[0]), 4 - 1)

    def test_directive_simple(self):
        self.r.directive('test', block='d0')
        self.assertEqual(self.r.data[0], '.. test::')

    def test_directive_arg_named(self):
        self.r.directive('test', arg='what', block='d3')
        self.assertEqual(self.r.data[0], '.. test:: what')

    def test_directive_arg_positional(self):
        self.r.directive('test', 'what', block='d1')
        self.assertEqual(self.r.data[0], '.. test:: what')

    def test_directive_fields(self):
        self.r.directive('test', fields=[('a', 'b')], block='d2')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '   :a: b')

    def test_directive_fields_with_arg(self):
        self.r.directive('test', arg='what', fields=[('a', 'b')], block='d4')
        self.assertEqual(self.r.data[0], '.. test:: what')
        self.assertEqual(self.r.data[1], '   :a: b')

    def test_directive_fields_multiple(self):
        self.r.directive('test', fields=[('a', 'b'), ('c', 'd')], block='d5')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '   :a: b')
        self.assertEqual(self.r.data[2], '   :c: d')

    def test_directive_fields_multiple_arg(self):
        self.r.directive('test', arg='new', fields=[('a', 'b'), ('c', 'd')], block='d6')
        self.assertEqual(self.r.data[0], '.. test:: new')
        self.assertEqual(self.r.data[1], '   :a: b')
        self.assertEqual(self.r.data[2], '   :c: d')

    def test_directive_content(self):
        self.r.directive('test', content='string', block='d7')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '')
        self.assertEqual(self.r.data[2], '   string')

    def test_directive_with_multiline_content(self):
        self.r.directive('test', content=['string', 'second'], block='d8')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '')
        self.assertEqual(self.r.data[2], '   string')
        self.assertEqual(self.r.data[3], '   second')


    def test_directive_simple_indent(self):
        self.r.directive('test', indent=3, block='di0')
        self.assertEqual(self.r.data, ['   .. test::'])

    def test_directive_arg_named_indent(self):
        self.r.directive('test', arg='what', indent=3, block='di3')
        self.assertEqual(self.r.data, ['   .. test:: what'])

    def test_directive_arg_positional_indent(self):
        self.r.directive('test', 'what', indent=3, block='di1')
        self.assertEqual(self.r.data, ['   .. test:: what'])

    def test_directive_fields_indent(self):
        self.r.directive('test', fields=[('a', 'b')], indent=3, block='di2')
        self.assertEqual(self.r.data, ['   .. test::', '      :a: b'])

    def test_directive_fields_with_arg_indent(self):
        self.r.directive('test', arg='what', fields=[('a', 'b')], indent=3, block='di4')
        self.assertEqual(self.r.data, ['   .. test:: what', '      :a: b'])

    def test_directive_fields_multiple_indent(self):
        self.r.directive('test', indent=3, fields=[('a', 'b'), ('c', 'd')], block='di5')
        self.assertEqual(self.r.data, ['   .. test::', '      :a: b', '      :c: d'])

    def test_directive_fields_multiple_arg_indent(self):
        self.r.directive('test', arg='new', indent=3, fields=[('a', 'b'), ('c', 'd')], block='di6')
        self.assertEqual(self.r.data, ['   .. test:: new', '      :a: b', '      :c: d'])

    def test_directive_content_indent(self):
        self.r.directive('test', content='string', indent=3, block='di7')
        self.assertEqual(self.r.data, ['   .. test::', '   ', '      string'])

    def test_directive_with_multiline_content_indent(self):
        self.r.directive('test', indent=3, content=['string', 'second'], block='di8')
        self.assertEqual(self.r.data, ['   .. test::', '   ', '      string', '      second'])

    def test_single_role_no_text(self):
        ret = self.r.role('test', 'value')
        self.assertEqual(ret, ':test:`value`')

    def test_multi_role_no_text(self):
        ret = self.r.role(['test', 'role'], 'value')
        self.assertEqual(ret, ':test:role:`value`')

    def test_single_role_text(self):
        ret = self.r.role('test', 'value', 'link')
        self.assertEqual(ret, ':test:`link <value>`')

    def test_multi_role_text(self):
        ret = self.r.role(['test', 'role'], 'value', 'link')
        self.assertEqual(ret, ':test:role:`link <value>`')

    def test_single_role_no_text_args(self):
        ret = self.r.role(name='test', value='value')
        self.assertEqual(ret, ':test:`value`')

    def test_multi_role_no_text_args(self):
        ret = self.r.role(name=['test', 'role'], value='value')
        self.assertEqual(ret, ':test:role:`value`')

    def test_single_role_text_args(self):
        ret = self.r.role(name='test', value='value', text='link')
        self.assertEqual(ret, ':test:`link <value>`')

    def test_multi_role_text_args(self):
        ret = self.r.role(name=['test', 'role'], value='value', text='link')
        self.assertEqual(ret, ':test:role:`link <value>`')

    def test_bold(self):
        ret = self.r.bold('text')
        self.assertEqual(ret, '**text**')

    def test_emph(self):
        ret = self.r.emph('text')
        self.assertEqual(ret, '*text*')

    def test_pre(self):
        ret = self.r.pre('text')
        self.assertEqual(ret, '``text``')

    def test_inline_link(self):
        ret = self.r.inline_link('text', 'link')
        self.assertEqual(ret, '`text <link>`_')

    def test_footnote_ref(self):
        ret = self.r.footnote_ref('name')
        self.assertEqual(ret, '[#name]_')

    def test_codeblock_simple(self):
        self.r.codeblock('ls -lha', block='cb0')
        self.assertEqual(self.r.data, ['::', '   ls -lha'])

    def test_codeblock_with_language(self):
        self.r.codeblock('ls -lha', language='shell',block='cb1')
        self.assertEqual(self.r.data, ['.. code-block:: shell', '', '   ls -lha'])

    def test_footnote(self):
        self.r.footnote('footsnotes', 'text of the note', block='fn0')
        self.assertEqual(self.r.data[0], '.. [#footsnotes] text of the note')

    def test_footnote_with_indent(self):
        self.r.footnote('footsnotes', 'text of the note', block='fn1', indent=3)
        self.assertEqual(self.r.data[0], '   .. [#footsnotes] text of the note')

    def test_footnote_with_wrap(self):
        self.r.footnote('footsnotes', 'the ' * 40, block='fn2', wrap=True)
        self.assertEqual(self.r.data[0],
                         '.. [#footsnotes]' + ' the' * 14 + '\n  ' + ' the' * 17 + '\n  ' + ' the' * 9)

    def test_definition(self):
        self.r.definition('defitem', 'this is def text', block='dfn0')
        self.assertEqual(self.r.data, ['defitem', '   this is def text'])

    def test_definition_with_indent(self):
        self.r.definition('defitem', 'this is def text', indent=3, block='dfn1')
        self.assertEqual(self.r.data, ['   defitem', '      this is def text'])

    def test_title_default(self):
        self.r.title('test text', block='hd0')
        self.assertEqual(self.r.data, ['=========', 'test text', '========='])

    def test_title_alt(self):
        self.r.title('test text', char='-', block='hd1')
        self.assertEqual(self.r.data, ['---------', 'test text', '---------'])

    def test_heading_one(self):
        self.r.heading('test heading', char='-', indent=0, block='hd2')
        self.assertEqual(self.r.data, ['test heading', '------------'])

    def test_heading_two(self):
        self.r.heading('test heading', char='^', indent=0, block='hd3')
        self.assertEqual(self.r.data, ['test heading', '^^^^^^^^^^^^'])

    def test_h1(self):
        self.r.h1('test', block='hd4')
        self.assertEqual(self.r.data, ['test', '===='])

    def test_h2(self):
        self.r.h2('test', block='hd5')
        self.assertEqual(self.r.data, ['test', '----'])

    def test_h3(self):
        self.r.h3('test', block='hd6')
        self.assertEqual(self.r.data, ['test', '~~~~'])

    def test_h4(self):
        self.r.h4('test', block='hd7')
        self.assertEqual(self.r.data, ['test', '++++'])

    def test_h5(self):
        self.r.h5('test', block='hd8')
        self.assertEqual(self.r.data, ['test', '^^^^'])

    def test_h6(self):
        self.r.h6('test', block='hd9')
        self.assertEqual(self.r.data, ['test', ';;;;'])

    def test_replacement(self):
        self.r.replacement('foo', 'replace-with-bar', block='sub0')
        self.assertEqual(self.r.data, ['.. |foo| replace:: replace-with-bar'])

    def test_replacement_with_indent(self):
        self.r.replacement('foo', 'replace-with-bar', indent=3, block='sub1')
        self.assertEqual(self.r.data, ['   .. |foo| replace:: replace-with-bar'])

    def test_li_simple(self):
        self.r.li('foo', block='li0')
        self.assertEqual(self.r.data, ['- foo'])

    def test_li_simple_indent(self):
        self.r.li('foo', indent=3, block='li1')
        self.assertEqual(self.r.data, ['   - foo'])

    def test_li_simple_alt(self):
        self.r.li('foo', bullet='*', block='li2')
        self.assertEqual(self.r.data, ['* foo'])

    def test_li_simple_alt_indent(self):
        self.r.li('foo', bullet='*', indent=3, block='li3')
        self.assertEqual(self.r.data, ['   * foo'])

    def test_li_complex(self):
        self.r.li(['foo', 'bar'], block='li0')
        self.assertEqual(self.r.data, ['- foo bar'])

    def test_li_complex_indent(self):
        self.r.li(['foo', 'bar'], indent=3, block='li1')
        self.assertEqual(self.r.data, ['   - foo bar'])

    def test_li_complex_alt(self):
        self.r.li(['foo', 'bar'], bullet='*', block='li2')
        self.assertEqual(self.r.data, ['* foo bar'])

    def test_li_complex_alt_indent(self):
        self.r.li(['foo', 'bar'], bullet='*', indent=3, block='li3')
        self.assertEqual(self.r.data, ['   * foo bar'])

    def test_field_simple(self):
        self.r.field('fname', 'fvalue', block='fld0')
        self.assertEqual(self.r.data, [':fname: fvalue'])

    def test_field_long_simple(self):
        self.r.field('fname is fname', 'fvalue', block='fld1')
        self.assertEqual(self.r.data, [':fname is fname: fvalue'])

    def test_field_simple_long(self):
        self.r.field('fname', 'v' * 54, block='fld2')
        self.assertEqual(self.r.data, [':fname: ' + 'v' * 54])

    def test_field_simple_long_long(self):
        self.r.field('fname', 'v' * 55, block='fld3')
        self.assertEqual(self.r.data, [':fname:', '', '   ' + 'v' * 55])

    def test_field_indent_simple(self):
        self.r.field('fname', 'fvalue', indent=3, block='fld4')
        self.assertEqual(self.r.data, ['   :fname: fvalue'])

    def test_field_indent_long_simple(self):
        self.r.field('fname is fname', 'fvalue', indent=3, block='fld5')
        self.assertEqual(self.r.data, ['   :fname is fname: fvalue'])

    def test_field_indent_simple_long(self):
        self.r.field('fname', 'v' * 54, indent=3, block='fld6')
        self.assertEqual(self.r.data, ['   :fname: ' + 'v' * 54])

    def test_field_indent_simple_long_long(self):
        self.r.field('fname', 'v' * 55, indent=3, block='fld7')
        self.assertEqual(self.r.data, ['   :fname:', '   ', '      ' + 'v' * 55])

    def test_field_wrap_simple(self):
        self.r.field('fname', 'the ' * 100, block='fld8')
        self.assertEqual(self.r.data, [':fname:', '', '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 10])

    def test_field_wrap_indent_simple(self):
        self.r.field('fname', 'the ' * 100, indent=3, block='fld8')
        self.assertEqual(self.r.data, ['   :fname:', '   ', '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 10])

    def test_content_string(self):
        self.r.content('this is sparta', block='ct0')
        self.assertEqual(self.r.data, ['this is sparta'])

    def test_content_list(self):
        self.r.content(['this is sparta', 'this is spinal tap'], block='ct1')
        self.assertEqual(self.r.data, ['this is sparta', 'this is spinal tap'])

    def test_content_indent_string(self):
        self.r.content('this is sparta', indent=3, block='ct2')
        self.assertEqual(self.r.data, ['   this is sparta'])

    def test_content_indent_list(self):
        self.r.content(['this is sparta', 'this is spinal tap'], indent=3, block='ct3')
        self.assertEqual(self.r.data, ['   this is sparta', '   this is spinal tap'])

    def test_content_long(self):
        self.r.content('the ' * 100, block='ct4')
        self.assertEqual(self.r.data, [ 'the' + ' the' * 17, 'the ' * 17 + 'the', 'the ' * 17 + 'the', 'the ' * 17 + 'the', 'the ' * 17 + 'the', 'the ' * 9 + 'the' ])

    def test_ontent_indent_long(self):
        self.r.content('the ' * 100, indent=3 ,block='ct5')
        self.assertEqual(self.r.data, [ '   the' + ' the' * 17, "   " + 'the ' * 17 + 'the', '   ' + 'the ' * 17 + 'the', '   ' + 'the ' * 17 + 'the', '   ' + 'the ' * 17 + 'the', '   ' + 'the ' * 9 + 'the' ])

    def test_ontent_indent_long_nowrap(self):
        self.r.content('the ' * 100, wrap=False, indent=3 ,block='ct5')
        self.assertEqual(self.r.data, [ '   ' + 'the ' * 99 + 'the'])

    def test_ref_target_named(self):
        self.r.ref_target(name="foo-are-magic-ref0", block='ref0')
        self.assertEqual(self.r.data, ['.. _foo-are-magic-ref0:'])

    def test_ref_target_unnamed(self):
        self.r.ref_target("foo-are-magic-ref1", block='ref1')
        self.assertEqual(self.r.data, ['.. _foo-are-magic-ref1:'])

    def test_ref_target_named_with_indent(self):
        self.r.ref_target(name="foo-are-magic-ref2", indent=3, block='ref2')
        self.assertEqual(self.r.data, ['   .. _foo-are-magic-ref2:'])

    def test_ref_target_unnamed_wo_indent(self):
        self.r.ref_target("foo-are-magic-ref3", 3, block='ref3')
        self.assertEqual(self.r.data, ['   .. _foo-are-magic-ref3:'])
Beispiel #6
0
class CustomTocTree(object):
    def __init__(self, filename, conf, sort=False):
        if "ref-toc" in filename:
            self._is_ref = True
            sort = True
        else:
            self._is_ref = False

        self.spec = self._process_spec(filename, sort)

        self.conf = conf
        self.table = None
        self.contents = None
        self.dfn = None

        self.final = False

    def build_table(self):
        self.table = TableData()
        self.table.add_header(['Name', 'Description'])

    def build_dfn(self):
        self.dfn = RstCloth()
        self.dfn.directive('class', 'toc')
        self.dfn.newline()

    def build_contents(self):
        self.contents = RstCloth()
        self.contents.directive('class', 'hidden')
        self.contents.newline()
        self.contents.directive('toctree',
                                fields=[('titlesonly', '')],
                                indent=3)
        self.contents.newline()

    def _process_spec(self, spec, sort=False):
        o = []

        with open(spec, 'r') as f:
            data = yaml.safe_load_all(f)

            for datum in data:
                if 'description' not in datum or datum['description'] is None:
                    datum['description'] = ''

                if sort is False:
                    pass
                elif 'name' not in datum:
                    sort = False

                o.append(datum)

        if sort is True:
            o.sort(key=lambda o: o['name'])

        return o

    def finalize(self):
        if not self.final:
            for ref in self.spec:
                if giza.content.helper.edition_check(ref, self.conf) is False:
                    continue

                if self.table is not None:
                    if 'text' in ref:
                        if ref['name'] is None:
                            self.table.add_row(['', ref['text']])
                        else:
                            self.table.add_row([ref['name'], ref['text']])
                    if 'name' in ref:
                        self.table.add_row([ref['name'], ref['description']])
                    else:
                        self.table = None

                if self.contents is not None and 'file' in ref:
                    if 'name' in ref and self._is_ref is False:
                        self.contents.content("{0} <{1}>".format(
                            ref['name'], ref['file']),
                                              6,
                                              wrap=False,
                                              block='toc')
                    else:
                        self.contents.content(ref['file'],
                                              6,
                                              wrap=False,
                                              block='toc')

                if self.dfn is not None:
                    if 'name' in ref:
                        text = ref['name']
                    else:
                        text = None

                    if 'level' in ref:
                        idnt = 3 * ref['level']
                    else:
                        idnt = 3

                    if 'class' in ref:
                        self.dfn.directive(name='class',
                                           arg=ref['class'],
                                           indent=idnt)
                        idnt += 3

                    if 'text' in ref:
                        if ref['name'] is None:
                            self.dfn.content(ref['text'], idnt)
                        else:
                            self.dfn.definition(ref['name'],
                                                ref['text'],
                                                indent=idnt,
                                                bold=False,
                                                wrap=False)
                    else:
                        link = self.dfn.role('doc', ref['file'], text)
                        self.dfn.definition(link,
                                            ref['description'],
                                            indent=idnt,
                                            bold=False,
                                            wrap=False)

                    self.dfn.newline()
Beispiel #7
0
class TestRstCloth(TestCase):
    @classmethod
    def setUp(self):
        self.r = RstCloth()

    def test_adding_without_blocks(self):
        self.r._add('foo')
        self.assertEqual(self.r.data[0], 'foo')

    def test_newline(self):
        self.r.newline()
        self.assertEqual(len(self.r.data), 1)

    def test_multi_newline(self):
        self.r.newline(count=4)
        self.assertEqual(len(self.r.data[0]), 4 - 1)

    def test_directive_simple(self):
        self.r.directive('test', block='d0')
        self.assertEqual(self.r.data[0], '.. test::')

    def test_directive_arg_named(self):
        self.r.directive('test', arg='what', block='d3')
        self.assertEqual(self.r.data[0], '.. test:: what')

    def test_directive_arg_positional(self):
        self.r.directive('test', 'what', block='d1')
        self.assertEqual(self.r.data[0], '.. test:: what')

    def test_directive_fields(self):
        self.r.directive('test', fields=[('a', 'b')], block='d2')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '   :a: b')

    def test_directive_fields_with_arg(self):
        self.r.directive('test', arg='what', fields=[('a', 'b')], block='d4')
        self.assertEqual(self.r.data[0], '.. test:: what')
        self.assertEqual(self.r.data[1], '   :a: b')

    def test_directive_fields_multiple(self):
        self.r.directive('test', fields=[('a', 'b'), ('c', 'd')], block='d5')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '   :a: b')
        self.assertEqual(self.r.data[2], '   :c: d')

    def test_directive_fields_multiple_arg(self):
        self.r.directive('test', arg='new', fields=[('a', 'b'), ('c', 'd')], block='d6')
        self.assertEqual(self.r.data[0], '.. test:: new')
        self.assertEqual(self.r.data[1], '   :a: b')
        self.assertEqual(self.r.data[2], '   :c: d')

    def test_directive_content(self):
        self.r.directive('test', content='string', block='d7')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '')
        self.assertEqual(self.r.data[2], '   string')

    def test_directive_with_multiline_content(self):
        self.r.directive('test', content=['string', 'second'], block='d8')
        self.assertEqual(self.r.data[0], '.. test::')
        self.assertEqual(self.r.data[1], '')
        self.assertEqual(self.r.data[2], '   string')
        self.assertEqual(self.r.data[3], '   second')


    def test_directive_simple_indent(self):
        self.r.directive('test', indent=3, block='di0')
        self.assertEqual(self.r.data, ['   .. test::'])

    def test_directive_arg_named_indent(self):
        self.r.directive('test', arg='what', indent=3, block='di3')
        self.assertEqual(self.r.data, ['   .. test:: what'])

    def test_directive_arg_positional_indent(self):
        self.r.directive('test', 'what', indent=3, block='di1')
        self.assertEqual(self.r.data, ['   .. test:: what'])

    def test_directive_fields_indent(self):
        self.r.directive('test', fields=[('a', 'b')], indent=3, block='di2')
        self.assertEqual(self.r.data, ['   .. test::', '      :a: b'])

    def test_directive_fields_with_arg_indent(self):
        self.r.directive('test', arg='what', fields=[('a', 'b')], indent=3, block='di4')
        self.assertEqual(self.r.data, ['   .. test:: what', '      :a: b'])

    def test_directive_fields_multiple_indent(self):
        self.r.directive('test', indent=3, fields=[('a', 'b'), ('c', 'd')], block='di5')
        self.assertEqual(self.r.data, ['   .. test::', '      :a: b', '      :c: d'])

    def test_directive_fields_multiple_arg_indent(self):
        self.r.directive('test', arg='new', indent=3, fields=[('a', 'b'), ('c', 'd')], block='di6')
        self.assertEqual(self.r.data, ['   .. test:: new', '      :a: b', '      :c: d'])

    def test_directive_content_indent(self):
        self.r.directive('test', content='string', indent=3, block='di7')
        self.assertEqual(self.r.data, ['   .. test::', '   ', '      string'])

    def test_directive_with_multiline_content_indent(self):
        self.r.directive('test', indent=3, content=['string', 'second'], block='di8')
        self.assertEqual(self.r.data, ['   .. test::', '   ', '      string', '      second'])

    def test_single_role_no_text(self):
        ret = self.r.role('test', 'value')
        self.assertEqual(ret, ':test:`value`')

    def test_multi_role_no_text(self):
        ret = self.r.role(['test', 'role'], 'value')
        self.assertEqual(ret, ':test:role:`value`')

    def test_single_role_text(self):
        ret = self.r.role('test', 'value', 'link')
        self.assertEqual(ret, ':test:`link <value>`')

    def test_multi_role_text(self):
        ret = self.r.role(['test', 'role'], 'value', 'link')
        self.assertEqual(ret, ':test:role:`link <value>`')

    def test_single_role_no_text_args(self):
        ret = self.r.role(name='test', value='value')
        self.assertEqual(ret, ':test:`value`')

    def test_multi_role_no_text_args(self):
        ret = self.r.role(name=['test', 'role'], value='value')
        self.assertEqual(ret, ':test:role:`value`')

    def test_single_role_text_args(self):
        ret = self.r.role(name='test', value='value', text='link')
        self.assertEqual(ret, ':test:`link <value>`')

    def test_multi_role_text_args(self):
        ret = self.r.role(name=['test', 'role'], value='value', text='link')
        self.assertEqual(ret, ':test:role:`link <value>`')

    def test_bold(self):
        ret = self.r.bold('text')
        self.assertEqual(ret, '**text**')

    def test_emph(self):
        ret = self.r.emph('text')
        self.assertEqual(ret, '*text*')

    def test_pre(self):
        ret = self.r.pre('text')
        self.assertEqual(ret, '``text``')

    def test_inline_link(self):
        ret = self.r.inline_link('text', 'link')
        self.assertEqual(ret, '`text <link>`_')

    def test_footnote_ref(self):
        ret = self.r.footnote_ref('name')
        self.assertEqual(ret, '[#name]')

    def test_codeblock_simple(self):
        self.r.codeblock('ls -lha', block='cb0')
        self.assertEqual(self.r.data, ['::', '   ls -lha'])

    def test_codeblock_with_language(self):
        self.r.codeblock('ls -lha', language='shell',block='cb1')
        self.assertEqual(self.r.data, ['.. code-block:: shell', '', '   ls -lha'])

    def test_footnote(self):
        self.r.footnote('footsnotes', 'text of the note', block='fn0')
        self.assertEqual(self.r.data[0], '.. [#footsnotes] text of the note')

    def test_footnote_with_indent(self):
        self.r.footnote('footsnotes', 'text of the note', block='fn1', indent=3)
        self.assertEqual(self.r.data[0], '   .. [#footsnotes] text of the note')

    def test_footnote_with_wrap(self):
        self.r.footnote('footsnotes', 'the ' * 40, block='fn2', wrap=True)
        self.assertEqual(self.r.data[0],
                         '.. [#footsnotes]' + ' the' * 14 + '\n  ' + ' the' * 17 + '\n  ' + ' the' * 9)

    def test_definition(self):
        self.r.definition('defitem', 'this is def text', block='dfn0')
        self.assertEqual(self.r.data, ['defitem', '   this is def text'])

    def test_definition_with_indent(self):
        self.r.definition('defitem', 'this is def text', indent=3, block='dfn1')
        self.assertEqual(self.r.data, ['   defitem', '      this is def text'])

    def test_title_default(self):
        self.r.title('test text', block='hd0')
        self.assertEqual(self.r.data, ['=========', 'test text', '========='])

    def test_title_alt(self):
        self.r.title('test text', char='-', block='hd1')
        self.assertEqual(self.r.data, ['---------', 'test text', '---------'])

    def test_heading_one(self):
        self.r.heading('test heading', char='-', indent=0, block='hd2')
        self.assertEqual(self.r.data, ['test heading', '------------'])

    def test_heading_two(self):
        self.r.heading('test heading', char='^', indent=0, block='hd3')
        self.assertEqual(self.r.data, ['test heading', '^^^^^^^^^^^^'])

    def test_h1(self):
        self.r.h1('test', block='hd4')
        self.assertEqual(self.r.data, ['test', '===='])

    def test_h2(self):
        self.r.h2('test', block='hd5')
        self.assertEqual(self.r.data, ['test', '----'])

    def test_h3(self):
        self.r.h3('test', block='hd6')
        self.assertEqual(self.r.data, ['test', '~~~~'])

    def test_h4(self):
        self.r.h4('test', block='hd7')
        self.assertEqual(self.r.data, ['test', '++++'])

    def test_h5(self):
        self.r.h5('test', block='hd8')
        self.assertEqual(self.r.data, ['test', '^^^^'])

    def test_h6(self):
        self.r.h6('test', block='hd9')
        self.assertEqual(self.r.data, ['test', ';;;;'])

    def test_replacement(self):
        self.r.replacement('foo', 'replace-with-bar', block='sub0')
        self.assertEqual(self.r.data, ['.. |foo| replace:: replace-with-bar'])

    def test_replacement_with_indent(self):
        self.r.replacement('foo', 'replace-with-bar', indent=3, block='sub1')
        self.assertEqual(self.r.data, ['   .. |foo| replace:: replace-with-bar'])

    def test_li_simple(self):
        self.r.li('foo', block='li0')
        self.assertEqual(self.r.data, ['- foo'])

    def test_li_simple_indent(self):
        self.r.li('foo', indent=3, block='li1')
        self.assertEqual(self.r.data, ['   - foo'])

    def test_li_simple_alt(self):
        self.r.li('foo', bullet='*', block='li2')
        self.assertEqual(self.r.data, ['* foo'])

    def test_li_simple_alt_indent(self):
        self.r.li('foo', bullet='*', indent=3, block='li3')
        self.assertEqual(self.r.data, ['   * foo'])

    def test_li_complex(self):
        self.r.li(['foo', 'bar'], block='li0')
        self.assertEqual(self.r.data, ['- foo bar'])

    def test_li_complex_indent(self):
        self.r.li(['foo', 'bar'], indent=3, block='li1')
        self.assertEqual(self.r.data, ['   - foo bar'])

    def test_li_complex_alt(self):
        self.r.li(['foo', 'bar'], bullet='*', block='li2')
        self.assertEqual(self.r.data, ['* foo bar'])

    def test_li_complex_alt_indent(self):
        self.r.li(['foo', 'bar'], bullet='*', indent=3, block='li3')
        self.assertEqual(self.r.data, ['   * foo bar'])

    def test_field_simple(self):
        self.r.field('fname', 'fvalue', block='fld0')
        self.assertEqual(self.r.data, [':fname: fvalue'])

    def test_field_long_simple(self):
        self.r.field('fname is fname', 'fvalue', block='fld1')
        self.assertEqual(self.r.data, [':fname is fname: fvalue'])

    def test_field_simple_long(self):
        self.r.field('fname', 'v' * 54, block='fld2')
        self.assertEqual(self.r.data, [':fname: ' + 'v' * 54])

    def test_field_simple_long_long(self):
        self.r.field('fname', 'v' * 55, block='fld3')
        self.assertEqual(self.r.data, [':fname:', '', '   ' + 'v' * 55])

    def test_field_indent_simple(self):
        self.r.field('fname', 'fvalue', indent=3, block='fld4')
        self.assertEqual(self.r.data, ['   :fname: fvalue'])

    def test_field_indent_long_simple(self):
        self.r.field('fname is fname', 'fvalue', indent=3, block='fld5')
        self.assertEqual(self.r.data, ['   :fname is fname: fvalue'])

    def test_field_indent_simple_long(self):
        self.r.field('fname', 'v' * 54, indent=3, block='fld6')
        self.assertEqual(self.r.data, ['   :fname: ' + 'v' * 54])

    def test_field_indent_simple_long_long(self):
        self.r.field('fname', 'v' * 55, indent=3, block='fld7')
        self.assertEqual(self.r.data, ['   :fname:', '   ', '      ' + 'v' * 55])

    def test_field_wrap_simple(self):
        self.r.field('fname', 'the ' * 100, block='fld8')
        self.assertEqual(self.r.data, [':fname:', '', '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 18, '  ' + ' the' * 10])

    def test_field_wrap_indent_simple(self):
        self.r.field('fname', 'the ' * 100, indent=3, block='fld8')
        self.assertEqual(self.r.data, ['   :fname:', '   ', '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 18, '     ' + ' the' * 10])

    def test_content_string(self):
        self.r.content('this is sparta', block='ct0')
        self.assertEqual(self.r.data, ['this is sparta'])

    def test_content_list(self):
        self.r.content(['this is sparta', 'this is spinal tap'], block='ct1')
        self.assertEqual(self.r.data, ['this is sparta', 'this is spinal tap'])

    def test_content_indent_string(self):
        self.r.content('this is sparta', indent=3, block='ct2')
        self.assertEqual(self.r.data, ['   this is sparta'])

    def test_content_indent_list(self):
        self.r.content(['this is sparta', 'this is spinal tap'], indent=3, block='ct3')
        self.assertEqual(self.r.data, ['   this is sparta', '   this is spinal tap'])

    def test_content_long(self):
        self.r.content('the ' * 100, block='ct4')
        self.assertEqual(self.r.data, [ 'the' + ' the' * 17, 'the ' * 17 + 'the', 'the ' * 17 + 'the', 'the ' * 17 + 'the', 'the ' * 17 + 'the', 'the ' * 9 + 'the' ])

    def test_ontent_indent_long(self):
        self.r.content('the ' * 100, indent=3 ,block='ct5')
        self.assertEqual(self.r.data, [ '   the' + ' the' * 17, "   " + 'the ' * 17 + 'the', '   ' + 'the ' * 17 + 'the', '   ' + 'the ' * 17 + 'the', '   ' + 'the ' * 17 + 'the', '   ' + 'the ' * 9 + 'the' ])

    def test_ontent_indent_long_nowrap(self):
        self.r.content('the ' * 100, wrap=False, indent=3 ,block='ct5')
        self.assertEqual(self.r.data, [ '   ' + 'the ' * 99 + 'the'])

    def test_ref_target_named(self):
        self.r.ref_target(name="foo-are-magic-ref0", block='ref0')
        self.assertEqual(self.r.data, ['.. _foo-are-magic-ref0:'])

    def test_ref_target_unnamed(self):
        self.r.ref_target("foo-are-magic-ref1", block='ref1')
        self.assertEqual(self.r.data, ['.. _foo-are-magic-ref1:'])

    def test_ref_target_named_with_indent(self):
        self.r.ref_target(name="foo-are-magic-ref2", indent=3, block='ref2')
        self.assertEqual(self.r.data, ['   .. _foo-are-magic-ref2:'])

    def test_ref_target_unnamed_wo_indent(self):
        self.r.ref_target("foo-are-magic-ref3", 3, block='ref3')
        self.assertEqual(self.r.data, ['   .. _foo-are-magic-ref3:'])