|
1 |
| -local C = {} |
2 |
| - |
3 |
| ----@class Sorter |
4 |
| -local Sorter = {} |
| 1 | +local Class = require("nvim-tree.class") |
| 2 | +local DirectoryNode = require("nvim-tree.node.directory") |
5 | 3 |
|
6 |
| -function Sorter:new(opts) |
7 |
| - local o = {} |
8 |
| - setmetatable(o, self) |
9 |
| - self.__index = self |
10 |
| - o.config = vim.deepcopy(opts.sort) |
| 4 | +local C = {} |
11 | 5 |
|
12 |
| - if type(o.config.sorter) == "function" then |
13 |
| - o.user = o.config.sorter |
| 6 | +---@class (exact) SorterCfg |
| 7 | +---@field sorter string|fun(nodes: Node[]) |
| 8 | +---@field folders_first boolean |
| 9 | +---@field files_first boolean |
| 10 | + |
| 11 | +---@class (exact) Sorter: Class |
| 12 | +---@field cfg SorterCfg |
| 13 | +---@field user fun(nodes: Node[])? |
| 14 | +---@field pre string? |
| 15 | +local Sorter = Class:new() |
| 16 | + |
| 17 | +---@param opts table user options |
| 18 | +---@return Sorter |
| 19 | +function Sorter:create(opts) |
| 20 | + ---@type Sorter |
| 21 | + local o = { |
| 22 | + cfg = vim.deepcopy(opts.sort), |
| 23 | + } |
| 24 | + o = self:new(o) |
| 25 | + |
| 26 | + if type(o.cfg.sorter) == "function" then |
| 27 | + o.user = o.cfg.sorter --[[@as fun(nodes: Node[])]] |
| 28 | + elseif type(o.cfg.sorter) == "string" then |
| 29 | + o.pre = o.cfg.sorter --[[@as string]] |
14 | 30 | end
|
15 | 31 | return o
|
16 | 32 | end
|
|
20 | 36 | ---@return fun(a: Node, b: Node): boolean
|
21 | 37 | function Sorter:get_comparator(sorter)
|
22 | 38 | return function(a, b)
|
23 |
| - return (C[sorter] or C.name)(a, b, self.config) |
| 39 | + return (C[sorter] or C.name)(a, b, self.cfg) |
24 | 40 | end
|
25 | 41 | end
|
26 | 42 |
|
|
41 | 57 | ---Evaluate `sort.folders_first` and `sort.files_first`
|
42 | 58 | ---@param a Node
|
43 | 59 | ---@param b Node
|
44 |
| ----@param cfg table |
| 60 | +---@param cfg SorterCfg |
45 | 61 | ---@return boolean|nil
|
46 | 62 | local function folders_or_files_first(a, b, cfg)
|
47 | 63 | if not (cfg.folders_first or cfg.files_first) then
|
48 | 64 | return
|
49 | 65 | end
|
50 | 66 |
|
51 |
| - if not a.nodes and b.nodes then |
| 67 | + if not a:is(DirectoryNode) and b:is(DirectoryNode) then |
52 | 68 | -- file <> folder
|
53 | 69 | return cfg.files_first
|
54 |
| - elseif a.nodes and not b.nodes then |
| 70 | + elseif a:is(DirectoryNode) and not b:is(DirectoryNode) then |
55 | 71 | -- folder <> file
|
56 | 72 | return not cfg.files_first
|
57 | 73 | end
|
@@ -157,15 +173,15 @@ function Sorter:sort(t)
|
157 | 173 | end
|
158 | 174 |
|
159 | 175 | split_merge(t, 1, #t, mini_comparator) -- sort by user order
|
160 |
| - else |
161 |
| - split_merge(t, 1, #t, self:get_comparator(self.config.sorter)) |
| 176 | + elseif self.pre then |
| 177 | + split_merge(t, 1, #t, self:get_comparator(self.pre)) |
162 | 178 | end
|
163 | 179 | end
|
164 | 180 |
|
165 | 181 | ---@param a Node
|
166 | 182 | ---@param b Node
|
167 | 183 | ---@param ignorecase boolean|nil
|
168 |
| ----@param cfg table |
| 184 | +---@param cfg SorterCfg |
169 | 185 | ---@return boolean
|
170 | 186 | local function node_comparator_name_ignorecase_or_not(a, b, ignorecase, cfg)
|
171 | 187 | if not (a and b) then
|
|
0 commit comments