diff --git a/lib/rdoc/markdown.kpeg b/lib/rdoc/markdown.kpeg
index e7fb5a70ca..47e842b378 100644
--- a/lib/rdoc/markdown.kpeg
+++ b/lib/rdoc/markdown.kpeg
@@ -84,6 +84,18 @@
# : A little insect that is known
# to enjoy picnics
#
+# ### Strike
+#
+# Example:
+#
+# ```
+# This is ~~striked~~.
+# ```
+#
+# Produces:
+#
+# This is ~~striked~~.
+#
# ### Github
#
# The #github extension enables a partial set of [Github Flavored Markdown]
@@ -193,6 +205,7 @@
:github,
:html,
:notes,
+ :strike,
]
# :section: Extensions
@@ -243,6 +256,11 @@
extension :notes
+ ##
+ # Enables the strike extension
+
+ extension :strike
+
# :section:
##
@@ -466,6 +484,17 @@
"#{text}"
end
end
+
+ ##
+ # Wraps `text` in strike markup for rdoc inline formatting
+
+ def strike text
+ if text =~ /\A[a-z\d.\/-]+\z/i then
+ "~#{text}~"
+ else
+ "#{text}"
+ end
+ end
}
root = Doc
@@ -494,27 +523,27 @@ Para = @NonindentSpace Inlines:a @BlankLine+
Plain = Inlines:a
{ paragraph a }
-AtxInline = !@Newline !(@Sp? /#*/ @Sp @Newline) Inline
+AtxInline = !@Newline !(@Sp /#*/ @Sp @Newline) Inline
AtxStart = < /\#{1,6}/ >
{ text.length }
-AtxHeading = AtxStart:s @Sp? AtxInline+:a (@Sp? /#*/ @Sp)? @Newline
+AtxHeading = AtxStart:s @Sp AtxInline+:a (@Sp /#*/ @Sp)? @Newline
{ RDoc::Markup::Heading.new(s, a.join) }
SetextHeading = SetextHeading1 | SetextHeading2
-SetextBottom1 = /={3,}/ @Newline
+SetextBottom1 = /={1,}/ @Newline
-SetextBottom2 = /-{3,}/ @Newline
+SetextBottom2 = /-{1,}/ @Newline
SetextHeading1 = &(@RawLine SetextBottom1)
- @StartList:a ( !@Endline Inline:b { a << b } )+ @Sp? @Newline
+ @StartList:a ( !@Endline Inline:b { a << b } )+ @Sp @Newline
SetextBottom1
{ RDoc::Markup::Heading.new(1, a.join) }
SetextHeading2 = &(@RawLine SetextBottom2)
- @StartList:a ( !@Endline Inline:b { a << b })+ @Sp? @Newline
+ @StartList:a ( !@Endline Inline:b { a << b })+ @Sp @Newline
SetextBottom2
{ RDoc::Markup::Heading.new(2, a.join) }
@@ -733,6 +762,9 @@ HtmlBlockOpenScript = "<" Spnl ("script" | "SCRIPT") Spnl HtmlAttribute* ">"
HtmlBlockCloseScript = "<" Spnl "/" ("script" | "SCRIPT") Spnl ">"
HtmlBlockScript = HtmlBlockOpenScript (!HtmlBlockCloseScript .)* HtmlBlockCloseScript
+HtmlBlockOpenHead = "<" Spnl ("head" | "HEAD") Spnl HtmlAttribute* ">"
+HtmlBlockCloseHead = "<" Spnl "/" ("head" | "HEAD") Spnl ">"
+HtmlBlockHead = HtmlBlockOpenHead (!HtmlBlockCloseHead .)* HtmlBlockCloseHead
HtmlBlockInTags = HtmlAnchor
| HtmlBlockAddress
@@ -768,6 +800,7 @@ HtmlBlockInTags = HtmlAnchor
| HtmlBlockThead
| HtmlBlockTr
| HtmlBlockScript
+ | HtmlBlockHead
HtmlBlock = < ( HtmlBlockInTags | HtmlComment | HtmlBlockSelfClosing | HtmlUnclosed) >
@BlankLine+
@@ -871,6 +904,7 @@ Inline = Str
| @Space
| Strong
| Emph
+ | Strike
| Image
| Link
| NoteReference
@@ -896,7 +930,7 @@ Entity = ( HexEntity | DecEntity | CharEntity ):a { a }
Endline = @LineBreak | @TerminalEndline | @NormalEndline
NormalEndline = @Sp @Newline !@BlankLine !">" !AtxStart
- !(Line /={3,}|-{3,}=/ @Newline)
+ !(Line /={1,}|-{1,}/ @Newline)
{ "\n" }
TerminalEndline = @Sp @Newline @Eof
@@ -916,46 +950,44 @@ UlLine = < /_{4,}/ > { text } |
Emph = EmphStar | EmphUl
-OneStarOpen = !StarLine "*" !@Spacechar !@Newline
-OneStarClose = !@Spacechar !@Newline Inline:a "*"
- { a }
+Whitespace = @Spacechar | @Newline
-EmphStar = OneStarOpen
+EmphStar = "*" !@Whitespace
@StartList:a
- ( !OneStarClose Inline:l { a << l } )*
- OneStarClose:l { a << l }
+ ( !"*" Inline:b { a << b }
+ | StrongStar:b { a << b }
+ )+
+ "*"
{ emphasis a.join }
-OneUlOpen = !UlLine "_" !@Spacechar !@Newline
-OneUlClose = !@Spacechar !@Newline Inline:a "_" # !Alphanumeric # TODO check
- { a }
-
-EmphUl = OneUlOpen
+EmphUl = "_" !@Whitespace
@StartList:a
- ( !OneUlClose Inline:l { a << l } )*
- OneUlClose:l { a << l }
+ ( !"_" Inline:b { a << b }
+ | StrongUl:b { a << b }
+ )+
+ "_"
{ emphasis a.join }
Strong = StrongStar | StrongUl
-TwoStarOpen = !StarLine "**" !@Spacechar !@Newline
-TwoStarClose = !@Spacechar !@Newline Inline:a "**" { a }
-
-StrongStar = TwoStarOpen
+StrongStar = "**" !@Whitespace
@StartList:a
- ( !TwoStarClose Inline:l { a << l } )*
- TwoStarClose:l { a << l }
+ ( !"**" Inline:b { a << b } )+
+ "**"
{ strong a.join }
-TwoUlOpen = !UlLine "__" !@Spacechar !@Newline
-TwoUlClose = !@Spacechar !@Newline Inline:a "__" # !Alphanumeric # TODO check
- { a }
+StrongUl = "__" !@Whitespace
+ @StartList:a
+ ( !"__" Inline:b { a << b } )+
+ "__"
+ { strong a.join }
-StrongUl = TwoUlOpen
- @StartList:a
- ( !TwoUlClose Inline:i { a << i } )*
- TwoUlClose:l { a << l }
- { strong a.join }
+Strike = &{ strike? }
+ "~~" !@Whitespace
+ @StartList:a
+ ( !"~~" Inline:b { a << b } )+
+ "~~"
+ { strike a.join }
# TODO alt text support
Image = "!" ( ExplicitLink | ReferenceLink ):a
@@ -971,14 +1003,13 @@ ReferenceLinkDouble = Label:content < Spnl > !"[]" Label:label
ReferenceLinkSingle = Label:content < (Spnl "[]")? >
{ link_to content, content, text }
-ExplicitLink = Label:l Spnl "(" @Sp Source:s Spnl Title @Sp ")"
+ExplicitLink = Label:l "(" @Sp Source:s Spnl Title @Sp ")"
{ "{#{l}}[#{s}]" }
Source = ( "<" < SourceContents > ">" | < SourceContents > )
{ text }
SourceContents = ( ( !"(" !")" !">" Nonspacechar )+ | "(" SourceContents ")")*
- | ""
Title = ( TitleSingle | TitleDouble | "" ):a
{ a }
@@ -1068,7 +1099,7 @@ Eof = !.
Nonspacechar = !@Spacechar !@Newline .
Sp = @Spacechar*
Spnl = @Sp (@Newline @Sp)?
-SpecialChar = /[*_`&\[\]() ";"
diff --git a/test/test_rdoc_markdown.rb b/test/test_rdoc_markdown.rb
index 79b0175293..522538db9f 100644
--- a/test/test_rdoc_markdown.rb
+++ b/test/test_rdoc_markdown.rb
@@ -930,6 +930,35 @@ def test_parse_strong_emphasis_underscore
assert_equal expected, doc
end
+ def test_parse_strike_tilde
+ doc = parse "it ~~works~~\n"
+
+ expected = @RM::Document.new(
+ @RM::Paragraph.new("it ~works~"))
+
+ assert_equal expected, doc
+ end
+
+ def test_parse_strike_words_tilde
+ doc = parse "it ~~works fine~~\n"
+
+ expected = @RM::Document.new(
+ @RM::Paragraph.new("it works fine"))
+
+ assert_equal expected, doc
+ end
+
+ def test_parse_strike_tilde_no
+ @parser.strike = false
+
+ doc = parse "it ~~works fine~~\n"
+
+ expected = @RM::Document.new(
+ @RM::Paragraph.new("it ~~works fine~~"))
+
+ assert_equal expected, doc
+ end
+
def test_parse_style
@parser.css = true