[ruby/rdoc] Fix ToRdoc generating incorrect {label,name}-lists

Previously, trying to round-trip label-list and name-lists with the
ToRdoc converter was not possible:

```ruby
doc = <<~RDOC
foo ::
bar ::
  hi
RDOC

markup = RDoc::Markup.parse(doc)
markup # => [doc: [list: NOTE [item: ["foo ", "bar"]; [para: "hi"]]]]

rt = RDoc::Markup::ToRdoc.new.convert(markup)
rt # => "foo\nbar:\n  hi\n\n"

rt_markup = RDoc::Markup.parse(rt)
rt_markup # => [doc: [para: "foo ", "bar:"], [verb: "hi\n"]]
```

This commit addresses the issue by fixing ToRdoc to generate output that
can be properly reparsed by RDoc. ToRdoc tests additionally needed to be
updated for the new output.

The old implementation of `accept_list_item_start` was copied to ToBs
because those tests did not pass with the new changes and I am
unfamiliar with the `backspace` format.

After:

```ruby
doc = <<~RDOC
foo ::
bar ::
  hi
RDOC

markup = RDoc::Markup.parse(doc)
markup # => [doc: [list: NOTE [item: ["foo ", "bar"]; [para: "hi"]]]]

rt = RDoc::Markup::ToRdoc.new.convert(markup)
rt # => "foo::\nbar::\n  hi\n\n"

rt_markup = RDoc::Markup.parse(rt)
rt_markup # => [doc: [list: NOTE [item: ["foo", "bar"]; [para: "hi"], blankline]]]
```

https://github.com/ruby/rdoc/commit/c6c51aa900
This commit is contained in:
Hartley McGuire 2024-03-05 20:13:38 -05:00 committed by git
parent 35c20cda70
commit 5ac6194c2b
3 changed files with 45 additions and 12 deletions

View File

@ -40,6 +40,31 @@ class RDoc::Markup::ToBs < RDoc::Markup::ToRdoc
@res << "\n"
end
##
# Prepares the visitor for consuming +list_item+
def accept_list_item_start list_item
type = @list_type.last
case type
when :NOTE, :LABEL then
bullets = Array(list_item.label).map do |label|
attributes(label).strip
end.join "\n"
bullets << ":\n" unless bullets.empty?
@prefix = ' ' * @indent
@indent += 2
@prefix << bullets + (' ' * @indent)
else
bullet = type == :BULLET ? '*' : @list_index.last.to_s + '.'
@prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1)
width = bullet.length + 1
@indent += width
end
end
##
# Turns on or off regexp handling for +convert_string+

View File

@ -145,11 +145,19 @@ class RDoc::Markup::ToRdoc < RDoc::Markup::Formatter
case type
when :NOTE, :LABEL then
bullets = Array(list_item.label).map do |label|
stripped_labels = Array(list_item.label).map do |label|
attributes(label).strip
end.join "\n"
end
bullets << ":\n" unless bullets.empty?
bullets = case type
when :NOTE
stripped_labels.map { |b| "#{b}::" }
when :LABEL
stripped_labels.map { |b| "[#{b}]" }
end
bullets = bullets.join("\n")
bullets << "\n" unless stripped_labels.empty?
@prefix = ' ' * @indent
@indent += 2

View File

@ -69,7 +69,7 @@ class TestRDocMarkupToRDoc < RDoc::Markup::TextFormatterTestCase
end
def accept_list_item_end_label
assert_equal "cat:\n", @to.res.join
assert_equal "[cat]\n", @to.res.join
assert_equal 0, @to.indent, 'indent'
end
@ -79,7 +79,7 @@ class TestRDocMarkupToRDoc < RDoc::Markup::TextFormatterTestCase
end
def accept_list_item_end_note
assert_equal "cat:\n", @to.res.join
assert_equal "cat::\n", @to.res.join
assert_equal 0, @to.indent, 'indent'
end
@ -100,7 +100,7 @@ class TestRDocMarkupToRDoc < RDoc::Markup::TextFormatterTestCase
def accept_list_item_start_label
assert_equal [""], @to.res
assert_equal "cat:\n ", @to.prefix
assert_equal "[cat]\n ", @to.prefix
assert_equal 2, @to.indent
end
@ -115,7 +115,7 @@ class TestRDocMarkupToRDoc < RDoc::Markup::TextFormatterTestCase
def accept_list_item_start_note
assert_equal [""], @to.res
assert_equal "cat:\n ", @to.prefix
assert_equal "cat::\n ", @to.prefix
assert_equal 2, @to.indent
end
@ -243,16 +243,16 @@ class TestRDocMarkupToRDoc < RDoc::Markup::TextFormatterTestCase
end
def accept_list_item_start_note_2
assert_equal "<tt>teletype</tt>:\n teletype description\n\n", @to.res.join
assert_equal "<tt>teletype</tt>::\n teletype description\n\n", @to.res.join
end
def accept_list_item_start_note_multi_description
assert_equal "label:\n description one\n\n description two\n\n",
assert_equal "label::\n description one\n\n description two\n\n",
@to.res.join
end
def accept_list_item_start_note_multi_label
assert_equal "one\ntwo:\n two headers\n\n", @to.res.join
assert_equal "one::\ntwo::\n two headers\n\n", @to.res.join
end
def accept_paragraph_b
@ -355,8 +355,8 @@ bar ::
NOTE_LIST
expected = <<-EXPECTED
foo
bar:
foo::
bar::
hi
EXPECTED