jitai 0.2.3
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.textile +14 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/kana-0.2.0.gem +0 -0
- data/kana.gemspec +71 -0
- data/lib/jitai.rb +47 -0
- data/lib/rake/jitaitask.rb +65 -0
- data/lib/ttf2eot/ChangeLog +5 -0
- data/lib/ttf2eot/Makefile +5 -0
- data/lib/ttf2eot/OpenTypeUtilities.cpp +334 -0
- data/lib/ttf2eot/OpenTypeUtilities.h +36 -0
- data/lib/ttf2eot/OpenTypeUtilities.o +0 -0
- data/lib/ttf2eot/README +35 -0
- data/lib/ttf2eot/ttf2eot +0 -0
- data/lib/ttf2eot/ttf2eot.cpp +94 -0
- data/lib/ttf2eot/ttf2eot.o +0 -0
- data/public/fonts/yardsale.eot +0 -0
- data/public/fonts/yardsale.ttf +0 -0
- data/public/stylesheets/fonts_ie.css +1 -0
- data/public/stylesheets/fonts_moz.css +1 -0
- data/spec/kana_spec.rb +7 -0
- data/spec/rake/kanatask_spec.rb +9 -0
- data/spec/spec_helper.rb +11 -0
- metadata +110 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Kelly
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
h1. jitai
|
2
|
+
|
3
|
+
A rake utility that consolidates your collection of custom font files into manageable CSS files.
|
4
|
+
|
5
|
+
h2.
|
6
|
+
ul.
|
7
|
+
li. 0.2.0 - .ttf fonts to .eot fonts.
|
8
|
+
|
9
|
+
pre. sudo gem install jitai
|
10
|
+
rake jitai:refresh
|
11
|
+
|
12
|
+
And then use your fonts accordingly.
|
13
|
+
|
14
|
+
Copyright (c) 2010 Kelly. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "jitai"
|
9
|
+
gem.summary = %Q{CSS custom font consolidator}
|
10
|
+
gem.description = %Q{CSS custom font consolidator}
|
11
|
+
gem.email = "defaultstring@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/kellydunn/jitai"
|
13
|
+
gem.authors = ["Kelly"]
|
14
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
15
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
|
+
end
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'spec/rake/spectask'
|
23
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
24
|
+
spec.libs << 'lib' << 'spec'
|
25
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
26
|
+
end
|
27
|
+
|
28
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
29
|
+
spec.libs << 'lib' << 'spec'
|
30
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
31
|
+
spec.rcov = true
|
32
|
+
end
|
33
|
+
|
34
|
+
task :spec => :check_dependencies
|
35
|
+
|
36
|
+
task :default => :spec
|
37
|
+
|
38
|
+
require 'rake/rdoctask'
|
39
|
+
Rake::RDocTask.new do |rdoc|
|
40
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
41
|
+
|
42
|
+
rdoc.rdoc_dir = 'rdoc'
|
43
|
+
rdoc.title = "jitai #{version}"
|
44
|
+
rdoc.rdoc_files.include('README*')
|
45
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
46
|
+
end
|
47
|
+
|
48
|
+
require 'lib/rake/jitaitask.rb'
|
49
|
+
Jitai::Rake::JitaiTask.new(:jitai) do |jitai|
|
50
|
+
end
|
51
|
+
|
52
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.3
|
data/kana-0.2.0.gem
ADDED
Binary file
|
data/kana.gemspec
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{kana}
|
8
|
+
s.version = "0.2.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Kelly"]
|
12
|
+
s.date = %q{2010-11-07}
|
13
|
+
s.description = %q{CSS consolidator gem file business}
|
14
|
+
s.email = %q{defaultstring@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.textile"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.textile",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"kana-0.2.0.gem",
|
27
|
+
"kana.gemspec",
|
28
|
+
"lib/kana.rb",
|
29
|
+
"lib/rake/kanatask.rb",
|
30
|
+
"lib/ttf2eot/ChangeLog",
|
31
|
+
"lib/ttf2eot/Makefile",
|
32
|
+
"lib/ttf2eot/OpenTypeUtilities.cpp",
|
33
|
+
"lib/ttf2eot/OpenTypeUtilities.h",
|
34
|
+
"lib/ttf2eot/OpenTypeUtilities.o",
|
35
|
+
"lib/ttf2eot/README",
|
36
|
+
"lib/ttf2eot/ttf2eot",
|
37
|
+
"lib/ttf2eot/ttf2eot.cpp",
|
38
|
+
"lib/ttf2eot/ttf2eot.o",
|
39
|
+
"public/fonts/yardsale.eot",
|
40
|
+
"public/fonts/yardsale.ttf",
|
41
|
+
"public/stylesheets/fonts_ie.css",
|
42
|
+
"public/stylesheets/fonts_moz.css",
|
43
|
+
"spec/kana_spec.rb",
|
44
|
+
"spec/rake/kanatask_spec.rb",
|
45
|
+
"spec/spec_helper.rb"
|
46
|
+
]
|
47
|
+
s.homepage = %q{http://github.com/kellydunn/kana}
|
48
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
49
|
+
s.require_paths = ["lib"]
|
50
|
+
s.rubygems_version = %q{1.3.7}
|
51
|
+
s.summary = %q{CSS consolidator gem}
|
52
|
+
s.test_files = [
|
53
|
+
"spec/kana_spec.rb",
|
54
|
+
"spec/rake/kanatask_spec.rb",
|
55
|
+
"spec/spec_helper.rb"
|
56
|
+
]
|
57
|
+
|
58
|
+
if s.respond_to? :specification_version then
|
59
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
60
|
+
s.specification_version = 3
|
61
|
+
|
62
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
63
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
64
|
+
else
|
65
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
66
|
+
end
|
67
|
+
else
|
68
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
data/lib/jitai.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module Jitai
|
2
|
+
class FontManager
|
3
|
+
attr_accessor :moz_path, :ie_path
|
4
|
+
|
5
|
+
def initialize(path= "public")
|
6
|
+
@moz_path = "#{path}/stylesheets/fonts_moz.css"
|
7
|
+
@ie_path = "#{path}/stylesheets/fonts_ie.css"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Font
|
12
|
+
attr_accessor :name, :path
|
13
|
+
|
14
|
+
def initialize(path)
|
15
|
+
@name = path.downcase.split(".")[0]
|
16
|
+
@path = path
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_css
|
20
|
+
moz = "@font-face {font-family:'#{@name}'; src:url('#{name}.ttf');}"
|
21
|
+
ie = "@font-face {font-family:'#{@name}'; src:url('#{name}.eot');}"
|
22
|
+
manager = Jitai::FontManager.new
|
23
|
+
find_font(manager.moz_path, moz)
|
24
|
+
find_font(manager.ie_path, ie)
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_font(file, search_font)
|
28
|
+
File.open(file, "w") if !File.exists?(file) # touch file
|
29
|
+
|
30
|
+
in_file = false
|
31
|
+
File.open(file) do |font|
|
32
|
+
test = font.gets
|
33
|
+
if !test.nil?
|
34
|
+
return (in_file = true) if search_font.eql? test.strip
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
unless in_file
|
39
|
+
File.open(file, "a") do |f|
|
40
|
+
f.puts search_font
|
41
|
+
puts search_font
|
42
|
+
puts "Was added to #{file}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/tasklib'
|
5
|
+
require 'lib/jitai.rb'
|
6
|
+
|
7
|
+
module Jitai
|
8
|
+
module Rake
|
9
|
+
class JitaiTask < ::Rake::TaskLib
|
10
|
+
attr_accessor :name
|
11
|
+
attr_accessor :cwd
|
12
|
+
|
13
|
+
def initialize(name = :kana)
|
14
|
+
@name = name
|
15
|
+
@cwd = "public/fonts/"
|
16
|
+
|
17
|
+
yield self if block_given?
|
18
|
+
define
|
19
|
+
end
|
20
|
+
|
21
|
+
def new
|
22
|
+
initialize
|
23
|
+
end
|
24
|
+
|
25
|
+
def define
|
26
|
+
desc "Sets the font directory for Jitai to operate."
|
27
|
+
task "jitai:set" do
|
28
|
+
# TODO kana should accept a directory argument
|
29
|
+
@cwd = "public/fonts/"
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Refreshes the CSS files in the font directory"
|
33
|
+
task "jitai:refresh" do
|
34
|
+
Dir.mkdir(@cwd) if !(File.directory? @cwd)
|
35
|
+
Dir.foreach(@cwd) do |font_file|
|
36
|
+
if !(File.directory?(font_file))
|
37
|
+
# Search for two different formats
|
38
|
+
conversion_type = (File.extname(font_file).downcase.eql? ".ttf")? ".eot" : ".ttf"
|
39
|
+
other_basename = font_file.split(".")[0] + conversion_type
|
40
|
+
other_file = "./#{@cwd}#{other_basename}"
|
41
|
+
file = "./#{@cwd}#{font_file}"
|
42
|
+
|
43
|
+
puts "other file: #{other_file}"
|
44
|
+
puts "file: #{file}"
|
45
|
+
|
46
|
+
# TODO edit ttf2eot so that it's actually installed in the system
|
47
|
+
if !File.exists?(other_file)
|
48
|
+
%x{cd lib/ttf2eot && ./ttf2eot < #{'../../' + @cwd + font_file} > #{'../../' + @cwd + font_file.split(".")[0] + conversion_type}}
|
49
|
+
end
|
50
|
+
|
51
|
+
# CONVENTIONS LOL
|
52
|
+
%x{mv #{other_file} #{other_file.downcase}}
|
53
|
+
%x{mv #{file} #{file.downcase}}
|
54
|
+
|
55
|
+
font = Jitai::Font.new(font_file)
|
56
|
+
font.to_css
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
self
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,334 @@
|
|
1
|
+
/* Modified for use with ttf2eot, originally from WebKit. */
|
2
|
+
|
3
|
+
/*
|
4
|
+
* Copyright (C) 2008 Apple Inc. All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions
|
8
|
+
* are met:
|
9
|
+
* 1. Redistributions of source code must retain the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer.
|
11
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
*
|
15
|
+
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
16
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
18
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
19
|
+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
20
|
+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
21
|
+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
22
|
+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
23
|
+
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
#include <string.h>
|
29
|
+
#include <vector>
|
30
|
+
|
31
|
+
#ifndef _MSC_VER
|
32
|
+
# include <stdint.h>
|
33
|
+
#else
|
34
|
+
typedef unsigned char uint8_t;
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#include "OpenTypeUtilities.h"
|
38
|
+
|
39
|
+
|
40
|
+
using std::vector;
|
41
|
+
|
42
|
+
typedef unsigned Fixed;
|
43
|
+
|
44
|
+
#define DEFAULT_CHARSET 1
|
45
|
+
|
46
|
+
struct BigEndianUShort {
|
47
|
+
operator unsigned short() const { return (v & 0x00ff) << 8 | v >> 8; }
|
48
|
+
BigEndianUShort(unsigned short u) : v((u & 0x00ff) << 8 | u >> 8) { }
|
49
|
+
unsigned short v;
|
50
|
+
};
|
51
|
+
|
52
|
+
struct BigEndianULong {
|
53
|
+
operator unsigned() const { return (v & 0xff) << 24 | (v & 0xff00) << 8 | (v & 0xff0000) >> 8 | v >> 24; }
|
54
|
+
BigEndianULong(unsigned u) : v((u & 0xff) << 24 | (u & 0xff00) << 8 | (u & 0xff0000) >> 8 | u >> 24) { }
|
55
|
+
unsigned v;
|
56
|
+
};
|
57
|
+
|
58
|
+
#pragma pack(1)
|
59
|
+
|
60
|
+
struct EOTPrefix {
|
61
|
+
unsigned eotSize;
|
62
|
+
unsigned fontDataSize;
|
63
|
+
unsigned version;
|
64
|
+
unsigned flags;
|
65
|
+
uint8_t fontPANOSE[10];
|
66
|
+
uint8_t charset;
|
67
|
+
uint8_t italic;
|
68
|
+
unsigned weight;
|
69
|
+
unsigned short fsType;
|
70
|
+
unsigned short magicNumber;
|
71
|
+
unsigned unicodeRange[4];
|
72
|
+
unsigned codePageRange[2];
|
73
|
+
unsigned checkSumAdjustment;
|
74
|
+
unsigned reserved[4];
|
75
|
+
unsigned short padding1;
|
76
|
+
};
|
77
|
+
|
78
|
+
struct TableDirectoryEntry {
|
79
|
+
BigEndianULong tag;
|
80
|
+
BigEndianULong checkSum;
|
81
|
+
BigEndianULong offset;
|
82
|
+
BigEndianULong length;
|
83
|
+
};
|
84
|
+
|
85
|
+
struct sfntHeader {
|
86
|
+
Fixed version;
|
87
|
+
BigEndianUShort numTables;
|
88
|
+
BigEndianUShort searchRange;
|
89
|
+
BigEndianUShort entrySelector;
|
90
|
+
BigEndianUShort rangeShift;
|
91
|
+
TableDirectoryEntry tables[1];
|
92
|
+
};
|
93
|
+
|
94
|
+
struct OS2Table {
|
95
|
+
BigEndianUShort version;
|
96
|
+
BigEndianUShort avgCharWidth;
|
97
|
+
BigEndianUShort weightClass;
|
98
|
+
BigEndianUShort widthClass;
|
99
|
+
BigEndianUShort fsType;
|
100
|
+
BigEndianUShort subscriptXSize;
|
101
|
+
BigEndianUShort subscriptYSize;
|
102
|
+
BigEndianUShort subscriptXOffset;
|
103
|
+
BigEndianUShort subscriptYOffset;
|
104
|
+
BigEndianUShort superscriptXSize;
|
105
|
+
BigEndianUShort superscriptYSize;
|
106
|
+
BigEndianUShort superscriptXOffset;
|
107
|
+
BigEndianUShort superscriptYOffset;
|
108
|
+
BigEndianUShort strikeoutSize;
|
109
|
+
BigEndianUShort strikeoutPosition;
|
110
|
+
BigEndianUShort familyClass;
|
111
|
+
uint8_t panose[10];
|
112
|
+
BigEndianULong unicodeRange[4];
|
113
|
+
uint8_t vendID[4];
|
114
|
+
BigEndianUShort fsSelection;
|
115
|
+
BigEndianUShort firstCharIndex;
|
116
|
+
BigEndianUShort lastCharIndex;
|
117
|
+
BigEndianUShort typoAscender;
|
118
|
+
BigEndianUShort typoDescender;
|
119
|
+
BigEndianUShort typoLineGap;
|
120
|
+
BigEndianUShort winAscent;
|
121
|
+
BigEndianUShort winDescent;
|
122
|
+
BigEndianULong codePageRange[2];
|
123
|
+
BigEndianUShort xHeight;
|
124
|
+
BigEndianUShort capHeight;
|
125
|
+
BigEndianUShort defaultChar;
|
126
|
+
BigEndianUShort breakChar;
|
127
|
+
BigEndianUShort maxContext;
|
128
|
+
};
|
129
|
+
|
130
|
+
struct headTable {
|
131
|
+
Fixed version;
|
132
|
+
Fixed fontRevision;
|
133
|
+
BigEndianULong checkSumAdjustment;
|
134
|
+
BigEndianULong magicNumber;
|
135
|
+
BigEndianUShort flags;
|
136
|
+
BigEndianUShort unitsPerEm;
|
137
|
+
long long created;
|
138
|
+
long long modified;
|
139
|
+
BigEndianUShort xMin;
|
140
|
+
BigEndianUShort xMax;
|
141
|
+
BigEndianUShort yMin;
|
142
|
+
BigEndianUShort yMax;
|
143
|
+
BigEndianUShort macStyle;
|
144
|
+
BigEndianUShort lowestRectPPEM;
|
145
|
+
BigEndianUShort fontDirectionHint;
|
146
|
+
BigEndianUShort indexToLocFormat;
|
147
|
+
BigEndianUShort glyphDataFormat;
|
148
|
+
};
|
149
|
+
|
150
|
+
struct nameRecord {
|
151
|
+
BigEndianUShort platformID;
|
152
|
+
BigEndianUShort encodingID;
|
153
|
+
BigEndianUShort languageID;
|
154
|
+
BigEndianUShort nameID;
|
155
|
+
BigEndianUShort length;
|
156
|
+
BigEndianUShort offset;
|
157
|
+
};
|
158
|
+
|
159
|
+
struct nameTable {
|
160
|
+
BigEndianUShort format;
|
161
|
+
BigEndianUShort count;
|
162
|
+
BigEndianUShort stringOffset;
|
163
|
+
nameRecord nameRecords[1];
|
164
|
+
};
|
165
|
+
|
166
|
+
#pragma pack()
|
167
|
+
|
168
|
+
static void appendBigEndianStringToEOTHeader(vector<uint8_t>&eotHeader, const BigEndianUShort* string, unsigned short length)
|
169
|
+
{
|
170
|
+
size_t size = eotHeader.size();
|
171
|
+
eotHeader.resize(size + length + 2 * sizeof(unsigned short));
|
172
|
+
unsigned short* dst = reinterpret_cast<unsigned short*>(&eotHeader[0] + size);
|
173
|
+
unsigned i = 0;
|
174
|
+
dst[i++] = length;
|
175
|
+
unsigned numCharacters = length / 2;
|
176
|
+
for (unsigned j = 0; j < numCharacters; j++)
|
177
|
+
dst[i++] = string[j];
|
178
|
+
dst[i] = 0;
|
179
|
+
}
|
180
|
+
|
181
|
+
bool getEOTHeader(unsigned char* fontData, size_t fontSize, vector<uint8_t>& eotHeader, size_t& overlayDst, size_t& overlaySrc, size_t& overlayLength)
|
182
|
+
{
|
183
|
+
overlayDst = 0;
|
184
|
+
overlaySrc = 0;
|
185
|
+
overlayLength = 0;
|
186
|
+
|
187
|
+
size_t dataLength = fontSize;
|
188
|
+
const char* data = (const char *) fontData;
|
189
|
+
|
190
|
+
eotHeader.resize(sizeof(EOTPrefix));
|
191
|
+
EOTPrefix* prefix = reinterpret_cast<EOTPrefix*>(&eotHeader[0]);
|
192
|
+
|
193
|
+
prefix->fontDataSize = dataLength;
|
194
|
+
prefix->version = 0x00020001;
|
195
|
+
prefix->flags = 0;
|
196
|
+
|
197
|
+
if (dataLength < offsetof(sfntHeader, tables))
|
198
|
+
return false;
|
199
|
+
|
200
|
+
const sfntHeader* sfnt = reinterpret_cast<const sfntHeader*>(data);
|
201
|
+
|
202
|
+
if (dataLength < offsetof(sfntHeader, tables) + sfnt->numTables * sizeof(TableDirectoryEntry))
|
203
|
+
return false;
|
204
|
+
|
205
|
+
bool haveOS2 = false;
|
206
|
+
bool haveHead = false;
|
207
|
+
bool haveName = false;
|
208
|
+
|
209
|
+
const BigEndianUShort* familyName = 0;
|
210
|
+
unsigned short familyNameLength = 0;
|
211
|
+
const BigEndianUShort* subfamilyName = 0;
|
212
|
+
unsigned short subfamilyNameLength = 0;
|
213
|
+
const BigEndianUShort* fullName = 0;
|
214
|
+
unsigned short fullNameLength = 0;
|
215
|
+
const BigEndianUShort* versionString = 0;
|
216
|
+
unsigned short versionStringLength = 0;
|
217
|
+
|
218
|
+
for (unsigned i = 0; i < sfnt->numTables; i++) {
|
219
|
+
unsigned tableOffset = sfnt->tables[i].offset;
|
220
|
+
unsigned tableLength = sfnt->tables[i].length;
|
221
|
+
|
222
|
+
if (dataLength < tableOffset || dataLength < tableLength || dataLength < tableOffset + tableLength)
|
223
|
+
return false;
|
224
|
+
|
225
|
+
unsigned tableTag = sfnt->tables[i].tag;
|
226
|
+
switch (tableTag) {
|
227
|
+
case 'OS/2':
|
228
|
+
{
|
229
|
+
if (dataLength < tableOffset + sizeof(OS2Table))
|
230
|
+
return false;
|
231
|
+
|
232
|
+
haveOS2 = true;
|
233
|
+
const OS2Table* OS2 = reinterpret_cast<const OS2Table*>(data + tableOffset);
|
234
|
+
for (unsigned j = 0; j < 10; j++)
|
235
|
+
prefix->fontPANOSE[j] = OS2->panose[j];
|
236
|
+
prefix->italic = OS2->fsSelection & 0x01;
|
237
|
+
prefix->weight = OS2->weightClass;
|
238
|
+
// FIXME: Should use OS2->fsType, but some TrueType fonts set it to an over-restrictive value.
|
239
|
+
// Since ATS does not enforce this on Mac OS X, we do not enforce it either.
|
240
|
+
prefix->fsType = 0;
|
241
|
+
for (unsigned j = 0; j < 4; j++)
|
242
|
+
prefix->unicodeRange[j] = OS2->unicodeRange[j];
|
243
|
+
for (unsigned j = 0; j < 2; j++)
|
244
|
+
prefix->codePageRange[j] = OS2->codePageRange[j];
|
245
|
+
break;
|
246
|
+
}
|
247
|
+
case 'head':
|
248
|
+
{
|
249
|
+
if (dataLength < tableOffset + sizeof(headTable))
|
250
|
+
return false;
|
251
|
+
|
252
|
+
haveHead = true;
|
253
|
+
const headTable* head = reinterpret_cast<const headTable*>(data + tableOffset);
|
254
|
+
prefix->checkSumAdjustment = head->checkSumAdjustment;
|
255
|
+
break;
|
256
|
+
}
|
257
|
+
case 'name':
|
258
|
+
{
|
259
|
+
if (dataLength < tableOffset + offsetof(nameTable, nameRecords))
|
260
|
+
return false;
|
261
|
+
|
262
|
+
haveName = true;
|
263
|
+
const nameTable* name = reinterpret_cast<const nameTable*>(data + tableOffset);
|
264
|
+
for (int j = 0; j < name->count; j++) {
|
265
|
+
if (dataLength < tableOffset + offsetof(nameTable, nameRecords) + (j + 1) * sizeof(nameRecord))
|
266
|
+
return false;
|
267
|
+
if (name->nameRecords[j].platformID == 3 && name->nameRecords[j].encodingID == 1 && name->nameRecords[j].languageID == 0x0409) {
|
268
|
+
if (dataLength < tableOffset + name->stringOffset + name->nameRecords[j].offset + name->nameRecords[j].length)
|
269
|
+
return false;
|
270
|
+
|
271
|
+
unsigned short nameLength = name->nameRecords[j].length;
|
272
|
+
const BigEndianUShort* nameString = reinterpret_cast<const BigEndianUShort*>(data + tableOffset + name->stringOffset + name->nameRecords[j].offset);
|
273
|
+
|
274
|
+
switch (name->nameRecords[j].nameID) {
|
275
|
+
case 1:
|
276
|
+
familyNameLength = nameLength;
|
277
|
+
familyName = nameString;
|
278
|
+
break;
|
279
|
+
case 2:
|
280
|
+
subfamilyNameLength = nameLength;
|
281
|
+
subfamilyName = nameString;
|
282
|
+
break;
|
283
|
+
case 4:
|
284
|
+
fullNameLength = nameLength;
|
285
|
+
fullName = nameString;
|
286
|
+
break;
|
287
|
+
case 5:
|
288
|
+
versionStringLength = nameLength;
|
289
|
+
versionString = nameString;
|
290
|
+
break;
|
291
|
+
default:
|
292
|
+
break;
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
296
|
+
break;
|
297
|
+
}
|
298
|
+
default:
|
299
|
+
break;
|
300
|
+
}
|
301
|
+
if (haveOS2 && haveHead && haveName)
|
302
|
+
break;
|
303
|
+
}
|
304
|
+
|
305
|
+
prefix->charset = DEFAULT_CHARSET;
|
306
|
+
prefix->magicNumber = 0x504c;
|
307
|
+
prefix->reserved[0] = 0;
|
308
|
+
prefix->reserved[1] = 0;
|
309
|
+
prefix->reserved[2] = 0;
|
310
|
+
prefix->reserved[3] = 0;
|
311
|
+
prefix->padding1 = 0;
|
312
|
+
|
313
|
+
appendBigEndianStringToEOTHeader(eotHeader, familyName, familyNameLength);
|
314
|
+
appendBigEndianStringToEOTHeader(eotHeader, subfamilyName, subfamilyNameLength);
|
315
|
+
appendBigEndianStringToEOTHeader(eotHeader, versionString, versionStringLength);
|
316
|
+
|
317
|
+
// If possible, ensure that the family name is a prefix of the full name.
|
318
|
+
if (fullNameLength >= familyNameLength && memcmp(familyName, fullName, familyNameLength)) {
|
319
|
+
overlaySrc = reinterpret_cast<const char*>(fullName) - data;
|
320
|
+
overlayDst = reinterpret_cast<const char*>(familyName) - data;
|
321
|
+
overlayLength = familyNameLength;
|
322
|
+
}
|
323
|
+
|
324
|
+
appendBigEndianStringToEOTHeader(eotHeader, fullName, fullNameLength);
|
325
|
+
|
326
|
+
unsigned short padding = 0;
|
327
|
+
eotHeader.push_back(padding);
|
328
|
+
eotHeader.push_back(padding);
|
329
|
+
|
330
|
+
prefix = reinterpret_cast<EOTPrefix*>(&eotHeader[0]);
|
331
|
+
prefix->eotSize = eotHeader.size() + fontSize;
|
332
|
+
|
333
|
+
return true;
|
334
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
/* Modified for use with ttf2eot, originally from WebKit. */
|
2
|
+
|
3
|
+
/*
|
4
|
+
* Copyright (C) 2008 Apple Inc. All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions
|
8
|
+
* are met:
|
9
|
+
* 1. Redistributions of source code must retain the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer.
|
11
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
*
|
15
|
+
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
16
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
18
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
19
|
+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
20
|
+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
21
|
+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
22
|
+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
23
|
+
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
#ifndef OpenTypeUtilities_h
|
29
|
+
#define OpenTypeUtilities_h
|
30
|
+
|
31
|
+
using std::vector;
|
32
|
+
|
33
|
+
bool getEOTHeader(unsigned char * fontData, size_t fontSize, vector<uint8_t>& eotHeader, size_t& overlayDst, size_t& overlaySrc, size_t& overlayLength);
|
34
|
+
|
35
|
+
|
36
|
+
#endif // OpenTypeUtilities_h
|
Binary file
|
data/lib/ttf2eot/README
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
Very quick commandline wrapper around OpenTypeUtilities.cpp from Chromium, used
|
2
|
+
to make EOT (Embeddable Open Type) files from TTF (TrueType/OpenType Font)
|
3
|
+
files. This is the format TTLoadEmbeddedFont() accepts, which is what Internet
|
4
|
+
Explorer uses for css @font-face declarations.
|
5
|
+
|
6
|
+
I've only tested this on Linux.
|
7
|
+
|
8
|
+
EOT was documented by Microsoft here:
|
9
|
+
<http://www.w3.org/Submission/2008/SUBM-EOT-20080305/>
|
10
|
+
|
11
|
+
TTLoadEmbeddedFont is described here:
|
12
|
+
<http://msdn.microsoft.com/en-us/library/dd145155(VS.85).aspx>
|
13
|
+
|
14
|
+
Chromium:
|
15
|
+
<http://src.chromium.org/viewvc/chrome/trunk/deps/third_party/WebKit/WebCore/platform/graphics/win/OpenTypeUtilities.cpp?view=log&pathrev=7591>
|
16
|
+
|
17
|
+
To build:
|
18
|
+
|
19
|
+
$ make
|
20
|
+
|
21
|
+
Usage:
|
22
|
+
|
23
|
+
$ ./ttf2eot < input.ttf > output.eot
|
24
|
+
|
25
|
+
Author: taviso@sdf.lonestar.org 15-Mar-2009
|
26
|
+
License: Derived from WebKit, so BSD/LGPL 2/LGPL 2.1.
|
27
|
+
|
28
|
+
Keywords for anyone having as much pain as me finding a utility to do this on Linux:
|
29
|
+
|
30
|
+
covert eot to ttf
|
31
|
+
eot converter
|
32
|
+
wtf is an eot file
|
33
|
+
|
34
|
+
|
35
|
+
TODO: MTX support?
|
data/lib/ttf2eot/ttf2eot
ADDED
Binary file
|
@@ -0,0 +1,94 @@
|
|
1
|
+
/* Trivial utility to create EOT files on Linux */
|
2
|
+
|
3
|
+
#include <stdlib.h>
|
4
|
+
#include <stdio.h>
|
5
|
+
#include <assert.h>
|
6
|
+
#include <limits.h>
|
7
|
+
#include <string.h>
|
8
|
+
|
9
|
+
#include <vector>
|
10
|
+
|
11
|
+
#ifndef _MSC_VER
|
12
|
+
# include <stdint.h>
|
13
|
+
#else
|
14
|
+
typedef unsigned char uint8_t;
|
15
|
+
#endif
|
16
|
+
|
17
|
+
#if defined(_MSC_VER) || defined(__MINGW32__)
|
18
|
+
# include <io.h>
|
19
|
+
# include <fcntl.h>
|
20
|
+
# ifndef _O_BINARY
|
21
|
+
# define _O_BINARY 0x8000
|
22
|
+
# endif
|
23
|
+
# ifndef _O_TEXT
|
24
|
+
# define _O_TEXT 0x4000
|
25
|
+
# endif
|
26
|
+
#endif
|
27
|
+
|
28
|
+
#include "OpenTypeUtilities.h"
|
29
|
+
|
30
|
+
#ifndef SIZE_MAX
|
31
|
+
# define SIZE_MAX UINT_MAX
|
32
|
+
#endif
|
33
|
+
|
34
|
+
using std::vector;
|
35
|
+
|
36
|
+
int main(int argc, char **argv)
|
37
|
+
{
|
38
|
+
const size_t kFontInitSize = 8192;
|
39
|
+
vector<uint8_t> eotHeader(512);
|
40
|
+
size_t overlayDst = 0;
|
41
|
+
size_t overlaySrc = 0;
|
42
|
+
size_t overlayLength = 0;
|
43
|
+
size_t fontSize = 0;
|
44
|
+
size_t fontOff = 0;
|
45
|
+
FILE *input;
|
46
|
+
unsigned char *fontData;
|
47
|
+
|
48
|
+
#if defined(_MSC_VER) || defined(__MINGW32__)
|
49
|
+
setmode(_fileno(stdin), _O_BINARY);
|
50
|
+
setmode(_fileno(stdout), _O_BINARY);
|
51
|
+
setmode(_fileno(stderr), _O_TEXT);
|
52
|
+
#endif
|
53
|
+
|
54
|
+
if (argv[1] == NULL || (argv[1][0] == '-' && argv[1][1] == '\0')) {
|
55
|
+
input = stdin;
|
56
|
+
} else {
|
57
|
+
input = fopen(argv[1], "rb");
|
58
|
+
if (input == NULL) {
|
59
|
+
fprintf(stderr, "could not open input file %s, %m\n", argv[1]);
|
60
|
+
return 1;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
if ((fontData = (unsigned char *) malloc(fontSize = kFontInitSize)) == NULL) {
|
65
|
+
fprintf(stderr, "Allocation failure, %m\n");
|
66
|
+
return 1;
|
67
|
+
}
|
68
|
+
|
69
|
+
do {
|
70
|
+
size_t ret = fread(fontData + fontOff, 1, fontSize - fontOff, input);
|
71
|
+
if (ret && fontSize <= SIZE_MAX / 2) {
|
72
|
+
fontOff += ret;
|
73
|
+
if ((fontData = (unsigned char *) realloc(fontData, fontSize *= 2)) == NULL) {
|
74
|
+
fprintf(stderr, "Allocation failure, %m\n");
|
75
|
+
return 1;
|
76
|
+
}
|
77
|
+
} else if (ret) {
|
78
|
+
fprintf(stderr, "Too much data, %m\n");
|
79
|
+
return 1;
|
80
|
+
} else {
|
81
|
+
fontData = (unsigned char *) realloc(fontData, fontSize = fontOff);
|
82
|
+
break;
|
83
|
+
}
|
84
|
+
} while (true);
|
85
|
+
|
86
|
+
if (getEOTHeader(fontData, fontSize, eotHeader, overlayDst, overlaySrc, overlayLength)) {
|
87
|
+
fwrite(&eotHeader[0], eotHeader.size(), 1, stdout);
|
88
|
+
fwrite(fontData, fontSize, 1, stdout);
|
89
|
+
return 0;
|
90
|
+
} else {
|
91
|
+
fprintf(stderr, "unknown error parsing input font, %m\n");
|
92
|
+
return 1;
|
93
|
+
}
|
94
|
+
}
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
@font-face {font-family:'yardsale'; src:url('yardsale.eot');}
|
@@ -0,0 +1 @@
|
|
1
|
+
@font-face {font-family:'yardsale'; src:url('yardsale.ttf');}
|
data/spec/kana_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jitai
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 17
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Kelly
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-07 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 13
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 2
|
33
|
+
- 9
|
34
|
+
version: 1.2.9
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
description: CSS custom font consolidator
|
38
|
+
email: defaultstring@gmail.com
|
39
|
+
executables: []
|
40
|
+
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files:
|
44
|
+
- LICENSE
|
45
|
+
- README.textile
|
46
|
+
files:
|
47
|
+
- .document
|
48
|
+
- .gitignore
|
49
|
+
- LICENSE
|
50
|
+
- README.textile
|
51
|
+
- Rakefile
|
52
|
+
- VERSION
|
53
|
+
- kana-0.2.0.gem
|
54
|
+
- kana.gemspec
|
55
|
+
- lib/jitai.rb
|
56
|
+
- lib/rake/jitaitask.rb
|
57
|
+
- lib/ttf2eot/ChangeLog
|
58
|
+
- lib/ttf2eot/Makefile
|
59
|
+
- lib/ttf2eot/OpenTypeUtilities.cpp
|
60
|
+
- lib/ttf2eot/OpenTypeUtilities.h
|
61
|
+
- lib/ttf2eot/OpenTypeUtilities.o
|
62
|
+
- lib/ttf2eot/README
|
63
|
+
- lib/ttf2eot/ttf2eot
|
64
|
+
- lib/ttf2eot/ttf2eot.cpp
|
65
|
+
- lib/ttf2eot/ttf2eot.o
|
66
|
+
- public/fonts/yardsale.eot
|
67
|
+
- public/fonts/yardsale.ttf
|
68
|
+
- public/stylesheets/fonts_ie.css
|
69
|
+
- public/stylesheets/fonts_moz.css
|
70
|
+
- spec/kana_spec.rb
|
71
|
+
- spec/rake/kanatask_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
has_rdoc: true
|
74
|
+
homepage: http://github.com/kellydunn/jitai
|
75
|
+
licenses: []
|
76
|
+
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options:
|
79
|
+
- --charset=UTF-8
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
hash: 3
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
version: "0"
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 1.3.7
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: CSS custom font consolidator
|
107
|
+
test_files:
|
108
|
+
- spec/kana_spec.rb
|
109
|
+
- spec/rake/kanatask_spec.rb
|
110
|
+
- spec/spec_helper.rb
|