ankirb 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/ankirb.gemspec +2 -0
- data/lib/ankirb/anki/card.rb +67 -0
- data/lib/ankirb/anki/deck.rb +0 -16
- data/lib/ankirb/anki/media.rb +15 -0
- data/lib/ankirb/export/apkg.rb +18 -6
- data/lib/ankirb/util/media_manager.rb +28 -0
- data/lib/ankirb/version.rb +1 -1
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0590f9a5bb353ee322d8c2b465c5dabd26dae92d
|
4
|
+
data.tar.gz: 8ad2652a4483b9914be1ad9a673f6741671c7739
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6451de0883d1580cdee90532299bbbcfce158637911a5763ec69a9fd8ad6aa0c626d3ba88677379312c31c286ca59743ca3e83015f8c84e389fe5c5366843add
|
7
|
+
data.tar.gz: bcbbf81515ee5576554ca1540431fb1d9cde1509dd2ad889f5f63fa610e163c2a05daa034fb7e9d3e1f84673447ebd8268da30c2d9ae5d3cf4b29de6c60f300c
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# ankirb
|
2
2
|
|
3
|
-
[](https://badge.fury.io/rb/ankirb)
|
3
|
+
[](https://badge.fury.io/rb/ankirb) [](https://travis-ci.org/rkachowski/anki-rb)
|
4
4
|
|
5
5
|
A basic gem to create [Anki](http://ankisrs.net/) decks (.apkg)
|
6
6
|
|
@@ -25,8 +25,9 @@ Or install it yourself as:
|
|
25
25
|
```ruby
|
26
26
|
require 'ankirb'
|
27
27
|
|
28
|
+
card = Anki::Card.new(:front=>"What is the french for cheese omelette?", :back=>"Omelette au fromage")
|
28
29
|
deck = Anki::Deck.new 'FancyExampleDeck'
|
29
|
-
deck.add_card
|
30
|
+
deck.add_card card
|
30
31
|
|
31
32
|
Anki::apkg.export deck, "~/Anki/Decks" #export to ~/Anki/Decks/FancyExampleDeck.apkg
|
32
33
|
```
|
data/ankirb.gemspec
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
module Anki
|
2
|
+
class Card
|
3
|
+
attr_accessor :tags, :deck
|
4
|
+
attr_reader :id
|
5
|
+
|
6
|
+
|
7
|
+
def initialize options={}
|
8
|
+
@front = CardFace.new(options[:front] || '')
|
9
|
+
@back = CardFace.new(options[:back] || '')
|
10
|
+
@tags = options[:tags] || []
|
11
|
+
|
12
|
+
@id = Time.now.to_i
|
13
|
+
end
|
14
|
+
|
15
|
+
def front
|
16
|
+
@front
|
17
|
+
end
|
18
|
+
|
19
|
+
def back
|
20
|
+
@back
|
21
|
+
end
|
22
|
+
|
23
|
+
def has_media?
|
24
|
+
!@front.media.empty? or !back.media.empty?
|
25
|
+
end
|
26
|
+
def front= value
|
27
|
+
@front.content = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def back= value
|
31
|
+
@back.content = value
|
32
|
+
end
|
33
|
+
|
34
|
+
alias :question :front
|
35
|
+
alias :question= :front=
|
36
|
+
alias :answer :back
|
37
|
+
alias :answer= :back=
|
38
|
+
end
|
39
|
+
|
40
|
+
class CardFace
|
41
|
+
attr_accessor :content, :media
|
42
|
+
|
43
|
+
def initialize content
|
44
|
+
@content = content
|
45
|
+
@media = []
|
46
|
+
scan_content_for_media
|
47
|
+
end
|
48
|
+
|
49
|
+
def << thing
|
50
|
+
if File.exists?(thing)
|
51
|
+
@media << thing
|
52
|
+
else
|
53
|
+
@content << thing
|
54
|
+
scan_content_for_media
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
@content
|
60
|
+
end
|
61
|
+
private
|
62
|
+
|
63
|
+
def scan_content_for_media
|
64
|
+
#todo: check if content contains a media reference and apply that
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/ankirb/anki/deck.rb
CHANGED
@@ -24,23 +24,7 @@ module Anki
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
class Card
|
28
|
-
attr_accessor :front, :back, :tags, :deck
|
29
|
-
attr_reader :id
|
30
27
|
|
31
|
-
@@defaults = {
|
32
|
-
:front => 'Card Front',
|
33
|
-
:back => 'Card Back'
|
34
|
-
}
|
35
|
-
|
36
|
-
def initialize options={}
|
37
|
-
@front = options[:front] || @@defaults[:front]
|
38
|
-
@back = options[:back] || @@defaults[:back]
|
39
|
-
@tags = options[:tags] || []
|
40
|
-
|
41
|
-
@id = Time.now.to_i
|
42
|
-
end
|
43
|
-
end
|
44
28
|
|
45
29
|
class Type
|
46
30
|
def self.new_type
|
data/lib/ankirb/export/apkg.rb
CHANGED
@@ -2,6 +2,7 @@ require 'zip'
|
|
2
2
|
require 'json'
|
3
3
|
require 'fileutils'
|
4
4
|
require 'base91'
|
5
|
+
|
5
6
|
module Anki
|
6
7
|
|
7
8
|
SCHEMA_VERSION = 11 unless const_defined?(:SCHEMA_VERSION)
|
@@ -13,8 +14,8 @@ module Anki
|
|
13
14
|
Dir.chdir(dir) do
|
14
15
|
db = DB.create 'collection.anki2'
|
15
16
|
|
16
|
-
export_deck deck, db
|
17
17
|
export_media deck
|
18
|
+
export_deck deck, db
|
18
19
|
filename = deck.name + '.apkg'
|
19
20
|
archive = Zip::File.open(filename, Zip::File::CREATE)
|
20
21
|
|
@@ -31,8 +32,19 @@ module Anki
|
|
31
32
|
|
32
33
|
private
|
33
34
|
def self.export_media deck
|
34
|
-
|
35
|
-
|
35
|
+
media_cards = deck.cards.select{|c| c.has_media? }
|
36
|
+
faces_with_media = media_cards.reduce([]){|arr,c| arr.push(c.front,c.back)}.select{|f|!f.media.empty?}
|
37
|
+
media ={}
|
38
|
+
|
39
|
+
faces_with_media.each do |face|
|
40
|
+
face.media.each do |media_reference|
|
41
|
+
#face << MediaManager.get_tag_for(media_reference)
|
42
|
+
FileUtils.cp media_reference, media.length.to_s
|
43
|
+
media[media.size.to_s] = File.basename(media_reference)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
File.open('media', 'w'){|f| f << media.to_json }
|
36
48
|
end
|
37
49
|
|
38
50
|
def self.export_deck deck, db
|
@@ -61,8 +73,8 @@ module Anki
|
|
61
73
|
|
62
74
|
deck.cards.each do |card|
|
63
75
|
#flds is front and back of card separated by \xf1
|
64
|
-
flds_bytes = [card.front, card.back].map{|f|f.bytes}.insert(1, 'f1'.hex)
|
65
|
-
flds = flds_bytes.flatten.pack('
|
76
|
+
flds_bytes = [card.front.content, card.back.content].map{|f|f.bytes}.insert(1, 'f1'.hex)
|
77
|
+
flds = flds_bytes.flatten.pack('U*')
|
66
78
|
|
67
79
|
note = {
|
68
80
|
:id => Time.now.to_i,
|
@@ -72,7 +84,7 @@ module Anki
|
|
72
84
|
:usn => -1,
|
73
85
|
:tags => nil,
|
74
86
|
:flds => flds,
|
75
|
-
:sfld => card.front.gsub(/<\/?[^>]*>/, ''), #v dirty html sanitization
|
87
|
+
:sfld => card.front.content.gsub(/<\/?[^>]*>/, ''), #v dirty html sanitization
|
76
88
|
:csum => 0,
|
77
89
|
:flags => 0,
|
78
90
|
:data => nil
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'mimemagic'
|
2
|
+
module Anki
|
3
|
+
class MediaManager
|
4
|
+
|
5
|
+
|
6
|
+
def self.get_tag_for filepath
|
7
|
+
media = MimeMagic.by_magic(File.open(filepath))
|
8
|
+
case
|
9
|
+
when media.image?
|
10
|
+
when media.video?
|
11
|
+
when media.audio?
|
12
|
+
" [sound:#{File.basename(filepath)}]"
|
13
|
+
else
|
14
|
+
raise "Unknown media type - #{filepath}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.valid_media? filepath
|
19
|
+
media = MimeMagic.by_magic(File.open(filepath))
|
20
|
+
if media.image? or media.video? or media.audio?
|
21
|
+
true
|
22
|
+
else
|
23
|
+
false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/ankirb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ankirb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Donald Hutchison
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: mimemagic
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.3'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.3'
|
111
125
|
description: A library that lets you export apkg packaged decks for Anki. Designed
|
112
126
|
to deal with creation / exporting and not much else
|
113
127
|
email:
|
@@ -124,10 +138,13 @@ files:
|
|
124
138
|
- Rakefile
|
125
139
|
- ankirb.gemspec
|
126
140
|
- lib/ankirb.rb
|
141
|
+
- lib/ankirb/anki/card.rb
|
127
142
|
- lib/ankirb/anki/deck.rb
|
143
|
+
- lib/ankirb/anki/media.rb
|
128
144
|
- lib/ankirb/export/apkg.rb
|
129
145
|
- lib/ankirb/export/db.rb
|
130
146
|
- lib/ankirb/export/defaults.rb
|
147
|
+
- lib/ankirb/util/media_manager.rb
|
131
148
|
- lib/ankirb/version.rb
|
132
149
|
homepage: https://github.com/rkachowski/anki-rb
|
133
150
|
licenses:
|