anki_record 0.1.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -0
  3. data/CHANGELOG.md +33 -4
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +5 -3
  6. data/README.md +147 -11
  7. data/anki_record.gemspec +2 -6
  8. data/lib/anki_record/anki_package/anki_package.rb +245 -0
  9. data/lib/anki_record/anki_package/database_setup_constants.rb +91 -0
  10. data/lib/anki_record/card/card.rb +108 -0
  11. data/lib/anki_record/card/card_attributes.rb +39 -0
  12. data/lib/anki_record/{card_template.rb → card_template/card_template.rb} +20 -47
  13. data/lib/anki_record/card_template/card_template_attributes.rb +69 -0
  14. data/lib/anki_record/collection/collection.rb +180 -0
  15. data/lib/anki_record/collection/collection_attributes.rb +35 -0
  16. data/lib/anki_record/deck/deck.rb +101 -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} +10 -23
  20. data/lib/anki_record/deck_options_group/deck_options_group_attributes.rb +23 -0
  21. data/lib/anki_record/helpers/checksum_helper.rb +17 -0
  22. data/lib/anki_record/helpers/data_query_helper.rb +13 -0
  23. data/lib/anki_record/helpers/shared_constants_helper.rb +1 -3
  24. data/lib/anki_record/helpers/time_helper.rb +7 -5
  25. data/lib/anki_record/note/note.rb +181 -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 -15
  35. metadata +32 -20
  36. data/.rdoc_options +0 -27
  37. data/lib/anki_record/anki_package.rb +0 -183
  38. data/lib/anki_record/collection.rb +0 -65
  39. data/lib/anki_record/db/anki_schema_definition.rb +0 -77
  40. data/lib/anki_record/db/clean_collection21_record.rb +0 -10
  41. data/lib/anki_record/db/clean_collection2_record.rb +0 -10
  42. data/lib/anki_record/deck.rb +0 -88
  43. data/lib/anki_record/note_field.rb +0 -63
  44. data/lib/anki_record/note_type.rb +0 -147
