Skip to content

Commit

Permalink
fix: Fixed rendering of code blocks that use markdown inside them
Browse files Browse the repository at this point in the history
fix: Fixed incorrect width of lines in code blocks that have concealed

This is only done for markdown

doc: Added more annotations
  • Loading branch information
OXY2DEV committed Sep 15, 2024
1 parent a7141f7 commit 1f7c120
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 38 deletions.
3 changes: 2 additions & 1 deletion lua/definitions.lua
Original file line number Diff line number Diff line change
Expand Up @@ -275,11 +275,12 @@
---
---@field pad_amount? integer
---@field text? [ string, string? ]
---@field hl? string

---@class markview.latex.symbols
---
---@field enable boolean
---@field custom? table<string, string>
---@field overwrite? table<string, string>
---@field hl? string

--- Links
Expand Down
58 changes: 49 additions & 9 deletions lua/markview/latex_renderer.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
local latex = {};
local utils = require("markview.utils");

--- Fixes a highlight group name
---@param hl string?
---@return string?
local set_hl = function (hl)
if type(hl) ~= "string" then
return;
Expand All @@ -15,6 +18,7 @@ local set_hl = function (hl)
end
end

---@type table<string, string> Superscript text
latex.superscripts = {
["0"] = "",
["1"] = "¹",
Expand Down Expand Up @@ -91,6 +95,7 @@ latex.superscripts = {
["Z"] = "",
};

---@type table<string, string> Latex symbols
latex.symbols = {
["lim"] = "lim",
["alpha"] = "α",
Expand Down Expand Up @@ -193,12 +198,19 @@ latex.symbols = {
["daleth"] = "",
};

---@type integer? Namespace used to render stuff, initially nil
latex.namespace = nil;

--- Sets the namespace
---@param ns string
latex.set_namespace = function (ns)
latex.namespace = ns;
latex.namespace = ns --[[ @as integer ]];
end

--- Renders brackets
---@param buffer integer
---@param content table
---@param user_config markview.latex.brackets
latex.render_brackets = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
Expand Down Expand Up @@ -232,6 +244,10 @@ latex.render_brackets = function (buffer, content, user_config)
});
end

--- Renders fractional
---@param buffer integer
---@param content table
---@param user_config markview.conf.latex
latex.render_fractional = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
Expand All @@ -255,6 +271,10 @@ latex.render_fractional = function (buffer, content, user_config)
});
end

--- Renders superscript text
---@param buffer integer
---@param content table
---@param user_config { enable: boolean }
latex.render_superscript = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
Expand Down Expand Up @@ -308,6 +328,10 @@ latex.render_superscript = function (buffer, content, user_config)
end
end

--- Renders superscript text
---@param buffer integer
---@param content table
---@param user_config { enable: boolean }
latex.render_subscript = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
Expand Down Expand Up @@ -361,20 +385,18 @@ latex.render_subscript = function (buffer, content, user_config)
end
end

--- Renders fractional
---@param buffer integer
---@param content table
---@param user_config markview.latex.symbols
latex.render_symbol = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
elseif not content.text then
return;
end

local _t = nil

if user_config.custom and user_config.custom[content.text] then
_t = user_config.custom[content.text]
elseif latex.symbols[content.text] then
_t = latex.symbols[content.text]
end
local _t = latex.symbols[content.text]

if not _t then
return;
Expand All @@ -391,6 +413,10 @@ latex.render_symbol = function (buffer, content, user_config)
});
end

--- Renders fractional
---@param buffer integer
---@param content table
---@param user_config markview.conf.latex
latex.render_root = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
Expand All @@ -407,6 +433,10 @@ latex.render_root = function (buffer, content, user_config)
});
end

--- Renders fractional
---@param buffer integer
---@param content table
---@param user_config { enable: boolean }
latex.render_inline = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
Expand All @@ -422,6 +452,10 @@ latex.render_inline = function (buffer, content, user_config)
});
end

--- Renders fractional
---@param buffer integer
---@param content table
---@param user_config markview.latex.block
latex.render_block = function (buffer, content, user_config)
if not user_config or user_config.enable == false then
return;
Expand Down Expand Up @@ -459,13 +493,19 @@ latex.render_block = function (buffer, content, user_config)
end
end

--- Renders latex
---@param render_type string
---@param buffer integer
---@param content table
---@param config_table markview.configuration
latex.render = function (render_type, buffer, content, config_table)
if not config_table or not config_table.latex then
return;
elseif config_table.latex and config_table.latex.enable == false then
return;
end

---@type markview.conf.latex
local conf = config_table.latex;

if conf.symbols and type(conf.symbols.overwrite) == "table" then
Expand All @@ -485,7 +525,7 @@ latex.render = function (render_type, buffer, content, config_table)
elseif render_type == "latex_superscript" then
pcall(latex.render_superscript, buffer, content, conf)
elseif render_type == "latex_subscript" then
pcall(latex.render_subscript, buffer, content, conf)
pcall(latex.render_subscript, buffer, content, conf.subscript)
elseif render_type == "latex_symbol" then
pcall(latex.render_symbol, buffer, content, conf.symbols)
elseif render_type == "latex_root" then
Expand Down
71 changes: 48 additions & 23 deletions lua/markview/parser.lua
Original file line number Diff line number Diff line change
Expand Up @@ -38,27 +38,67 @@ parser.get_md_len = function (text)
local final_string = text;
local len = vim.fn.strdisplaywidth(text);

for str_a, internal, str_b in final_string:gmatch("([*]+)([^*]+)([*]+)") do
local valid_signs = math.max(vim.fn.strdisplaywidth(str_a), vim.fn.strdisplaywidth(str_b));

for s = 1, valid_signs do
local a = str_a:sub(s, s);
local b = str_b:reverse():sub(s, s);

if a == b then
len = len - 2;

final_string = final_string:gsub(a .. parser.escape_string(internal) .. b, internal);
end
end
end

for str_a, internal, str_b in final_string:gmatch("([_]+)([^_]+)([_]+)") do
local valid_signs = math.max(vim.fn.strdisplaywidth(str_a), vim.fn.strdisplaywidth(str_b));

for s = 1, valid_signs do
local a = str_a:sub(s, s);
local b = str_b:reverse():sub(s, s);

if a == b then
len = len - 2;

final_string = final_string:gsub(a .. parser.escape_string(internal) .. b, internal);
end
end
end

for inline_code in final_string:gmatch("`([^`]+)`") do
len = len - 2;

local escaped = inline_code:gsub("%p", "%%%1");
final_string = final_string:gsub("`" .. escaped .. "`", inline_code:gsub(".", "|"));
local _r = inline_code:gsub("[%[%]%(%)%*%_]", "X")
final_string = final_string:gsub("`" .. parser.escape_string(inline_code) .. "`", _r);
end

for link, address in final_string:gmatch("!%[([^%]]+)%]%(([^%)]+)%)") do
--- Image links: ![link](address)
for link, address in final_string:gmatch("%!%[(.-)%]%((.-)%)") do
len = len - vim.fn.strdisplaywidth("![]()" .. address);

final_string = final_string:gsub("%!%[" .. link .. "%]%(" .. address .. "%)", link);
end

for link, address in final_string:gmatch("%[([^%]]+)%]%(([^%)]+)%)") do
--- Image links: ![link][address]
for link, address in final_string:gmatch("%!%[(.-)%]%[(.-)%]") do
len = len - vim.fn.strdisplaywidth("![]");

final_string = final_string:gsub("%!%[" .. link .. "%]%[" .. address .. "%]", link .. "|" .. address .. "|");
end

--- Links: [link](address)
for link, address in final_string:gmatch("%[(.-)%]%((.-)%)") do
len = len - vim.fn.strdisplaywidth("[]()" .. address);

final_string = final_string:gsub("%[" .. link .. "%]%(" .. address .. "%)", link);
end

for link, address in final_string:gmatch("[^!]%[([^%]]+)%]%[([^%]]+)%]") do
len = len - vim.fn.strdisplaywidth("[" .. "][" .. address .. "]");
--- Links: [link][address]
for link, address in final_string:gmatch("%[(.-)%]%[(.-)%]") do
len = len - vim.fn.strdisplaywidth("[][]" .. address);

