Skip to content

Commit e26dcf3

Browse files
committed
refactor(agenda): optimize prefix formatting with pre-compilation and rename extra to marker for clarity
1 parent 7b6d321 commit e26dcf3

5 files changed

Lines changed: 193 additions & 104 deletions

File tree

lua/orgmode/agenda/agenda_item.lua

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ end
2121
---@field date_range_days number
2222
---@field label string
2323
---@field time string
24-
---@field extra string
24+
---@field marker string
2525
---@field index number
2626
local AgendaItem = {}
2727

@@ -80,7 +80,7 @@ end
8080

8181
function AgendaItem:_generate_data()
8282
self.time = self.headline_date:has_time() and self:_format_time(self.headline_date) or ''
83-
self.extra = self:_generate_extra()
83+
self.marker = self:_generate_marker()
8484
self.label = self:_generate_label()
8585
end
8686

@@ -156,8 +156,8 @@ function AgendaItem:_is_valid_for_date()
156156

157157
return false
158158
end
159-
160-
function AgendaItem:_generate_extra()
159+
---@private
160+
function AgendaItem:_generate_marker()
161161
if self.headline_date:is_deadline() then
162162
if self.is_same_day then
163163
return 'Deadline:'
@@ -189,6 +189,7 @@ function AgendaItem:_generate_extra()
189189
return ''
190190
end
191191

192+
192193
function AgendaItem:_generate_label()
193194
local include_time = self.time ~= ''
194195
if (self.headline_date:is_deadline() or self.headline_date:is_scheduled()) and not self.is_same_day then
@@ -200,7 +201,7 @@ function AgendaItem:_generate_label()
200201
end
201202

202203
local time = include_time and add_padding(self.time) or ''
203-
return time .. self.extra
204+
return time .. self.marker
204205
end
205206

206207
---@private

lua/orgmode/agenda/types/agenda.lua

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ function OrgAgendaType:render(bufnr, current_line)
249249
end
250250
local agenda_days = self:_get_agenda_days()
251251

252+
local prefix_formats = self.org_agenda_prefix_format or config.org_agenda_prefix_format
253+
local prefix_format = prefix_formats.agenda
254+
local compiled_prefix = Formatter.compile(prefix_format)
255+
252256
local agendaView = AgendaView:new({ bufnr = self.bufnr, highlighter = self.highlighter })
253257
agendaView:add_line(AgendaLine:single_token({
254258
content = self:_get_title(),
@@ -272,7 +276,7 @@ function OrgAgendaType:render(bufnr, current_line)
272276
for _, agenda_item in ipairs(agenda_day.agenda_items) do
273277
-- If there is an index value, this is an AgendaItem instance
274278
if agenda_item.index then
275-
agendaView:add_line(self:_build_line(agenda_item, agenda_day))
279+
agendaView:add_line(self:_build_line(agenda_item, agenda_day, compiled_prefix))
276280
else
277281
agendaView:add_line(self:_build_time_grid_line(agenda_item, agenda_day))
278282
end
@@ -499,8 +503,9 @@ end
499503
---@private
500504
---@param agenda_item OrgAgendaItem
501505
---@param metadata table<string, any>
506+
---@param compiled_prefix? OrgAgendaFormatterSegment[]
502507
---@return OrgAgendaLine
503-
function OrgAgendaType:_build_line(agenda_item, metadata)
508+
function OrgAgendaType:_build_line(agenda_item, metadata, compiled_prefix)
504509
local headline = agenda_item.headline
505510
local item_hl_group = agenda_item:get_hlgroup()
506511
local line = AgendaLine:new({
@@ -515,7 +520,7 @@ function OrgAgendaType:_build_line(agenda_item, metadata)
515520
})
516521

517522
local prefix_formats = self.org_agenda_prefix_format or config.org_agenda_prefix_format
518-
local prefix_format = prefix_formats.agenda
523+
local prefix_format = compiled_prefix or Formatter.compile(prefix_formats.agenda)
519524
local prefix = Formatter.format(prefix_format, agenda_item, metadata)
520525

521526
line:add_token(AgendaLineToken:new({

lua/orgmode/agenda/types/todo.lua

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ end
111111
function OrgAgendaTodosType:render(bufnr)
112112
self.bufnr = bufnr or 0
113113
local headlines, category_length = self:_get_headlines()
114+
115+
local prefix_formats = self.org_agenda_prefix_format or config.org_agenda_prefix_format
116+
local prefix_format = prefix_formats[self.prefix_key] or prefix_formats.todo
117+
local compiled_prefix = Formatter.compile(prefix_format)
118+
114119
local agendaView = AgendaView:new({ bufnr = self.bufnr, highlighter = self.highlighter })
115120

116121
-- If custom view and no headlines, return empty view
@@ -132,7 +137,7 @@ function OrgAgendaTodosType:render(bufnr)
132137
end
133138

134139
for _, headline in ipairs(headlines) do
135-
agendaView:add_line(self:_build_line(headline, { category_length = category_length }))
140+
agendaView:add_line(self:_build_line(headline, { category_length = category_length }, compiled_prefix))
136141
end
137142

138143
self.view = agendaView:render()
@@ -142,16 +147,17 @@ end
142147
---@private
143148
---@param headline OrgHeadline
144149
---@param metadata table<string, any>
150+
---@param compiled_prefix? OrgAgendaFormatterSegment[]
145151
---@return OrgAgendaLine
146-
function OrgAgendaTodosType:_build_line(headline, metadata)
152+
function OrgAgendaTodosType:_build_line(headline, metadata, compiled_prefix)
147153
local line = AgendaLine:new({
148154
headline = headline,
149155
line_hl_group = headline:is_clocked_in() and 'Visual' or nil,
150156
metadata = metadata,
151157
})
152158

153159
local prefix_formats = self.org_agenda_prefix_format or config.org_agenda_prefix_format
154-
local prefix_format = prefix_formats[self.prefix_key] or prefix_formats.todo
160+
local prefix_format = compiled_prefix or Formatter.compile(prefix_formats[self.prefix_key] or prefix_formats.todo)
155161
local prefix = Formatter.format(prefix_format, nil, metadata, headline)
156162

157163
line:add_token(AgendaLineToken:new({

0 commit comments

Comments
 (0)