cjk-subsetter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f5a3ca8ccd0b7ada0d8f57abcd5213e262a13b76
4
+ data.tar.gz: 647e81a6abc23b72af8a998fb0e18b8d2f689c2e
5
+ SHA512:
6
+ metadata.gz: a6319e989c38971de7570417eb2bec62e7e90e07d769861c6a3902bf438c04732cb1740789a132874ae22cb0fb9da280f1e743323a146ec1e6a851bf78a59bff
7
+ data.tar.gz: 185fd7eaa06bf1b43c6e177bf3683899fd9bfa6a5fc4ad50b420327a2a082e7c9ac03fc8a7e9dfc6a1db2d9b37f67ad0588ffb41d64db69214b06b5c296b4281
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = subsetter
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to subsetter
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
+ * Fork the project.
10
+ * Start a feature/bugfix branch.
11
+ * Commit and push until you are happy with your contribution.
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2013 yangqing. See LICENSE.txt for
18
+ further details.
19
+
@@ -0,0 +1,8 @@
1
+ <style>
2
+ @font-face
3
+ {
4
+ font-family: <%= font_key %>;
5
+ src: url('/<%= relative_path %>');
6
+ }
7
+ <%= klass %> { font-family: <%= font_key %>; }
8
+ </style>
@@ -0,0 +1,90 @@
1
+ require 'rack'
2
+ require 'nokogiri'
3
+ require 'digest/sha1'
4
+ require 'erb'
5
+ require 'pathname'
6
+ require 'posix/spawn'
7
+
8
+ module Rack
9
+ class Subsetter
10
+ def initialize(app, options={})
11
+ @app = app
12
+ @prefix = options[:prefix]
13
+ @font_map = options[:font_map]
14
+ @font_source = options[:font_source]
15
+ @public_path = options[:font_dist][:public_path]
16
+ @font_dist = ::File.expand_path(options[:font_dist][:dir], @public_path)
17
+ @sfnttool = ::File.expand_path("../tools/sfnttool.jar", __FILE__)
18
+ end
19
+
20
+ def should_subset(str)
21
+ !!(str =~ /\p{Han}|\p{Katakana}|\p{Hiragana}|\p{Hangul}|\p{Punctuation}|\p{Word}/)
22
+ end
23
+
24
+ def create_subset_map(html)
25
+ doc = Nokogiri::HTML(html)
26
+ doc.search('[class*="%s"]' % @prefix).each do |element|
27
+ type = /#{@prefix}-(\w+)/.match(element['class'])[1]
28
+ unless @subset_string_map[type]
29
+ @subset_string_map[type] = Hash.new
30
+ end
31
+ set_subset_map(type, element.inner_text)
32
+ end
33
+ end
34
+
35
+ def set_subset_map(type, string)
36
+ string.each_char do |s|
37
+ next unless should_subset(s)
38
+ @subset_string_map[type][s] = 1
39
+ end
40
+ end
41
+
42
+ def html?(headers)
43
+ headers['Content-Type'] =~ /html/
44
+ end
45
+
46
+ def create_path(string, font_name)
47
+ filename = Digest::SHA1.hexdigest(string + font_name)
48
+ @font_dist + '/' + filename + '.ttf'
49
+ end
50
+
51
+ def call(env)
52
+ @path = @font_dist
53
+
54
+ status, headers, body = @app.call(env)
55
+ return [status, headers, body] unless html? headers
56
+
57
+ response = Rack::Response.new([], status, headers)
58
+ new_body = ""
59
+ @subset_string_map = Hash.new
60
+
61
+ body.each do |string|
62
+ create_subset_map(string)
63
+ new_body << " " << string
64
+ end
65
+
66
+ p_public = Pathname.new @public_path
67
+ template = ::ERB.new ::File.read ::File.expand_path("../style.erb", __FILE__)
68
+
69
+ @subset_string_map.each do |font_key, chars_map|
70
+ subset_string = chars_map.map { |key, value| key }.join
71
+ font_name = @font_map[font_key].join
72
+ file_path = create_path(subset_string, font_name)
73
+
74
+ unless ::File.exist? file_path
75
+ ::File.open(file_path, 'w+')
76
+ child = POSIX::Spawn::Child.new('java', "-jar", "#{@sfnttool}", "-s", \
77
+ "#{subset_string}", "#{@font_source}/#{font_name}", "#{file_path}")
78
+ end
79
+
80
+ p_output = Pathname.new file_path
81
+ relative_path = p_output.relative_path_from p_public
82
+ klass = '.%s-' % @prefix + font_key
83
+ new_body.gsub!(%r{</head>}, template.result(binding) + "</head>")
84
+ end
85
+
86
+ response.write new_body
87
+ response.finish
88
+ end
89
+ end
90
+ end
Binary file
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cjk-subsetter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - hxgdzyuyi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: posix-spawn
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.6
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.6
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 2.8.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.8.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rdoc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.12'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '3.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: jeweler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.8.8
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 1.8.8
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sinatra
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rack-cache
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: '1.2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '1.2'
139
+ description: You can use chinese webfont
140
+ email: hxgdzyuyi@gmail.com
141
+ executables: []
142
+ extensions: []
143
+ extra_rdoc_files:
144
+ - README.rdoc
145
+ files:
146
+ - lib/rack/style.erb
147
+ - lib/rack/subsetter.rb
148
+ - lib/rack/tools/sfnttool.jar
149
+ - README.rdoc
150
+ homepage: https://bitbucket.org/hxgdzyuyi/cjk-subsetter/overview
151
+ licenses:
152
+ - Apache License 2.0
153
+ metadata: {}
154
+ post_install_message:
155
+ rdoc_options: []
156
+ require_paths:
157
+ - lib
158
+ required_ruby_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ requirements: []
169
+ rubyforge_project:
170
+ rubygems_version: 2.0.3
171
+ signing_key:
172
+ specification_version: 4
173
+ summary: You can use chinese webfont
174
+ test_files: []