Skip to content

Commit bfa71b7

Browse files
authored
Merge pull request #474 from aycabta/fix-escape-in-string
Fix escape in string
2 parents 1261ff6 + 2b02e37 commit bfa71b7

File tree

3 files changed

+160
-4
lines changed

3 files changed

+160
-4
lines changed

lib/rdoc/ruby_lex.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,13 +1331,14 @@ def identify_string(ltype, quoted = ltype, type = nil)
13311331
ungetc
13321332
end
13331333
elsif ch == '\\'
1334-
if %w[' /].include? @ltype then
1334+
case @ltype
1335+
when "'" then
13351336
case ch = getc
1336-
when "\n", "'"
1337-
when @ltype
1337+
when "'", '\\' then
13381338
str << ch
13391339
else
1340-
ungetc
1340+
str << '\\'
1341+
str << ch
13411342
end
13421343
else
13431344
str << read_escape

test/test_rdoc_markup_to_html.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,66 @@ def test_accept_verbatim_pipe
485485
assert_equal expected, @to.res.join
486486
end
487487

488+
def test_accept_verbatim_escape_in_string
489+
code = <<-'RUBY'
490+
def foo
491+
[
492+
'\\',
493+
'\'',
494+
"'",
495+
"\'\"\`",
496+
"\#",
497+
"\#{}",
498+
"#",
499+
"#{}",
500+
/'"/,
501+
/\'\"/,
502+
/\//,
503+
/\\/,
504+
/\#/,
505+
/\#{}/,
506+
/#/,
507+
/#{}/
508+
]
509+
end
510+
def bar
511+
end
512+
RUBY
513+
verb = @RM::Verbatim.new(*code.split(/(?<=\n)/))
514+
515+
@to.start_accepting
516+
@to.accept_verbatim verb
517+
518+
expected = <<-'EXPECTED'
519+
520+
<pre class="ruby"><span class="ruby-keyword">def</span> <span class="ruby-identifier">foo</span>
521+
[
522+
<span class="ruby-string">&#39;\\&#39;</span>,
523+
<span class="ruby-string">&#39;\&#39;&#39;</span>,
524+
<span class="ruby-string">&quot;&#39;&quot;</span>,
525+
<span class="ruby-string">&quot;\&#39;\&quot;\`&quot;</span>,
526+
<span class="ruby-string">&quot;\#&quot;</span>,
527+
<span class="ruby-string">&quot;\#{}&quot;</span>,
528+
<span class="ruby-string">&quot;#&quot;</span>,
529+
<span class="ruby-node">&quot;#{}&quot;</span>,
530+
<span class="ruby-regexp">/&#39;&quot;/</span>,
531+
<span class="ruby-regexp">/\&#39;\&quot;/</span>,
532+
<span class="ruby-regexp">/\//</span>,
533+
<span class="ruby-regexp">/\\/</span>,
534+
<span class="ruby-regexp">/\#/</span>,
535+
<span class="ruby-regexp">/\#{}/</span>,
536+
<span class="ruby-regexp">/#/</span>,
537+
<span class="ruby-regexp">/#{}/</span>
538+
]
539+
<span class="ruby-keyword">end</span>
540+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">bar</span>
541+
<span class="ruby-keyword">end</span>
542+
</pre>
543+
EXPECTED
544+
545+
assert_equal expected, @to.res.join
546+
end
547+
488548
def test_accept_verbatim_ruby
489549
verb = @RM::Verbatim.new("1 + 1\n")
490550
verb.format = :ruby

test/test_rdoc_ruby_lex.rb

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,101 @@ def test_class_tokenize_string
466466
assert_equal expected, tokens
467467
end
468468

469+
def test_class_tokenize_string_with_escape
470+
tokens = RDoc::RubyLex.tokenize <<'RUBY', nil
471+
[
472+
'\\',
473+
'\'',
474+
"'",
475+
"\'\"\`",
476+
"\#",
477+
"\#{}",
478+
"#",
479+
"#{}",
480+
/'"/,
481+
/\'\"/,
482+
/\//,
483+
/\\/,
484+
/\#/,
485+
/\#{}/,
486+
/#/,
487+
/#{}/
488+
]
489+
RUBY
490+
491+
expected = [
492+
@TK::TkLBRACK .new( 0, 1, 0, "["),
493+
@TK::TkNL .new( 1, 1, 1, "\n"),
494+
@TK::TkSPACE .new( 2, 2, 0, " "),
495+
@TK::TkSTRING .new( 4, 2, 2, "'\\\\'"),
496+
@TK::TkCOMMA .new( 8, 2, 6, ","),
497+
@TK::TkNL .new( 9, 2, 2, "\n"),
498+
@TK::TkSPACE .new( 10, 3, 0, " "),
499+
@TK::TkSTRING .new( 12, 3, 2, "'\\''"),
500+
@TK::TkCOMMA .new( 16, 3, 6, ","),
501+
@TK::TkNL .new( 17, 3, 10, "\n"),
502+
@TK::TkSPACE .new( 18, 4, 0, " "),
503+
@TK::TkSTRING .new( 20, 4, 2, "\"'\""),
504+
@TK::TkCOMMA .new( 23, 4, 5, ","),
505+
@TK::TkNL .new( 24, 4, 18, "\n"),
506+
@TK::TkSPACE .new( 25, 5, 0, " "),
507+
@TK::TkSTRING .new( 27, 5, 2, "\"\\'\\\"\\`\""),
508+
@TK::TkCOMMA .new( 35, 5, 10, ","),
509+
@TK::TkNL .new( 36, 5, 25, "\n"),
510+
@TK::TkSPACE .new( 37, 6, 0, " "),
511+
@TK::TkSTRING .new( 39, 6, 2, "\"\\#\""),
512+
@TK::TkCOMMA .new( 43, 6, 6, ","),
513+
@TK::TkNL .new( 44, 6, 37, "\n"),
514+
@TK::TkSPACE .new( 45, 7, 0, " "),
515+
@TK::TkSTRING .new( 47, 7, 2, "\"\\\#{}\""),
516+
@TK::TkCOMMA .new( 53, 7, 8, ","),
517+
@TK::TkNL .new( 54, 7, 45, "\n"),
518+
@TK::TkSPACE .new( 55, 8, 0, " "),
519+
@TK::TkSTRING .new( 57, 8, 2, "\"#\""),
520+
@TK::TkCOMMA .new( 60, 8, 5, ","),
521+
@TK::TkNL .new( 61, 8, 55, "\n"),
522+
@TK::TkSPACE .new( 62, 9, 0, " "),
523+
@TK::TkDSTRING.new( 64, 9, 2, "\"\#{}\""),
524+
@TK::TkCOMMA .new( 69, 9, 7, ","),
525+
@TK::TkNL .new( 70, 9, 62, "\n"),
526+
@TK::TkSPACE .new( 71, 10, 0, " "),
527+
@TK::TkREGEXP .new( 73, 10, 2, "/'\"/"),
528+
@TK::TkCOMMA .new( 77, 10, 6, ","),
529+
@TK::TkNL .new( 78, 10, 71, "\n"),
530+
@TK::TkSPACE .new( 79, 11, 0, " "),
531+
@TK::TkREGEXP .new( 81, 11, 2, "/\\'\\\"/"),
532+
@TK::TkCOMMA .new( 87, 11, 8, ","),
533+
@TK::TkNL .new( 88, 11, 79, "\n"),
534+
@TK::TkSPACE .new( 89, 12, 0, " "),
535+
@TK::TkREGEXP .new( 91, 12, 2, "/\\//"),
536+
@TK::TkCOMMA .new( 95, 12, 6, ","),
537+
@TK::TkNL .new( 96, 12, 89, "\n"),
538+
@TK::TkSPACE .new( 97, 13, 0, " "),
539+
@TK::TkREGEXP .new( 99, 13, 2, "/\\\\/"),
540+
@TK::TkCOMMA .new(103, 13, 6, ","),
541+
@TK::TkNL .new(104, 13, 97, "\n"),
542+
@TK::TkSPACE .new(105, 14, 0, " "),
543+
@TK::TkREGEXP .new(107, 14, 2, "/\\#/"),
544+
@TK::TkCOMMA .new(111, 14, 6, ","),
545+
@TK::TkNL .new(112, 14, 105, "\n"),
546+
@TK::TkSPACE .new(113, 15, 0, " "),
547+
@TK::TkREGEXP .new(115, 15, 2, "/\\\#{}/"),
548+
@TK::TkCOMMA .new(121, 15, 8, ","),
549+
@TK::TkNL .new(122, 15, 113, "\n"),
550+
@TK::TkSPACE .new(123, 16, 0, " "),
551+
@TK::TkREGEXP .new(125, 16, 2, "/#/"),
552+
@TK::TkCOMMA .new(128, 16, 5, ","),
553+
@TK::TkNL .new(129, 16, 123, "\n"),
554+
@TK::TkSPACE .new(130, 17, 0, " "),
555+
@TK::TkDREGEXP.new(132, 17, 2, "/\#{}/"),
556+
@TK::TkNL .new(137, 17, 7, "\n"),
557+
@TK::TkRBRACK .new(138, 18, 0, "]"),
558+
@TK::TkNL .new(139, 18, 138, "\n")
559+
]
560+
561+
assert_equal expected, tokens
562+
end
563+
469564
def test_class_tokenize_string_escape
470565
tokens = RDoc::RubyLex.tokenize '"\\n"', nil
471566
assert_equal @TK::TkSTRING.new( 0, 1, 0, "\"\\n\""), tokens.first

0 commit comments

Comments
 (0)