Skip to content

Commit 8f6cb3a

Browse files
authored
Merge pull request #636 from KSR-Yasuda/bugfix/CodeFenceHandling
Code fence handling breaks if `~~~` appears in the fence
2 parents 7026436 + a6a1bed commit 8f6cb3a

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

after/ftplugin/markdown.vim

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,21 @@ endfunction
1414

1515
if get(g:, 'vim_markdown_folding_style_pythonic', 0)
1616
function! Foldexpr_markdown(lnum)
17+
if (a:lnum == 1)
18+
let b:fence_str = ''
19+
endif
20+
1721
let l1 = getline(a:lnum)
1822
"~~~~~ keep track of fenced code blocks ~~~~~
1923
"If we hit a code block fence
20-
if l1 =~# '````*' || l1 =~# '\~\~\~\~*'
24+
if l1 =~# '\v^[[:space:]>]*\v(`{3,}|\~{3,})\s*(\w+)?\s*$'
2125
" toggle the variable that says if we're in a code block
2226
if b:fenced_block == 0
2327
let b:fenced_block = 1
24-
elseif b:fenced_block == 1
28+
let b:fence_str = matchstr(l1, '\v(`{3,}|\~{3,})')
29+
elseif b:fenced_block == 1 && matchstr(l1, '\v(`{3,}|\~{3,})') ==# b:fence_str
2530
let b:fenced_block = 0
31+
let b:fence_str = ''
2632
endif
2733
" else, if we're caring about front matter
2834
elseif get(g:, 'vim_markdown_frontmatter', 0) == 1
@@ -100,16 +106,19 @@ else " vim_markdown_folding_style_pythonic == 0
100106
function! Foldexpr_markdown(lnum)
101107
if (a:lnum == 1)
102108
let l0 = ''
109+
let b:fence_str = ''
103110
else
104111
let l0 = getline(a:lnum-1)
105112
endif
106113

107114
" keep track of fenced code blocks
108-
if l0 =~# '````*' || l0 =~# '\~\~\~\~*'
115+
if l0 =~# '\v^[[:space:]>]*\v(`{3,}|\~{3,})\s*(\w+)?\s*$'
109116
if b:fenced_block == 0
110117
let b:fenced_block = 1
111-
elseif b:fenced_block == 1
118+
let b:fence_str = matchstr(l0, '\v(`{3,}|\~{3,})')
119+
elseif b:fenced_block == 1 && matchstr(l0, '\v(`{3,}|\~{3,})') ==# b:fence_str
112120
let b:fenced_block = 0
121+
let b:fence_str = ''
113122
endif
114123
elseif get(g:, 'vim_markdown_frontmatter', 0) == 1
115124
if b:front_matter == 1

ftplugin/markdown.vim

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,19 @@ function! s:GetHeaderList()
162162
let l:front_matter = 0
163163
let l:header_list = []
164164
let l:vim_markdown_frontmatter = get(g:, 'vim_markdown_frontmatter', 0)
165+
let l:fence_str = ''
165166
for i in range(1, line('$'))
166167
let l:lineraw = getline(i)
167168
let l:l1 = getline(i+1)
168169
let l:line = substitute(l:lineraw, '#', "\\\#", 'g')
169170
" exclude lines in fenced code blocks
170-
if l:line =~# '````*' || l:line =~# '\~\~\~\~*'
171+
if l:line =~# '\v^[[:space:]>]*(`{3,}|\~{3,})\s*(\w+)?\s*$'
171172
if l:fenced_block == 0
172173
let l:fenced_block = 1
173-
elseif l:fenced_block == 1
174+
let l:fence_str = matchstr(l:line, '\v(`{3,}|\~{3,})')
175+
elseif l:fenced_block == 1 && matchstr(l:line, '\v(`{3,}|\~{3,})') ==# l:fence_str
174176
let l:fenced_block = 0
177+
let l:fence_str = ''
175178
endif
176179
" exclude lines in frontmatters
177180
elseif l:vim_markdown_frontmatter == 1

0 commit comments

Comments
 (0)