summaryrefslogtreecommitdiff
path: root/vim/pack/downloads/opt/lsp/ftplugin/lspgfm.vim
blob: 2e9bf768306f5be5b888715eb621f0fc94447375 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
vim9script

import autoload 'lsp/markdown.vim' as md

# Update the preview window with the github flavored markdown text
def UpdatePreviewWindowContents(bnr: number, contentList: list<dict<any>>)
  :silent! bnr->deletebufline(1, '$')

  var lines: list<string> = []
  var props: dict<list<list<number>>>
  var lnum = 0

  # Each item in "contentList" is a Dict with the following items:
  #   text: text for this line
  #   props: list of text properties.  Each list item is a Dict.  See
  #   |popup-props| for more information.
  #
  # Need to convert the text properties from the format used by
  # popup_settext() to that used by prop_add_list().
  for entry in contentList
    lines->add(entry.text)
    lnum += 1
    if entry->has_key('props')
      for p in entry.props
	if !props->has_key(p.type)
	  props[p.type] = []
	endif
	if p->has_key('end_lnum')
	  props[p.type]->add([lnum, p.col, p.end_lnum, p.end_col])
	else
	  props[p.type]->add([lnum, p.col, lnum, p.col + p.length])
	endif
      endfor
    endif
  endfor
  setbufline(bnr, 1, lines)
  for prop_type in props->keys()
    prop_add_list({type: prop_type}, props[prop_type])
  endfor
enddef

# Render the github flavored markdown text.
# Text can be displayed either in a popup window or in a preview window.
def RenderGitHubMarkdownText()
  var bnr: number = bufnr()
  var winId: number = win_getid()
  var document: dict<list<any>>
  var inPreviewWindow = false

  if win_gettype() == 'preview'
    inPreviewWindow = true
  endif

  try
    if !inPreviewWindow
      winId = bnr->getbufinfo()[0].popups[0]
    endif
    # parse the github markdown content and convert it into a list of text and
    # list of associated text properties.
    document = md.ParseMarkdown(bnr->getbufline(1, '$'), winId->winwidth())
  catch /.*/
    b:markdown_fallback = v:true
    return
  endtry

  b:lsp_syntax = document.syntax
  md.list_pattern->setbufvar(bnr, '&formatlistpat')
  var settings = 'linebreak breakindent breakindentopt=list:-1'
  win_execute(winId, $'setlocal {settings}')
  if inPreviewWindow
    UpdatePreviewWindowContents(bnr, document.content)
  else
    winId->popup_settext(document.content)
  endif
enddef
RenderGitHubMarkdownText()

# vim: tabstop=8 shiftwidth=2 softtabstop=2