A Neovim plugin enabling you to solve LeetCode problems.
| 1 | local Popup = require("leetcode-ui.popup") |
| 2 | local Group = require("leetcode-ui.group") |
| 3 | local Lines = require("leetcode-ui.lines") |
| 4 | |
| 5 | local log = require("leetcode.logger") |
| 6 | local t = require("leetcode.translator") |
| 7 | |
| 8 | local utils = require("leetcode.utils") |
| 9 | local config = require("leetcode.config") |
| 10 | local stats_api = require("leetcode.api.statistics") |
| 11 | local Spinner = require("leetcode.logger.spinner") |
| 12 | |
| 13 | ---@class lc.ui.LanguagesPopup : lc.ui.SkillsPopup |
| 14 | ---@field renderer lc.ui.Renderer |
| 15 | local Languages = Popup:extend("LeetLanguages") |
| 16 | |
| 17 | |
| 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 |
| 43 | end |
| 44 | |
| 45 | ---@private |
| 46 | ---@param res lc.Languages.Res |
| 47 | |
| 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) |
| 61 | end |
| 62 | |
| 63 | |
| 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) |
| 76 | end |
| 77 | |
| 78 | |
| 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 | }) |
| 106 | end |
| 107 | |
| 108 | return Languages() |