anki_record 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +13 -2
  3. data/CHANGELOG.md +37 -9
  4. data/Gemfile +3 -1
  5. data/Gemfile.lock +10 -2
  6. data/README.md +120 -35
  7. data/anki_record.gemspec +1 -5
  8. data/lib/anki_record/anki_package/anki_package.rb +237 -0
  9. data/lib/anki_record/card/card.rb +108 -0
  10. data/lib/anki_record/card/card_attributes.rb +39 -0
  11. data/lib/anki_record/card_template/card_template.rb +64 -0
  12. data/lib/anki_record/card_template/card_template_attributes.rb +69 -0
  13. data/lib/anki_record/collection/collection.rb +182 -0
  14. data/lib/anki_record/collection/collection_attributes.rb +35 -0
  15. data/lib/anki_record/database_setup_constants.rb +88 -0
  16. data/lib/anki_record/deck/deck.rb +99 -0
  17. data/lib/anki_record/deck/deck_attributes.rb +30 -0
  18. data/lib/anki_record/deck/deck_defaults.rb +19 -0
  19. data/lib/anki_record/{deck_options_group.rb → deck_options_group/deck_options_group.rb} +12 -31
  20. data/lib/anki_record/deck_options_group/deck_options_group_attributes.rb +23 -0
  21. data/lib/anki_record/helpers/checksum_helper.rb +10 -11
  22. data/lib/anki_record/helpers/data_query_helper.rb +15 -0
  23. data/lib/anki_record/helpers/shared_constants_helper.rb +6 -6
  24. data/lib/anki_record/helpers/time_helper.rb +18 -13
  25. data/lib/anki_record/note/note.rb +178 -0
  26. data/lib/anki_record/note/note_attributes.rb +56 -0
  27. data/lib/anki_record/note_field/note_field.rb +62 -0
  28. data/lib/anki_record/note_field/note_field_attributes.rb +39 -0
  29. data/lib/anki_record/note_field/note_field_defaults.rb +19 -0
  30. data/lib/anki_record/note_type/note_type.rb +161 -0
  31. data/lib/anki_record/note_type/note_type_attributes.rb +80 -0
  32. data/lib/anki_record/note_type/note_type_defaults.rb +38 -0
  33. data/lib/anki_record/version.rb +1 -1
  34. data/lib/anki_record.rb +1 -16
  35. metadata +26 -16
  36. data/lib/anki_record/anki_package.rb +0 -194
  37. data/lib/anki_record/card.rb +0 -75
  38. data/lib/anki_record/card_template.rb +0 -105
  39. data/lib/anki_record/collection.rb +0 -105
  40. data/lib/anki_record/db/anki_schema_definition.rb +0 -77
  41. data/lib/anki_record/db/clean_collection21_record.rb +0 -10
  42. data/lib/anki_record/db/clean_collection2_record.rb +0 -10
  43. data/lib/anki_record/deck.rb +0 -101
  44. data/lib/anki_record/note.rb +0 -135
  45. data/lib/anki_record/note_field.rb +0 -84
  46. data/lib/anki_record/note_type.rb +0 -233
