Skip to content

Instantly share code, notes, and snippets.

@andywerner
Forked from ttscoff/font_grabber.rb
Last active November 24, 2017 13:39
Show Gist options
  • Save andywerner/5fd22581bdf075e4ab382ae127bf8feb to your computer and use it in GitHub Desktop.
Save andywerner/5fd22581bdf075e4ab382ae127bf8feb to your computer and use it in GitHub Desktop.
Give it a <link> from Google fonts or a css file downloaded from google fonts and get back CSS with fonts embedded
#!/usr/bin/ruby
# encoding: utf-8
# Grab google web fonts and embed them as base64 data URIs
# <http://brettterpstra.com/2015/03/14/embedding-google-web-fonts/>
require 'base64'
if ARGV.length > 0
input = ARGV
elsif STDIN.stat.size > 0
input = STDIN.read.strip.split(/\n+/)
else
$stderr.puts "No input"
Process.exit 1
end
output = ""
input.each {|line|
css = nil
if line =~ /^\s*<link.*?>\s*$/
url = line.match(/href='(.*?)'/)
if url
css_url = url[1]
css = %x{curl -sS '#{css_url}'}.strip
else
$stderr.puts "Error matching url"
end
elsif File.file?(line)
css = File.read(line)
end
# $stdout.puts css
if css
css.gsub!(/(src: .*?, url\()(.*?)(\) format\(')(.*?)('\);)/).each {|src|
pre = $1
font_url = $2
mid = $3
font_fmt = $4
post = $5
font_ext = font_url.match(/\.(\w+)$/)[1]
font_src = %x{curl -sS '#{font_url}'}
enc = Base64.encode64(font_src).strip.gsub(/\n/,'')
%Q{src:url("data:font/#{font_ext};base64,#{enc}") format('#{font_fmt}');}
}
output += css + "\n"
else
next
end
}
$stdout.puts output
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment