Skip to content

Instantly share code, notes, and snippets.

@ttscoff
Last active May 13, 2021 06:14
Show Gist options
  • Star 46 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
  • Save ttscoff/986f0dcda3d3dd4270f6 to your computer and use it in GitHub Desktop.
Save ttscoff/986f0dcda3d3dd4270f6 to your computer and use it in GitHub Desktop.
Give it a <link> 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|
if line =~ /^\s*<link.*?>\s*$/
url = line.match(/href='(.*?)'/)
if url
css_url = url[1]
else
$stderr.puts "Error matching url"
end
css = %x{curl -sS '#{css_url}'}.strip
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
@ideaOwl
Copy link

ideaOwl commented Aug 24, 2016

Syntax to run this on Windows, to add on top of @eikaramba's change, is:

ruby font_grabber.rb "<link href='https://fonts.googleapis.com/css?family=Merriweather:300,400,700' rel='stylesheet'>" > fonts.css

@seanirby
Copy link

You will want to change to change the regex on line 20 support double quotes.

/href=['"](.*?)['"]/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment