text2svg 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94254b4b10b68d5e825b24f2a4144c69da09e2c5
4
- data.tar.gz: 9861a858f2d279f0f1c10a66a74b2a0b33bb5843
3
+ metadata.gz: 669e306f0e466d680462a3fe6277e7fee87394fd
4
+ data.tar.gz: 17c4b5490802f0a842cb37584cf8c3bb35e8be20
5
5
  SHA512:
6
- metadata.gz: b45729144575ef72fb38d6a1af983e0e2154f99ca0b98a46679946fe25ec936424d5c518165e2dc8ee16568bfc4d4e623eb486c83c4b2cfdeec122f534305c5b
7
- data.tar.gz: adadaa9dd72fdd0dc23187ebd9a0086e68ab37ec19495a97988322d0c4752ca83e593202104789d35e8010c70868704f93a607125e05a86d0de13c2cec85c41b
6
+ metadata.gz: 53ddc5d148dab731052f69a1ea2ccd45f5e097e7b345f9f6c7e0f1ac760787d833dd54e4edf7d03cd00b583a99a0f50fee16425685dd5842ac1b2080d5083cc2
7
+ data.tar.gz: 6d5778f049cb11601586bf8f67d8e88d8a3716ab11d0306309be302fcab21bc0d789c8ed61f0cea5e07de80bd8ab8410a18b397cbebe3279e5376f2cad14df08
data/lib/text2svg/cli.rb CHANGED
@@ -2,10 +2,19 @@ require 'text2svg/typography'
2
2
 
3
3
  module Text2svg
4
4
  module CLI
5
- Option = Struct.new(:font, :text_align, :fill, :encoding)
6
-
7
5
  def start
8
- o = CLI::Option.new(nil, :left, :black, Encoding::UTF_8)
6
+ o = Option.new(
7
+ nil,
8
+ :left,
9
+ :black,
10
+ :none,
11
+ 1,
12
+ Encoding::UTF_8,
13
+ :none,
14
+ 1,
15
+ false,
16
+ false,
17
+ )
9
18
  OptionParser.new.tap { |opt|
10
19
  opt.on('-f', '--font FONT', 'font file path (require)') do |arg|
11
20
  o.font = arg
@@ -19,19 +28,24 @@ module Text2svg
19
28
  opt.on('--encoding ENCODING', 'input text encoding (default utf-8)') do |arg|
20
29
  o.encoding = Encoding.find(arg)
21
30
  end
31
+ opt.on('--stroke COLOR', 'stroke color setting (default none)') do |arg|
32
+ o.stroke = arg
33
+ end
34
+ opt.on('--stroke-width NUM', 'stroke-width value (default 1)') do |arg|
35
+ o.stroke_width = arg
36
+ end
37
+ opt.on('--bold', "embolden outline (default false)") do |arg|
38
+ o.bold = arg
39
+ end
40
+ opt.on('--italic', "oblique outline (default false)") do |arg|
41
+ o.italic = arg
42
+ end
22
43
  }.parse!(ARGV)
23
44
  unless o.font
24
- raise ArgumentError, "require `--font` cli option. see --help"
45
+ raise ArgumentError, 'require `--font` cli option. see --help'
25
46
  end
26
47
  text = ARGV[0] || $stdin.read
27
- puts Text2svg::Typography.build(
28
- text,
29
- font: o.font,
30
- text_align: o.text_align,
31
- stroke: :none,
32
- fill: o.fill,
33
- encoding: o.encoding,
34
- )
48
+ puts Text2svg::Typography.build(text, o).to_s
35
49
  end
36
50
  module_function :start
37
51
  end
@@ -1,49 +1,65 @@
1
1
  require 'text2svg/cli'
2
2
 
3
3
  module Text2svgCLITest
4
+ def check(t)
5
+ out = capture do
6
+ Text2svg::CLI.start
7
+ end
8
+ unless String === out
9
+ t.error 'return value was break'
10
+ end
11
+ unless 0 < out.length
12
+ t.error 'unsupported font?'
13
+ end
14
+ if out.strip[0, 4] != '<svg'
15
+ t.error 'output format was break'
16
+ end
17
+ end
18
+
4
19
  def test_start(t)
5
20
  %w(left right center).each do |text_align|
6
21
  ARGV[0] = "Hello,\nWorld!"
7
22
  ARGV[1] = '--font=/Library/Fonts/Times New Roman.ttf'
8
23
  ARGV[2] = "--text-align=#{text_align}"
9
- out = capture do
10
- Text2svg::CLI.start
11
- end
12
- unless String === out
13
- t.error 'return value was break'
14
- end
15
- unless 0 < out.length
16
- t.error 'unsupported font?'
17
- end
18
- if out.strip[0,4] != "<svg"
19
- t.error 'output format was break'
20
- end
24
+
25
+ check(t)
21
26
  end
22
27
  end
23
28
 
24
29
  def test_encoding(t)
25
30
  [
26
31
  ['utf-8', "\xEF\x82\x9B".force_encoding(Encoding::ASCII_8BIT)],
27
- ['utf-32', "\x00\x00\xFE\xFF\x00\x00\xF0\x9B".force_encoding(Encoding::ASCII_8BIT)]
32
+ ['utf-32', "\x00\x00\xFE\xFF\x00\x00\xF0\x9B".force_encoding(Encoding::ASCII_8BIT)],
28
33
  ].each do |(encoding, text)|
29
34
  ARGV[0] = text
30
35
  ARGV[1] = '--font=~/Library/Fonts/fontawesome-webfont.ttf'
31
36
  ARGV[2] = "--encoding=#{encoding}"
32
- out = capture do
33
- Text2svg::CLI.start
34
- end
35
- unless String === out
36
- t.error 'return value was break'
37
- end
38
- unless 0 < out.length
39
- t.error 'unsupported font?'
40
- end
41
- if out.strip[0,4] != "<svg"
42
- t.error 'output format was break'
43
- end
37
+ check(t)
44
38
  end
45
39
  end
46
40
 
41
+ def test_bold(t)
42
+ ARGV[0] = 'Hello'
43
+ ARGV[1] = '--font=/Library/Fonts/Times New Roman.ttf'
44
+ ARGV[2] = '--bold'
45
+ check(t)
46
+ end
47
+
48
+ def test_italic(t)
49
+ ARGV[0] = 'Hello'
50
+ ARGV[1] = '--font=/Library/Fonts/Times New Roman.ttf'
51
+ ARGV[2] = '--italic'
52
+ check(t)
53
+ end
54
+
55
+ def test_stroke(t)
56
+ ARGV[0] = 'Hello'
57
+ ARGV[1] = '--font=/Library/Fonts/Times New Roman.ttf'
58
+ ARGV[2] = '--stroke=red'
59
+ ARGV[3] = '--stroke-width=100'
60
+ check(t)
61
+ end
62
+
47
63
  def capture
48
64
  out = StringIO.new
49
65
  orig = $stdout
@@ -0,0 +1,25 @@
1
+ module Text2svg
2
+ class Option < Struct.new(
3
+ :font,
4
+ :text_align,
5
+ :fill,
6
+ :stroke,
7
+ :stroke_width,
8
+ :encoding,
9
+ :stroke,
10
+ :stroke_width,
11
+ :bold,
12
+ :italic,
13
+ )
14
+
15
+ class << self
16
+ def from_hash(h)
17
+ o = new
18
+ h.to_h.each do |k, v|
19
+ o[k.to_sym] = v
20
+ end
21
+ o
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,5 +1,6 @@
1
1
  require 'freetype'
2
2
  require 'text2svg/outline2d'
3
+ require 'text2svg/option'
3
4
 
4
5
  module Text2svg
5
6
  class Typography
@@ -10,30 +11,25 @@ module Text2svg
10
11
  INTER_CHAR_SPACE_DIV = 50r
11
12
 
12
13
  class << self
