@@ -6,8 +6,6 @@ local colors = require('render-markdown.colors')
6
6
7
7
--- @class render.md.data.Code
8
8
--- @field col integer
9
- --- @field start_row integer
10
- --- @field end_row integer
11
9
--- @field code_node ? render.md.Node
12
10
--- @field language_node ? render.md.Node
13
11
--- @field language ? string
@@ -55,8 +53,6 @@ function Render:setup()
55
53
56
54
self .data = {
57
55
col = self .node .start_col ,
58
- start_row = self .node .start_row ,
59
- end_row = self .node .end_row ,
60
56
code_node = code_node ,
61
57
language_node = language_node ,
62
58
language = (language_node or {}).text ,
@@ -72,20 +68,23 @@ function Render:setup()
72
68
end
73
69
74
70
function 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
77
76
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 )
81
81
end
82
- self :left_pad (add_background , icon_added )
82
+ self :left_pad (background )
83
83
end
84
84
85
85
--- @private
86
- --- @param add_background boolean
87
86
--- @return boolean
88
- function Render :language (add_background )
87
+ function Render :language ()
89
88
if not vim .tbl_contains ({ ' language' , ' full' }, self .code .style ) then
90
89
return false
91
90
end
@@ -103,11 +102,8 @@ function Render:language(add_background)
103
102
if self .code .sign then
104
103
self :sign (icon , icon_highlight )
105
104
end
106
- local highlight = { icon_highlight }
107
- if add_background then
108
- table.insert (highlight , self .code .highlight )
109
- end
110
105
local icon_text = icon .. ' '
106
+ local highlight = { icon_highlight , self .code .highlight }
111
107
if self .code .position == ' left' then
112
108
if self .code .language_name and self .context :hidden (node ) then
113
109
-- Code blocks will pick up varying amounts of leading white space depending on the
@@ -138,40 +134,38 @@ function Render:language(add_background)
138
134
end
139
135
140
136
--- @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
154
146
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 ) } } ,
156
148
virt_text_pos = ' overlay' ,
157
149
})
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 )
166
152
end
167
153
end
168
154
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 )
169
163
local win_col , padding = 0 , {}
170
164
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 ))
173
167
end
174
- for row = self . data . start_row , self . data . end_row - 1 do
168
+ for row = start_row , end_row do
175
169
self .marks :add (' code_background' , row , self .data .col , {
176
170
end_row = row + 1 ,
177
171
hl_group = self .code .highlight ,
@@ -189,38 +183,30 @@ function Render:background(icon_added)
189
183
end
190
184
191
185
--- @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 )
202
188
local margin , padding = self .data .margin , self .data .padding
203
189
if (self .data .col == 0 or # self .data .empty_rows == 0 ) and margin <= 0 and padding <= 0 then
204
190
return
205
191
end
206
192
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 )
213
199
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
215
202
local virt_text = {}
216
203
if self .data .col > 0 and vim .tbl_contains (self .data .empty_rows , row ) then
217
204
table.insert (virt_text , fill_text )
218
205
end
219
206
if margin > 0 then
220
207
table.insert (virt_text , margin_text )
221
208
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
224
210
table.insert (virt_text , padding_text )
225
211
end
226
212
if # virt_text > 0 then
0 commit comments