From f1f45ab762c27468d6384ce800fd56bea62bbfe1 Mon Sep 17 00:00:00 2001 From: Tim Fogarty Date: Wed, 29 Aug 2018 11:04:01 -0700 Subject: [PATCH] Fix block parsing for fenced code blocks in lists (#476) This is a backport of the initial fix in v2 (#372). --- block.go | 23 +++++++++++++++++++++++ block_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/block.go b/block.go index 929638a..45c21a6 100644 --- a/block.go +++ b/block.go @@ -1143,6 +1143,7 @@ func (p *parser) listItem(out *bytes.Buffer, data []byte, flags *int) int { // process the following lines containsBlankLine := false sublist := 0 + codeBlockMarker := "" gatherlines: for line < len(data) { @@ -1170,6 +1171,28 @@ gatherlines: chunk := data[line+indent : i] + if p.flags&EXTENSION_FENCED_CODE != 0 { + // determine if in or out of codeblock + // if in codeblock, ignore normal list processing + _, marker := isFenceLine(chunk, nil, codeBlockMarker, false) + if marker != "" { + if codeBlockMarker == "" { + // start of codeblock + codeBlockMarker = marker + } else { + // end of codeblock. + *flags |= LIST_ITEM_CONTAINS_BLOCK + codeBlockMarker = "" + } + } + // we are in a codeblock, write line, and continue + if codeBlockMarker != "" || marker != "" { + raw.Write(data[line+indent : i]) + line = i + continue gatherlines + } + } + // evaluate how this line fits in switch { // is this a nested list item? diff --git a/block_test.go b/block_test.go index b9d6653..820fe89 100644 --- a/block_test.go +++ b/block_test.go @@ -1583,6 +1583,44 @@ func TestFencedCodeBlock_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { doTestsBlock(t, tests, EXTENSION_FENCED_CODE|EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) } +func TestListWithFencedCodeBlock(t *testing.T) { + var tests = []string{ + "1. one\n\n ```\n code\n ```\n\n2. two\n", + "
    \n
  1. one

    \n\n
    code\n
  2. \n\n
  3. two

  4. \n
\n", + // https://github.com/russross/blackfriday/issues/239 + "1. one\n\n ```\n - code\n ```\n\n2. two\n", + "
    \n
  1. one

    \n\n
    - code\n
  2. \n\n
  3. two

  4. \n
\n", + } + doTestsBlock(t, tests, EXTENSION_FENCED_CODE) +} + +func TestListWithMalformedFencedCodeBlock(t *testing.T) { + // Ensure that in the case of an unclosed fenced code block in a list, + // no source gets ommitted (even if it is malformed). + // See russross/blackfriday#372 for context. + var tests = []string{ + "1. one\n\n ```\n code\n\n2. two\n", + "
    \n
  1. one\n\n```\ncode\n\n2. two
  2. \n
\n", + + "1. one\n\n ```\n - code\n\n2. two\n", + "
    \n
  1. one\n\n```\n- code\n\n2. two
  2. \n
\n", + } + doTestsBlock(t, tests, EXTENSION_FENCED_CODE) +} + +func TestListWithFencedCodeBlockNoExtensions(t *testing.T) { + // If there is a fenced code block in a list, and FencedCode is not set, + // lists should be processed normally. + var tests = []string{ + "1. one\n\n ```\n code\n ```\n\n2. two\n", + "
    \n
  1. one

    \n\n

    \ncode\n

  2. \n\n
  3. two

  4. \n
\n", + + "1. one\n\n ```\n - code\n ```\n\n2. two\n", + "
    \n
  1. one

    \n\n

    ```

    \n\n
      \n
    • code\n```
    • \n
  2. \n\n
  3. two

  4. \n
\n", + } + doTestsBlock(t, tests, 0) +} + func TestTitleBlock_EXTENSION_TITLEBLOCK(t *testing.T) { var tests = []string{ "% Some title\n" +