text2svg 0.0.3 → 0.1.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/README.md +13 -0
- data/exe/text2svg +0 -1
- data/lib/text2svg.rb +2 -1
- data/lib/text2svg/cli.rb +13 -21
- data/lib/text2svg/cli_test.rb +0 -8
- data/lib/text2svg/option.rb +1 -5
- data/lib/text2svg/typography.rb +16 -9
- data/lib/text2svg/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bda63aa25ac6727ef210af1f40414c3b7d120b7
|
4
|
+
data.tar.gz: 19469eeca0f2b0308345d6f60b7b94fdd77b9d64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06a6b8ad39765e73045d46fccc6880b337b7f61d0416a7d257a87d50181add2a2529b3567f6539aec822c5b82200ee73497bc8af8a103485d8350e5594bc65e3
|
7
|
+
data.tar.gz: b93fdce03dfee133362ce6e0fdeda849f7f631f4a01d340a807f1ea1592e348608e96cf6d335ed044fa08bb93a4a8c6e058bd59fa26d4b5ed88247fa78453532
|
data/README.md
CHANGED
@@ -10,6 +10,19 @@ $ text2svg "Hello, World\!" --font="/Library/Fonts/Times New Roman.ttf" > test.s
|
|
10
10
|
|
11
11
|

|
12
12
|
|
13
|
+
## Option
|
14
|
+
|
15
|
+
```shell
|
16
|
+
$ text2svg --help
|
17
|
+
Usage: text2svg [options]
|
18
|
+
-f, --font FONT font file path (require)
|
19
|
+
--text-align ALIGN text align left,right or center (default left)
|
20
|
+
--encoding ENCODING input text encoding (default utf-8)
|
21
|
+
--bold embolden outline (default false)
|
22
|
+
--italic oblique outline (default false)
|
23
|
+
--option STRING decorate options (default nil)(e.g. fill="red" stroke-width="100")
|
24
|
+
```
|
25
|
+
|
13
26
|
## Installation
|
14
27
|
|
15
28
|
Add this line to your application's Gemfile:
|
data/exe/text2svg
CHANGED
data/lib/text2svg.rb
CHANGED
data/lib/text2svg/cli.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
|
+
require 'optparse'
|
1
2
|
require 'text2svg/typography'
|
3
|
+
require 'text2svg/option'
|
2
4
|
|
3
5
|
module Text2svg
|
4
6
|
module CLI
|
5
7
|
def start
|
6
8
|
o = Option.new(
|
7
|
-
nil,
|
8
|
-
:left,
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
:none,
|
14
|
-
1,
|
15
|
-
false,
|
16
|
-
false,
|
9
|
+
nil, # font
|
10
|
+
:left, # text_align
|
11
|
+
Encoding::UTF_8, # encoding
|
12
|
+
false, # bold
|
13
|
+
false, # italic
|
14
|
+
nil, # attribute
|
17
15
|
)
|
18
16
|
OptionParser.new.tap { |opt|
|
19
17
|
opt.on('-f', '--font FONT', 'font file path (require)') do |arg|
|
@@ -22,24 +20,18 @@ module Text2svg
|
|
22
20
|
opt.on('--text-align ALIGN', 'text align left,right or center (default left)', %i(left right center)) do |arg|
|
23
21
|
o.text_align = arg
|
24
22
|
end
|
25
|
-
opt.on('--fill FILL', 'text fill color (default black)') do |arg|
|
26
|
-
o.fill = arg
|
27
|
-
end
|
28
23
|
opt.on('--encoding ENCODING', 'input text encoding (default utf-8)') do |arg|
|
29
24
|
o.encoding = Encoding.find(arg)
|
30
25
|
end
|
31
|
-
opt.on('--
|
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|
|
26
|
+
opt.on('--bold', 'embolden outline (default false)') do |arg|
|
38
27
|
o.bold = arg
|
39
28
|
end
|
40
|
-
opt.on('--italic',
|
29
|
+
opt.on('--italic', 'oblique outline (default false)') do |arg|
|
41
30
|
o.italic = arg
|
42
31
|
end
|
32
|
+
opt.on('--attribute STRING', 'decorate options (default nil)(e.g. fill="red" stroke-width="100")') do |arg|
|
33
|
+
o.attribute = arg
|
34
|
+
end
|
43
35
|
}.parse!(ARGV)
|
44
36
|
unless o.font
|
45
37
|
raise ArgumentError, 'require `--font` cli option. see --help'
|
data/lib/text2svg/cli_test.rb
CHANGED
@@ -52,14 +52,6 @@ module Text2svgCLITest
|
|
52
52
|
check(t)
|
53
53
|
end
|
54
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
|
-
|
63
55
|
def capture
|
64
56
|
out = StringIO.new
|
65
57
|
orig = $stdout
|
data/lib/text2svg/option.rb
CHANGED
data/lib/text2svg/typography.rb
CHANGED
@@ -15,20 +15,25 @@ module Text2svg
|
|
15
15
|
if Hash === option
|
16
16
|
option = Option.from_hash(option)
|
17
17
|
end
|
18
|
+
option.encoding ||= Encoding::UTF_8
|
18
19
|
content = path(text, option)
|
19
20
|
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)
|
20
21
|
svg << "<title>#{text}</title>\n"
|
21
22
|
svg << content.data
|
22
23
|
svg << "</svg>\n"
|
23
|
-
Content.new(svg, content.width, content.height)
|
24
|
+
Content.new(svg, content.width, content.height, content.notdef_indexes)
|
24
25
|
end
|
25
26
|
|
26
27
|
def path(text, option)
|
27
28
|
if Hash === option
|
28
29
|
option = Option.from_hash(option)
|
29
30
|
end
|
31
|
+
return Content.new("", 0, 0) if text.empty?
|
32
|
+
|
33
|
+
option.encoding ||= Encoding::UTF_8
|
30
34
|
text.force_encoding(option.encoding).encode!(Encoding::UTF_8)
|
31
35
|
|
36
|
+
notdef_indexes = []
|
32
37
|
FreeType::API::Font.open(File.expand_path(option.font)) do |f|
|
33
38
|
f.set_char_size(0, 0, 3000, 3000)
|
34
39
|
|
@@ -38,7 +43,7 @@ module Text2svg
|
|
38
43
|
|
39
44
|
before_char = nil
|
40
45
|
space_width = f.glyph(' '.freeze).char_width
|
41
|
-
text.each_char do |char|
|
46
|
+
text.each_char.with_index do |char, index|
|
42
47
|
if NEW_LINE.match char
|
43
48
|
line = []
|
44
49
|
lines << line
|
@@ -46,24 +51,22 @@ module Text2svg
|
|
46
51
|
next
|
47
52
|
end
|
48
53
|
|
49
|
-
# glyph登録されていない文字
|
50
54
|
glyph_id = f.char_index(char)
|
51
55
|
glyph = if glyph_id == 0
|
56
|
+
notdef_indexes << index
|
52
57
|
f.notdef
|
53
58
|
else
|
54
59
|
f.glyph(char)
|
55
60
|
end
|
56
61
|
|
57
|
-
# glyphが登録されているが字形が登録されていない文字
|
58
62
|
if glyph.outline.tags.length == 0
|
63
|
+
notdef_indexes << index
|
59
64
|
glyph = f.notdef
|
60
65
|
end
|
61
66
|
|
62
67
|
glyph.bold if option.bold
|
63
68
|
glyph.italic if option.italic
|
64
69
|
|
65
|
-
kern = f.kerning_unfitted(before_char, char).x
|
66
|
-
|
67
70
|
width, is_draw = if IDEOGRAPHIC_SPACE.match char
|
68
71
|
[space_width * 2r, false]
|
69
72
|
elsif WHITESPACE.match char
|
@@ -92,6 +95,7 @@ module Text2svg
|
|
92
95
|
y = 0r
|
93
96
|
output = ''
|
94
97
|
line_height = f.line_height
|
98
|
+
output << %(<g #{option.attribute}>\n)
|
95
99
|
lines.zip(width_by_line).each do |(line, line_width)|
|
96
100
|
x = 0r
|
97
101
|
y += line_height
|
@@ -114,7 +118,7 @@ module Text2svg
|
|
114
118
|
x += f.kerning_unfitted(before_char, cs.char).x.to_i
|
115
119
|
output << %! <g transform="translate(#{x.to_i},0)">\n!
|
116
120
|
if cs.draw?
|
117
|
-
output << %( <path
|
121
|
+
output << %( <path d="#{cs.d}"/>\n)
|
118
122
|
end
|
119
123
|
x += cs.width
|
120
124
|
x += inter_char_space if cs != line.last
|
@@ -123,8 +127,11 @@ module Text2svg
|
|
123
127
|
end
|
124
128
|
output << "</g>\n".freeze
|
125
129
|
end
|
130
|
+
output << "</g>\n".freeze
|
126
131
|
|
127
|
-
|
132
|
+
option_width = 0
|
133
|
+
option_width += space_width / 1.5 if option.italic
|
134
|
+
Content.new(output, (max_width + option_width).to_i, (y + line_height / 4).to_i, notdef_indexes)
|
128
135
|
end
|
129
136
|
end
|
130
137
|
end
|
@@ -136,7 +143,7 @@ module Text2svg
|
|
136
143
|
end
|
137
144
|
end
|
138
145
|
|
139
|
-
Content = Struct.new(:data, :width, :height) do
|
146
|
+
Content = Struct.new(:data, :width, :height, :notdef_indexes) do
|
140
147
|
def to_s
|
141
148
|
data
|
142
149
|
end
|
data/lib/text2svg/version.rb
CHANGED
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
|
4
|
+
version: 0.1.0
|
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-
|
11
|
+
date: 2015-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: freetype
|
@@ -112,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
112
|
version: '0'
|
113
113
|
requirements: []
|
114
114
|
rubyforge_project:
|
115
|
-
rubygems_version: 2.5.
|
115
|
+
rubygems_version: 2.5.1
|
116
116
|
signing_key:
|
117
117
|
specification_version: 4
|
118
118
|
summary: Build svg path data from font file
|