cheapredwine 0.3.1 → 0.4.0
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/.rspec +1 -0
- data/.travis.yml +0 -6
- data/README.md +18 -23
- data/cheapredwine.gemspec +3 -3
- data/lib/cheapredwine.rb +21 -42
- data/lib/cheapredwine/command.rb +2 -0
- data/lib/cheapredwine/command/builder.rb +69 -0
- data/lib/cheapredwine/command/node.rb +19 -0
- data/lib/cheapredwine/command/nodes.rb +29 -0
- data/lib/cheapredwine/command/runner.rb +29 -0
- data/lib/cheapredwine/{info.rb → parser.rb} +4 -4
- data/lib/cheapredwine/version.rb +2 -2
- data/spec/cheapredwine/command/builder_spec.rb +39 -0
- data/spec/cheapredwine/command/runner_spec.rb +36 -0
- data/spec/{info_spec.rb → cheapredwine/parser_spec.rb} +3 -3
- data/spec/cheapredwine_spec.rb +21 -11
- data/spec/spec_helper.rb +1 -0
- metadata +21 -30
- data/lib/cheapredwine/image.rb +0 -2
- data/lib/cheapredwine/image/params.rb +0 -16
- data/lib/cheapredwine/image/writer.rb +0 -44
- data/spec/fixtures/extractor/hobo.otf +0 -0
- data/spec/fixtures/lato-regular.ttf +0 -0
- data/spec/fixtures/parser/features.ttx +0 -129
- data/spec/fixtures/parser/hobo.ttx +0 -8195
- data/spec/fixtures/parser/lato-regular.ttx +0 -43112
- data/spec/fixtures/test.png +0 -0
- data/spec/image/params_spec.rb +0 -22
- data/spec/image/writer_spec.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 507b55232c7e11bb44fecba447aafb123c916a54
|
4
|
+
data.tar.gz: 71a1610253c44b2e813f5a35794403642e9741c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 644ce9189ef137b71c6d4e09143a42f1113bcd35c1262b707e404b9bc117c139b0d3e266f2d0f5e3bf2a0124a734a81572374f8eaf0e8e6f2a54f99d743b5ef9
|
7
|
+
data.tar.gz: b4bc656a2f792e3b02bffbb0d5d87eab712aca3a02c9f604bd02f80dcd256207cdfe8fb5b1e042c325d5bc6ab5ae9592a00a21fefcdebd366ecfbdadbd9d7530
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
#
|
1
|
+
# Cheapredwine
|
2
2
|
|
3
3
|
[](https://codeclimate.com/github/hugobast/cheapredwine)
|
4
|
+
[](https://travis-ci.org/hugobast/cheapredwine)
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
I needed a way to test fonts on the web. I based this library on myfonts.com. CheapRedWine makes use to Harfbuzz' hb-view utility to generate images from fonts with a slew of different parameters. It also uses fontTools' ttx utility for font introspection.
|
6
|
+
Makes text images. Introspecs (in a limited way thus far) a font file to get to it's metadata. Supports OTF/TTF font features the likes of ligatures, old style numbers, stylistic alternatives, etc. Cheapredwine uses of Harfbuzz' hb-view utility to generate images.
|
8
7
|
|
9
8
|
## Installation
|
10
9
|
|
@@ -14,7 +13,7 @@ Make sure the dependencies are satisfied
|
|
14
13
|
|
15
14
|
## Dependencies
|
16
15
|
|
17
|
-
It assumes the following is installed and in the case where it applies
|
16
|
+
It assumes the following is installed and in the case where it applies; accessible from the $PATH env variable.
|
18
17
|
|
19
18
|
* [cairo](http://www.cairographics.org/releases/)
|
20
19
|
* [harfbuzz](http://www.freedesktop.org/software/harfbuzz/release/)
|
@@ -23,28 +22,24 @@ It assumes the following is installed and in the case where it applies, accessib
|
|
23
22
|
|
24
23
|
#### Getting a font object from a simple ttf or otf file:
|
25
24
|
|
26
|
-
font =
|
27
|
-
font.
|
28
|
-
font.
|
25
|
+
font = Cheapredwine.new font_file
|
26
|
+
font.font_name # => "Font Name"
|
27
|
+
font.family_name # => "Font Family"
|
29
28
|
font.style # => "Bold Italic"
|
30
29
|
font.features # => ["liga", "onum", "dlig", … "salt"]
|
31
30
|
|
32
31
|
#### Generating images with text for the font:
|
33
32
|
|
34
|
-
image = font.image
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
size: 40, # size of the text eq to px
|
45
|
-
color: red, # the text color
|
46
|
-
features: [liga, salt] # list of otf features to be applied
|
47
|
-
}
|
33
|
+
image = font.image do
|
34
|
+
append_text "Hello" # A regular piece of text
|
35
|
+
append_text "123456", with: ["onum"] # A piece of text with 'onum' enable
|
36
|
+
turn_on_feature "dlig" # Turns a feature on for the whole image
|
37
|
+
turn_off_feature "liga" # Turns off a feature for the whole image
|
38
|
+
set_margin 0
|
39
|
+
set_font_size 32
|
40
|
+
set_background "#123456"
|
41
|
+
set_foreground "#654321"
|
42
|
+
end
|
48
43
|
|
49
44
|
## Contributing
|
50
45
|
|
@@ -56,4 +51,4 @@ It assumes the following is installed and in the case where it applies, accessib
|
|
56
51
|
|
57
52
|
## TODO
|
58
53
|
|
59
|
-
1. Replace hb-view by something more appropriate (C Extension).
|
54
|
+
1. Replace hb-view by something more appropriate (C Extension or pure Ruby implementation).
|
data/cheapredwine.gemspec
CHANGED
@@ -5,11 +5,11 @@ require 'cheapredwine/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "cheapredwine"
|
8
|
-
gem.version =
|
8
|
+
gem.version = Cheapredwine::VERSION
|
9
9
|
gem.authors = ["Hugo Bastien"]
|
10
10
|
gem.email = ["hugo@hbastien.com"]
|
11
|
-
gem.description = %q{I needed a way to test fonts on the web. I based this library on myfonts.com.
|
12
|
-
gem.summary = %q{I needed a way to test fonts on the web. I based this library on myfonts.com.
|
11
|
+
gem.description = %q{I needed a way to test fonts on the web. I based this library on myfonts.com. Cheapredwine uses to Harfbuzz' hb-view utility to generate images from fonts with a slew of different parameters. It also uses fontTools' ttx utility for font introspection.}
|
12
|
+
gem.summary = %q{I needed a way to test fonts on the web. I based this library on myfonts.com. Cheapredwine uses to Harfbuzz' hb-view utility to generate images from fonts with a slew of different parameters. It also uses fontTools' ttx utility for font introspection.}
|
13
13
|
gem.homepage = "https://github.com/hugobast/cheapredwine"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
data/lib/cheapredwine.rb
CHANGED
@@ -1,55 +1,34 @@
|
|
1
1
|
require "cheapredwine/version"
|
2
|
-
require "cheapredwine/
|
3
|
-
require "cheapredwine/image"
|
2
|
+
require "cheapredwine/command"
|
4
3
|
|
5
|
-
class
|
4
|
+
class Cheapredwine
|
6
5
|
extend Forwardable
|
7
|
-
attr_accessor :font
|
8
|
-
def_delegators :@font, :file, :name, :family, :style, :features
|
9
|
-
|
10
|
-
def initialize(file)
|
11
|
-
info = Info.new file
|
12
|
-
@font = Font.new do |font|
|
13
|
-
font.name = info.font_name
|
14
|
-
font.family = info.family_name
|
15
|
-
font.features = info.features
|
16
|
-
font.style = info.style
|
17
|
-
font.path = file
|
18
|
-
font
|
19
|
-
end
|
20
|
-
end
|
21
6
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
text: text
|
29
|
-
})
|
30
|
-
|
31
|
-
params = Image::Params.new(params)
|
32
|
-
Image::Writer.new(params).exec
|
7
|
+
attr_accessor :file
|
8
|
+
def_delegators :@attrs, :font_name, :family_name, :style, :features
|
9
|
+
|
10
|
+
def initialize file
|
11
|
+
@attrs = Parser.new file
|
12
|
+
@file = File.new file
|
33
13
|
end
|
34
14
|
|
35
|
-
|
15
|
+
def image &block
|
16
|
+
create(&block).run!
|
17
|
+
end
|
36
18
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
19
|
+
def create &block
|
20
|
+
builder.instance_eval &block
|
21
|
+
builder.font_file file.path
|
22
|
+
runner
|
42
23
|
end
|
43
24
|
|
44
|
-
|
45
|
-
attr_accessor :name, :family, :features, :path, :style
|
25
|
+
private
|
46
26
|
|
47
|
-
|
48
|
-
|
49
|
-
|
27
|
+
def builder
|
28
|
+
@builder ||= Command::Builder.new
|
29
|
+
end
|
50
30
|
|
51
|
-
|
52
|
-
|
53
|
-
end
|
31
|
+
def runner
|
32
|
+
@runner ||= Command::Runner.new builder
|
54
33
|
end
|
55
34
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'cheapredwine/command/nodes'
|
2
|
+
|
3
|
+
class Cheapredwine
|
4
|
+
module Command
|
5
|
+
class Builder
|
6
|
+
attr_reader :features, :nodes
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@features = ["-liga"]
|
10
|
+
@nodes = Nodes.new
|
11
|
+
yield self if block_given?
|
12
|
+
end
|
13
|
+
|
14
|
+
def append_text text, options = {}
|
15
|
+
nodes.add text, options.fetch(:with, [])
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_margin size
|
19
|
+
@margin = size
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_font_size size
|
23
|
+
@font_size = size
|
24
|
+
end
|
25
|
+
|
26
|
+
def font_file file
|
27
|
+
@font_file = file
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_foreground color
|
31
|
+
@foreground = color
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_background color
|
35
|
+
@background = color
|
36
|
+
end
|
37
|
+
|
38
|
+
def turn_on_feature feature
|
39
|
+
features.push "+#{feature}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def turn_off_feature feature
|
43
|
+
features.push "-#{feature}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_params
|
47
|
+
{
|
48
|
+
features: "#{all_features.join(",")}",
|
49
|
+
text: "#{nodes.concat}",
|
50
|
+
font_file: @font_file,
|
51
|
+
font_size: @font_size,
|
52
|
+
foreground: @foreground,
|
53
|
+
background: @background,
|
54
|
+
margin: @margin
|
55
|
+
}.reject { |key, val| val.nil? }
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def all_features
|
61
|
+
features + all_features_from_text
|
62
|
+
end
|
63
|
+
|
64
|
+
def all_features_from_text
|
65
|
+
nodes.all.map { |node| node.features }.flatten
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Cheapredwine
|
2
|
+
module Command
|
3
|
+
class Node
|
4
|
+
attr_reader :text, :starts_at
|
5
|
+
|
6
|
+
def initialize text, features, starts_at
|
7
|
+
@text = text
|
8
|
+
@features = features
|
9
|
+
@starts_at = starts_at
|
10
|
+
end
|
11
|
+
|
12
|
+
def features
|
13
|
+
@features.map do |feature|
|
14
|
+
"#{feature}[#{starts_at}:#{starts_at + text.length}]"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'cheapredwine/command/node'
|
2
|
+
|
3
|
+
class Cheapredwine
|
4
|
+
module Command
|
5
|
+
class Nodes
|
6
|
+
attr_reader :nodes
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@nodes = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add text, features
|
13
|
+
nodes << Node.new(text, features, length)
|
14
|
+
end
|
15
|
+
|
16
|
+
def all
|
17
|
+
nodes
|
18
|
+
end
|
19
|
+
|
20
|
+
def concat
|
21
|
+
nodes.map { |node| node.text }.join
|
22
|
+
end
|
23
|
+
|
24
|
+
def length
|
25
|
+
concat.length
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Cheapredwine
|
2
|
+
module Command
|
3
|
+
class Runner
|
4
|
+
attr_reader :builder
|
5
|
+
|
6
|
+
def initialize builder
|
7
|
+
@builder = builder
|
8
|
+
end
|
9
|
+
|
10
|
+
def run!
|
11
|
+
IO.popen params.unshift "hb-view"
|
12
|
+
end
|
13
|
+
|
14
|
+
def params
|
15
|
+
builder.to_params.map { |k, v| parameterize_pair k, v }
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def parameterize_pair key, val
|
21
|
+
"--#{parameterize key}=#{val}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def parameterize key
|
25
|
+
key.to_s.gsub(/_/, "-")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/cheapredwine/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
class
|
2
|
-
VERSION = "0.
|
1
|
+
class Cheapredwine
|
2
|
+
VERSION = "0.4.0"
|
3
3
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'cheapredwine/command/builder'
|
3
|
+
|
4
|
+
describe Cheapredwine::Command::Builder do
|
5
|
+
let(:builder) { Cheapredwine::Command::Builder.new }
|
6
|
+
|
7
|
+
it "sets liga to off by default" do
|
8
|
+
expect(builder.features).to eq ["-liga"]
|
9
|
+
end
|
10
|
+
|
11
|
+
it "transforms it's data to params" do
|
12
|
+
builder.append_text "hello"
|
13
|
+
builder.append_text " world"
|
14
|
+
|
15
|
+
expect(builder.to_params).to eq features: "-liga", text: "hello world"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "transforms it's data to params along with features" do
|
19
|
+
builder.append_text "ffi", with: ["liga"]
|
20
|
+
builder.append_text "stffi"
|
21
|
+
builder.append_text "st", with: ["dlig"]
|
22
|
+
|
23
|
+
expect(builder.to_params).to eq features: "-liga,liga[0:3],dlig[8:10]", text: "ffistffist"
|
24
|
+
end
|
25
|
+
|
26
|
+
context "with features" do
|
27
|
+
let(:builder) { Cheapredwine::Command::Builder.new }
|
28
|
+
|
29
|
+
it "can turn on a features" do
|
30
|
+
builder.turn_on_feature "liga"
|
31
|
+
expect(builder.features).to eq ["-liga", "+liga"]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can turn off a feature" do
|
35
|
+
builder.turn_off_feature "onum"
|
36
|
+
expect(builder.features).to eq ["-liga", "-onum"]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'cheapredwine/command/runner'
|
2
|
+
require 'cheapredwine/command/builder'
|
3
|
+
|
4
|
+
describe Cheapredwine::Command::Runner do
|
5
|
+
let(:builder) {
|
6
|
+
Cheapredwine::Command::Builder.new do |builder|
|
7
|
+
builder.append_text "Lorem ipsum dolor"
|
8
|
+
builder.turn_on_feature "aalt"
|
9
|
+
builder.set_font_size 15
|
10
|
+
builder.font_file "/path/to/font.otf"
|
11
|
+
end
|
12
|
+
}
|
13
|
+
|
14
|
+
let(:runner) { Cheapredwine::Command::Runner.new builder }
|
15
|
+
|
16
|
+
it "assembles params from a builder" do
|
17
|
+
expect(runner.params).to eq [
|
18
|
+
"--features=-liga,+aalt",
|
19
|
+
"--text=Lorem ipsum dolor",
|
20
|
+
"--font-file=/path/to/font.otf",
|
21
|
+
"--font-size=15"
|
22
|
+
]
|
23
|
+
end
|
24
|
+
|
25
|
+
it "executes the command" do
|
26
|
+
expect(IO).to receive(:popen).with([
|
27
|
+
"hb-view",
|
28
|
+
"--features=-liga,+aalt",
|
29
|
+
"--text=Lorem ipsum dolor",
|
30
|
+
"--font-file=/path/to/font.otf",
|
31
|
+
"--font-size=15"
|
32
|
+
])
|
33
|
+
|
34
|
+
runner.run!
|
35
|
+
end
|
36
|
+
end
|