Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 40 additions & 5 deletions leetcode.el
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,11 @@ Default is programming language.")
c, cpp, csharp, golang, java, javascript, typescript, kotlin, php, python,
python3, ruby, rust, scala, swift, mysql, mssql, oraclesql.")

(defconst leetcode--code-start "// code_start"
"Code start mark in LeetCode description.")
(defconst leetcode--code-end "// code_end"
"Code end mark in LeetCode description.")

(defvar leetcode--filter-regex nil "Filter rows by regex.")
(defvar leetcode--filter-tag nil "Filter rows by tag.")
(defvar leetcode--filter-difficulty nil
Expand Down Expand Up @@ -370,6 +375,18 @@ query consolePanelConfig($titleSlug: String!) {

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Utils ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun leetcode--insert-code-start-marker ()
"Insert code start marker."
(when (or (string= leetcode--lang "c")
(string= leetcode--lang "cpp"))
(insert (format "\n\n%s\n\n" leetcode--code-start))))

(defun leetcode--insert-code-end-marker ()
"Insert code end marker."
(when (or (string= leetcode--lang "c")
(string= leetcode--lang "cpp"))
(insert (format "\n\n%s\n\n" leetcode--code-end))))

(defun leetcode--referer (value)
"It will return an alist as the HTTP Referer Header.
VALUE should be the referer."
Expand Down Expand Up @@ -485,7 +502,11 @@ Such as 'Two Sum' will be converted to 'two-sum'. 'Pow(x, n)' will be 'powx-n'"

(defun leetcode--code-buffer-data ()
"Get code buffer content, that is, the `current-buffer'."
(leetcode--buffer-content (current-buffer)))
(let ((code (leetcode--buffer-content (current-buffer)))
(pattern (concat leetcode--code-start "\\([\0-\377]*?\\)" leetcode--code-end)))
(if (string-match pattern code)
(match-string 1 code)
code)))

(defun leetcode--get-slug-title (code-buf)
"Get slug title before try or submit with CODE-BUF.
Expand Down Expand Up @@ -889,11 +910,12 @@ row."
(goto-char url-http-end-of-headers)
(let-alist (json-read)
(let ((qid .data.activeDailyCodingChallengeQuestion.question.qid))
(leetcode-show-problem (string-to-number qid)))))))
(leetcode-show-problem qid))))))

(aio-defun leetcode-try ()
"Asynchronously test the code using customized testcase."
(interactive)
(leetcode-restore-layout)
(aio-await (leetcode--ensure-login t))
(let* ((title-slug (leetcode--get-slug-title (current-buffer)))
(problem (leetcode--get-problem title-slug))
Expand All @@ -904,9 +926,10 @@ row."
(aio-defun leetcode-submit ()
"Asynchronously submit the code and show result."
(interactive)
(leetcode-restore-layout)
(aio-await (leetcode--ensure-login t))
(let* ((code-buf (current-buffer))
(code (leetcode--buffer-content code-buf))
(code (leetcode--code-buffer-data))
(slug-title (leetcode--get-slug-title code-buf))
(problem (leetcode--get-problem slug-title))
(problem-id (leetcode-problem-id problem))
Expand Down Expand Up @@ -994,6 +1017,10 @@ alist specified in `display-buffer-alist'."
(goto-char (point-max))
(cond
((eq .status_code 10)
(if (equal .code_answer .expected_code_answer)
(insert (leetcode--add-font-lock "PASS: " 'leetcode-accepted-face))
(insert (leetcode--add-font-lock "FAIL: " 'leetcode-error-face)))
(insert "\n\n")
;; Code Answer
(insert "Code Answer:\n")
(dotimes (i (length .code_answer))
Expand Down Expand Up @@ -1058,9 +1085,12 @@ STATUS_CODE has following possible value:
(insert (format "Stdout: \n%s\n" .std_output))))
((eq .status_code 14)
(insert (format "Status: %s" (leetcode--add-font-lock .status_msg 'leetcode-error-face)))
(insert "\n"))
(insert (format "\n\n%s / %s testcases passed\n" .total_correct .total_testcases))
(insert (format "Last Test Case: %s\n" .last_testcase)))
((eq .status_code 15)
(insert (format "Status: %s" (leetcode--add-font-lock .status_msg 'leetcode-error-face)))
(insert (format "\n\n%s / %s testcases passed\n" .total_correct .total_testcases))
(insert (format "Last Test Case: %s\n" .last_testcase))
(insert "\n\n")
(insert (format .full_runtime_error)))
((eq .status_code 20)
Expand Down Expand Up @@ -1313,7 +1343,9 @@ major mode by `leetcode-prefer-language'and `auto-mode-alist'."
(equal (leetcode-snippet-lang-slug s) leetcode--lang))
snippets))
(template-code (leetcode-snippet-code snippet)))
(leetcode--insert-code-start-marker)
(insert template-code)
(leetcode--insert-code-end-marker)
(leetcode--replace-in-buffer "" "")))
(funcall (assoc-default suffix auto-mode-alist #'string-match-p))
(leetcode-solution-mode t))
Expand All @@ -1336,7 +1368,7 @@ major mode by `leetcode-prefer-language'and `auto-mode-alist'."
"This command should be run in LeetCode code buffer.
It will restore the layout based on current buffer's name."
(interactive)
(let* ((slug-title (file-name-sans-extension (buffer-name)))
(let* ((slug-title (leetcode--get-slug-title (current-buffer)))
(problem (leetcode--get-problem slug-title))
(problem-id (leetcode-problem-id problem))
(desc-buf (get-buffer (leetcode--detail-buffer-name problem-id)))
Expand All @@ -1345,6 +1377,9 @@ It will restore the layout based on current buffer's name."
(leetcode--solving-window-layout)
(unless desc-buf
(aio-await (leetcode-show-problem problem-id)))
(with-current-buffer result-buf
(erase-buffer)
(insert "Waiting for result..."))
(display-buffer desc-buf
'((display-buffer-reuse-window
leetcode--display-detail)
Expand Down