@@ -6,8 +6,6 @@ local colors = require('render-markdown.colors')
66
77--- @class render.md.data.Code
88--- @field col integer
9- --- @field start_row integer
10- --- @field end_row integer
119--- @field code_node ? render.md.Node
1210--- @field language_node ? render.md.Node
1311--- @field language ? string
@@ -55,8 +53,6 @@ function Render:setup()
5553
5654 self .data = {
5755 col = self .node .start_col ,
58- start_row = self .node .start_row ,
59- end_row = self .node .end_row ,
6056 code_node = code_node ,
6157 language_node = language_node ,
6258 language = (language_node or {}).text ,
@@ -72,20 +68,23 @@ function Render:setup()
7268end
7369
7470function Render :render ()
75- local disabled_language = vim .tbl_contains (self .code .disable_background , self .data .language )
76- local add_background = vim .tbl_contains ({ ' normal' , ' full' }, self .code .style ) and not disabled_language
71+ local disabled_language = self .code .disable_background
72+ if type (disabled_language ) == ' table' then
73+ disabled_language = vim .tbl_contains (disabled_language , self .data .language )
74+ end
75+ local background = vim .tbl_contains ({ ' normal' , ' full' }, self .code .style ) and not disabled_language
7776
78- local icon_added = self :language (add_background )
79- if add_background then
80- self :background (icon_added )
77+ local icon = self :language ()
78+ self :border (icon )
79+ if background then
80+ self :background (self .node .start_row + 1 , self .node .end_row - 2 )
8181 end
82- self :left_pad (add_background , icon_added )
82+ self :left_pad (background )
8383end
8484
8585--- @private
86- --- @param add_background boolean
8786--- @return boolean
88- function Render :language (add_background )
87+ function Render :language ()
8988 if not vim .tbl_contains ({ ' language' , ' full' }, self .code .style ) then
9089 return false
9190 end
@@ -103,11 +102,8 @@ function Render:language(add_background)
103102 if self .code .sign then
104103 self :sign (icon , icon_highlight )
105104 end
106- local highlight = { icon_highlight }
107- if add_background then
108- table.insert (highlight , self .code .highlight )
109- end
110105 local icon_text = icon .. ' '
106+ local highlight = { icon_highlight , self .code .highlight }
111107 if self .code .position == ' left' then
112108 if self .code .language_name and self .context :hidden (node ) then
113109 -- Code blocks will pick up varying amounts of leading white space depending on the
@@ -138,40 +134,38 @@ function Render:language(add_background)
138134end
139135
140136--- @private
141- --- @param icon_added boolean
142- function Render :background (icon_added )
143- local width = self .code .width == ' block' and self .data .max_width or self .context :get_width ()
144-
145- if self .code .border == ' thin' then
146- --- @param row integer
147- --- @param icon string
148- local function add_border (row , icon )
149- local virt_text = {}
150- if self .data .margin > 0 then
151- table.insert (virt_text , { Str .pad (self .data .margin ), self .config .padding .highlight })
152- end
153- table.insert (virt_text , { icon :rep (width - self .data .col ), colors .bg_to_fg (self .code .highlight ) })
137+ --- @param icon boolean
138+ function Render :border (icon )
139+ --- @param row integer
140+ --- @param border string
141+ --- @param context_hidden boolean
142+ local function add_border (row , border , context_hidden )
143+ local delim_hidden = self .context :hidden (self .node :child (' fenced_code_block_delimiter' , row ))
144+ if self .code .border == ' thin' and context_hidden and delim_hidden then
145+ local width = self .code .width == ' block' and self .data .max_width or vim .o .columns
154146 self .marks :add (' code_border' , row , self .data .col , {
155- virt_text = virt_text ,
147+ virt_text = { { border : rep ( width - self . data . col ), colors . bg_to_fg ( self . code . highlight ) } } ,
156148 virt_text_pos = ' overlay' ,
157149 })
158- end
159- if not icon_added and self .context :hidden (self .data .code_node ) and self :delim_hidden (self .data .start_row ) then
160- add_border (self .data .start_row , self .code .above )
161- self .data .start_row = self .data .start_row + 1
162- end
163- if self :delim_hidden (self .data .end_row - 1 ) then
164- add_border (self .data .end_row - 1 , self .code .below )
165- self .data .end_row = self .data .end_row - 1
150+ else
151+ self :background (row , row )
166152 end
167153 end
168154
155+ add_border (self .node .start_row , self .code .above , not icon and self .context :hidden (self .data .code_node ))
156+ add_border (self .node .end_row - 1 , self .code .below , true )
157+ end
158+
159+ --- @private
160+ --- @param start_row integer
161+ --- @param end_row integer
162+ function Render :background (start_row , end_row )
169163 local win_col , padding = 0 , {}
170164 if self .code .width == ' block' then
171- win_col = self .data .margin + width + self .data .indent
172- table.insert (padding , { Str . pad (vim .o .columns * 2 ), self . config . padding . highlight } )
165+ win_col = self .data .margin + self . data . max_width + self .data .indent
166+ table.insert (padding , self : padding_text (vim .o .columns * 2 ))
173167 end
174- for row = self . data . start_row , self . data . end_row - 1 do
168+ for row = start_row , end_row do
175169 self .marks :add (' code_background' , row , self .data .col , {
176170 end_row = row + 1 ,
177171 hl_group = self .code .highlight ,
@@ -189,38 +183,30 @@ function Render:background(icon_added)
189183end
190184
191185--- @private
192- --- @param row integer
193- --- @return boolean
194- function Render :delim_hidden (row )
195- return self .context :hidden (self .node :child (' fenced_code_block_delimiter' , row ))
196- end
197-
198- --- @private
199- --- @param add_background boolean
200- --- @param icon_added boolean
201- function Render :left_pad (add_background , icon_added )
186+ --- @param background boolean
187+ function Render :left_pad (background )
202188 local margin , padding = self .data .margin , self .data .padding
203189 if (self .data .col == 0 or # self .data .empty_rows == 0 ) and margin <= 0 and padding <= 0 then
204190 return
205191 end
206192
207- -- Use low priority to include other marks in padding when code block is at edge
208- local priority = self . data . col == 0 and 0 or nil
209- local fill_text = { Str . pad ( self .data .col ), self . config . padding . highlight }
210- local margin_text = { Str . pad ( margin ), self .config . padding . highlight }
211- local background = add_background and self . code . highlight or self . config . padding . highlight
212- local padding_text = { Str . pad (padding ) , background }
193+ -- Use lowest priority (0) to include all other marks in padding when code block is at edge
194+ -- Use medium priority (1000) to include border marks while likely avoiding other plugin
195+ local priority = self .data .col == 0 and 0 or 1000
196+ local fill_text = self : padding_text ( self .data . col )
197+ local margin_text = self : padding_text ( margin )
198+ local padding_text = self : padding_text (padding , background and self . code . highlight or nil )
213199
214- for row = self .data .start_row , self .data .end_row - 1 do
200+ local start_row , end_row = self .node .start_row , (self .node .end_row - 1 )
201+ for row = start_row , end_row do
215202 local virt_text = {}
216203 if self .data .col > 0 and vim .tbl_contains (self .data .empty_rows , row ) then
217204 table.insert (virt_text , fill_text )
218205 end
219206 if margin > 0 then
220207 table.insert (virt_text , margin_text )
221208 end
222- local skip_padding = row == self .data .start_row and icon_added
223- if not skip_padding and padding > 0 then
209+ if padding > 0 and row > start_row and row < end_row then
224210 table.insert (virt_text , padding_text )
225211 end
226212 if # virt_text > 0 then
0 commit comments