Deck: "Physics"
File: "Mechanics.apkg"
Q: What is the formula for the gravitational potential energy $$ U_g $$?
A: $$ U_g = m g h $$ [J].
Q: What is the formula for the spring potential energy $$ U_s $$.
A: $$ U_s = \frac{1}{2} k |x|^2 $$ [J].
#!/usr/bin/env ruby | |
# Usage: | |
# | |
# => brew install imagemagick | |
# => gem install anki2 kramdown rmagick image_optim image_optim_pack | |
# => chmod +x ./anki.rb | |
# => ./anki.rb questions.md | |
require 'rubygems' | |
require 'yaml' | |
require 'anki2' | |
require 'kramdown' | |
require 'rmagick' | |
require 'image_optim' | |
# Transforms `$` into `[$$]` and `[/$$]`. | |
def fences(str) | |
toggle = true | |
str = str.gsub(/\${1}\s{1}/, '[$$] ') | |
str = str.gsub(/\s{1}\${1}/, ' [$$]') | |
while str =~ /\[\${2}\]/ do | |
if toggle | |
str = str.sub(/\[\${2}\]/, '[$$/]') | |
toggle = false | |
else | |
str = str.sub(/\[\${2}\]/, '[/$$]') | |
toggle = true | |
end | |
end | |
str = str.gsub(/\[\${2}\/\]/, '[$$]') | |
end | |
# Markdown to HTML. Known issue: Kramdown ignores `$$` for some reason. | |
def markdown(str) | |
str = str.gsub(/\${2}/, '$') | |
str = Kramdown::Document.new(str).to_html | |
str = fences(str) | |
end | |
# Open the file from command line params | |
file = File.new(ARGV[0], 'r') | |
arr = file.read.split('---') | |
file.close | |
# Read the front matter and media folder | |
meta = YAML.load(arr[0].strip) | |
media = meta['Media'] || '.' | |
@anki = Anki2.new(name: meta['Deck'], output_path: meta['File']) | |
puts "--> Generating deck \"#{meta['Deck']}\"\n" | |
# Read images from media | |
images = Dir.glob("#{media}/*.{png,jpg,jpeg,gif}") | |
# Resize the images before optimizing | |
puts "--> Resizing #{images.count} images\n" | |
images.each do |name| | |
image = Magick::Image.read(name).first | |
image.change_geometry("800") do |cols, rows, img| | |
img = img.resize!(cols, rows) | |
img.write(name) | |
end | |
end | |
# Optimize images before packing | |
image_optim = ImageOptim.new(:pngout => false, :svgo => false) | |
images.each do |name| | |
puts "--> Optimizing #{name}\n" | |
image_optim.optimize_image!(name) | |
end | |
# Add the media folder | |
@anki.add_media(media) | |
# Add cards to the deck | |
deck = arr[1..-1] | |
deck.each do |card| | |
content = card.split(/(Q:|A:)/) | |
question = markdown(content[2].strip) | |
answer = markdown(content[4].strip) | |
@anki.add_card(question, answer) | |
end | |
# Pack and save the cards | |
puts "--> Packing #{deck.count} cards\n" | |
@anki.save | |
puts "--> Done!\n" |
Deck: "Physics"
File: "Mechanics.apkg"
Q: What is the formula for the gravitational potential energy $$ U_g $$?
A: $$ U_g = m g h $$ [J].
Q: What is the formula for the spring potential energy $$ U_s $$.
A: $$ U_s = \frac{1}{2} k |x|^2 $$ [J].