Merge branch 'master' of https://github.com/russross/blackfriday
commit
05cb4f68d7
|
@ -3,6 +3,7 @@ language: go
|
|||
go:
|
||||
- "1.9.x"
|
||||
- "1.10.x"
|
||||
- "1.11.x"
|
||||
- tip
|
||||
matrix:
|
||||
fast_finish: true
|
||||
|
|
12
README.md
12
README.md
|
@ -86,12 +86,16 @@ Usage
|
|||
For basic usage, it is as simple as getting your input into a byte
|
||||
slice and calling:
|
||||
|
||||
output := blackfriday.MarkdownBasic(input)
|
||||
```go
|
||||
output := blackfriday.MarkdownBasic(input)
|
||||
```
|
||||
|
||||
This renders it with no extensions enabled. To get a more useful
|
||||
feature set, use this instead:
|
||||
|
||||
output := blackfriday.MarkdownCommon(input)
|
||||
```go
|
||||
output := blackfriday.MarkdownCommon(input)
|
||||
```
|
||||
|
||||
### v2
|
||||
|
||||
|
@ -154,7 +158,7 @@ markdown file using a standalone program. You can also browse the
|
|||
source directly on github if you are just looking for some example
|
||||
code:
|
||||
|
||||
* <http://github.com/russross/blackfriday-tool>
|
||||
* <https://github.com/russross/blackfriday-tool>
|
||||
|
||||
Note that if you have not already done so, installing
|
||||
`blackfriday-tool` will be sufficient to download and install
|
||||
|
@ -328,7 +332,7 @@ are a few of note:
|
|||
* [markdownfmt](https://github.com/shurcooL/markdownfmt): like gofmt,
|
||||
but for markdown.
|
||||
|
||||
* [LaTeX output](https://bitbucket.org/ambrevar/blackfriday-latex):
|
||||
* [LaTeX output](https://gitlab.com/ambrevar/blackfriday-latex):
|
||||
renders output as LaTeX.
|
||||
|
||||
* [bfchroma](https://github.com/Depado/bfchroma/): provides convenience
|
||||
|
|
24
block.go
24
block.go
|
@ -649,14 +649,17 @@ func isFenceLine(data []byte, info *string, oldmarker string, newlineOptional bo
|
|||
}
|
||||
|
||||
i = skipChar(data, i, ' ')
|
||||
if i >= len(data) || data[i] != '\n' {
|
||||
if newlineOptional && i == len(data) {
|
||||
if i >= len(data) {
|
||||
if newlineOptional {
|
||||
return i, marker
|
||||
}
|
||||
return 0, ""
|
||||
}
|
||||
if data[i] == '\n' {
|
||||
i++ // Take newline into account
|
||||
}
|
||||
|
||||
return i + 1, marker // Take newline into account.
|
||||
return i, marker
|
||||
}
|
||||
|
||||
// fencedCodeBlock returns the end index if data contains a fenced code block at the beginning,
|
||||
|
@ -1133,6 +1136,15 @@ func (p *parser) listItem(out *bytes.Buffer, data []byte, flags *int) int {
|
|||
i++
|
||||
}
|
||||
|
||||
// process the following lines
|
||||
containsBlankLine := false
|
||||
sublist := 0
|
||||
codeBlockMarker := ""
|
||||
if p.flags&EXTENSION_FENCED_CODE != 0 && i > line {
|
||||
// determine if codeblock starts on the first line
|
||||
_, codeBlockMarker = isFenceLine(data[line:i], nil, "", false)
|
||||
}
|
||||
|
||||
// get working buffer
|
||||
var raw bytes.Buffer
|
||||
|
||||
|
@ -1140,11 +1152,6 @@ func (p *parser) listItem(out *bytes.Buffer, data []byte, flags *int) int {
|
|||
raw.Write(data[line:i])
|
||||
line = i
|
||||
|
||||
// process the following lines
|
||||
containsBlankLine := false
|
||||
sublist := 0
|
||||
codeBlockMarker := ""
|
||||
|
||||
gatherlines:
|
||||
for line < len(data) {
|
||||
i++
|
||||
|
@ -1153,7 +1160,6 @@ gatherlines:
|
|||
for data[i-1] != '\n' {
|
||||
i++
|
||||
}
|
||||
|
||||
// if it is an empty line, guess that it is part of this item
|
||||
// and move on to the next line
|
||||
if p.isEmpty(data[line:i]) > 0 {
|
||||
|
|
|
@ -697,8 +697,8 @@ func TestUnorderedList(t *testing.T) {
|
|||
"* List\n extra indent, same paragraph\n",
|
||||
"<ul>\n<li>List\n extra indent, same paragraph</li>\n</ul>\n",
|
||||
|
||||
"* List\n\n code block\n",
|
||||
"<ul>\n<li><p>List</p>\n\n<pre><code>code block\n</code></pre></li>\n</ul>\n",
|
||||
"* List\n\n code block\n\n* List continues",
|
||||
"<ul>\n<li><p>List</p>\n\n<pre><code>code block\n</code></pre></li>\n\n<li><p>List continues</p></li>\n</ul>\n",
|
||||
|
||||
"* List\n\n code block with spaces\n",
|
||||
"<ul>\n<li><p>List</p>\n\n<pre><code> code block with spaces\n</code></pre></li>\n</ul>\n",
|
||||
|
@ -1096,7 +1096,7 @@ func TestFencedCodeBlock(t *testing.T) {
|
|||
"<p>``` lisp\nno ending</p>\n",
|
||||
|
||||
"~~~ lisp\nend with language\n~~~ lisp\n",
|
||||
"<p>~~~ lisp\nend with language\n~~~ lisp</p>\n",
|
||||
"<pre><code class=\"language-lisp\">end with language\n</code></pre>\n\n<p>lisp</p>\n",
|
||||
|
||||
"```\nmismatched begin and end\n~~~\n",
|
||||
"<p>```\nmismatched begin and end\n~~~</p>\n",
|
||||
|
@ -1139,6 +1139,21 @@ func TestFencedCodeBlock(t *testing.T) {
|
|||
|
||||
"```\n[]:()\n[]:)\n[]:(\n[]:x\n[]:testing\n[:testing\n\n[]:\nlinebreak\n[]()\n\n[]:\n[]()\n```",
|
||||
"<pre><code>[]:()\n[]:)\n[]:(\n[]:x\n[]:testing\n[:testing\n\n[]:\nlinebreak\n[]()\n\n[]:\n[]()\n</code></pre>\n",
|
||||
|
||||
"- test\n\n```\n codeblock\n ```\ntest\n",
|
||||
"<ul>\n<li><p>test</p>\n\n<pre><code>codeblock\n</code></pre></li>\n</ul>\n\n<p>test</p>\n",
|
||||
|
||||
"- ```\n codeblock\n ```\n\n- test\n",
|
||||
"<ul>\n<li><pre><code>codeblock\n</code></pre></li>\n\n<li><p>test</p></li>\n</ul>\n",
|
||||
|
||||
"- test\n- ```\n codeblock\n ```\n",
|
||||
"<ul>\n<li>test</li>\n\n<li><pre><code>codeblock\n</code></pre></li>\n</ul>\n",
|
||||
|
||||
"- test\n```\ncodeblock\n```\n\n- test\n",
|
||||
"<ul>\n<li><p>test</p>\n\n<pre><code>codeblock\n</code></pre></li>\n\n<li><p>test</p></li>\n</ul>\n",
|
||||
|
||||
"- test\n```go\nfunc foo() bool {\n\treturn true;\n}\n```\n\n- test\n",
|
||||
"<ul>\n<li><p>test</p>\n\n<pre><code class=\"language-go\">func foo() bool {\n\treturn true;\n}\n</code></pre></li>\n\n<li><p>test</p></li>\n</ul>\n",
|
||||
}
|
||||
doTestsBlock(t, tests, EXTENSION_FENCED_CODE)
|
||||
}
|
||||
|
@ -1557,7 +1572,7 @@ func TestFencedCodeBlock_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) {
|
|||
"<p>``` lisp\nno ending</p>\n",
|
||||
|
||||
"~~~ lisp\nend with language\n~~~ lisp\n",
|
||||
"<p>~~~ lisp\nend with language\n~~~ lisp</p>\n",
|
||||
"<pre><code class=\"language-lisp\">end with language\n</code></pre>\n\n<p>lisp</p>\n",
|
||||
|
||||
"```\nmismatched begin and end\n~~~\n",
|
||||
"<p>```\nmismatched begin and end\n~~~</p>\n",
|
||||
|
|
|
@ -252,7 +252,7 @@ func link(p *parser, out *bytes.Buffer, data []byte, offset int) int {
|
|||
case data[i] == '\n':
|
||||
textHasNl = true
|
||||
|
||||
case data[i-1] == '\\':
|
||||
case isBackslashEscaped(data, i):
|
||||
continue
|
||||
|
||||
case data[i] == '[':
|
||||
|
|
|
@ -8,4 +8,6 @@
|
|||
|
||||
<p><a href="/url/" title="title has spaces afterward">URL and title</a>.</p>
|
||||
|
||||
<p><a href="/url/">URL with backslashes\</a>.</p>
|
||||
|
||||
<p>[Empty]().</p>
|
||||
|
|
|
@ -8,5 +8,6 @@ Just a [URL](/url/).
|
|||
|
||||
[URL and title](/url/ "title has spaces afterward" ).
|
||||
|
||||
[URL with backslashes\\](/url/).
|
||||
|
||||
[Empty]().
|
||||
|
|
Loading…
Reference in New Issue