commit 1ea97303fd9c09d4bd005d1c1dadfb2badebc60a
parent a7f34cd8cfd7e3ab8f1ef3824f5d1233e92f91c6
Author: Ryan Winograd <ryan@thewinograds.com>
Date: Sat, 5 Sep 2020 10:45:50 -0500
Fix: HTML Conversion: List with wrapped lines (#1008)
Track how many leading spaces a list item has in order to determine whether we should start a blockquote.
Note the extra close tag in the added test: this is a pre-existing issue
already present on `dev`.
Diffstat:
2 files changed, 54 insertions(+), 10 deletions(-)
diff --git a/autoload/vimwiki/html.vim b/autoload/vimwiki/html.vim
@@ -1005,7 +1005,7 @@ function! s:process_tag_arrow_quote(line, arrow_quote) abort
endfunction
-function! s:process_tag_list(line, lists) abort
+function! s:process_tag_list(line, lists, lstLeadingSpaces) abort
function! s:add_checkbox(line, rx_list) abort
let st_tag = '<li>'
let chk = matchlist(a:line, a:rx_list)
@@ -1026,6 +1026,7 @@ function! s:process_tag_list(line, lists) abort
let in_list = (len(a:lists) > 0)
+ let lstLeadingSpaces = a:lstLeadingSpaces
" If it is not list yet then do not process line that starts from *bold*
" text.
@@ -1033,12 +1034,14 @@ function! s:process_tag_list(line, lists) abort
if !in_list
let pos = match(a:line, '^\s*' . s:rxBold)
if pos != -1
- return [0, []]
+ return [0, [], lstLeadingSpaces]
endif
endif
let lines = []
let processed = 0
+ let checkboxRegExp = '\s*\[\(.\)\]\s*'
+ let maybeCheckboxRegExp = '\%('.checkboxRegExp.'\)\?'
if a:line =~# '^\s*'.s:bullets.'\s'
let lstSym = matchstr(a:line, s:bullets)
@@ -1057,22 +1060,29 @@ function! s:process_tag_list(line, lists) abort
let lstRegExp = ''
endif
+ " If we're at the start of a list, figure out how many spaces indented we are so we can later
+ " determine whether we're indented enough to be at the setart of a blockquote
+ if lstSym !=# ''
+ let lstLeadingSpaces = strlen(matchstr(a:line, lstRegExp.maybeCheckboxRegExp))
+ endif
+
" Jump empty lines
if in_list && a:line =~# '^$'
" Just Passing my way, do you mind ?
let [processed, lines, quote] = s:process_tag_precode(a:line, g:state.quote)
let processed = 1
- return [processed, lines]
+ return [processed, lines, lstLeadingSpaces]
endif
" Can embeded indented code in list (Issue #55)
let b_permit = in_list
- let b_match = lstSym ==# '' && a:line =~# '^\s\{4,}[^[:space:]>*-]'
+ let blockquoteRegExp = '^\s\{' . (lstLeadingSpaces + 2) . ',}[^[:space:]>*-]'
+ let b_match = lstSym ==# '' && a:line =~# blockquoteRegExp
let b_match = b_match || g:state.quote
if b_permit && b_match
let [processed, lines, g:state.quote] = s:process_tag_precode(a:line, g:state.quote)
if processed == 1
- return [processed, lines]
+ return [processed, lines, lstLeadingSpaces]
endif
endif
@@ -1083,8 +1093,7 @@ function! s:process_tag_list(line, lists) abort
let line = substitute(a:line, '\t', repeat(' ', &tabstop), 'g')
let indent = stridx(line, lstSym)
- let checkbox = '\s*\[\(.\)\]\s*'
- let [st_tag, en_tag] = s:add_checkbox(line, lstRegExp.checkbox)
+ let [st_tag, en_tag] = s:add_checkbox(line, lstRegExp.checkboxRegExp)
if !in_list
call add(a:lists, [lstTagClose, indent])
@@ -1107,7 +1116,7 @@ function! s:process_tag_list(line, lists) abort
call add(a:lists, [en_tag, indent])
call add(lines, st_tag)
- call add(lines, substitute(a:line, lstRegExp.'\%('.checkbox.'\)\?', '', ''))
+ call add(lines, substitute(a:line, lstRegExp.maybeCheckboxRegExp, '', ''))
let processed = 1
elseif in_list && a:line =~# '^\s\+\S\+'
@@ -1123,7 +1132,7 @@ function! s:process_tag_list(line, lists) abort
call s:close_tag_list(a:lists, lines)
endif
- return [processed, lines]
+ return [processed, lines, lstLeadingSpaces]
endfunction
@@ -1323,6 +1332,7 @@ function! s:parse_line(line, state) abort
let state.quote = a:state.quote
let state.arrow_quote = a:state.arrow_quote
let state.active_multiline_comment = a:state.active_multiline_comment
+ let state.list_leading_spaces = a:state.list_leading_spaces
let state.pre = a:state.pre[:]
let state.math = a:state.math[:]
let state.table = a:state.table[:]
@@ -1490,7 +1500,7 @@ function! s:parse_line(line, state) abort
" lists
if !processed
- let [processed, lines] = s:process_tag_list(line, state.lists)
+ let [processed, lines, state.list_leading_spaces] = s:process_tag_list(line, state.lists, state.list_leading_spaces)
if processed && state.quote
let state.quote = s:close_tag_precode(state.quote, lines)
endif
@@ -1715,6 +1725,7 @@ function! s:convert_file_to_lines(wikifile, current_html_file) abort
let state.quote = 0
let state.arrow_quote = 0
let state.active_multiline_comment = 0
+ let state.list_leading_spaces = 0
let state.pre = [0, 0] " [in_pre, indent_pre]
let state.math = [0, 0] " [in_math, indent_math]
let state.table = []
diff --git a/test/html_blockquote.vader b/test/html_blockquote.vader
@@ -28,6 +28,39 @@ Expect (Tested by hand 2):
</ul>
+Given vimwiki (Issue 1007: List with hard wraps and a blockquote):
+ - Item 1
+ wraps to the second line.
+ This is a blockquote.
+
+ And this is back to the list item
+ - [ ] Item 2
+ wraps to the second line.
+ This is a blockquote.
+
+ And this is back to the list item
+
+Execute (2Html):
+ call ConvertWiki2Body() | 1d | $d | $d
+
+Expect (No blockquote):
+ <ul>
+ <li>
+ Item 1
+ wraps to the second line.
+ <pre><code>This is a blockquote.
+ </code></pre>
+ </code></pre>
+ And this is back to the list item
+
+ <li class="done0">
+ Item 2
+ wraps to the second line.
+ <pre><code>This is a blockquote.
+ </code></pre>
+ And this is back to the list item
+
+ </ul>
#Given (Issue 3: BlockQuote at multiple list levels {{{3):
# 1. Outer Item 1