0.0.1
This commit is contained in:
commit
4664814b80
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
*.sw[opn]
|
||||||
|
*.gem
|
||||||
|
/pkg
|
8
Gemfile
Normal file
8
Gemfile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
group :development do
|
||||||
|
gem "rake", '~> 12', require: false
|
||||||
|
gem "rdoc", '~> 4'
|
||||||
|
gem "bundler", '~> 1'
|
||||||
|
gem "jeweler", '~> 2'
|
||||||
|
end
|
62
Gemfile.lock
Normal file
62
Gemfile.lock
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
addressable (2.4.0)
|
||||||
|
builder (3.2.3)
|
||||||
|
descendants_tracker (0.0.4)
|
||||||
|
thread_safe (~> 0.3, >= 0.3.1)
|
||||||
|
faraday (0.9.2)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
|
git (1.5.0)
|
||||||
|
github_api (0.16.0)
|
||||||
|
addressable (~> 2.4.0)
|
||||||
|
descendants_tracker (~> 0.0.4)
|
||||||
|
faraday (~> 0.8, < 0.10)
|
||||||
|
hashie (>= 3.4)
|
||||||
|
mime-types (>= 1.16, < 3.0)
|
||||||
|
oauth2 (~> 1.0)
|
||||||
|
hashie (3.6.0)
|
||||||
|
highline (2.0.0)
|
||||||
|
jeweler (2.3.9)
|
||||||
|
builder
|
||||||
|
bundler
|
||||||
|
git (>= 1.2.5)
|
||||||
|
github_api (~> 0.16.0)
|
||||||
|
highline (>= 1.6.15)
|
||||||
|
nokogiri (>= 1.5.10)
|
||||||
|
psych
|
||||||
|
rake
|
||||||
|
rdoc
|
||||||
|
semver2
|
||||||
|
jwt (2.1.0)
|
||||||
|
mime-types (2.99.3)
|
||||||
|
mini_portile2 (2.4.0)
|
||||||
|
multi_json (1.13.1)
|
||||||
|
multi_xml (0.6.0)
|
||||||
|
multipart-post (2.0.0)
|
||||||
|
nokogiri (1.10.0)
|
||||||
|
mini_portile2 (~> 2.4.0)
|
||||||
|
oauth2 (1.4.1)
|
||||||
|
faraday (>= 0.8, < 0.16.0)
|
||||||
|
jwt (>= 1.0, < 3.0)
|
||||||
|
multi_json (~> 1.3)
|
||||||
|
multi_xml (~> 0.5)
|
||||||
|
rack (>= 1.2, < 3)
|
||||||
|
psych (3.1.0)
|
||||||
|
rack (2.0.6)
|
||||||
|
rake (12.3.2)
|
||||||
|
rdoc (4.3.0)
|
||||||
|
semver2 (3.4.2)
|
||||||
|
thread_safe (0.3.6)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
bundler (~> 1)
|
||||||
|
jeweler (~> 2)
|
||||||
|
rake (~> 12)
|
||||||
|
rdoc (~> 4)
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.17.3
|
20
LICENSE.txt
Normal file
20
LICENSE.txt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2014 Denis Knauf
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
50
Rakefile
Normal file
50
Rakefile
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
require 'rubygems'
|
||||||
|
require 'bundler'
|
||||||
|
begin
|
||||||
|
Bundler.setup(:default, :development)
|
||||||
|
rescue Bundler::BundlerError => e
|
||||||
|
$stderr.puts e.message
|
||||||
|
$stderr.puts "Run `bundle install` to install missing gems"
|
||||||
|
exit e.status_code
|
||||||
|
end
|
||||||
|
|
||||||
|
require 'jeweler'
|
||||||
|
Jeweler::Tasks.new do |gem|
|
||||||
|
gem.name = "middleman-fonts"
|
||||||
|
gem.homepage = "http://github.com/DenisKnauf/middleman-fonts"
|
||||||
|
gem.license = "MIT"
|
||||||
|
gem.summary = %Q{Fonts formats convertions}
|
||||||
|
gem.description = %{Generates WOFFs from TTFs and fonts.css}
|
||||||
|
gem.email = %q{#{"de"}nis}+?@+'den'+%Q{kn}+"#{?.}at"
|
||||||
|
gem.authors = ["Denis Knauf"]
|
||||||
|
gem.files = %w[README.md VERSION lib/**/*.rb test/**/*.rb]
|
||||||
|
gem.require_paths = %w[lib]
|
||||||
|
end
|
||||||
|
Jeweler::RubygemsDotOrgTasks.new
|
||||||
|
|
||||||
|
require 'rake/testtask'
|
||||||
|
Rake::TestTask.new(:test) do |test|
|
||||||
|
test.libs << 'lib' << 'test'
|
||||||
|
test.pattern = 'test/**/test_*.rb'
|
||||||
|
test.verbose = true
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Code coverage detail"
|
||||||
|
task :simplecov do
|
||||||
|
ENV['COVERAGE'] = "true"
|
||||||
|
Rake::Task['test'].execute
|
||||||
|
end
|
||||||
|
|
||||||
|
task :default => :test
|
||||||
|
|
||||||
|
require 'rdoc/task'
|
||||||
|
Rake::RDocTask.new do |rdoc|
|
||||||
|
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
||||||
|
|
||||||
|
rdoc.rdoc_dir = 'rdoc'
|
||||||
|
rdoc.title = "middleman-fonts #{version}"
|
||||||
|
rdoc.rdoc_files.include('README*')
|
||||||
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||||
|
end
|
16
lib/middleman-fonts.rb
Normal file
16
lib/middleman-fonts.rb
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
require "middleman-core"
|
||||||
|
|
||||||
|
::Middleman::Extensions.register :fonts_css do
|
||||||
|
require 'middleman-fonts/fonts_css'
|
||||||
|
::Middleman::Extensions::Metadata2FontsCss
|
||||||
|
end
|
||||||
|
|
||||||
|
::Middleman::Extensions.register :fonts4web do
|
||||||
|
require 'middleman-fonts/fonts4web'
|
||||||
|
::Middleman::Extensions::Fonts4Web
|
||||||
|
end
|
||||||
|
|
||||||
|
::Middleman::Extensions.register :font_awesome do
|
||||||
|
require 'middleman-fonts/font_awesome'
|
||||||
|
::Middleman::Extensions::FontAwesome
|
||||||
|
end
|
15
lib/middleman-fonts/font_awesome.rb
Normal file
15
lib/middleman-fonts/font_awesome.rb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
require 'pathname'
|
||||||
|
require 'fileutils'
|
||||||
|
require 'font-awesome-sass'
|
||||||
|
|
||||||
|
class ::Middleman::Extensions::FontAwesome < ::Middleman::Extension
|
||||||
|
def manipulate_resource_list resources
|
||||||
|
path = Pathname.new FontAwesome::Sass::fonts_path
|
||||||
|
path.find do |f|
|
||||||
|
next unless f.file?
|
||||||
|
dest = Pathname.new( 'assets')/'fonts'/f.relative_path_from( path)
|
||||||
|
resources << ::Middleman::Sitemap::Resource.new( @app.sitemap, dest.to_s, f.to_s)
|
||||||
|
end
|
||||||
|
resources
|
||||||
|
end
|
||||||
|
end
|
156
lib/middleman-fonts/fonts4web.rb
Normal file
156
lib/middleman-fonts/fonts4web.rb
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
require 'json'
|
||||||
|
require 'active_support/all'
|
||||||
|
require 'fileutils'
|
||||||
|
require 'shellwords'
|
||||||
|
require 'digest/md5'
|
||||||
|
|
||||||
|
class ::Middleman::Sitemap::Fonts4Web < ::Middleman::Sitemap::Resource
|
||||||
|
def initialize store, path, source
|
||||||
|
source_dir = Pathname.new( store.app.config[:source]).expand_path
|
||||||
|
STDERR.printf "fonts4web %p\n", path: path, source: source, source_dir: source_dir
|
||||||
|
super store, path, nil
|
||||||
|
@source = source
|
||||||
|
end
|
||||||
|
|
||||||
|
def binary?() true end
|
||||||
|
|
||||||
|
def render *_
|
||||||
|
convert( Pathname.new( @source)).read
|
||||||
|
end
|
||||||
|
|
||||||
|
def convert src
|
||||||
|
STDERR.puts "convert #{src}"
|
||||||
|
# files:
|
||||||
|
f = src.basename
|
||||||
|
md5sum = Digest::MD5.hexdigest src.read
|
||||||
|
|
||||||
|
# files in cache:
|
||||||
|
symlink = @cachepath/"#{f.basename f.extname}-#{md5sum}#{f.extname}"
|
||||||
|
cache_dest = @cachepath/"#{symlink.basename f.extname}.woff"
|
||||||
|
relsrc = src.expand_path.relative_path_from @cachepath.expand_path
|
||||||
|
dest = dest ? Pathname.new( dest) : cache_dest.expand_path
|
||||||
|
|
||||||
|
@cachepath.mkpath
|
||||||
|
|
||||||
|
identical = true
|
||||||
|
# cache_dest is older than source
|
||||||
|
unless cache_dest.exist?
|
||||||
|
identical = false
|
||||||
|
# prepare cache-files:
|
||||||
|
symlink.unlink if begin symlink.lstat; rescue Errno::ENOENT; false; end
|
||||||
|
symlink.make_symlink relsrc
|
||||||
|
|
||||||
|
# convert:
|
||||||
|
status = spawn @converter, symlink.basename, chdir: symlink.dirname
|
||||||
|
raise "Convertion #{src} failed!" unless 0 == status.exitstatus
|
||||||
|
raise "Convertion #{src} failed!" unless cache_dest.exist?
|
||||||
|
end
|
||||||
|
|
||||||
|
#FileUtils.copy cache_dest, dest, verbose: false
|
||||||
|
|
||||||
|
#builder.trigger identical ? :identical : :created, "#{dest}"
|
||||||
|
dest
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ::Middleman::Extensions::Fonts4Web < ::Middleman::Extension
|
||||||
|
def initialize app, **options_hash, &block
|
||||||
|
super
|
||||||
|
@converter = 'sfnt2woff-zopfli'
|
||||||
|
@cachepath = Pathname.new '.fonts_cache'
|
||||||
|
end
|
||||||
|
def included() true end
|
||||||
|
alias registered included
|
||||||
|
class <<self
|
||||||
|
def included() true end
|
||||||
|
alias registered included
|
||||||
|
end
|
||||||
|
|
||||||
|
def spawn *a, **options
|
||||||
|
a = a.map &:to_s
|
||||||
|
if options[:verbose]
|
||||||
|
pre = ''
|
||||||
|
pre = "cd #{Shellwords.escape options[:chdir]}; " if options.has_key? :chdir
|
||||||
|
STDERR.puts "$ #{pre}#{a.shelljoin}"
|
||||||
|
end
|
||||||
|
options.delete :verbose
|
||||||
|
options[:chdir] &&= options[:chdir].to_s
|
||||||
|
pid = Process.spawn *a, **options
|
||||||
|
_, status = Process.wait2 pid
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
def convert builder, src, dest = nil
|
||||||
|
# files:
|
||||||
|
f = src.basename
|
||||||
|
md5sum = Digest::MD5.hexdigest src.read
|
||||||
|
|
||||||
|
# files in cache:
|
||||||
|
symlink = @cachepath/"#{f.basename f.extname}-#{md5sum}#{f.extname}"
|
||||||
|
cache_dest = @cachepath/"#{symlink.basename f.extname}.woff"
|
||||||
|
relsrc = src.expand_path.relative_path_from @cachepath.expand_path
|
||||||
|
dest = dest ? Pathname.new( dest) : cache_dest.expand_path
|
||||||
|
|
||||||
|
@cachepath.mkpath
|
||||||
|
|
||||||
|
identical = true
|
||||||
|
# cache_dest is older than source
|
||||||
|
unless cache_dest.exist?
|
||||||
|
identical = false
|
||||||
|
# prepare cache-files:
|
||||||
|
symlink.unlink if begin symlink.lstat; rescue Errno::ENOENT; false; end
|
||||||
|
symlink.make_symlink relsrc
|
||||||
|
|
||||||
|
# convert:
|
||||||
|
status = spawn @converter, symlink.basename, chdir: symlink.dirname
|
||||||
|
raise "Convertion #{src} failed!" unless 0 == status.exitstatus
|
||||||
|
raise "Convertion #{src} failed!" unless cache_dest.exist?
|
||||||
|
end
|
||||||
|
|
||||||
|
FileUtils.copy cache_dest, dest, verbose: false
|
||||||
|
|
||||||
|
builder.trigger identical ? :identical : :created, "#{dest}"
|
||||||
|
dest
|
||||||
|
end
|
||||||
|
|
||||||
|
#def manipulate_resource_list resources
|
||||||
|
# source_dir = Pathname.new @app.config[:source]
|
||||||
|
# paths = {}
|
||||||
|
# resources.each {|res| paths[res.path] = res }
|
||||||
|
# resources.each do |res|
|
||||||
|
# path = Pathname.new res.path
|
||||||
|
# if 'assets' == path.descend.first.to_s
|
||||||
|
# case path.extname
|
||||||
|
# when '.otf', '.ttf'
|
||||||
|
# new = path.dirname/"#{path.basename path.extname}.woff"
|
||||||
|
# unless paths.has_key? new
|
||||||
|
# STDERR.puts "convert #{new} <= #{path}"
|
||||||
|
# resource = ::Middleman::Sitemap::Fonts4Web.new( @app.sitemap, new.to_s, res)
|
||||||
|
# if false
|
||||||
|
# woff = convert source_dir.expand_path/path #, path.dirname/"#{path.basename path.extname}.woff"
|
||||||
|
# resources << ::Middleman::Sitemap::Fonts4Web.new( @app.sitemap, new.to_s, woff.to_s)
|
||||||
|
# end
|
||||||
|
# resources << resource
|
||||||
|
# paths[new.to_s] = resource
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
# resources
|
||||||
|
#end
|
||||||
|
|
||||||
|
def after_build builder
|
||||||
|
paths = ::Middleman::Util.all_files_under app.config[:build_dir]
|
||||||
|
paths.each do |path|
|
||||||
|
if 'assets' == path.relative_path_from( Pathname.new(@app.config[:build_dir])).descend.first.to_s
|
||||||
|
case path.extname
|
||||||
|
when '.otf', '.ttf'
|
||||||
|
new = path.dirname/"#{path.basename path.extname}.woff"
|
||||||
|
unless paths.include?( new)
|
||||||
|
convert builder, path, path.dirname/"#{path.basename path.extname}.woff"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
62
lib/middleman-fonts/fonts_css.rb
Normal file
62
lib/middleman-fonts/fonts_css.rb
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
require 'json'
|
||||||
|
require 'active_support/all'
|
||||||
|
require 'fileutils'
|
||||||
|
|
||||||
|
class ::Middleman::Extensions::Metadata2FontsCss < ::Middleman::Extension
|
||||||
|
def initialize app, **options_hash, &block
|
||||||
|
super
|
||||||
|
@additional_extentions = %w[woff]
|
||||||
|
end
|
||||||
|
def included() true end
|
||||||
|
alias registered included
|
||||||
|
class <<self
|
||||||
|
def included() true end
|
||||||
|
alias registered included
|
||||||
|
end
|
||||||
|
|
||||||
|
def manipulate_resource_list resources
|
||||||
|
fonts_css = StringIO.new
|
||||||
|
resources.lazy.
|
||||||
|
select {|res| Pathname.new( res.path).basename.to_s == 'METADATA.json' }.
|
||||||
|
map do |res|
|
||||||
|
JSON.parse( File.read( f))['fonts'].each do |font|
|
||||||
|
font = font.symbolize_keys
|
||||||
|
font[:ttf] = "/assets/fonts/#{font[:filename]}"
|
||||||
|
font[:woff] = "/assets/fonts/#{font[:filename].gsub /\.[ot]tf\Z/, '.woff'}"
|
||||||
|
fonts_css.printf <<EOF.gsub( /^\s*(.*?)\s*$/, '\1').gsub( /\n/m, ''), font
|
||||||
|
@font-face {
|
||||||
|
font-family: "%<name>s";
|
||||||
|
font-weight: %<weight>i;
|
||||||
|
font-style: %<style>s;
|
||||||
|
src:
|
||||||
|
local("%<fullName>s"),
|
||||||
|
local("%<postScriptName>s"),
|
||||||
|
url("%<woff>s") format("woff"),
|
||||||
|
url("%<ttf>s") format("truetype");
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
resources.delete_if do |res|
|
||||||
|
path = Pathname.new res.path
|
||||||
|
if 'assets' == path.descend.first.to_s
|
||||||
|
case path.basename.to_s
|
||||||
|
when 'METADATA.pb' then true
|
||||||
|
when 'METADATA.json' then true
|
||||||
|
when 'DESCRIPTION.en_us.html' then true
|
||||||
|
when 'OFL.txt' then true
|
||||||
|
else false
|
||||||
|
end
|
||||||
|
else false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
resources << ::Middleman::Sitemap::StringResource.new(
|
||||||
|
self.app.sitemap,
|
||||||
|
'assets/styles/fonts.css',
|
||||||
|
fonts_css.string)
|
||||||
|
|
||||||
|
resources
|
||||||
|
end
|
||||||
|
end
|
1
lib/middleman_extension.rb
Normal file
1
lib/middleman_extension.rb
Normal file
|
@ -0,0 +1 @@
|
||||||
|
require 'middleman-fonts'
|
56
middleman-fonts.gemspec
Normal file
56
middleman-fonts.gemspec
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# Generated by jeweler
|
||||||
|
# DO NOT EDIT THIS FILE DIRECTLY
|
||||||
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
# stub: middleman-fonts 0.0.1 ruby lib
|
||||||
|
|
||||||
|
Gem::Specification.new do |s|
|
||||||
|
s.name = "middleman-fonts".freeze
|
||||||
|
s.version = "0.0.1"
|
||||||
|
|
||||||
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
||||||
|
s.require_paths = ["lib".freeze]
|
||||||
|
s.authors = ["Denis Knauf".freeze]
|
||||||
|
s.date = "2019-01-05"
|
||||||
|
s.description = "Generates WOFFs from TTFs and fonts.css".freeze
|
||||||
|
s.email = "\#{\"de\"}nis@denkn.at".freeze
|
||||||
|
s.extra_rdoc_files = [
|
||||||
|
"LICENSE.txt",
|
||||||
|
"README.md"
|
||||||
|
]
|
||||||
|
s.files = [
|
||||||
|
"README.md",
|
||||||
|
"VERSION",
|
||||||
|
"lib/middleman-fonts.rb",
|
||||||
|
"lib/middleman-fonts/font_awesome.rb",
|
||||||
|
"lib/middleman-fonts/fonts4web.rb",
|
||||||
|
"lib/middleman-fonts/fonts_css.rb",
|
||||||
|
"lib/middleman_extension.rb"
|
||||||
|
]
|
||||||
|
s.homepage = "http://github.com/DenisKnauf/middleman-fonts".freeze
|
||||||
|
s.licenses = ["MIT".freeze]
|
||||||
|
s.rubygems_version = "2.7.6".freeze
|
||||||
|
s.summary = "Fonts formats convertions".freeze
|
||||||
|
|
||||||
|
if s.respond_to? :specification_version then
|
||||||
|
s.specification_version = 4
|
||||||
|
|
||||||
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
||||||
|
s.add_development_dependency(%q<rake>.freeze, ["~> 12"])
|
||||||
|
s.add_development_dependency(%q<rdoc>.freeze, ["~> 4"])
|
||||||
|
s.add_development_dependency(%q<bundler>.freeze, ["~> 1"])
|
||||||
|
s.add_development_dependency(%q<jeweler>.freeze, ["~> 2"])
|
||||||
|
else
|
||||||
|
s.add_dependency(%q<rake>.freeze, ["~> 12"])
|
||||||
|
s.add_dependency(%q<rdoc>.freeze, ["~> 4"])
|
||||||
|
s.add_dependency(%q<bundler>.freeze, ["~> 1"])
|
||||||
|
s.add_dependency(%q<jeweler>.freeze, ["~> 2"])
|
||||||
|
end
|
||||||
|
else
|
||||||
|
s.add_dependency(%q<rake>.freeze, ["~> 12"])
|
||||||
|
s.add_dependency(%q<rdoc>.freeze, ["~> 4"])
|
||||||
|
s.add_dependency(%q<bundler>.freeze, ["~> 1"])
|
||||||
|
s.add_dependency(%q<jeweler>.freeze, ["~> 2"])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue