Skip to content

Commit ffb465f

Browse files
committed
feat(asciidoc): Added delimited blocks & admonition blocks support
Ref: #455
1 parent c81ce9e commit ffb465f

10 files changed

Lines changed: 308 additions & 8 deletions

File tree

doc/markview.nvim-asciidoc.txt

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
---@field enable boolean Enable rendering of Asciidoc files?
77
---
88
---@field admonitions markview.config.asciidoc.admonitions
9+
---@field delimited_blocks markview.config.asciidoc.delimited_blocks
910
---@field checkboxes markview.config.asciidoc.checkboxes
1011
---@field document_attributes markview.config.asciidoc.document_attributes
1112
---@field document_titles markview.config.asciidoc.document_titles
@@ -16,7 +17,7 @@
1617
<
1718

1819
--------------------------------------------------------------------------------
19-
enable
20+
enable *markview.nvim-asciidoc.enable*
2021

2122
Enables previewing asciidoc files.
2223

@@ -25,7 +26,7 @@ Enables previewing asciidoc files.
2526
<
2627

2728
--------------------------------------------------------------------------------
28-
admonitions
29+
admonitions *markview.nvim-asciidoc.admonitions*
2930

3031
>lua
3132
--- Configuration for admonitions.
@@ -120,7 +121,34 @@ Each admonition type has the following options.
120121
<
121122

122123
--------------------------------------------------------------------------------
123-
document_attributes
124+
delimited_blocks *markview.nvim-asciidoc.delimited_blocks*
125+
126+
>lua
127+
--- Configuration for admonition blocks.
128+
---@class markview.config.asciidoc.delimited_blocks
129+
---
130+
---@field enable boolean Enable rendering of delimited blocks.
131+
---@field hl? string Highlight group for the lines of the delimited blocks.
132+
<
133+
134+
Changes how admonitions are shown.
135+
136+
▋ 󰋽 Note
137+
▋ `Admonition block`s are configured via asciidoc.admonitions {2} as they are a
138+
▋ variation of delimited blocks. Same with preview.raw_previews {1} where
139+
▋ disabling `admonitions` won't disable rendering of the block(only the admonition
140+
▋ label will disappear).
141+
142+
>lua
143+
delimited_blocks = {
144+
enable = true,
145+
146+
hl = "MarkviewCode"
147+
},
148+
<
149+
150+
--------------------------------------------------------------------------------
151+
document_attributes *markview.nvim-asciidoc.document_attributes*
124152

125153
>lua
126154
--[[ Options for document attributes. ]]
@@ -257,7 +285,7 @@ Repeats given text by an amount.
257285
<
258286

259287
--------------------------------------------------------------------------------
260-
list_items
288+
list_items *markview.nvim-asciidoc.list_items*
261289

262290
>lua
263291
--- Configuration for list items.
@@ -327,7 +355,7 @@ Each list item type has the following options.
327355
<
328356

329357
--------------------------------------------------------------------------------
330-
section_titles
358+
section_titles *markview.nvim-asciidoc.section_titles*
331359

332360
>lua
333361
--- Configuration for section titles.
@@ -395,7 +423,7 @@ Each section title level has the following options.
395423
<
396424

397425
--------------------------------------------------------------------------------
398-
tocs
426+
tocs *markview.nvim-asciidoc.tocs*
399427

400428
>lua
401429
--- Configuration for generated Table of contents section..
@@ -477,4 +505,9 @@ Each item depth has the following options.
477505
---@field icon_hl? string Highlight group for `icon`.
478506
<
479507

508+
Links ~
509+
510+
1: |markview.nvim-preview.raw_previews|
511+
2: |markview.nvim-asciidoc.admonitions|
512+
480513
vim:ft=help:textwidth=80:tabstop=4:noexpandtab:

