125 lines
4.5 KiB
Lua
125 lines
4.5 KiB
Lua
-- Copyright (c) 2020-2021 hoob3rt
|
|
-- MIT license, see LICENSE for more details.
|
|
local M = {}
|
|
local require = require('lualine_require').require
|
|
local utils = require('lualine.utils.utils')
|
|
local highlight = require('lualine.highlight')
|
|
|
|
---runs draw function on components in section
|
|
---handles separator edge cases :/
|
|
---also handles default transitional separators at section boundaries
|
|
---(why? I don't know)
|
|
---@param section table list of components
|
|
---@param section_name string used for getting proper hl
|
|
---@param is_focused boolean
|
|
---@return string formatted string for a section
|
|
--TODO Clean this up this does lots of messy stuff.
|
|
function M.draw_section(section, section_name, is_focused)
|
|
local highlight_name = highlight.format_highlight(section_name, is_focused)
|
|
|
|
local status = {}
|
|
for _, component in pairs(section) do
|
|
-- load components into status table
|
|
if type(component) ~= 'table' or (type(component) == 'table' and not component.component_no) then
|
|
return '' -- unknown element in section. section possibly not yet loaded
|
|
end
|
|
table.insert(status, component:draw(highlight_name, is_focused))
|
|
end
|
|
|
|
local section_color = utils.extract_highlight_colors(string.match(highlight_name, '%%#(.*)#'))
|
|
|
|
-- Flags required for knowing when to remove component separator
|
|
local strip_next_component = false
|
|
local last_component_found = false
|
|
local first_component_no = #section
|
|
|
|
-- Check through components to see when component separator need to be removed
|
|
for component_no = #section, 1, -1 do
|
|
if #status[component_no] > 0 then
|
|
first_component_no = component_no
|
|
end
|
|
-- Remove component separator with highlight for last component
|
|
if not last_component_found and #status[component_no] > 0 then
|
|
last_component_found = true
|
|
status[component_no] = section[component_no]:strip_separator()
|
|
if section_name < 'c' then
|
|
if
|
|
type(section[first_component_no].options.separator) ~= 'table'
|
|
and (section[1].options.section_separators.left ~= nil and section[1].options.section_separators.left ~= '')
|
|
then
|
|
status[component_no] =
|
|
string.format('%s%%Z{%s}', status[component_no], section[1].options.section_separators.left)
|
|
end
|
|
end
|
|
end
|
|
-- Remove component separator when color option is used in next component
|
|
if strip_next_component then
|
|
strip_next_component = false
|
|
status[component_no] = section[component_no]:strip_separator()
|
|
end
|
|
-- Remove component separator when color option is used to color background
|
|
if
|
|
(
|
|
type(section[component_no].options.color) == 'table'
|
|
and section[component_no].options.color.bg
|
|
and section[component_no].options.color.bg ~= section_color.bg
|
|
)
|
|
or type(section[component_no].options.color) == 'string'
|
|
or (
|
|
type(section[component_no].options.color) == 'function'
|
|
and section[component_no].color_fn_cache
|
|
and section[component_no].color_fn_cache.bg
|
|
and section[component_no].color_fn_cache.bg ~= section_color.bg
|
|
)
|
|
then
|
|
strip_next_component = true
|
|
status[component_no] = section[component_no]:strip_separator()
|
|
end
|
|
|
|
if section[component_no].strip_previous_separator == true then
|
|
strip_next_component = true
|
|
end
|
|
end
|
|
|
|
local left_separator_string = ''
|
|
if
|
|
section_name > 'x'
|
|
and section[first_component_no]
|
|
and type(section[first_component_no].options.separator) ~= 'table'
|
|
and (section[1].options.section_separators.right ~= nil and section[1].options.section_separators.right ~= '')
|
|
then
|
|
left_separator_string = string.format(
|
|
'%%z{%s}',
|
|
section[first_component_no].options.ls_separator or section[1].options.section_separators.right
|
|
)
|
|
end
|
|
|
|
-- Remove empty strings from status
|
|
status = utils.list_shrink(status)
|
|
local status_str = table.concat(status)
|
|
|
|
if #status_str == 0 then
|
|
return ''
|
|
end
|
|
|
|
local needs_hl
|
|
|
|
local find_start_trans_sep_start, find_start_trans_sep_end = status_str:find('^%%z{.-}')
|
|
if find_start_trans_sep_start then
|
|
-- the section doesn't need to be prepended with default hl when sections
|
|
-- first component has transitional sep
|
|
needs_hl = status_str:find('^%%#', find_start_trans_sep_end + 1)
|
|
else
|
|
needs_hl = status_str:find('^%%#')
|
|
end
|
|
|
|
if needs_hl then
|
|
-- Don't prepend with old highlight when the component changes it immediately
|
|
return left_separator_string .. status_str
|
|
else
|
|
return left_separator_string .. highlight_name .. status_str
|
|
end
|
|
end
|
|
|
|
return M
|