blob: 28f1addeaa04f2012daf117bd0919fa50bb9405a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
(require 'cl-macs)
(require 'ht)
(require 'seq)
(require 's)
;; Type definitions for Russian structures
(cl-defstruct russian-word
"Definition and metadata of a single Russian word."
(word nil :type string)
(translations :type list
:documentation "List of lists of strings, each a set of translations.")
(notes nil :type list ;; of string
:documentation "free-form notes about this word")
(roots nil :type list ;; of string
:documentation "list of strings that correspond with roots (exact string match)"))
(defun russian--merge-words (previous new)
"Merge two Russian word definitions together. If no previous
definition exists, only the new one will be returned."
(if (not previous) new
(cl-assert (equal (russian-word-word previous)
(russian-word-word new))
"different words passed into merge function")
(make-russian-word :word (russian-word-word previous)
:translations (-concat (russian-word-translations previous)
(russian-word-translations new))
:notes (-concat (russian-word-notes previous)
(russian-word-notes new))
:roots (-concat (russian-word-roots previous)
(russian-word-roots new)))))
;; Definitions for creating a data structure of all Russian words.
(defvar russian-words (make-hash-table)
"Table of all Russian words in the corpus.")
(defun russian--define-word (word)
"Define a single word in the corpus, optionally merging it with
another entry."
(let ((key (russian-word-word word)))
(ht-set russian-words key (russian--merge-words
(ht-get russian-words key)
word))))
(defmacro define-russian-words (&rest words)
"Define the list of all available words. There may be more than
one entry for a word in some cases."
(declare (indent defun))
;; Clear the table before proceeding with insertion
(setq russian-words (make-hash-table))
(seq-map
(lambda (word)
(russian--define-word (make-russian-word :word (car word)
:translations (cadr word)
:notes (caddr word)
:roots (cadddr word))))
words)
'(message "Defined %s unique words." (ht-size russian-words)))
;; Helpers to train Russian words through passively.
(defun russian--format-word (word)
"Format a Russian word suitable for echo display."
(apply #'s-concat
(-flatten
(list (russian-word-word word)
" - "
(s-join ", " (russian-word-translations word))
(when-let ((roots (russian-word-roots word)))
(list " [" (s-join ", " roots) "]"))
(when-let ((notes (russian-word-notes word)))
(list " (" (s-join "; " notes) ")"))))))
(defun display-russian-words ()
"Convert Russian words to passively terms and start passively."
(interactive)
(setq passively-learn-terms (make-hash-table))
(ht-map
(lambda (k v)
(ht-set passively-learn-terms k (russian--format-word v)))
russian-words)
(passively-enable))
(defun lookup-last-russian-word (in-eww)
"Look up the last Russian word in Wiktionary"
(interactive "P")
(let ((url (concat "https://ru.wiktionary.org/wiki/" passively-last-displayed)))
(if in-eww (eww url)
(browse-url url))))
(provide 'russian)
|