diff --git a/lib/rdoc/generator/template/aliki/css/rdoc.css b/lib/rdoc/generator/template/aliki/css/rdoc.css index 25a3f43076..8341a4ff37 100644 --- a/lib/rdoc/generator/template/aliki/css/rdoc.css +++ b/lib/rdoc/generator/template/aliki/css/rdoc.css @@ -70,6 +70,8 @@ --color-accent-subtle: var(--color-primary-50); --color-code-bg: #f6f8fa; --color-code-border: var(--color-neutral-300); + --color-sig-bg: var(--color-neutral-100); + --color-sig-border: var(--color-primary-200); --color-nav-bg: #fff; --color-nav-text: var(--color-neutral-700); --color-th-background: var(--color-neutral-100); @@ -203,6 +205,8 @@ --color-accent-subtle-hover: rgb(235 84 79 / 20%); --color-code-bg: var(--color-neutral-800); --color-code-border: var(--color-neutral-700); + --color-sig-bg: #211f1e; /* between neutral-900 and neutral-800 */ + --color-sig-border: var(--color-accent-primary); --color-nav-bg: var(--color-neutral-900); --color-nav-text: var(--color-neutral-50); --color-th-background: var(--color-background-tertiary); @@ -1282,6 +1286,7 @@ main .method-description .method-calls-super { } main .method-detail { + position: relative; margin-bottom: 2.5em; } @@ -1292,16 +1297,34 @@ main .method-detail:target { } main .method-header { - display: inline-block; - max-width: calc(100% - 6em); /* 6em is the width of the source code toggle */ + background: var(--color-sig-bg); + border-left: 3px solid var(--color-sig-border); + border-radius: var(--radius-md); + padding: var(--space-3); + padding-right: 6em; } main .method-heading { - position: relative; + display: flex; + flex-direction: column; + align-items: flex-start; font-family: var(--font-code); font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); - margin-bottom: var(--space-3); + line-height: var(--line-height-normal); +} + +main .method-heading a { + color: inherit; + text-decoration: none; +} + +main .method-heading a:hover { + color: var(--color-accent-primary); +} + +main .method-heading .method-callseq { + display: block; } main .method-heading .method-name { @@ -1313,7 +1336,9 @@ main .method-heading .method-args { } main .method-controls { - float: right; + position: absolute; + top: var(--space-3); + right: var(--space-3); } main .method-controls summary { @@ -1356,14 +1381,19 @@ main .method-controls summary:active { border-color: var(--color-primary-500); } -main .method-description, -main .aliases { - margin-top: 0.75em; +main .method-description { color: var(--color-text-primary); + line-height: var(--line-height-relaxed); +} + +main .method-header ~ .method-description { + margin-top: var(--space-5); + padding-left: var(--space-2); } main .aliases { - padding-top: 4px; + margin-top: var(--space-4); + padding-top: var(--space-1); font-style: italic; cursor: default; } @@ -1410,9 +1440,18 @@ main .attribute-access-type { white-space: nowrap; } + main .method-heading { + font-size: var(--font-size-base); + } + + main .method-header { + padding: var(--space-2); + padding-right: var(--space-2); + } + main .method-controls { - margin-top: 10px; - float: none; + position: static; + margin-top: var(--space-2); } } diff --git a/lib/rdoc/markdown.kpeg b/lib/rdoc/markdown.kpeg index d95a88a823..8d24cc097f 100644 --- a/lib/rdoc/markdown.kpeg +++ b/lib/rdoc/markdown.kpeg @@ -1249,7 +1249,7 @@ RawNoteBlock = @StartList:a # Markdown extensions added by RDoc follow CodeFence = &{ github? } - Ticks3 (@Sp StrChunk:format)? Spnl < ( + Ticks3 (@Sp StrChunk:format)? @Sp @Newline? < ( ( !"`" Nonspacechar )+ | !Ticks3 /`+/ | Spacechar | diff --git a/lib/rdoc/markdown.rb b/lib/rdoc/markdown.rb index e4d0ae9ff6..45954fd1cc 100644 --- a/lib/rdoc/markdown.rb +++ b/lib/rdoc/markdown.rb @@ -15570,7 +15570,7 @@ def _RawNoteBlock return _tmp end - # CodeFence = &{ github? } Ticks3 (@Sp StrChunk:format)? Spnl < ((!"`" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text verbatim.format = format.intern if format.instance_of?(String) verbatim } + # CodeFence = &{ github? } Ticks3 (@Sp StrChunk:format)? @Sp @Newline? < ((!"`" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text verbatim.format = format.intern if format.instance_of?(String) verbatim } def _CodeFence _save = self.pos @@ -15612,31 +15612,41 @@ def _CodeFence self.pos = _save break end - _tmp = apply(:_Spnl) + _tmp = _Sp() unless _tmp self.pos = _save break end - _text_start = self.pos _save4 = self.pos - + _tmp = _Newline() + unless _tmp + _tmp = true + self.pos = _save4 + end + unless _tmp + self.pos = _save + break + end + _text_start = self.pos _save5 = self.pos - while true # choice - _save6 = self.pos + _save6 = self.pos + while true # choice _save7 = self.pos + + _save8 = self.pos while true # sequence - _save8 = self.pos + _save9 = self.pos _tmp = match_string("`") _tmp = _tmp ? nil : true - self.pos = _save8 + self.pos = _save9 unless _tmp - self.pos = _save7 + self.pos = _save8 break end _tmp = apply(:_Nonspacechar) unless _tmp - self.pos = _save7 + self.pos = _save8 end break end # end sequence @@ -15644,19 +15654,19 @@ def _CodeFence if _tmp while true - _save9 = self.pos + _save10 = self.pos while true # sequence - _save10 = self.pos + _save11 = self.pos _tmp = match_string("`") _tmp = _tmp ? nil : true - self.pos = _save10 + self.pos = _save11 unless _tmp - self.pos = _save9 + self.pos = _save10 break end _tmp = apply(:_Nonspacechar) unless _tmp - self.pos = _save9 + self.pos = _save10 end break end # end sequence @@ -15665,59 +15675,59 @@ def _CodeFence end _tmp = true else - self.pos = _save6 + self.pos = _save7 end break if _tmp - self.pos = _save5 + self.pos = _save6 - _save11 = self.pos + _save12 = self.pos while true # sequence - _save12 = self.pos + _save13 = self.pos _tmp = apply(:_Ticks3) _tmp = _tmp ? nil : true - self.pos = _save12 + self.pos = _save13 unless _tmp - self.pos = _save11 + self.pos = _save12 break end _tmp = scan(/\G(?-mix:`+)/) unless _tmp - self.pos = _save11 + self.pos = _save12 end break end # end sequence break if _tmp - self.pos = _save5 + self.pos = _save6 _tmp = apply(:_Spacechar) break if _tmp - self.pos = _save5 + self.pos = _save6 _tmp = _Newline() break if _tmp - self.pos = _save5 + self.pos = _save6 break end # end choice if _tmp while true - _save13 = self.pos + _save14 = self.pos while true # choice - _save14 = self.pos - _save15 = self.pos + + _save16 = self.pos while true # sequence - _save16 = self.pos + _save17 = self.pos _tmp = match_string("`") _tmp = _tmp ? nil : true - self.pos = _save16 + self.pos = _save17 unless _tmp - self.pos = _save15 + self.pos = _save16 break end _tmp = apply(:_Nonspacechar) unless _tmp - self.pos = _save15 + self.pos = _save16 end break end # end sequence @@ -15725,19 +15735,19 @@ def _CodeFence if _tmp while true - _save17 = self.pos + _save18 = self.pos while true # sequence - _save18 = self.pos + _save19 = self.pos _tmp = match_string("`") _tmp = _tmp ? nil : true - self.pos = _save18 + self.pos = _save19 unless _tmp - self.pos = _save17 + self.pos = _save18 break end _tmp = apply(:_Nonspacechar) unless _tmp - self.pos = _save17 + self.pos = _save18 end break end # end sequence @@ -15746,36 +15756,36 @@ def _CodeFence end _tmp = true else - self.pos = _save14 + self.pos = _save15 end break if _tmp - self.pos = _save13 + self.pos = _save14 - _save19 = self.pos + _save20 = self.pos while true # sequence - _save20 = self.pos + _save21 = self.pos _tmp = apply(:_Ticks3) _tmp = _tmp ? nil : true - self.pos = _save20 + self.pos = _save21 unless _tmp - self.pos = _save19 + self.pos = _save20 break end _tmp = scan(/\G(?-mix:`+)/) unless _tmp - self.pos = _save19 + self.pos = _save20 end break end # end sequence break if _tmp - self.pos = _save13 + self.pos = _save14 _tmp = apply(:_Spacechar) break if _tmp - self.pos = _save13 + self.pos = _save14 _tmp = _Newline() break if _tmp - self.pos = _save13 + self.pos = _save14 break end # end choice @@ -15783,7 +15793,7 @@ def _CodeFence end _tmp = true else - self.pos = _save4 + self.pos = _save5 end if _tmp text = get_text(_text_start) @@ -16677,7 +16687,7 @@ def _DefinitionListDefinition Rules[:_InlineNote] = rule_info("InlineNote", "&{ notes? } \"^[\" @StartList:a (!\"]\" Inline:l { a << l })+ \"]\" { ref = [:inline, @note_order.length] @footnotes[ref] = paragraph a note_for ref }") Rules[:_Notes] = rule_info("Notes", "(Note | SkipBlock)*") Rules[:_RawNoteBlock] = rule_info("RawNoteBlock", "@StartList:a (!@BlankLine !RawNoteReference OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a }") - Rules[:_CodeFence] = rule_info("CodeFence", "&{ github? } Ticks3 (@Sp StrChunk:format)? Spnl < ((!\"`\" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text verbatim.format = format.intern if format.instance_of?(String) verbatim }") + Rules[:_CodeFence] = rule_info("CodeFence", "&{ github? } Ticks3 (@Sp StrChunk:format)? @Sp @Newline? < ((!\"`\" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text verbatim.format = format.intern if format.instance_of?(String) verbatim }") Rules[:_Table] = rule_info("Table", "&{ github? } TableHead:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) parse_table_cells(table) }") Rules[:_TableHead] = rule_info("TableHead", "TableItem2+:items \"|\"? @Newline { items }") Rules[:_TableRow] = rule_info("TableRow", "((TableItem:item1 TableItem2+:items { [item1, *items] }):row | TableItem2+:row) \"|\"? @Newline { row }") diff --git a/test/rdoc/rdoc_markdown_test.rb b/test/rdoc/rdoc_markdown_test.rb index fc96b2985c..5ffed64f78 100644 --- a/test/rdoc/rdoc_markdown_test.rb +++ b/test/rdoc/rdoc_markdown_test.rb @@ -1242,6 +1242,21 @@ def test_code_fence_with_unintended_array assert_equal expected, doc end + def test_code_fence_preserves_text_indentation + doc = parse <<~MD + ```ruby + foo() + bar() + ``` + MD + + expected = doc( + verb(" foo()\n bar()\n").tap { |v| v.format = :ruby } + ) + + assert_equal expected, doc + end + def test_gfm_table doc = parse <<~MD | | |compare-ruby|built-ruby|