@@ -1,84 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # TODO: raise exceptions on invalid assignment to prevent downstream errors and specs for the writeable attributes
4
- # TODO: All instance variables should at least be readable
5
-
6
- require "pry"
7
-
8
- module AnkiRecord
9
- ##
10
- # NoteField represents a field of an Anki note type
11
- class NoteField
12
- DEFAULT_FIELD_FONT_STYLE = "Arial"
13
- DEFAULT_FIELD_FONT_SIZE = 20
14
- DEFAULT_FIELD_DESCRIPTION = ""
15
- private_constant :DEFAULT_FIELD_FONT_STYLE, :DEFAULT_FIELD_FONT_SIZE, :DEFAULT_FIELD_DESCRIPTION
16
-
17
- ##
18
- # The note type that the note field belongs to
19
- attr_reader :note_type
20
-
21
- ##
22
- # The name of the note field
23
- attr_accessor :name
24
-
25
- ##
26
- # A boolean that indicates if this field is sticky when adding cards of the note type in Anki
27
- attr_accessor :sticky
28
-
29
- ##
30
- # A boolean that indicates if this field should be right to left
31
- attr_accessor :right_to_left
32
-
33
- ##
34
- # The font style used when editing the note field
35
- attr_accessor :font_style
36
-
37
- ##
38
- # The font size used when editing the note field
39
- attr_accessor :font_size
40
-
41
- ##
42
- # The description of the note field
43
- attr_accessor :description
44
-
45
- ##
46
- # 0 for the first field of the note type, 1 for the second, etc.
47
- attr_reader :ordinal_number
48
-
49
- ##
50
- # Instantiates a new field for the given note type
51
- def initialize(note_type:, name: nil, args: nil)
52
- raise ArgumentError unless (name && args.nil?) || (args && args["name"])
53
-
54
- @note_type = note_type
55
- if args
56
- setup_note_field_instance_variables_from_existing(args: args)
57
- else
58
- setup_note_field_instance_variables(name: name)
59
- end
60
- end
61
-
62
- private
63
-
64
- def setup_note_field_instance_variables_from_existing(args:)
65
- @name = args["name"]
66
- @ordinal_number = args["ord"]
67
- @sticky = args["sticky"]
68
- @right_to_left = args["rtl"]
69
- @font_style = args["font"]
70
- @font_size = args["size"]
71
- @description = args["description"]
72
- end
73
-
74
- def setup_note_field_instance_variables(name:)
75
- @name = name
76
- @ordinal_number = @note_type.fields.length
77
- @sticky = false
78
- @right_to_left = false
79
- @font_style = DEFAULT_FIELD_FONT_STYLE
80
- @font_size = DEFAULT_FIELD_FONT_SIZE
81
- @description = DEFAULT_FIELD_DESCRIPTION
82
- end
83
- end
84
- end
@@ -1,233 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "pry"
4
-
5
- require_relative "card_template"
6
- require_relative "helpers/shared_constants_helper"
7
- require_relative "helpers/time_helper"
8
- require_relative "note_field"
9
-
10
- module AnkiRecord
11
- ##
12
- # NoteType represents an Anki note type (also called a model)
13
- class NoteType
14
- include AnkiRecord::SharedConstantsHelper
15
- include AnkiRecord::TimeHelper
16
- NEW_NOTE_TYPE_SORT_FIELD = 0
17
- private_constant :NEW_NOTE_TYPE_SORT_FIELD
18
-
19
- ##
20
- # The collection object that the note type belongs to
21
- attr_reader :collection
22
-
23
- ##
24
- # The id of the note type
25
- attr_reader :id
26
-
27
- ##
28
- # The name of the note type
29
- attr_accessor :name
30
-
31
- ##
32
- # A boolean that indicates if this note type is a cloze-deletion note type
33
- attr_accessor :cloze
34
-
35
- ##
36
- # The CSS styling of the note type
37
- attr_reader :css
38
-
39
- ##
40
- # The LaTeX preamble of the note type
41
- attr_reader :latex_preamble
42
-
43
- ##
44
- # The LaTeX postamble of the note type
45
- attr_reader :latex_postamble
46
-
47
- ##
48
- # A boolean probably related to something with LaTeX and SVG.
49
- #
50
- # TODO: Investigate what this does
51
- attr_reader :latex_svg
52
-
53
- ##
54
- # An array of the card template objects belonging to the note type
55
- attr_reader :card_templates
56
-
57
- ##
58
- # An array of the field names of the card template
59
- attr_reader :fields
60
-
61
- ##
62
- # TODO: Investigate the meaning of the deck id of a note type
63
- attr_reader :deck_id
64
-
65
- ##
66
- # TODO: Investigate the meaning of tags of a note type
67
- attr_reader :tags
68
-
69
- ##
70
- # Instantiates a new note type
71
- def initialize(collection:, name: nil, cloze: false, args: nil)
72
- raise ArgumentError unless (name && args.nil?) || (args && args["name"])
73
-
74
- @collection = collection
75
-
76
- if args
77
- setup_note_type_instance_variables_from_existing(args: args)
78
- else
79
- setup_note_type_instance_variables(name: name, cloze: cloze)
80
- end
81
- end
82
-
83
- ##
84
- # Creates a new field and adds it to this note type's fields
85
- #
86
- # The field is an instance of AnkiRecord::NoteField
87
- def new_note_field(name:)
88
- # TODO: Raise an exception if the name is already used by a field in this note type
89
- note_field = AnkiRecord::NoteField.new(note_type: self, name: name)
90
- @fields << note_field
91
- note_field
92
- end
93
-
94
- ##
95
- # Create a new card template and adds it to this note type's templates
96
- #
97
- # The card template is an instance of AnkiRecord::CardTemplate
98
- def new_card_template(name:)
99
- # TODO: Raise an exception if the name is already used by a template in this note type
100
- card_template = AnkiRecord::CardTemplate.new(note_type: self, name: name)
101
- @card_templates << card_template
102
- card_template
103
- end
104
-
105
- ##
106
- # Find one of the note type's card templates by name
107
- def find_card_template_by(name:)
108
- card_templates.find { |template| template.name == name }
109
- end
110
-
111
- ##
112
- # The field names of the note type ordered by their ordinal values
113
- def field_names_in_order
114
- @fields.sort_by(&:ordinal_number).map(&:name)
115
- end
116
-
117
- ##
118
- # The allowed field names of the note in snake_case
119
- #
120
- # TODO: make this more robust... what happens when the note type name has non-alphabetic characters?
121
- def snake_case_field_names
122
- field_names_in_order.map { |field_name| field_name.downcase.gsub(" ", "_") }
123
- end
124
-
125
- ##
126
- # The name of the field used to sort notes of the note type in the Anki browser
127
- def sort_field_name
128
- @fields.find { |field| field.ordinal_number == @sort_field }&.name
129
- end
130
-
131
- ##
132
- # The name of the sort field in snake_case
133
- def snake_case_sort_field_name
134
- sort_field_name.downcase.gsub(" ", "_")
135
- end
136
-
137
- ##
138
- # The allowed field_name values in {{field_name}} of the note type's card templates' question format
139
- #
140
- # These are the note type's fields' names, and if the note type is a cloze type,
141
- # these also include the note type's fields' names prepended with 'cloze:'.
142
- #
143
- # TODO: research if other special field names like e.g. 'FrontSide' are allowed
144
- def allowed_card_template_question_format_field_names
145
- allowed = field_names_in_order
146
- cloze ? allowed + field_names_in_order.map { |field_name| "cloze:#{field_name}" } : allowed
147
- end
148
-
149
- ##
150
- # The allowed field_name values in {{field_name}} of the note type's card templates' answer format
151
- #
152
- # These are the note type's fields' names, and if the note type is a cloze type,
153
- # these also include the note type's fields' names prepended with 'cloze:'.
154
- #
155
- # TODO: research if other special field names like e.g. 'FrontSide' are allowed
156
- def allowed_card_template_answer_format_field_names
157
- allowed_card_template_question_format_field_names + ["FrontSide"]
158
- end
159
-
160
- private
161
-
162
- # rubocop:disable Metrics/MethodLength
163
- # rubocop:disable Metrics/AbcSize
164
- def setup_note_type_instance_variables_from_existing(args:)
165
- @id = args["id"]
166
- @name = args["name"]
167
- @cloze = args["type"] == 1
168
- @last_modified_time = args["mod"]
169
- @usn = args["usn"]
170
- @sort_field = args["sortf"]
171
- @deck_id = args["did"]
172
- @fields = args["flds"].map { |fld| NoteField.new(note_type: self, args: fld) }
173
- @card_templates = args["tmpls"].map { |tmpl| CardTemplate.new(note_type: self, args: tmpl) }
174
- @css = args["css"]
175
- @latex_preamble = args["latexPre"]
176
- @latex_postamble = args["latexPost"]
177
- @latex_svg = args["latexsvg"]
178
- @req = args["req"]
179
- @tags = args["tags"]
180
- @vers = args["vers"]
181
- end
182
- # rubocop:enable Metrics/MethodLength
183
- # rubocop:enable Metrics/AbcSize
184
-
185
- # rubocop:disable Metrics/MethodLength
186
- def setup_note_type_instance_variables(name:, cloze:)
187
- @id = milliseconds_since_epoch
188
- @name = name
189
- @cloze = cloze
190
- @last_modified_time = seconds_since_epoch
191
- @usn = NEW_OBJECT_USN
192
- @sort_field = NEW_NOTE_TYPE_SORT_FIELD
193
- @deck_id = nil
194
- @fields = []
195
- @card_templates = []
196
- @css = default_css
197
- @latex_preamble = default_latex_preamble
198
- @latex_postamble = default_latex_postamble
199
- @latex_svg = false
200
- @req = nil
201
- @tags = []
202
- @vers = []
203
- end
204
- # rubocop:enable Metrics/MethodLength
205
-
206
- def default_css
207
- <<-CSS
208
- .card {
209
- color: black;
210
- background-color: transparent;
211
- text-align: center;
212
- }
213
- CSS
214
- end
215
-
216
- def default_latex_preamble
217
- <<-LATEX_PRE
218
- \\documentclass[12pt]{article}
219
- \\special{papersize=3in,5in}
220
- \\usepackage{amssymb,amsmath}
221
- \\pagestyle{empty}
222
- \\setlength{\\parindent}{0in}
223
- \\begin{document}
224
- LATEX_PRE
225
- end
226
-
227
- def default_latex_postamble
228
- <<-LATEX_POST
229
- \\end{document}
230
- LATEX_POST
231
- end
232
- end
233
- end