google_font_extractor 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +22 -0
- data/google_font_extractor.gemspec +40 -0
- data/lib/extract.rb +68 -0
- data/lib/google_font_extractor.rb +50 -0
- data/lib/version.rb +3 -0
- metadata +100 -0
data/README.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Introduction
|
2
|
+
|
3
|
+
The GoogleFontExtractor Gem will crawl the Google Webfonts directory on your command and return an array of Struct instances with details of fonts available in the Google Fonts directory.
|
4
|
+
|
5
|
+
PLEASE Note: this does NOT download the font files themselves.
|
6
|
+
|
7
|
+
Let's get started.
|
8
|
+
|
9
|
+
## 1. In your Gemfile
|
10
|
+
gem "google_font_extractor"
|
11
|
+
|
12
|
+
## 2. Bundle Install
|
13
|
+
|
14
|
+
## 3. rails console example
|
15
|
+
ruby-1.9.2> fonts = GoogleFontExtractor.extract
|
16
|
+
ruby-1.9.2> fonts.first
|
17
|
+
=> #<struct designer="Steve Matteson", name="Droid Serif", charsets=["latin"], weights_count="4", weights=["regular", "italic", "bold", "bolditalic"], families_count=nil, category="serif">
|
18
|
+
ruby-1.9.2>
|
19
|
+
|
20
|
+
|
21
|
+
# Additional notes
|
22
|
+
If you want to do anything real with this, you should save the results of the extract method to a YAML file or database table.
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib/', __FILE__)
|
3
|
+
$:.unshift lib unless $:.include?(lib)
|
4
|
+
|
5
|
+
require 'version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "google_font_extractor"
|
9
|
+
s.version = GoogleFontExtractor::VERSION
|
10
|
+
s.platform = Gem::Platform::RUBY
|
11
|
+
s.authors = ["Jason Lambert"]
|
12
|
+
s.email = ["mail@jasonlambert.co.uk"]
|
13
|
+
s.homepage = "https://github.com/mendable/google-font-extractor"
|
14
|
+
s.summary = "Extracts a list of all fonts available via the Google Webfonts API"
|
15
|
+
s.description = "Extracts a list of all fonts available via the Google Webfonts API, including details of character sets supported, weights, and categorization."
|
16
|
+
|
17
|
+
s.required_rubygems_version = ">= 1.3.6"
|
18
|
+
|
19
|
+
s.files = Dir.glob("lib/*") + %w(README.md google_font_extractor.gemspec)
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
s.rubyforge_project = %q{[none]}
|
22
|
+
|
23
|
+
|
24
|
+
if s.respond_to? :specification_version then
|
25
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
26
|
+
s.specification_version = 3
|
27
|
+
|
28
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
29
|
+
s.add_runtime_dependency(%q<tidy_ffi>, [">= 0.1.3"])
|
30
|
+
s.add_runtime_dependency(%q<scrapi>, [">= 2.0.0"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<tidy_ffi>, [">= 0.1.3"])
|
33
|
+
s.add_dependency(%q<scrapi>, [">= 2.0.0"])
|
34
|
+
end
|
35
|
+
else
|
36
|
+
s.add_dependency(%q<tidy_ffi>, [">= 0.1.3"])
|
37
|
+
s.add_dependency(%q<scrapi>, [">= 2.0.0"])
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/lib/extract.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
module GoogleFontExtractor
|
2
|
+
module Extract
|
3
|
+
|
4
|
+
# Individual Font details page
|
5
|
+
class FontPage < Scraper::Base
|
6
|
+
array :weights
|
7
|
+
|
8
|
+
process("#_variants span.parametername", :weights => :text) do |el|
|
9
|
+
@weights.each_with_index do |r, idx|
|
10
|
+
if r =~ /Web Fonts API parameter name: (.*)/ then
|
11
|
+
@weights[idx] = $1.split(':').size == 1 ? "regular" : $1.split(':').last
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
result :weights
|
17
|
+
end
|
18
|
+
|
19
|
+
# Element within list of fonts
|
20
|
+
class FontListElement < Scraper::Base
|
21
|
+
array :weights
|
22
|
+
array :charsets
|
23
|
+
|
24
|
+
attr_accessor :category # for storing serif, sans-serif, etc
|
25
|
+
|
26
|
+
# Font Name
|
27
|
+
process "div.preview span", :name => :text
|
28
|
+
|
29
|
+
# Weights
|
30
|
+
process "div.godesigner span.variantcount span", :weights_count => :text
|
31
|
+
|
32
|
+
# Families. Note, FamiliesCount will always be nil in the final output
|
33
|
+
# because the main extract method breaks down to specific fonts, rather
|
34
|
+
# than their meta-family grouping.
|
35
|
+
process "div.godesigner span.familycount span", :families_count => :text
|
36
|
+
|
37
|
+
# Designer name, but remove variants and families count text
|
38
|
+
process("div.godesigner", :designer => :text) do |el|
|
39
|
+
@designer = @designer.gsub(" #{@weights_count} variants", '')
|
40
|
+
@designer = @designer.gsub(" #{@families_count} families", '')
|
41
|
+
|
42
|
+
# remove font name from designer name
|
43
|
+
if @designer =~ /by (.*)/ then
|
44
|
+
@designer = $1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Each listing has a small png image icon denoting its available character set.
|
49
|
+
process("div.ranges img", :charsets => "@src") do |el|
|
50
|
+
@charsets.each_with_index do |r, idx|
|
51
|
+
if r =~ /ic_(\w+)\.png/ then
|
52
|
+
@charsets[idx] = $1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
result :designer, :name, :charsets, :weights_count, :weights, :families_count, :category
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
# Main list of fonts
|
62
|
+
class FontList < Scraper::Base
|
63
|
+
array :fonts
|
64
|
+
process "#fontlist li", :fonts => FontListElement
|
65
|
+
result :fonts
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'tidy_ffi'
|
2
|
+
require 'scrapi'
|
3
|
+
|
4
|
+
require File.dirname(__FILE__) + '/extract.rb'
|
5
|
+
|
6
|
+
|
7
|
+
module GoogleFontExtractor
|
8
|
+
|
9
|
+
CATEGORIES = %w(serif sans-serif display handwriting)
|
10
|
+
|
11
|
+
def self.fonts
|
12
|
+
# main list
|
13
|
+
final_font_list = []
|
14
|
+
|
15
|
+
|
16
|
+
CATEGORIES.each do |category|
|
17
|
+
# Get intermediate list of fonts
|
18
|
+
font_list = Extract::FontList.scrape(URI.parse("http://www.google.com/webfonts?sort=pop&category=#{category}"))
|
19
|
+
|
20
|
+
|
21
|
+
# Build final list of real fonts. Some fonts are listed are grouped by family on the main font
|
22
|
+
# list, break those familiies down into individual fonts.
|
23
|
+
font_list.each_with_index do |font, idx|
|
24
|
+
if font.families_count then
|
25
|
+
Extract::FontList.scrape(URI.parse("http://www.google.com/webfonts/list?family=#{URI.encode(font.name)}&sort=pop&category=#{category}")).each do |intermediate|
|
26
|
+
intermediate[:category] = category
|
27
|
+
final_font_list << intermediate
|
28
|
+
end
|
29
|
+
else
|
30
|
+
font[:category] = category
|
31
|
+
final_font_list << font
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# Tidy.
|
38
|
+
final_font_list.flatten!
|
39
|
+
|
40
|
+
|
41
|
+
# Further enhance final list of fonts with additional information from the individual font pages
|
42
|
+
# so we can provide information about the font weights (bold, etc) that are available.
|
43
|
+
final_font_list.each_with_index do |font, idx|
|
44
|
+
if font.weights_count then
|
45
|
+
font.weights = Extract::FontPage.scrape(URI.parse("http://www.google.com/webfonts/family?family=#{URI.encode(font.name)}"))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google_font_extractor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Jason Lambert
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-03-18 00:00:00 +00:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: tidy_ffi
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 1
|
31
|
+
- 3
|
32
|
+
version: 0.1.3
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: scrapi
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 2
|
45
|
+
- 0
|
46
|
+
- 0
|
47
|
+
version: 2.0.0
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
description: Extracts a list of all fonts available via the Google Webfonts API, including details of character sets supported, weights, and categorization.
|
51
|
+
email:
|
52
|
+
- mail@jasonlambert.co.uk
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files: []
|
58
|
+
|
59
|
+
files:
|
60
|
+
- lib/extract.rb
|
61
|
+
- lib/google_font_extractor.rb
|
62
|
+
- lib/version.rb
|
63
|
+
- README.md
|
64
|
+
- google_font_extractor.gemspec
|
65
|
+
has_rdoc: true
|
66
|
+
homepage: https://github.com/mendable/google-font-extractor
|
67
|
+
licenses: []
|
68
|
+
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
version: "0"
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
segments:
|
88
|
+
- 1
|
89
|
+
- 3
|
90
|
+
- 6
|
91
|
+
version: 1.3.6
|
92
|
+
requirements: []
|
93
|
+
|
94
|
+
rubyforge_project: "[none]"
|
95
|
+
rubygems_version: 1.3.7
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Extracts a list of all fonts available via the Google Webfonts API
|
99
|
+
test_files: []
|
100
|
+
|