@@ -5,7 +5,9 @@ local icons = require('render-markdown.lib.icons')
55local str = require (' render-markdown.lib.str' )
66
77--- @class render.md.code.Data
8- --- @field language integer
8+ --- @field info ? render.md.Node
9+ --- @field language ? render.md.Node
10+ --- @field language_padding integer
911--- @field padding integer
1012--- @field body integer
1113--- @field margin integer
@@ -27,26 +29,33 @@ function Render:setup()
2729 if self .node :height () <= 2 then
2830 return false
2931 end
32+
33+ local info = self .node :child (' info_string' )
34+ local language = info and info :child (' language' )
35+
3036 local widths = self .node :widths ()
3137 local width = vim .fn .max (widths )
3238
33- local language = self :offset (self .config .language_pad , width )
39+ local language_padding = self :offset (self .config .language_pad , width )
3440 local left = self :offset (self .config .left_pad , width )
3541 local right = self :offset (self .config .right_pad , width )
3642
3743 local body = str .width (self .config .language_left )
3844 + str .width (self .config .language_right )
39- + language
45+ + language_padding
4046 + widths [1 ]
4147 body = math.max (body , left + width + right , self .config .min_width )
4248
4349 self .data = {
50+ info = info ,
4451 language = language ,
52+ language_padding = language_padding ,
4553 padding = left ,
4654 body = body ,
4755 margin = self :offset (self .config .left_margin , body ),
4856 }
49- return true
57+
58+ return self :enabled (self .config .disable )
5059end
5160
5261--- @private
@@ -66,43 +75,55 @@ function Render:offset(value, used)
6675 return result
6776end
6877
78+ --- @private
79+ --- @param disable boolean | string[]
80+ --- @return boolean
81+ function Render :enabled (disable )
82+ if type (disable ) == ' boolean' then
83+ return not disable
84+ else
85+ local language = self .data .language
86+ return not language or not vim .tbl_contains (disable , language .text )
87+ end
88+ end
89+
6990--- @protected
7091function Render :run ()
7192 local start_row = self .node .start_row
7293 local end_row = self .node .end_row - 1
7394
7495 local above = self .node :child (' fenced_code_block_delimiter' , start_row )
7596 local below = self .node :child (' fenced_code_block_delimiter' , end_row )
76- local info = self .node :child (' info_string' )
7797
7898 if self .config .conceal_delimiters then
99+ self .marks :over (self .config , true , self .data .info , { conceal = ' ' })
79100 self .marks :over (self .config , true , above , { conceal = ' ' })
80101 self .marks :over (self .config , true , below , { conceal = ' ' })
81- self .marks :over (self .config , true , info , { conceal = ' ' })
82102 end
83103
84- local language = info and info :child (' language' )
85- if not self :language (info , language , above ) then
104+ if not self :language (above ) then
86105 self :border (above , self .config .above )
87106 end
88107 self :border (below , self .config .below )
89108
90- local background = self :background_enabled ( language )
109+ local background = self :enabled ( self . config . disable_background )
91110 if background then
92111 self :background (start_row + 1 , end_row - 1 )
93112 end
94113 self :padding (background )
95114end
96115
97116--- @private
98- --- @param info ? render.md.Node
99- --- @param language ? render.md.Node
100117--- @param delim ? render.md.Node
101118--- @return boolean
102- function Render :language (info , language , delim )
119+ function Render :language (delim )
103120 if not self .config .language then
104121 return false
105122 end
123+
124+ local info = self .data .info
125+ local language = self .data .language
126+ local padding = self .data .language_padding
106127 if not info or not language or not delim then
107128 return false
108129 end
@@ -151,15 +172,15 @@ function Render:language(info, language, delim)
151172 local suffix = 0
152173 -- space within block after accounting for white space and padding
153174 local width = self .data .body - delim .start_col
154- local extra = width - prefix - body :width () - suffix - self . data . language --- @type integer
175+ local extra = width - prefix - body :width () - suffix - padding --- @type integer
155176 if self .config .position == ' left' then
156- prefix = prefix + self . data . language
177+ prefix = prefix + padding
157178 suffix = suffix + extra
158179 elseif self .config .position == ' right' then
159180 prefix = prefix + extra
160- suffix = suffix + self . data . language
181+ suffix = suffix + padding
161182 else
162- prefix = prefix + self . data . language + math.floor (extra / 2 )
183+ prefix = prefix + padding + math.floor (extra / 2 )
163184 suffix = suffix + math.ceil (extra / 2 )
164185 end
165186 if self .config .width == ' full' then
@@ -206,18 +227,6 @@ function Render:border(node, thin)
206227 })
207228end
208229
209- --- @private
210- --- @param language ? render.md.Node
211- --- @return boolean
212- function Render :background_enabled (language )
213- local disable = self .config .disable_background
214- if type (disable ) == ' boolean' then
215- return not disable
216- else
217- return language == nil or not vim .tbl_contains (disable , language .text )
218- end
219- end
220-
221230--- @private
222231--- @param start_row integer
223232--- @param end_row integer
0 commit comments