final_string = final_string:gsub("%[" .. link .. "%]%[" .. address .. "%]", link);
end
Expand All @@ -68,21 +108,6 @@ parser.get_md_len = function (text)
final_string = final_string:gsub( "[" .. pattern .. "]", pattern);
end

for str_a, internal, str_b in final_string:gmatch("([*_]+)([^*]+)([*_]+)") do
local valid_signs = math.max(vim.fn.strdisplaywidth(str_a), vim.fn.strdisplaywidth(str_b));

for s = 1, valid_signs do
local a = str_a:sub(s, s);
local b = str_b:reverse():sub(s, s);

if a == b then
len = len - 2;

final_string = final_string:gsub(a .. internal .. b, internal);
end
end
end

return len, final_string;
end

Expand Down Expand Up @@ -225,7 +250,7 @@ parser.md = function (buffer, TStree, from, to)
--- "__inside_code_block" is still experimental
---@diagnostic disable
if not parser.cached_conf or
not parser.cached_conf.__inside_code_block ~= true
parser.cached_conf.__inside_code_block ~= true
then
---@diagnostic enable
local root = TStree:root();
Expand Down Expand Up @@ -615,7 +640,7 @@ parser.md_inline = function (buffer, TStree, from, to)
--- "__inside_code_block" is still experimental
---@diagnostic disable
if not parser.cached_conf or
not parser.cached_conf.__inside_code_block ~= false
parser.cached_conf.__inside_code_block ~= true
then
---@diagnostic enable
local root = TStree:root();
Expand Down
9 changes: 4 additions & 5 deletions lua/markview/renderer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1140,6 +1140,7 @@ renderer.render_code_blocks = function (buffer, content, config_table)
for line, text in ipairs(content.lines) do
-- NOTE: Nested code blocks have a different start position
local length = content.line_lengths[line] - content.col_start;
local position = #text;

vim.api.nvim_buf_add_highlight(buffer, renderer.namespace, set_hl(config_table.hl), content.row_start + line, content.col_start, -1)

Expand All @@ -1151,12 +1152,10 @@ renderer.render_code_blocks = function (buffer, content, config_table)
}
})

local position, width = #text, vim.fn.strdisplaywidth(vim.fn.strcharpart(text, content.col_start) or "");

vim.api.nvim_buf_set_extmark(buffer, renderer.namespace, content.row_start + line, position, {
virt_text_pos = "inline",
virt_text = {
{ string.rep(config_table.pad_char or " ", block_length - width), set_hl(config_table.hl) },
{ string.rep(config_table.pad_char or " ", block_length - length), set_hl(config_table.hl) },
{ string.rep(config_table.pad_char or " ", config_table.pad_amount or 1), set_hl(config_table.hl) }
}
})
Expand Down Expand Up @@ -1260,6 +1259,7 @@ renderer.render_code_blocks = function (buffer, content, config_table)
for line, text in ipairs(content.lines) do
-- NOTE: Nested code blocks have a different start position
local length = content.line_lengths[line] - content.col_start;
local position = #text;

vim.api.nvim_buf_set_extmark(buffer, renderer.namespace, content.row_start + line, content.col_start, {
hl_group = set_hl(config_table.hl),
Expand All @@ -1276,12 +1276,11 @@ renderer.render_code_blocks = function (buffer, content, config_table)
}
})

local position, width = #text, vim.fn.strdisplaywidth(vim.fn.strcharpart(text, content.col_start) or "");

vim.api.nvim_buf_set_extmark(buffer, renderer.namespace, content.row_start + line, position, {
virt_text_pos = "inline",
virt_text = {
{ string.rep(config_table.pad_char or " ", block_length - width), set_hl(config_table.hl) },
{ string.rep(config_table.pad_char or " ", block_length - length), set_hl(config_table.hl) },
{ string.rep(config_table.pad_char or " ", config_table.pad_amount or 1), set_hl(config_table.hl) }
}
})
Expand Down

0 comments on commit 1f7c120

Please sign in to comment.