13
- def build(text, font:, stroke: :none, stroke_width: 1, fill: :black, text_align: :left, encoding: Encoding::UTF_8)
14
- g, w, h = path(
15
- text,
16
- font: font,
17
- stroke: stroke,
18
- stroke_width: stroke_width,
19
- fill: fill,
20
- text_align: text_align,
21
- encoding: encoding,
22
- )
23
- svg = %(<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 #{w} #{h}">\n)
14
+ def build(text, option)
15
+ if Hash === option
16
+ option = Option.from_hash(option)
17
+ end
18
+ content = path(text, option)
19
+ svg = %(<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 #{content.width} #{content.height}">\n)
24
20
  svg << "<title>#{text}</title>\n"
25
- svg << g
21
+ svg << content.data
26
22
  svg << "</svg>\n"
27
- svg
23
+ Content.new(svg, content.width, content.height)
28
24
  end
29
25
 
30
- def path(text, font:, stroke: :none, stroke_width: 1, fill: :black, text_align: :left, encoding: Encoding::UTF_8)
31
- stroke ||= :none
32
- fill ||= :black
33
- text_align ||= :left
34
- text.force_encoding(encoding).encode!(Encoding::UTF_8)
26
+ def path(text, option)
27
+ if Hash === option
28
+ option = Option.from_hash(option)
29
+ end
30
+ text.force_encoding(option.encoding).encode!(Encoding::UTF_8)
35
31
 
36
- FreeType::API::Font.open(File.expand_path(font)) do |f|
32
+ FreeType::API::Font.open(File.expand_path(option.font)) do |f|
37
33
  f.set_char_size(0, 0, 3000, 3000)
38
34
 
39
35
  lines = []
@@ -62,6 +58,10 @@ module Text2svg
62
58
  if glyph.outline.tags.length == 0
63
59
  glyph = f.notdef
64
60
  end
61
+
62
+ glyph.bold if option.bold
63
+ glyph.italic if option.italic
64
+
65
65
  kern = f.kerning_unfitted(before_char, char).x
66
66
 
67
67
  width, is_draw = if IDEOGRAPHIC_SPACE.match char
@@ -97,7 +97,7 @@ module Text2svg
97
97
  y += line_height
98
98
  before_char = nil
99
99
 
100
- case text_align.to_sym
100
+ case option.text_align.to_sym
101
101
  when :center
102
102
  x += (max_width - line_width) / 2r
103
103
  when :right
@@ -114,7 +114,7 @@ module Text2svg
114
114
  x += f.kerning_unfitted(before_char, cs.char).x.to_i
115
115
  output << %! <g transform="translate(#{x.to_i},0)">\n!
116
116
  if cs.draw?
117
- output << %( <path stroke="#{stroke}" stroke-width="#{stroke_width}" fill="#{fill}" d="#{cs.d}"/>\n)
117
+ output << %( <path stroke="#{option.stroke}" stroke-width="#{option.stroke_width}" fill="#{option.fill}" d="#{cs.d}"/>\n)
118
118
  end
119
119
  x += cs.width
120
120
  x += inter_char_space if cs != line.last
@@ -124,7 +124,7 @@ module Text2svg
124
124
  output << "</g>\n".freeze
125
125
  end
126
126
 
127
- [output, max_width.to_i, (y + line_height / 4).to_i]
127
+ Content.new(output, max_width.to_i, (y + line_height / 4).to_i)
128
128
  end
129
129
  end
130
130
  end
@@ -135,4 +135,10 @@ module Text2svg
135
135
  is_draw
136
136
  end
137
137
  end
138
+
139
+ Content = Struct.new(:data, :width, :height) do
140
+ def to_s
141
+ data
142
+ end
143
+ end
138
144
  end
@@ -1,3 +1,3 @@
1
1
  module Text2svg
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
data/text2svg.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_runtime_dependency 'freetype'
22
+ spec.add_runtime_dependency 'freetype', '>= 0.0.3'
23
23
  spec.add_development_dependency 'bundler', '~> 1.11'
24
24
  spec.add_development_dependency 'rake', '~> 10.0'
25
25
  spec.add_development_dependency 'rgot'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: text2svg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-19 00:00:00.000000000 Z
11
+ date: 2015-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: freetype
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 0.0.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 0.0.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -87,6 +87,7 @@ files:
87
87
  - lib/text2svg.rb
88
88
  - lib/text2svg/cli.rb
89
89
  - lib/text2svg/cli_test.rb
90
+ - lib/text2svg/option.rb
90
91
  - lib/text2svg/outline2d.rb
91
92
  - lib/text2svg/typography.rb
92
93
  - lib/text2svg/version.rb