doc/tags

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
markview.nvim markview.nvim.txt /*markview.nvim*
33
markview.nvim-advanced markview.nvim-advanced.txt /*markview.nvim-advanced*
44
markview.nvim-asciidoc markview.nvim-asciidoc.txt /*markview.nvim-asciidoc*
5+
markview.nvim-asciidoc.admonitions markview.nvim-asciidoc.txt /*markview.nvim-asciidoc.admonitions*
6+
markview.nvim-asciidoc.delimited_blocks markview.nvim-asciidoc.txt /*markview.nvim-asciidoc.delimited_blocks*
7+
markview.nvim-asciidoc.document_attributes markview.nvim-asciidoc.txt /*markview.nvim-asciidoc.document_attributes*
8+
markview.nvim-asciidoc.enable markview.nvim-asciidoc.txt /*markview.nvim-asciidoc.enable*
9+
markview.nvim-asciidoc.list_items markview.nvim-asciidoc.txt /*markview.nvim-asciidoc.list_items*
10+
markview.nvim-asciidoc.section_titles markview.nvim-asciidoc.txt /*markview.nvim-asciidoc.section_titles*
11+
markview.nvim-asciidoc.tocs markview.nvim-asciidoc.txt /*markview.nvim-asciidoc.tocs*
512
markview.nvim-asciidoc_inline markview.nvim-asciidoc_inline.txt /*markview.nvim-asciidoc_inline*
613
markview.nvim-autocmds markview.nvim-autocmds.txt /*markview.nvim-autocmds*
714
markview.nvim-commands markview.nvim.txt /*markview.nvim-commands*

lua/markview/config/asciidoc.lua

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,12 @@ return {
140140
["d"] = { text = "󰔳", hl = "MarkviewCheckboxUnchecked" },
141141
},
142142

143+
delimited_blocks = {
144+
enable = true,
145+
146+
hl = "MarkviewCode"
147+
},
148+
143149
horizontal_rules = {
144150
enable = true,
145151

lua/markview/parsers/asciidoc.lua

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,87 @@ asciidoc.admonition = function (buffer, _, text, range)
6262
---|fE
6363
end
6464

65+
--[[
66+
Admonition blocks.
67+
68+
```asciidoc
69+
[NOTE]
70+
======
71+
Some note.
72+
73+
Some other note.
74+
======
75+
```
76+
]]
77+
---@param buffer integer
78+
---@param TSNode TSNode
79+
---@param text string[]
80+
---@param range markview.parsed.asciidoc.admonitions.range
81+
asciidoc.admonition_block = function (buffer, TSNode, text, range)
82+
---|fS
83+
84+
local admonition = TSNode:prev_named_sibling() --[[@as TSNode]];
85+
86+
local _kind = admonition:named_child(1) --[[@as TSNode]];
87+
local kind = vim.treesitter.get_node_text(_kind, buffer, {});
88+
89+
range.kind = { _kind:range() };
90+
range.row_start = range.kind[1];
91+
92+
asciidoc.insert({
93+
class = "asciidoc_admonition_block",
94+
kind = kind,
95+
96+
text = text,
97+
range = range
98+
});
99+
100+
---|fE
101+
end
102+
103+
--[[
104+
Delimited blocks.
105+
106+
```asciidoc
107+
======
108+
Foo
109+
======
110+
```
111+
]]
112+
---@param buffer integer
113+
---@param TSNode TSNode
114+
---@param text string[]
115+
---@param range markview.parsed.range
116+
asciidoc.delimited_block = function (buffer, TSNode, text, range)
117+
---|fS
118+
119+
local before = TSNode:prev_named_sibling();
120+
121+
-- NOTE: Detect `admonitions` first.
122+
if before and before:type() == "element_attr" then
123+
local attr_value = before:named_child(1);
124+
125+
if attr_value and attr_value:type() == "attr_value" then
126+
local attr_text = vim.treesitter.get_node_text(attr_value, buffer, {});
127+
128+
if string.match(attr_text, "^[A-Z]+$") then
129+
---@diagnostic disable-next-line: param-type-mismatch
130+
asciidoc.admonition_block(buffer, TSNode, text, range);
131+
return;
132+
end
133+
end
134+
end
135+
136+
asciidoc.insert({
137+
class = "asciidoc_delimited_block",
138+
139+
text = text,
140+
range = range
141+
});
142+
143+
---|fE
144+
end
145+
65146
--[[
66147
Document attributes.
67148
@@ -570,6 +651,8 @@ asciidoc.parse = function (buffer, TSTree, from, to)
570651
571652
(admonition) @asciidoc.admonition
572653
(breaks) @asciidoc.hr
654+
655+
(delimited_block) @asciidoc.delimited_block
573656
]]);
574657

575658
if not can_scan then

lua/markview/renderer.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ renderer.option_maps = {
1616
---|fS
1717

1818
asciidoc = {
19-
admonitions = { "asciidoc_admonitiono" },
19+
admonitions = { "asciidoc_admonition", "asciidoc_admonition_block" },
20+
delimited_blocks = { "asciidoc_admonition", "asciidoc_delimited_block" },
2021
document_attribute = { "asciidoc_document_attribute" },
2122
document_title = { "asciidoc_document_title" },
2223
horizontal_rules = { "asciidoc_hr" },

lua/markview/renderers/asciidoc.lua

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,133 @@ asciidoc.admonition = function (buffer, item)
7777
---|fE
7878
end
7979

80+
---@param buffer integer
81+
---@param item markview.parsed.asciidoc.admonition_blocks
82+
asciidoc.admonition_block = function (buffer, item)
83+
---|fS
84+
85+
---@type markview.config.asciidoc.delimited_blocks?
86+
local config = spec.get({ "asciidoc", "delimited_blocks" }, { fallback = nil });
87+
88+
if not config then
89+
return;
90+
end
91+
92+
---@type markview.config.asciidoc.admonitions?
93+
local admonition_config = spec.get({ "asciidoc", "admonitions" }, { fallback = nil });
94+
---@type markview.config.asciidoc.admonitions.opts?
95+
local ad_config;
96+
97+
if admonition_config then
98+
ad_config = utils.match(admonition_config, item.kind, {
99+
case_insensitive = true,
100+
101+
ignore_keys = { "enable" },
102+
eval_args = { buffer, item }
103+
});
104+
end
105+
106+
local range = item.range;
107+
108+
local row_end = range.kind[3];
109+
local col_end = range.kind[4];
110+
111+
if ad_config then
112+
utils.set_extmark(buffer, asciidoc.ns, range.row_start, range.col_start, {
113+
end_col = range.kind[2],
114+
conceal = "",
115+
116+
virt_text_pos = "inline",
117+
virt_text = {
118+
{ ad_config.corner_left or "", utils.set_hl(ad_config.corner_left_hl or ad_config.hl) },
119+
{ ad_config.padding_left or "", utils.set_hl(ad_config.padding_left_hl or ad_config.hl) },
120+
121+
{ ad_config.icon or "", utils.set_hl(ad_config.icon_hl or ad_config.hl) }
122+
},
123+
124+
hl_mode = "combine"
125+
});
126+
127+
utils.set_extmark(buffer, asciidoc.ns, range.kind[1], range.kind[2], {
128+
end_row = row_end,
129+
end_col = col_end,
130+
131+
hl_group = utils.set_hl(ad_config.hl)
132+
});
133+
134+
utils.set_extmark(buffer, asciidoc.ns, range.kind[3], range.kind[4], {
135+
end_col = range.kind[4] + 1,
136+
conceal = "",
137+
138+
virt_text_pos = "inline",
139+
virt_text = {
140+
{ ad_config.padding_right or "", utils.set_hl(ad_config.padding_right_hl or ad_config.hl) },
141+
{ ad_config.corner_right or "", utils.set_hl(ad_config.corner_right_hl or ad_config.hl) }
142+
},
143+
144+
hl_mode = "combine"
145+
});
146+
147+
utils.set_extmark(buffer, asciidoc.ns, range.row_start + 1, range.col_start, {
148+
end_row = row_end + 1,
149+
conceal_lines = "",
150+
});
151+
else
152+
utils.set_extmark(buffer, asciidoc.ns, range.row_start, range.col_start, {
153+
end_row = row_end + 1,
154+
conceal_lines = "",
155+
});
156+
end
157+
158+
if (ad_config and ad_config.desc_hl) or config.hl then
159+
utils.set_extmark(buffer, asciidoc.ns, range.row_start + 1, range.col_start, {
160+
end_row = range.row_end - 1,
161+
162+
---@diagnostic disable-next-line: param-type-mismatch
163+
line_hl_group = utils.set_hl(ad_config and ad_config.desc_hl or config.hl)
164+
});
165+
end
166+
167+
utils.set_extmark(buffer, asciidoc.ns, range.row_end, 0, {
168+
end_row = range.row_end,
169+
conceal_lines = "",
170+
});
171+
172+
---|fE
173+
end
174+
175+
---@param buffer integer
176+
---@param item markview.parsed.asciidoc.delimited_blocks
177+
asciidoc.delimited_block = function (buffer, item)
178+
---|fS
179+
180+
---@type markview.config.asciidoc.delimited_blocks?
181+
local config = spec.get({ "asciidoc", "delimited_blocks" }, { fallback = nil });
182+
183+
if not config then
184+
return;
185+
end
186+
187+
local range = item.range;
188+
189+
utils.set_extmark(buffer, asciidoc.ns, range.row_start, range.col_start, {
190+
end_row = range.row_start,
191+
conceal_lines = "",
192+
});
193+
194+
utils.set_extmark(buffer, asciidoc.ns, range.row_start, range.col_start, {
195+
end_row = range.row_end - 1,
196+
line_hl_group = utils.set_hl(config.hl)
197+
});
198+
199+
utils.set_extmark(buffer, asciidoc.ns, range.row_end, 0, {
200+
end_row = range.row_end,
201+
conceal_lines = "",
202+
});
203+
204+
---|fE
205+
end
206+
80207
---@param buffer integer
81208
---@param item markview.parsed.asciidoc.document_titles
82209
asciidoc.document_attribute = function (buffer, item)

0 commit comments

Comments
 (0)