@@ -1,77 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnkiRecord
4
- ANKI_SCHEMA_DEFINITION = <<~SQL # :nodoc:
5
- CREATE TABLE col (
6
- id integer PRIMARY KEY,
7
- crt integer NOT NULL,
8
- mod integer NOT NULL,
9
- scm integer NOT NULL,
10
- ver integer NOT NULL,
11
- dty integer NOT NULL,
12
- usn integer NOT NULL,
13
- ls integer NOT NULL,
14
- conf text NOT NULL,
15
- models text NOT NULL,
16
- decks text NOT NULL,
17
- dconf text NOT NULL,
18
- tags text NOT NULL
19
- );
20
- CREATE TABLE notes (
21
- id integer PRIMARY KEY,
22
- guid text NOT NULL,
23
- mid integer NOT NULL,
24
- mod integer NOT NULL,
25
- usn integer NOT NULL,
26
- tags text NOT NULL,
27
- flds text NOT NULL,
28
- sfld integer NOT NULL,
29
- csum integer NOT NULL,
30
- flags integer NOT NULL,
31
- data text NOT NULL
32
- );
33
- CREATE TABLE cards (
34
- id integer PRIMARY KEY,
35
- nid integer NOT NULL,
36
- did integer NOT NULL,
37
- ord integer NOT NULL,
38
- mod integer NOT NULL,
39
- usn integer NOT NULL,
40
- type integer NOT NULL,
41
- queue integer NOT NULL,
42
- due integer NOT NULL,
43
- ivl integer NOT NULL,
44
- factor integer NOT NULL,
45
- reps integer NOT NULL,
46
- lapses integer NOT NULL,
47
- left integer NOT NULL,
48
- odue integer NOT NULL,
49
- odid integer NOT NULL,
50
- flags integer NOT NULL,
51
- data text NOT NULL
52
- );
53
- CREATE TABLE revlog (
54
- id integer PRIMARY KEY,
55
- cid integer NOT NULL,
56
- usn integer NOT NULL,
57
- ease integer NOT NULL,
58
- ivl integer NOT NULL,
59
- lastIvl integer NOT NULL,
60
- factor integer NOT NULL,
61
- time integer NOT NULL,
62
- type integer NOT NULL
63
- );
64
- CREATE INDEX ix_notes_usn ON notes (usn);
65
- CREATE INDEX ix_cards_usn ON cards (usn);
66
- CREATE INDEX ix_revlog_usn ON revlog (usn);
67
- CREATE INDEX ix_cards_nid ON cards (nid);
68
- CREATE INDEX ix_cards_sched ON cards (did, queue, due);
69
- CREATE INDEX ix_revlog_cid ON revlog (cid);
70
- CREATE INDEX ix_notes_csum ON notes (csum);
71
- CREATE TABLE graves (
72
- usn integer NOT NULL,
73
- oid integer NOT NULL,
74
- type integer NOT NULL
75
- );
76
- SQL
77
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnkiRecord
4
- ##
5
- # This is the SQL insert statement (as a Ruby string/here document) for the
6
- # default col record in the collection.anki21 database exported from a new Anki 2.1.54 profile
7
- CLEAN_COLLECTION_21_RECORD = <<~SQL
8
- INSERT INTO col VALUES(1,1676883600,0,1676902364657,11,0,0,0,'{"activeDecks":[1],"curDeck":1,"nextPos":1,"schedVer":2,"sortType":"noteFld","estTimes":true,"collapseTime":1200,"dayLearnFirst":false,"curModel":1676902364661,"sortBackwards":false,"newSpread":0,"creationOffset":300,"timeLim":0,"addToCur":true,"dueCounts":true}','{"1676902364664":{"id":1676902364664,"name":"Basic (type in the answer)","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}\\n\\n{{type:Back}}","afmt":"{{Front}}\\n\\n<hr id=answer>\\n\\n{{type:Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0,1]]]},"1676902364663":{"id":1676902364663,"name":"Basic (optional reversed card)","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0},{"name":"Card 2","ord":1,"qfmt":"{{#Add Reverse}}{{Back}}{{/Add Reverse}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Front}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Add Reverse","ord":2,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]],[1,"all",[1,2]]]},"1676902364665":{"id":1676902364665,"name":"Cloze","type":1,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Cloze","ord":0,"qfmt":"{{cloze:Text}}","afmt":"{{cloze:Text}}<br>\\n{{Back Extra}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Text","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back Extra","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n.cloze {\\n font-weight: bold;\\n color: blue;\\n}\\n.nightMode .cloze {\\n color: lightblue;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]]]},"1676902364661":{"id":1676902364661,"name":"Basic","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]]]},"1676902364662":{"id":1676902364662,"name":"Basic (and reversed card)","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0},{"name":"Card 2","ord":1,"qfmt":"{{Back}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Front}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]],[1,"any",[1]]]}}','{"1":{"id":1,"mod":0,"name":"Default","usn":0,"lrnToday":[0,0],"revToday":[0,0],"newToday":[0,0],"timeToday":[0,0],"collapsed":true,"browserCollapsed":true,"desc":"","dyn":0,"conf":1,"extendNew":0,"extendRev":0}}','{"1":{"id":1,"mod":0,"name":"Default","usn":0,"maxTaken":60,"autoplay":true,"timer":0,"replayq":true,"new":{"bury":false,"delays":[1.0,10.0],"initialFactor":2500,"ints":[1,4,0],"order":1,"perDay":20},"rev":{"bury":false,"ease4":1.3,"ivlFct":1.0,"maxIvl":36500,"perDay":200,"hardFactor":1.2},"lapse":{"delays":[10.0],"leechAction":1,"leechFails":8,"minInt":1,"mult":0.0},"dyn":false,"newMix":0,"newPerDayMinimum":0,"interdayLearningMix":0,"reviewOrder":0,"newSortOrder":0,"newGatherPriority":0,"buryInterdayLearning":false}}','{}');
9
- SQL
10
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnkiRecord
4
- ##
5
- # This is the SQL insert statement (as a Ruby string/here document) for the
6
- # default col record in the collection.anki2 database exported from a new Anki 2.1.54 profile
7
- CLEAN_COLLECTION_2_RECORD = <<~SQL
8
- INSERT INTO col VALUES(1,1676883600,1676902390012,1676902390005,11,0,0,0,'{"addToCur":true,"_deck_1_lastNotetype":1676902390008,"nextPos":2,"sortType":"noteFld","newSpread":0,"schedVer":2,"collapseTime":1200,"estTimes":true,"curDeck":1,"creationOffset":300,"dayLearnFirst":false,"timeLim":0,"activeDecks":[1],"sortBackwards":false,"_nt_1676902390008_lastDeck":1,"curModel":1676902390008,"dueCounts":true}','{"1676902390010":{"id":1676902390010,"name":"Basic (optional reversed card)","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0},{"name":"Card 2","ord":1,"qfmt":"{{#Add Reverse}}{{Back}}{{/Add Reverse}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Front}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Add Reverse","ord":2,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]],[1,"all",[1,2]]]},"1676902390009":{"id":1676902390009,"name":"Basic (and reversed card)","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0},{"name":"Card 2","ord":1,"qfmt":"{{Back}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Front}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]],[1,"any",[1]]]},"1676902390008":{"id":1676902390008,"name":"Basic","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}","afmt":"{{FrontSide}}\\n\\n<hr id=answer>\\n\\n{{Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]]]},"1676902390011":{"id":1676902390011,"name":"Basic (type in the answer)","type":0,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Card 1","ord":0,"qfmt":"{{Front}}\\n\\n{{type:Back}}","afmt":"{{Front}}\\n\\n<hr id=answer>\\n\\n{{type:Back}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Front","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0,1]]]},"1676902390012":{"id":1676902390012,"name":"Cloze","type":1,"mod":0,"usn":0,"sortf":0,"did":null,"tmpls":[{"name":"Cloze","ord":0,"qfmt":"{{cloze:Text}}","afmt":"{{cloze:Text}}<br>\\n{{Back Extra}}","bqfmt":"","bafmt":"","did":null,"bfont":"","bsize":0}],"flds":[{"name":"Text","ord":0,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""},{"name":"Back Extra","ord":1,"sticky":false,"rtl":false,"font":"Arial","size":20,"description":""}],"css":".card {\\n font-family: arial;\\n font-size: 20px;\\n text-align: center;\\n color: black;\\n background-color: white;\\n}\\n.cloze {\\n font-weight: bold;\\n color: blue;\\n}\\n.nightMode .cloze {\\n color: lightblue;\\n}\\n","latexPre":"\\\\documentclass[12pt]{article}\\n\\\\special{papersize=3in,5in}\\n\\\\usepackage[utf8]{inputenc}\\n\\\\usepackage{amssymb,amsmath}\\n\\\\pagestyle{empty}\\n\\\\setlength{\\\\parindent}{0in}\\n\\\\begin{document}\\n","latexPost":"\\\\end{document}","latexsvg":false,"req":[[0,"any",[0]]]}}','{"1":{"id":1,"mod":0,"name":"Default","usn":0,"lrnToday":[0,0],"revToday":[0,0],"newToday":[0,0],"timeToday":[0,0],"collapsed":true,"browserCollapsed":true,"desc":"","dyn":0,"conf":1,"extendNew":0,"extendRev":0}}','{"1":{"id":1,"mod":0,"name":"Default","usn":0,"maxTaken":60,"autoplay":true,"timer":0,"replayq":true,"new":{"bury":false,"delays":[1.0,10.0],"initialFactor":2500,"ints":[1,4,0],"order":1,"perDay":20},"rev":{"bury":false,"ease4":1.3,"ivlFct":1.0,"maxIvl":36500,"perDay":200,"hardFactor":1.2},"lapse":{"delays":[10.0],"leechAction":1,"leechFails":8,"minInt":1,"mult":0.0},"dyn":false,"newMix":0,"newPerDayMinimum":0,"interdayLearningMix":0,"reviewOrder":0,"newSortOrder":0,"newGatherPriority":0,"buryInterdayLearning":false}}','{}');
9
- SQL
10
- end
@@ -1,88 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "pry"
4
-
5
- require_relative "helpers/shared_constants_helper"
6
- require_relative "helpers/time_helper"
7
-
8
- # TODO: All instance variables should at least be readable
9
-
10
- module AnkiRecord
11
- ##
12
- # Deck represents an Anki deck
13
- class Deck
14
- include SharedConstantsHelper
15
- include TimeHelper
16
-
17
- DEFAULT_DECK_TODAY_ARRAY = [0, 0].freeze
18
- DEFAULT_COLLAPSED = false
19
-
20
- private_constant :DEFAULT_DECK_TODAY_ARRAY, :DEFAULT_COLLAPSED
21
-
22
- ##
23
- # The name of the deck
24
- attr_accessor :name
25
-
26
- ##
27
- # The description of the deck
28
- attr_accessor :description
29
-
30
- ##
31
- # One of many attributes that is currently read-only and needs to be documented.
32
- attr_reader :collection, :id, :last_modified_time, :deck_options_group_id
33
-
34
- ##
35
- # Instantiate a new Deck
36
- def initialize(collection:, name: nil, args: nil)
37
- raise ArgumentError unless (name && args.nil?) || (args && args["name"])
38
-
39
- @collection = collection
40
- if args
41
- setup_deck_instance_variables_from_existing(args: args)
42
- else
43
- setup_deck_instance_variables(name: name)
44
- end
45
- end
46
-
47
- private
48
-
49
- # rubocop:disable Metrics/MethodLength
50
- # rubocop:disable Metrics/AbcSize
51
- def setup_deck_instance_variables_from_existing(args:)
52
- @id = args["id"]
53
- @last_modified_time = args["mod"]
54
- @name = args["name"]
55
- @usn = args["usn"]
56
- @learn_today = args["lrnToday"]
57
- @review_today = args["revToday"]
58
- @new_today = args["newToday"]
59
- @time_today = args["timeToday"]
60
- @collapsed_in_main_window = args["collapsed"]
61
- @collapsed_in_browser = args["browserCollapsed"]
62
- @description = args["desc"]
63
- @dyn = args["dyn"]
64
- @deck_options_group_id = args["conf"]
65
- @extend_new = args["extendNew"]
66
- @extend_review = args["extendRev"]
67
- end
68
- # rubocop:enable Metrics/MethodLength
69
- # rubocop:enable Metrics/AbcSize
70
-
71
- # rubocop:disable Metrics/MethodLength
72
- def setup_deck_instance_variables(name:)
73
- @id = milliseconds_since_epoch
74
- @last_modified_time = seconds_since_epoch
75
- @name = name
76
- @usn = NEW_OBJECT_USN
77
- @learn_today = @review_today = @new_today = @time_today = DEFAULT_DECK_TODAY_ARRAY
78
- @collapsed_in_main_window = DEFAULT_COLLAPSED
79
- @collapsed_in_browser = DEFAULT_COLLAPSED
80
- @description = ""
81
- @dyn = NON_FILTERED_DECK_DYN
82
- @deck_options_group_id = nil # TODO
83
- @extend_new = 0
84
- @extend_review = 0
85
- end
86
- # rubocop:enable Metrics/MethodLength
87
- end
88
- end
@@ -1,63 +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 name of the note field
19
- attr_accessor :name
20
-
21
- ##
22
- # One of many attributes that is readable and writeable but needs to be documented
23
- attr_accessor :sticky, :right_to_left, :font_style, :font_size, :description
24
-
25
- ##
26
- # One of many attributes that is currently read-only and needs to be documented.
27
- attr_reader :note_type, :ordinal_number
28
-
29
- ##
30
- # Instantiates a new field for the given note type
31
- def initialize(note_type:, name: nil, args: nil)
32
- raise ArgumentError unless (name && args.nil?) || (args && args["name"])
33
-
34
- @note_type = note_type
35
- if args
36
- setup_note_field_instance_variables_from_existing(args: args)
37
- else
38
- setup_note_field_instance_variables(name: name)
39
- end
40
- end
41
-
42
- private
43
-
44
- def setup_note_field_instance_variables_from_existing(args:)
45
- @name = args["name"]
46
- @ordinal_number = args["ord"]
47
- @sticky = args["sticky"]
48
- @right_to_left = args["rtl"]
49
- @font_style = args["font"]
50
- @font_size = args["size"]
51
- end
52
-
53
- def setup_note_field_instance_variables(name:)
54
- @name = name
55
- @ordinal_number = @note_type.fields.length
56
- @sticky = false
57
- @right_to_left = false
58
- @font_style = DEFAULT_FIELD_FONT_STYLE
59
- @font_size = DEFAULT_FIELD_FONT_SIZE
60
- @description = DEFAULT_FIELD_DESCRIPTION
61
- end
62
- end
63
- end
@@ -1,147 +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
- # TODO: All instance variables should at least be readable
11
-
12
- module AnkiRecord
13
- ##
14
- # NoteType represents an Anki note type (also called a model)
15
- class NoteType
16
- include AnkiRecord::SharedConstantsHelper
17
- include AnkiRecord::TimeHelper
18
- NEW_NOTE_TYPE_SORT_FIELD = 0
19
- private_constant :NEW_NOTE_TYPE_SORT_FIELD
20
-
21
- ##
22
- # The name of this note type
23
- attr_accessor :name
24
-
25
- ##
26
- # true if the note type is a cloze note type and false if it is not
27
- attr_accessor :cloze
28
-
29
- ##
30
- # One of many attributes that is readable and writeable but needs to be documented
31
- attr_accessor :css, :latex_preamble, :latex_postamble, :latex_svg
32
-
33
- ##
34
- # One of many attributes that is currently read-only and needs to be documented.
35
- attr_reader :id, :templates, :fields, :deck_id
36
-
37
- ##
38
- # Instantiates a new note type
39
- def initialize(collection:, name: nil, cloze: false, args: nil)
40
- raise ArgumentError unless (name && args.nil?) || (args && args["name"])
41
-
42
- @collection = collection
43
-
44
- if args
45
- setup_note_type_instance_variables_from_existing(args: args)
46
- else
47
- setup_note_type_instance_variables(
48
- name: name, cloze: cloze
49
- )
50
- end
51
- end
52
-
53
- ##
54
- # Create a new field and adds it to this note type's fields
55
- #
56
- # The field is an instance of AnkiRecord::NoteField
57
- def new_note_field(name:)
58
- # TODO: Check if name already used by a field in this note type
59
- @fields << AnkiRecord::NoteField.new(note_type: self, name: name)
60
- end
61
-
62
- ##
63
- # Create a new card template and adds it to this note type's templates
64
- #
65
- # The card template is an instance of AnkiRecord::CardTemplate
66
- def new_card_template(name:)
67
- # TODO: Check if name already used by a template in this note type
68
- @templates << AnkiRecord::CardTemplate.new(note_type: self, name: name)
69
- end
70
-
71
- private
72
-
73
- # rubocop:disable Metrics/MethodLength
74
- # rubocop:disable Metrics/AbcSize
75
- def setup_note_type_instance_variables_from_existing(args:)
76
- @id = args["id"]
77
- @name = args["name"]
78
- @cloze = args["type"] == 1
79
- @last_modified_time = args["mod"]
80
- @usn = args["usn"]
81
- @sort_field = args["sortf"]
82
- @deck_id = args["did"]
83
- @fields = args["flds"].map { |fld| NoteField.new(note_type: self, args: fld) }
84
- @templates = args["tmpls"].map { |tmpl| CardTemplate.new(note_type: self, args: tmpl) }
85
- @css = args["css"]
86
- @latex_preamble = args["latexPre"]
87
- @latex_postamble = args["latexPost"]
88
- @latex_svg = args["latexsvg"]
89
- @req = args["req"]
90
- @tags = args["tags"]
91
- @vers = args["vers"]
92
- end
93
- # rubocop:enable Metrics/MethodLength
94
- # rubocop:enable Metrics/AbcSize
95
-
96
- # rubocop:disable Metrics/MethodLength
97
- def setup_note_type_instance_variables(name:, cloze:)
98
- @id = milliseconds_since_epoch
99
- @name = name
100
- @cloze = cloze
101
- @last_modified_time = seconds_since_epoch
102
- @usn = NEW_OBJECT_USN
103
- @sort_field = NEW_NOTE_TYPE_SORT_FIELD
104
- @deck_id = nil
105
- @fields = []
106
- @templates = []
107
- @css = default_css
108
- @latex_preamble = default_latex_preamble
109
- @latex_postamble = default_latex_postamble
110
- @latex_svg = false
111
- @req = nil
112
- @tags = []
113
- @vers = []
114
- end
115
- # rubocop:enable Metrics/MethodLength
116
-
117
- # TODO: use constant here
118
- def default_css
119
- <<-CSS
120
- .card {
121
- color: black;
122
- background-color: transparent;
123
- text-align: center;
124
- }
125
- CSS
126
- end
127
-
128
- # TODO: use constant here
129
- def default_latex_preamble
130
- <<-LATEX_PRE
131
- \\documentclass[12pt]{article}
132
- \\special{papersize=3in,5in}
133
- \\usepackage{amssymb,amsmath}
134
- \\pagestyle{empty}
135
- \\setlength{\\parindent}{0in}
136
- \\begin{document}
137
- LATEX_PRE
138
- end
139
-
140
- # TODO: use constant here
141
- def default_latex_postamble
142
- <<-LATEX_POST
143
- \\end{document}
144
- LATEX_POST
145
- end
146
- end
147
- end