From ada69e1f211f506c7e944959b990ab1d064cc9b0 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Sun, 28 May 2023 08:36:20 -0700 Subject: [PATCH] Markdown text in a completion popup window is not properly rendered. In a Vim9 script, string index is a character index and not a byte index. Use strpart() instead of indexing a string to extract characters --- autoload/lsp/markdown.vim | 34 +++++++++++++++++----------------- ftplugin/lspgfm.vim | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/autoload/lsp/markdown.vim b/autoload/lsp/markdown.vim index 7c0ca0f..e6aa670 100644 --- a/autoload/lsp/markdown.vim +++ b/autoload/lsp/markdown.vim @@ -200,14 +200,14 @@ def GetNextInlineBlock(text: string, blocks: list, rel_pos: number): dictremove(0) var pos = cur.start[1] while blocks->len() > 0 && cur.end[0] >= blocks[0].start[0] - result.text ..= Unescape(text[pos : blocks[0].start[0] - 1], cur.marker[0]) + result.text ..= Unescape(text->strpart(pos, blocks[0].start[0] - pos), cur.marker[0]) # get nested block var part = GetNextInlineBlock(text, blocks, rel_pos + result.text->len()) result.text ..= part.text result.props += part.props pos = part.end_pos endwhile - result.text ..= Unescape(text[pos : cur.end[0] - 1], cur.marker[0]) + result.text ..= Unescape(text->strpart(pos, cur.end[0] - pos), cur.marker[0]) # add props for current inline block var prop_type = { '`': 'code_span', @@ -276,12 +276,12 @@ def ParseInlines(text: string, rel_pos: number = 0): dict var new_delim = { marker: delimiter.marker[0]->repeat(marker_len), start: [seq[idx].start[1] - marker_len, seq[idx].start[1]], - left: v:true, - right: v:false + left: true, + right: false } seq[idx].marker = seq[idx].marker[: -1 - marker_len] seq[idx].start[1] -= marker_len - seq[idx].right = v:false + seq[idx].right = false idx += 1 seq->insert(new_delim, idx) endif @@ -297,7 +297,7 @@ def ParseInlines(text: string, rel_pos: number = 0): dict if delimiter.marker->len() > marker_len delimiter.start[0] += marker_len else - delimiter.left = v:false + delimiter.left = false break endif idx -= 1 @@ -322,7 +322,7 @@ def ParseInlines(text: string, rel_pos: number = 0): dict pos = 0 while seq->len() > 0 if pos < seq[0].start[0] - formatted.text ..= Unescape(text[pos : seq[0].start[0] - 1]) + formatted.text ..= Unescape(text->strpart(pos, seq[0].start[0] - pos)) pos = seq[0].start[0] endif var inline = GetNextInlineBlock(text, seq, @@ -332,7 +332,7 @@ def ParseInlines(text: string, rel_pos: number = 0): dict pos = inline.end_pos endwhile if pos < text->len() - formatted.text ..= Unescape(text[pos : -1]) + formatted.text ..= Unescape(text->strpart(pos)) endif return formatted enddef @@ -394,15 +394,15 @@ enddef def NeedBlankLine(prev: string, cur: string): bool if prev == 'hr' || cur == 'hr' - return v:false + return false elseif prev == 'heading' || cur == 'heading' - return v:true + return true elseif prev == 'paragraph' && cur == 'paragraph' - return v:true + return true elseif prev != cur - return v:true + return true endif - return v:false + return false enddef var last_block: string = '' @@ -560,13 +560,13 @@ export def ParseMarkdown(data: list, width: number = 80): dict if marker[1] == -1 break endif - line = line[marker[2] :] + line = line->strpart(marker[2]) elseif open_blocks[cur].type == 'list_item' var marker = line->matchstrpos($'^ \{{{open_blocks[cur].indent}}}') if marker[1] == -1 break endif - line = line[marker[2] :] + line = line->strpart(marker[2]) elseif open_blocks[cur].type == 'fenced_code' if line =~ $'^ \{{,3}}{open_blocks[cur].fence}{open_blocks[cur].fence[0]}* *$' CloseBlocks(document, open_blocks, cur) @@ -627,7 +627,7 @@ export def ParseMarkdown(data: list, width: number = 80): dict endif # check for new container blocks - while v:true + while true var block = line->matchstrpos($'{block_quote}\|{list_item}') if block[1] < 0 break @@ -637,7 +637,7 @@ export def ParseMarkdown(data: list, width: number = 80): dict # start a new block open_blocks->add(CreateContainerBlock(block, document->len())) cur = open_blocks->len() - line = line[block[2] :] + line = line->strpart(block[2]) endwhile # check for leaf block diff --git a/ftplugin/lspgfm.vim b/ftplugin/lspgfm.vim index 02f2fc2..14f46d1 100644 --- a/ftplugin/lspgfm.vim +++ b/ftplugin/lspgfm.vim @@ -8,7 +8,7 @@ var document: dict> try popup_id = bnr->getbufinfo()[0].popups[0] - document = md.ParseMarkdown(bnr->getbufline(1, '$'), winwidth(popup_id)) + document = md.ParseMarkdown(bnr->getbufline(1, '$'), popup_id->winwidth()) catch /.*/ b:markdown_fallback = v:true finish -- 2.48.1