A Neovim plugin enabling you to solve LeetCode problems.
| 1 | local Testcase = require("leetcode-ui.popup.console.testcase") |
| 2 | local Result = require("leetcode-ui.popup.console.result") |
| 3 | local NuiLayout = require("nui.layout") |
| 4 | local Layout = require("leetcode-ui.layout") |
| 5 | local Popup = require("leetcode-ui.popup") |
| 6 | |
| 7 | local config = require("leetcode.config") |
| 8 | local keys = config.user.keys |
| 9 | local Runner = require("leetcode.runner") |
| 10 | local log = require("leetcode.logger") |
| 11 | |
| 12 | ---@class lc.ui.Console : lc.ui.Layout |
| 13 | ---@field question lc.ui.Question |
| 14 | ---@field testcase lc.ui.Console.TestcasePopup |
| 15 | ---@field result lc.ui.Console.ResultPopup |
| 16 | ---@field popups lc.ui.Console.Popup[] |
| 17 | local ConsoleLayout = Layout:extend("LeetConsoleLayout") |
| 18 | |
| 19 | -- |
| 20 | ConsoleLayout.super.unmount(self) |
| 21 | |
| 22 | self.testcase = Testcase(self) |
| 23 | self.result = Result(self) |
| 24 | self.popups = { self.testcase, self.result } |
| 25 | end |
| 26 | |
| 27 | |
| 28 | ConsoleLayout.super.hide(self) |
| 29 | |
| 30 | pcall(function() |
| 31 | local winid = vim.api.nvim_get_current_win() |
| 32 | if winid == self.question.description.winid then |
| 33 | vim.api.nvim_set_current_win(self.question.winid) |
| 34 | end |
| 35 | end) |
| 36 | end |
| 37 | |
| 38 | |
| 39 | self:update(NuiLayout.Box({ |
| 40 | NuiLayout.Box(self.testcase, { size = config.user.console.testcase.size }), |
| 41 | NuiLayout.Box(self.result, { size = config.user.console.result.size }), |
| 42 | }, { dir = config.user.console.dir })) |
| 43 | |
| 44 | ConsoleLayout.super.mount(self) |
| 45 | |
| 46 | self:set_keymaps({ |
| 47 | [keys.reset_testcases] = function() |
| 48 | self.testcase:reset() |
| 49 | end, |
| 50 | [keys.use_testcase] = function() |
| 51 | self:use_testcase() |
| 52 | end, |
| 53 | [keys.focus_testcases] = function() |
| 54 | self.testcase:focus() |
| 55 | end, |
| 56 | [keys.focus_result] = function() |
| 57 | self.result:focus() |
| 58 | end, |
| 59 | }) |
| 60 | end |
| 61 | |
| 62 | |
| 63 | local range = self.question:editor_section_range("code") |
| 64 | if not range:is_valid_or_log() then |
| 65 | return |
| 66 | end |
| 67 | |
| 68 | if config.user.console.open_on_runcode then |
| 69 | self:show() |
| 70 | end |
| 71 | |
| 72 | self.result:focus() |
| 73 | |
| 74 | Runner:init(self.question):run(submit) |
| 75 | end |
| 76 | |
| 77 | |
| 78 | local last_testcase = self.result.last_testcase |
| 79 | if last_testcase and last_testcase ~= "" then |
| 80 | self.testcase:append(last_testcase) |
| 81 | else |
| 82 | log.warn("No testcase to use") |
| 83 | end |
| 84 | end |
| 85 | |
| 86 | |
| 87 | for _, popup in pairs(self.popups) do |
| 88 | for key, fn in pairs(keymaps) do |
| 89 | popup:map("n", key, fn) |
| 90 | end |
| 91 | end |
| 92 | end |
| 93 | |
| 94 | ---@param parent lc.ui.Question |
| 95 | |
| 96 | self.question = parent |
| 97 | self.testcase = Testcase(self) |
| 98 | self.result = Result(self) |
| 99 | self.popups = { self.testcase, self.result } |
| 100 | |
| 101 | ConsoleLayout.super.init( |
| 102 | self, |
| 103 | { |
| 104 | relative = "editor", |
| 105 | position = "50%", |
| 106 | size = config.user.console.size, |
| 107 | }, |
| 108 | NuiLayout.Box({ |
| 109 | NuiLayout.Box(self.testcase, { size = config.user.console.testcase.size }), |
| 110 | NuiLayout.Box(self.result, { size = config.user.console.result.size }), |
| 111 | }, { dir = config.user.console.dir }) |
| 112 | ) |
| 113 | end |
| 114 | |
| 115 | ---@type fun(parent: lc.ui.Question): lc.ui.Console |
| 116 | local LeetConsoleLayout = ConsoleLayout |
| 117 | |
| 118 | return LeetConsoleLayout |