irongit

A Neovim plugin enabling you to solve LeetCode problems.

108 lines2.6 KBLua
1local Popup = require("leetcode-ui.popup")
2local Group = require("leetcode-ui.group")
3local Lines = require("leetcode-ui.lines")
4
5local log = require("leetcode.logger")
6local t = require("leetcode.translator")
7
8local utils = require("leetcode.utils")
9local config = require("leetcode.config")
10local stats_api = require("leetcode.api.statistics")
11local Spinner = require("leetcode.logger.spinner")
12
13---@class lc.ui.LanguagesPopup : lc.ui.SkillsPopup
14---@field renderer lc.ui.Renderer
15local Languages = Popup:extend("LeetLanguages")
16
17function Languages:handle(res)
18 local lines = Lines()
19
20 local lang = utils.get_lang_by_name(res.lang)
21
22 if lang then
23 lines:append(lang.icon .. " " .. lang.lang, lang.hl or "leetcode_code")
24 else
25 lines:append(res.lang, "leetcode_code")
26 end
27
28 lines:append(" - ", "leetcode_list")
29
30 if config.translator then
31 lines:append("解题数", "leetcode_alt")
32 lines:append(" " .. res.problems_solved)
33 else
34 lines:append("" .. res.problems_solved)
35 if res.problems_solved == 1 then
36 lines:append(" problem solved", "leetcode_alt")
37 else
38 lines:append(" problems solved", "leetcode_alt")
39 end
40 end
41
42 return lines
43end
44
45---@private
46---@param res lc.Languages.Res
47function Languages:populate(res)
48 local group = Group({}, { spacing = 1 })
49 if res == vim.NIL then
50 return
51 end
52
53 table.sort(res, function(a, b)
54 return a.problems_solved > b.problems_solved
55 end)
56 for _, lang in ipairs(res) do
57 group:insert(self:handle(lang))
58 end
59
60 self.renderer:insert(group)
61end
62
63function Languages:mount()
64 Languages.super.mount(self)
65
66 local spinner = Spinner:start("fetching user languages", "dot")
67 stats_api.languages(function(res, err)
68 if err then
69 spinner:error(err.msg)
70 else
71 self:populate(res)
72 spinner:success("languages fetched")
73 Languages.super.draw(self)
74 end
75 end)
76end
77
78function Languages:init()
79 Languages.super.init(self, {
80 position = "50%",
81 size = {
82 width = 75,
83 height = "50%",
84 },
85 enter = true,
86 focusable = true,
87 zindex = 50,
88 relative = "editor",
89 border = {
90 padding = {
91 top = 2,
92 bottom = 2,
93 left = 3,
94 right = 3,
95 },
96 style = "rounded",
97 text = {
98 top = (" %s "):format(t("Languages")),
99 },
100 },
101 buf_options = {
102 modifiable = false,
103 readonly = false,
104 },
105 })
106end
107
108return Languages()