lirve.el/learning-irregular-verbs-in-English.el

348 lines
15 KiB
EmacsLisp
Raw Normal View History

2023-12-31 10:00:33 +01:00
;;; learning-irregular-verbs-in-English.el --- Application to learn and review irregular verbs in English. -*- lexical-binding: t;
;;
;; Copyright © 2024 Andros Fenollosa
;; Authors: Andros Fenollosa <andros@fenollosa.email>
;; URL: https://github.com/tanrax/learning-irregular-verbs-in-English.el
;; Version: 1.0.0
;; SPDX-License-Identifier: GPL-3.0-or-later
;;; Commentary:
;; Application to learn and review irregular verbs in English.
;;; Code:
(defun learning-irregular-verbs-in-English ()
"Application to learn and review irregular verbs in English."
(interactive)
2024-01-02 16:23:41 +01:00
(let ((learning-irregular-verbs-in-English--verbs '(
("beat" "beat" "beaten")
("become" "became" "become")
("begin" "began" "begun")
("bend" "bent" "bent")
("bet" "bet" "bet")
("bite" "bit" "bitten")
("bleed" "bled" "bled")
("blow" "blew" "blown")
("break" "broke" "broken")
("bring" "brought" "brought")
("build" "built" "built")
("burn" "burnt" "burnt")
("buy" "bought" "bought")
("catch" "caught" "caught")
("choose" "chose" "chosen")
("come" "came" "come")
("cost" "cost" "cost")
("cut" "cut" "cut")
("dig" "dug" "dug")
("do" "did" "done")
("draw" "drew" "drawn")
("dream" "dreamt" "dreamt")
("drink" "drank" "drunk")
("drive" "drove" "driven")
("eat" "ate" "eaten")
("fall" "fell" "fallen")
("feed" "fed" "fed")
("feel" "felt" "felt")
("fight" "fought" "fought")
("find" "found" "found")
("fly" "flew" "flown")
("forget" "forgot" "forgotten")
("forgive" "forgave" "forgiven")
("freeze" "froze" "frozen")
("get" "got" "got")
("give" "gave" "given")
("go" "went" "gone")
("grow" "grew" "grown")
("hang" "hung" "hung")
("have" "had" "had")
("hear" "heard" "heard")
("hide" "hid" "hidden")
("hit" "hit" "hit")
("hold" "held" "held")
("hurt" "hurt" "hurt")
("keep" "kept" "kept")
("know" "knew" "known")
("lay" "laid" "laid")
("lead" "led" "led")
("learn" "learnt" "learnt")
("leave" "left" "left")
("lend" "lent" "lent")
("let" "let" "let")
("lie" "lay" "lain")
("light" "lit" "lit")
("lose" "lost" "lost")
("make" "made" "made")
("mean" "meant" "meant")
("meet" "met" "met")
("pay" "paid" "paid")
("put" "put" "put")
("read" "read" "read")
("ride" "rode" "ridden")
("ring" "rang" "rung")
("rise" "rose" "risen")
("run" "ran" "run")
("say" "said" "said")
("see" "saw" "seen")
("sell" "sold" "sold")
("send" "sent" "sent")
("set" "set" "set")
("shake" "shook" "shaken")
("shine" "shone" "shone")
("shoot" "shot" "shot")
("show" "showed" "shown")
("shut" "shut" "shut")
("sing" "sang" "sung")
("sink" "sank" "sunk")
("sit" "sat" "sat")
("sleep" "slept" "slept")
("smell" "smelt" "smelt")
("speak" "spoke" "spoken")
("spend" "spent" "spent")
("spill" "spelt" "spelt")
("spit" "spit" "spit")
("stand" "stood" "stood")
("steal" "stole" "stolen")
("swim" "swam" "swum")
("take" "took" "taken")
("teach" "taught" "taught")
("tear" "tore" "torn")
("tell" "told" "told")
("think" "thought" "thought")
("throw" "threw" "thrown")
("understand" "understood" "understood")
("wake" "woke" "woken")
("wear" "wore" "worn")
("win" "won" "won")
("write" "wrote" "written")))
2024-01-02 16:33:02 +01:00
;; learning-irregular-verbs-in-English
(learning-irregular-verbs-in-English--buffer-name "*Learning irregular verbs in English*")
(learning-irregular-verbs-in-English--state 1) ;; 1: start, 2: playing (before first check), 3: win (show success layout)
(learning-irregular-verbs-in-English--verb-to-learn-infinitive nil)
(learning-irregular-verbs-in-English--verb-to-learn-simple-past nil)
(learning-irregular-verbs-in-English--verb-to-learn-past-participle nil)
(learning-irregular-verbs-in-English--emoji-valid "")
(learning-irregular-verbs-in-English--emoji-error "👎")
(learning-irregular-verbs-in-English--widget-title nil)
(learning-irregular-verbs-in-English--text-title " 🧑‍🎓 Learning irregular verbs in English 🇬🇧")
(learning-irregular-verbs-in-English--widget-item-verb nil)
(learning-irregular-verbs-in-English--widget-field-simple-past nil)
(learning-irregular-verbs-in-English--widget-label-check-simple-past nil)
(learning-irregular-verbs-in-English--widget-field-past-participle nil)
(learning-irregular-verbs-in-English--widget-label-check-past-participle nil)
(learning-irregular-verbs-in-English--text-button-check "Check")
(learning-irregular-verbs-in-English--widget-button-check nil)
(learning-irregular-verbs-in-English--widget-message-success nil)
(learning-irregular-verbs-in-English--widget-item-space-before-success nil)
(learning-irregular-verbs-in-English--text-success "Nice!")
(learning-irregular-verbs-in-English--widget-item-space-after-success nil)
(learning-irregular-verbs-in-English--widget-button-quit nil)
(learning-irregular-verbs-in-English--text-button-quit "Quit")
(learning-irregular-verbs-in-English--widget-item-space-between-buttons nil)
(learning-irregular-verbs-in-English--widget-button-replay nil)
(learning-irregular-verbs-in-English--text-button-replay "New challenge"))
2023-12-31 15:39:31 +01:00
;; Imports
(require 'widget)
(eval-when-compile
(require 'wid-edit))
;; Functions
2024-01-01 20:39:40 +01:00
(defun kill-app ()
"Kill the application."
(interactive)
2024-01-02 16:33:02 +01:00
(kill-buffer learning-irregular-verbs-in-English--buffer-name))
2024-01-01 20:39:40 +01:00
2024-01-02 16:18:41 +01:00
(defun value-field-simple-past ()
2024-01-02 16:33:02 +01:00
(if (not (eq learning-irregular-verbs-in-English--widget-field-simple-past nil)) (widget-value learning-irregular-verbs-in-English--widget-field-simple-past) ""))
2024-01-02 16:18:41 +01:00
(defun value-field-past-participle ()
2024-01-02 16:33:02 +01:00
(if (not (eq learning-irregular-verbs-in-English--widget-field-past-participle nil)) (widget-value learning-irregular-verbs-in-English--widget-field-past-participle) ""))
2024-01-02 16:18:41 +01:00
2023-12-31 15:39:31 +01:00
(defun set-verb-to-learn ()
"Set the verb to learn."
2024-01-02 16:18:41 +01:00
(let ((verbs-random (nth (random (length learning-irregular-verbs-in-English--verbs)) learning-irregular-verbs-in-English--verbs)))
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--verb-to-learn-infinitive (nth 0 verbs-random))
(setq learning-irregular-verbs-in-English--verb-to-learn-simple-past (nth 1 verbs-random))
(setq learning-irregular-verbs-in-English--verb-to-learn-past-participle (nth 2 verbs-random))))
2023-12-31 15:39:31 +01:00
2024-01-01 13:10:45 +01:00
(defun format-value-infinitive ()
2023-12-31 15:39:31 +01:00
"Format the value of the infinitive."
2024-01-02 16:33:02 +01:00
(format "Infinitive ➡️ %s" learning-irregular-verbs-in-English--verb-to-learn-infinitive))
2023-12-31 15:39:31 +01:00
2024-01-01 13:10:45 +01:00
(defun format-check-simple-past ()
2023-12-31 15:39:31 +01:00
"Format the value of the simple past."
2024-01-02 16:33:02 +01:00
(if (eq learning-irregular-verbs-in-English--state 1)
2024-01-01 13:10:45 +01:00
""
(format " %s" (if
(and
2024-01-02 16:33:02 +01:00
(string= (value-field-simple-past) learning-irregular-verbs-in-English--verb-to-learn-simple-past)
2024-01-02 16:18:41 +01:00
(not (string= (value-field-simple-past) "")))
2024-01-02 16:33:02 +01:00
learning-irregular-verbs-in-English--emoji-valid learning-irregular-verbs-in-English--emoji-error))))
2024-01-01 13:10:45 +01:00
(defun format-check-past-participle ()
"Format the value of the past participle."
2024-01-02 16:33:02 +01:00
(if (eq learning-irregular-verbs-in-English--state 1)
2024-01-01 13:10:45 +01:00
""
(format " %s" (if
(and
2024-01-02 16:33:02 +01:00
(string= (value-field-past-participle) learning-irregular-verbs-in-English--verb-to-learn-past-participle)
2024-01-02 16:18:41 +01:00
(not (string= (value-field-past-participle) "")))
2024-01-02 16:33:02 +01:00
learning-irregular-verbs-in-English--emoji-valid learning-irregular-verbs-in-English--emoji-error))))
2024-01-01 13:10:45 +01:00
(defun toggle-layout-success ()
"Toggle the layout to success."
2024-01-02 16:33:02 +01:00
(if (eq learning-irregular-verbs-in-English--state 3)
2024-01-01 20:39:40 +01:00
(progn
;; Cursor to end
(goto-char (point-max))
;; Remove check button
2024-01-02 16:33:02 +01:00
(widget-delete learning-irregular-verbs-in-English--widget-button-check)
(setq learning-irregular-verbs-in-English--widget-button-check nil)
2024-01-01 20:39:40 +01:00
;; Text success
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-item-space-before-success (widget-create 'item
2024-01-01 20:39:40 +01:00
""))
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-message-success (widget-create 'item
learning-irregular-verbs-in-English--text-success
2024-01-01 20:39:40 +01:00
))
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-item-space-after-success (widget-create 'item
2024-01-01 20:39:40 +01:00
"\n"))
;; Replay button
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-button-replay (widget-create 'push-button
2024-01-01 20:39:40 +01:00
:size 20
:notify (lambda (&rest ignore)
(replay))
2024-01-02 16:33:02 +01:00
learning-irregular-verbs-in-English--text-button-replay))
2024-01-01 20:39:40 +01:00
;; Space
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-item-space-between-buttons (widget-create 'item
2024-01-01 20:39:40 +01:00
"\n"))
;; Quit button
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-button-quit (widget-create 'push-button
2024-01-01 20:39:40 +01:00
:size 20
:notify (lambda (&rest ignore)
(kill-app))
2024-01-02 16:33:02 +01:00
learning-irregular-verbs-in-English--text-button-quit))
2024-01-01 20:39:40 +01:00
(widget-backward 2)
)
(progn
2024-01-02 16:33:02 +01:00
(when (not (eq learning-irregular-verbs-in-English--widget-item-space-before-success nil)) (widget-delete learning-irregular-verbs-in-English--widget-item-space-before-success))
(when (not (eq learning-irregular-verbs-in-English--widget-message-success nil)) (widget-delete learning-irregular-verbs-in-English--widget-message-success))
(when (not (eq learning-irregular-verbs-in-English--widget-item-space-after-success nil)) (widget-delete learning-irregular-verbs-in-English--widget-item-space-after-success))
(when (not (eq learning-irregular-verbs-in-English--widget-button-replay nil)) (widget-delete learning-irregular-verbs-in-English--widget-button-replay))
(when (not (eq learning-irregular-verbs-in-English--widget-item-space-between-buttons nil)) (widget-delete learning-irregular-verbs-in-English--widget-item-space-between-buttons))
(when (not (eq learning-irregular-verbs-in-English--widget-button-quit nil)) (widget-delete learning-irregular-verbs-in-English--widget-button-quit))
2024-01-01 20:39:40 +01:00
)))
(defun make-button-check ()
"Make the button check."
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-button-check (widget-create 'push-button
2024-01-01 20:39:40 +01:00
:notify (lambda (&rest ignore)
(update))
2024-01-02 16:33:02 +01:00
learning-irregular-verbs-in-English--text-button-check)))
2024-01-01 13:10:45 +01:00
2023-12-31 15:39:31 +01:00
2024-01-01 13:10:45 +01:00
(defun start ()
2023-12-31 15:39:31 +01:00
"Start o replay challenge."
(interactive)
2024-01-02 16:33:02 +01:00
;; Set the learning-irregular-verbs-in-English--state
(setq learning-irregular-verbs-in-English--state 1)
2023-12-31 15:39:31 +01:00
;; Get a new verb
(set-verb-to-learn)
;; Show the verb in infinitive
2024-01-02 16:33:02 +01:00
(widget-value-set learning-irregular-verbs-in-English--widget-item-verb (format-value-infinitive))
2024-01-01 20:39:40 +01:00
;; Reset button check
2024-01-02 16:33:02 +01:00
(when (eq learning-irregular-verbs-in-English--widget-button-check nil) (make-button-check))
2024-01-01 20:39:40 +01:00
;; Clear the fields
2024-01-02 16:33:02 +01:00
(widget-value-set learning-irregular-verbs-in-English--widget-field-simple-past "")
(widget-value-set learning-irregular-verbs-in-English--widget-label-check-simple-past "")
(widget-value-set learning-irregular-verbs-in-English--widget-field-past-participle "")
(widget-value-set learning-irregular-verbs-in-English--widget-label-check-past-participle "")
2024-01-01 13:10:45 +01:00
;; Update labels
2024-01-01 20:39:40 +01:00
(update))
(defun replay ()
"Replay the challenge."
(interactive)
(start)
(widget-backward 1))
2023-12-31 15:39:31 +01:00
2024-01-01 13:10:45 +01:00
(defun update ()
"Check the answers."
(interactive)
;; Is playing?
2024-01-02 16:33:02 +01:00
(when (and (eq learning-irregular-verbs-in-English--state 1)
2024-01-01 13:10:45 +01:00
(or
2024-01-02 16:18:41 +01:00
(not (string= (value-field-simple-past) ""))
(not (string= (value-field-past-participle) "")))
2024-01-01 13:10:45 +01:00
)
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--state 2))
2024-01-01 13:10:45 +01:00
;; Check the answers
2024-01-02 16:33:02 +01:00
(when (eq learning-irregular-verbs-in-English--state 2)
2024-01-01 13:10:45 +01:00
;; Is win?
(when (and
2024-01-02 16:33:02 +01:00
(string= (value-field-simple-past) learning-irregular-verbs-in-English--verb-to-learn-simple-past)
(string= (value-field-past-participle) learning-irregular-verbs-in-English--verb-to-learn-past-participle))
;; Set the learning-irregular-verbs-in-English--state
(setq learning-irregular-verbs-in-English--state 3))
2024-01-01 13:10:45 +01:00
;; Update the check labels
2024-01-02 16:33:02 +01:00
(widget-value-set learning-irregular-verbs-in-English--widget-label-check-simple-past (format-check-simple-past))
(widget-value-set learning-irregular-verbs-in-English--widget-label-check-past-participle (format-check-past-participle)))
2024-01-01 20:39:40 +01:00
;; Update the success layout if needed
(toggle-layout-success))
2023-12-31 15:39:31 +01:00
(defun main-layout ()
"Make widgets for the main layout."
(interactive)
;; Create the buffer
2024-01-02 16:33:02 +01:00
(switch-to-buffer learning-irregular-verbs-in-English--buffer-name)
2023-12-31 15:39:31 +01:00
;; Clear the buffer
(kill-all-local-variables)
(let ((inhibit-read-only t))
(erase-buffer))
(remove-overlays)
;; Create the widgets
;; Title
2024-01-02 16:33:02 +01:00
(insert (propertize (format "\n%s\n\n" learning-irregular-verbs-in-English--text-title) 'face '(:height 1.2 :weight bold)))
2023-12-31 15:39:31 +01:00
;; Verb in infinitive
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-item-verb (widget-create 'item
2023-12-31 15:39:31 +01:00
:value ""))
;; Separator
(insert "\nSimple past ➡️ ")
;; Simple past
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-field-simple-past (widget-create 'editable-field
2023-12-31 15:39:31 +01:00
:size 8
:help-echo "Type a Simple past"
))
2024-01-01 13:10:45 +01:00
;; Label check
(insert " ")
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-label-check-simple-past (widget-create 'item
2024-01-01 13:10:45 +01:00
(format-check-simple-past)))
2023-12-31 15:39:31 +01:00
;; Separator
2024-01-01 13:10:45 +01:00
(insert "\nPast participle ➡️ ")
2023-12-31 15:39:31 +01:00
;; Past participle
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-field-past-participle (widget-create 'editable-field
2023-12-31 15:39:31 +01:00
:size 8
:help-echo "Type a Past participle"))
2024-01-01 13:10:45 +01:00
;; Label check
(insert " ")
2024-01-02 16:33:02 +01:00
(setq learning-irregular-verbs-in-English--widget-label-check-past-participle (widget-create 'item
2024-01-01 13:10:45 +01:00
(format-check-past-participle)))
2023-12-31 15:39:31 +01:00
;; Separator
2024-01-01 20:39:40 +01:00
(insert "\n")
2023-12-31 15:39:31 +01:00
;; Check button
2024-01-01 20:39:40 +01:00
(make-button-check)
2023-12-31 15:39:31 +01:00
;; Display the buffer
(use-local-map widget-keymap)
(widget-setup))
;; Keybindings
(define-key widget-keymap (kbd "q") 'kill-app)
;; Init
(main-layout)
2024-01-01 13:10:45 +01:00
(start)
2024-01-02 16:18:41 +01:00
(widget-backward 1)))
2023-12-31 10:00:33 +01:00
(provide 'learning-irregular-verbs-in-English)
;;; learning-irregular-verbs-in-English.el ends here