much of Rails 3.2 upgrade
16
.gitignore
vendored
@@ -1,3 +1,17 @@
|
||||
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
||||
#
|
||||
# If you find yourself ignoring temporary files generated by your text editor
|
||||
# or operating system, you probably want to add a global ignore instead:
|
||||
# git config --global core.excludesfile ~/.gitignore_global
|
||||
|
||||
# Ignore bundler config
|
||||
/.bundle
|
||||
|
||||
# Ignore the default SQLite database.
|
||||
/db/*.sqlite3
|
||||
|
||||
# Ignore all logfiles and tempfiles.
|
||||
/tmp
|
||||
*.swp
|
||||
.DS_Store
|
||||
log/
|
||||
@@ -8,7 +22,6 @@ coverage*
|
||||
public/warpables/*
|
||||
public/warps/*
|
||||
public/tms/*
|
||||
public/api/0.6/*
|
||||
db/schema.rb
|
||||
config/database.yml
|
||||
config/amazon_s3.yml
|
||||
@@ -16,6 +29,7 @@ config/initializers/recaptcha.rb
|
||||
config/config.yml
|
||||
config/initializers/site_keys.rb
|
||||
Gemfile.lock
|
||||
# these are probably from when we used bundler with rails 2.3.x
|
||||
vendor/bundler_gems/gems
|
||||
vendor/bundler_gems/specifications
|
||||
vendor/bundler_gems/doc
|
||||
|
||||
15
Gemfile
@@ -1,18 +1,25 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
ruby "1.9.3"
|
||||
gem "rails", "2.3.15"
|
||||
gem "rails", "~>3.2"
|
||||
|
||||
# dependencies
|
||||
gem "mysql", "2.9.1"
|
||||
gem "geokit-rails", "1.1.4"
|
||||
gem "geokit-rails"
|
||||
gem "image_science", "1.2.6"
|
||||
gem "recaptcha", :require => "recaptcha/rails"
|
||||
gem "will_paginate", "2.3.16"
|
||||
gem "will_paginate"
|
||||
gem "oa-openid", "0.3.2"
|
||||
gem "httparty", "0.11.0"
|
||||
gem "RubyInline"
|
||||
gem "rdoc"
|
||||
gem "ruby-openid"
|
||||
gem "paperclip"
|
||||
gem 'open_id_authentication'
|
||||
# if you use amazon s3 for warpable image storage
|
||||
gem 'aws-sdk', '~> 1.5.7'
|
||||
|
||||
# for rake image migration tasks
|
||||
gem 'right_aws'
|
||||
|
||||
# if you decide to use sqlite3 as the database
|
||||
gem "sqlite3"
|
||||
|
||||
89
README
@@ -1,94 +1,77 @@
|
||||
oooo o8o . .
|
||||
`888 `"' .o8 .o8
|
||||
888 oooo ooo. .oo. oooo .o888oo .o888oo .ooooo. oooo d8b
|
||||
888 .8P' `888P"Y88b `888 888 888 d88' `88b `888""8P
|
||||
888888. 888 888 888 888 888 888ooo888 888
|
||||
888 `88b. 888 888 888 888 . 888 . 888 .o 888
|
||||
o888o o888o o888o o888o o888o "888" "888" `Y8bod8P' d888b
|
||||
MapKnitter
|
||||
|
||||
Use Public Lab's Map Knitter to upload your own aerial photographs (for example those from balloon or kite mapping: http://publiclab.org/wiki/balloon-mapping) and combine them into:
|
||||
|
||||
Use Public Laboratory's Map Knitter to upload your own aerial imagery and combine it into a GeoTiff and TMS/OpenLayers map.
|
||||
* web "slippy maps" like Google Maps
|
||||
* GeoTiff
|
||||
* TMS
|
||||
* high resolution JPEG
|
||||
|
||||
Copyright 2010-2011 Jeffrey Warren
|
||||
Copyright 2010-2014 Public Lab & Jeffrey Warren
|
||||
|
||||
==========================
|
||||
LICENSE
|
||||
==========================
|
||||
|
||||
PLOTS Map Knitter is free software: you can redistribute it and/or modify
|
||||
Map Knitter is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
PLOTS Map Knitter is distributed in the hope that it will be useful,
|
||||
Map Knitter is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with PLOTS Map Knitter. If not, see <http://www.gnu.org/licenses/>.
|
||||
along with Map Knitter. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
==========================
|
||||
ABOUT
|
||||
==========================
|
||||
|
||||
Use Public Laboratory's Map Knitter to upload your own aerial imagery and combine it into a GeoTiff and TMS/OpenLayers map.
|
||||
Use Public Lab's Map Knitter to upload your own aerial imagery and combine it into a GeoTiff and TMS/OpenLayers map.
|
||||
|
||||
Read more about PLOTS Map Knitter at: http://publiclaboratory.org/wiki/plots-map-toolkit
|
||||
Read more about Map Knitter at: http://publiclab.org/wiki/plots-map-toolkit
|
||||
|
||||
The Public Laboratory for Open Technology and Science (PLOTS) is a community which develops and applies open-source tools to environmental exploration and investigation. By democratizing inexpensive and accessible “Do-It-Yourself” techniques, Public Laboratory creates a collaborative network of practitioners who actively re-imagine the human relationship with the environment.
|
||||
The Public Laboratory for Open Technology and Science (Public Lab) is a community which develops and applies open-source tools to environmental exploration and investigation. By democratizing inexpensive and accessible “Do-It-Yourself” techniques, Public Lab creates a collaborative network of practitioners who actively re-imagine the human relationship with the environment.
|
||||
|
||||
The core PLOTS program is focused on “civic science” in which we research open source hardware and software tools and methods to generate knowledge and share data about community environmental health. Our goal is to increase the ability of underserved communities to identify, redress, remediate, and create awareness and accountability around environmental concerns. PLOTS achieves this by providing online and offline training, education and support, and by focusing on locally-relevant outcomes that emphasize human capacity and understanding.
|
||||
The core Public Lab program is focused on “civic science” in which we research open source hardware and software tools and methods to generate knowledge and share data about community environmental health. Our goal is to increase the ability of underserved communities to identify, redress, remediate, and create awareness and accountability around environmental concerns. Public Lab achieves this by providing online and offline training, education and support, and by focusing on locally-relevant outcomes that emphasize human capacity and understanding.
|
||||
|
||||
Join now at: http://publiclaboratory.org/join
|
||||
Join now at: http://publiclab.org
|
||||
|
||||
==========================
|
||||
INSTALLATION
|
||||
==========================
|
||||
|
||||
You'll need Ruby on Rails ~2.3.15, Ruby 1.8.7 (Ruby 1.9.x doesn't work for now as there is no packaged version of the geohash gem yet for 1.9.x), and GDAL >=1.7.x (gdal.org)
|
||||
Check the version of ruby installed on your system by "ruby -v" If it displays a version other than 1.8.7, use a version manager like RVM to use ruby 1.8.7 as default.
|
||||
You'll need Ruby 1.9.3 and GDAL >=1.7.x (gdal.org)
|
||||
Check the version of ruby installed on your system by "ruby -v" If it displays a version other than 1.9.3, use a version manager like RVM to use ruby 1.9.3 as default.
|
||||
|
||||
1) Download source from http://github.com/jywarren/mapknitter
|
||||
2) Install the compatible (with ruby 1.8.7) versions of the following gems using "gem install" : mysql(2.9.1), geokit-rails(1.1.4), image_science(1.2.6), recaptcha(0.3.6), will_paginate(2.3.16), oa-openid(0.3.2), httparty(0.11.0).
|
||||
For e.g.- use "gem install geokit-rails -v 1.1.4" to install geokit-rails version 1.1.4. The dependent libraries can be viewed by opening /config/environment.rb.
|
||||
3) Install davetroy-geohash from github source; first add github source with "gem sources -a http://gems.github.com" then run "gem install davetroy-geohash". (probably not needed anymore really)
|
||||
4) Manually run "gem install RubyInline" - this was causing trouble when done from environment.rb
|
||||
5) Install Amazon S3 gem with "gem install aws-s3" if you are using Amazon S3 for most image storage
|
||||
6) Copy and configure config/database.yml from config/database.yml.example
|
||||
7) Initialize database with "rake db:migrate"
|
||||
8) Change the Google Maps API key at config/config.yml, which you can copy from config/config.yml.example. If you're running it locally, you can use the default which is provided; it's set up for http://localhost:3000. For a new one visit http://code.google.com/apis/maps/signup.html
|
||||
9) Enter the ReCaptcha public and private keys in config/initializers/recaptcha.rb, copied from recaptcha.rb.example
|
||||
10) Remove write permissions from the folder you have placed your app in.
|
||||
11) Start rails with "script/server -p 3000" or "passenger start -p 3000" from the Rails root and open http://localhost:3000 in a web browser.
|
||||
1) Download source from https://github.com/publiclab/mapknitter
|
||||
2) Install gems with `bundle install` from the rails root folder
|
||||
3) Copy and configure config/database.yml from config/database.yml.example
|
||||
4) Initialize database with "rake db:migrate"
|
||||
5) Change the Google Maps API key at config/config.yml, which you can copy from config/config.yml.example. If you're running it locally, you can use the default which is provided; it's set up for http://localhost:3000. For a new one visit http://code.google.com/apis/maps/signup.html
|
||||
6) Enter the ReCaptcha public and private keys in config/initializers/recaptcha.rb, copied from recaptcha.rb.example
|
||||
7) Start rails with "passenger start" from the Rails root and open http://localhost:3000 in a web browser.
|
||||
|
||||
==========================
|
||||
BITNAMI INSTALLATION
|
||||
BUGS AND SUPPORT
|
||||
==========================
|
||||
|
||||
This is experimental, but if it works, you'll have a local version which you can carry around on a USB stick. We hope it will be useful for low-bandwidth situations. But beware - it hasn't been tested!
|
||||
To report bugs and request features, please use the GitHub issue tracker provided at https://github.com/publiclab/mapknitter/issues
|
||||
|
||||
From the Bitnami RubyStack README:
|
||||
To install BitNami RubyStack you will need:
|
||||
For additional support, join the Public Lab website and mailing list at http://publiclab.org/lists or for urgent requests, email web@publiclab.org
|
||||
|
||||
- Intel x86 or compatible processor
|
||||
- Minimum of 512 MB RAM
|
||||
- Minimum of 150 MB hard drive space
|
||||
- TCP/IP protocol support
|
||||
- Compatible operantig systems:
|
||||
- An x86 Linux operating system.
|
||||
- A 32-bit Windows operating system such as Windows 2000, XP, Vista
|
||||
or Windows Server 2003.
|
||||
- An OS X operating system (PowerPC or x86).
|
||||
For questions related to the use of this software and balloon or kite mapping, the same page links to the "grassrootsmapping" discussion group.
|
||||
|
||||
==========================
|
||||
DEVELOPERS
|
||||
==========================
|
||||
|
||||
Development is occurring at https://github.com/publiclab/mapknitter/; please fork and submit pull requests.
|
||||
|
||||
If you're a developer, consider joining the Public Lab developer list, also at http://publiclab.org/lists
|
||||
|
||||
You will also need:
|
||||
- GDAL >= 1.7.x (gdal.org)
|
||||
- some source of local tiles, such as from TileStream (mapbox.com)
|
||||
|
||||
1) Download the Bitnami.org RubyStack: http://bitnami.org/stack/rubystack, and run the installer.
|
||||
2) Place this MapKnitter folder in the resulting "projects" folder inside "rubystack-2.2-2" (get MapKnitter at http://github.com/jywarren/mapknitter or https://github.com/jywarren/mapknitter/zipball/master)
|
||||
3) Open a shell prompt/terminal, and enter the "rubystack-2.2-2" folder.
|
||||
4) Type ".rubyconsole" to start the Bitnami ruby console.
|
||||
5) Type "cd projects/mapknitter" to enter the MapKnitter project folder.
|
||||
6) Follow the above steps for a normal installation.
|
||||
|
||||
|
||||
9
Rakefile
@@ -1,10 +1,7 @@
|
||||
#!/usr/bin/env rake
|
||||
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||
|
||||
require(File.join(File.dirname(__FILE__), 'config', 'boot'))
|
||||
require File.expand_path('../config/application', __FILE__)
|
||||
|
||||
require 'rake'
|
||||
require 'rake/testtask'
|
||||
require 'rdoc/task'
|
||||
|
||||
require 'tasks/rails'
|
||||
Mapknitter::Application.load_tasks
|
||||
|
||||
BIN
app/assets/images/rails.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
15
app/assets/javascripts/application.js
Normal file
@@ -0,0 +1,15 @@
|
||||
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
||||
// listed below.
|
||||
//
|
||||
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
||||
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
||||
//
|
||||
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
||||
// the compiled file.
|
||||
//
|
||||
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
||||
// GO AFTER THE REQUIRES BELOW.
|
||||
//
|
||||
// require jquery
|
||||
// require jquery_ujs
|
||||
//= require_tree .
|
||||
13
app/assets/stylesheets/application.css
Normal file
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
||||
* listed below.
|
||||
*
|
||||
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
||||
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
||||
*
|
||||
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
||||
* compiled file, but it's generally better to create a new file per style scope.
|
||||
*
|
||||
*= require_self
|
||||
*= require_tree .
|
||||
*/
|
||||
@@ -1,19 +1,48 @@
|
||||
# Filters added to this controller apply to all controllers in the application.
|
||||
# Likewise, all the methods added will be available for all controllers.
|
||||
require_dependency 'password'
|
||||
|
||||
include AuthenticatedSystem
|
||||
|
||||
class ApplicationController < ActionController::Base
|
||||
# Prevent CSRF attacks by raising an exception.
|
||||
# For APIs, you may want to use :null_session instead.
|
||||
protect_from_forgery with: :exception
|
||||
|
||||
helper :all # include all helpers, all the time
|
||||
|
||||
# See ActionController::RequestForgeryProtection for details
|
||||
# Uncomment the :secret if you're not using the cookie session store
|
||||
protect_from_forgery # :secret => 'e60163cd72d897fd0ae06095d71acfbc'
|
||||
|
||||
# See ActionController::Base for details
|
||||
# Uncomment this to filter the contents of submitted sensitive data parameters
|
||||
# from your application log (in this case, all fields with names like "password").
|
||||
filter_parameter_logging :password
|
||||
|
||||
before_filter :current_user
|
||||
helper_method :logged_in?
|
||||
|
||||
def current_user
|
||||
user_id = session[:user_id]
|
||||
if user_id
|
||||
begin
|
||||
@user = User.find(user_id)
|
||||
rescue
|
||||
@user = nil
|
||||
end
|
||||
else
|
||||
@user = nil
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def require_login
|
||||
unless logged_in?
|
||||
path_info = request.env['PATH_INFO']
|
||||
flash[:warning] = "You must be logged in to access this section"
|
||||
redirect_to '/login?back_to=' + URI.encode(path_info) # halts request cycle
|
||||
end
|
||||
end
|
||||
|
||||
def logged_in?
|
||||
user_id = session[:user_id]
|
||||
|
||||
begin
|
||||
if user_id and User.find(user_id)
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
rescue
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -4,7 +4,7 @@ class MapController < ApplicationController
|
||||
|
||||
def index
|
||||
# only maps with at least 1 warpable:
|
||||
@maps = Map.find :all, :conditions => {:archived => false, :password => ''}, :order => 'updated_at DESC', :joins => :warpables, :group => "maps.id", :limit => 24
|
||||
@maps = Map.find :all, :conditions => {:archived => false, :password => ''}, :order => 'updated_at DESC', :group => "maps.id", :limit => 24
|
||||
@notes = Node.find :all, :order => "id DESC", :limit => 5
|
||||
@unpaginated = true
|
||||
@authors = Map.find(:all, :limit => 12, :group => "maps.author", :order => "id DESC", :conditions => ['password = "" AND archived = "false"']).collect(&:author)
|
||||
@@ -333,11 +333,11 @@ class MapController < ApplicationController
|
||||
export.jpg = false
|
||||
export.save
|
||||
|
||||
directory = RAILS_ROOT+"/public/warps/"+map.name+"/"
|
||||
directory = Rails.root+"/public/warps/"+map.name+"/"
|
||||
stdin, stdout, stderr = Open3.popen3('rm -r '+directory)
|
||||
puts stdout.readlines
|
||||
puts stderr.readlines
|
||||
stdin, stdout, stderr = Open3.popen3('rm -r '+RAILS_ROOT+'/public/tms/'+map.name)
|
||||
stdin, stdout, stderr = Open3.popen3('rm -r '+Rails.root+'/public/tms/'+map.name)
|
||||
puts stdout.readlines
|
||||
puts stderr.readlines
|
||||
|
||||
|
||||
@@ -1,8 +1,28 @@
|
||||
# Methods added to this helper will be available to all templates in the application.
|
||||
module ApplicationHelper
|
||||
|
||||
def admin
|
||||
APP_CONFIG["password"] == params[:password]
|
||||
end
|
||||
# add this to app/helpers/application_helper.rb
|
||||
# http://www.emersonlackey.com/article/rails3-error-messages-for-replacemen
|
||||
def errors_for(object, message=nil)
|
||||
html = ""
|
||||
unless object.nil? || object.errors.blank?
|
||||
html << "<div class='formErrors #{object.class.name.humanize.downcase}Errors'>\n"
|
||||
if message.blank?
|
||||
if object.new_record?
|
||||
html << "\t\t<h5>There was a problem creating the #{object.class.name.humanize.downcase}</h5>\n"
|
||||
else
|
||||
html << "\t\t<h5>There was a problem updating the #{object.class.name.humanize.downcase}</h5>\n"
|
||||
end
|
||||
else
|
||||
html << "<h5>#{message}</h5>"
|
||||
end
|
||||
html << "\t\t<ul>\n"
|
||||
object.errors.full_messages.each do |error|
|
||||
html << "\t\t\t<li>#{error}</li>\n"
|
||||
end
|
||||
html << "\t\t</ul>\n"
|
||||
html << "\t</div>\n"
|
||||
end
|
||||
html
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
0
app/models/.gitkeep
Normal file
@@ -245,7 +245,7 @@ class Map < ActiveRecord::Base
|
||||
puts '> generating tiles'
|
||||
# make tiles:
|
||||
google_api_key = APP_CONFIG["google_maps_api_key"]
|
||||
gdal2tiles = 'gdal2tiles.py -k -t "'+self.name+'-nrg" -g "'+google_api_key+'" '+RAILS_ROOT+'/public/warps/'+self.name+'/'+self.name+'-nrg.tif '+RAILS_ROOT+'/public/tms/'+self.name+"-nrg/"
|
||||
gdal2tiles = 'gdal2tiles.py -k -t "'+self.name+'-nrg" -g "'+google_api_key+'" '+Rails.root+'/public/warps/'+self.name+'/'+self.name+'-nrg.tif '+Rails.root+'/public/tms/'+self.name+"-nrg/"
|
||||
# puts gdal2tiles
|
||||
# puts system('which gdal2tiles.py')
|
||||
system(Gdal.ulimit+gdal2tiles)
|
||||
@@ -344,16 +344,16 @@ class Map < ActiveRecord::Base
|
||||
geotiff_location
|
||||
end
|
||||
|
||||
# generates a tileset at RAILS_ROOT/public/tms/<map_name>/
|
||||
# generates a tileset at Rails.root/public/tms/<map_name>/
|
||||
def generate_tiles
|
||||
google_api_key = APP_CONFIG["google_maps_api_key"]
|
||||
gdal2tiles = 'gdal2tiles.py -k -t "'+self.name+'" -g "'+google_api_key+'" '+RAILS_ROOT+'/public/warps/'+self.name+'/'+self.name+'-geo.tif '+RAILS_ROOT+'/public/tms/'+self.name+"/"
|
||||
gdal2tiles = 'gdal2tiles.py -k -t "'+self.name+'" -g "'+google_api_key+'" '+Rails.root+'/public/warps/'+self.name+'/'+self.name+'-geo.tif '+Rails.root+'/public/tms/'+self.name+"/"
|
||||
# puts gdal2tiles
|
||||
# puts system('which gdal2tiles.py')
|
||||
system(Gdal.ulimit+gdal2tiles)
|
||||
end
|
||||
|
||||
# zips up tiles at RAILS_ROOT/public/tms/<map_name>.zip
|
||||
# zips up tiles at Rails.root/public/tms/<map_name>.zip
|
||||
def zip_tiles
|
||||
rmzip = 'cd public/tms/ && rm '+self.name+'.zip && cd ../../'
|
||||
system(Gdal.ulimit+rmzip)
|
||||
@@ -364,8 +364,8 @@ class Map < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def generate_jpg(export_type)
|
||||
imageMagick = 'convert -background white -flatten '+RAILS_ROOT+'/public/warps/'+self.name+'/'+self.name+'-geo.tif '+RAILS_ROOT+'/public/warps/'+self.name+'/'+self.name+'.jpg' if export_type == "normal"
|
||||
imageMagick = 'convert -background white -flatten '+RAILS_ROOT+'/public/warps/'+self.name+'/'+self.name+'-'+export_type+'.tif '+RAILS_ROOT+'/public/warps/'+self.name+'/'+self.name+'-nrg.jpg' if export_type == "nrg"
|
||||
imageMagick = 'convert -background white -flatten '+Rails.root+'/public/warps/'+self.name+'/'+self.name+'-geo.tif '+Rails.root+'/public/warps/'+self.name+'/'+self.name+'.jpg' if export_type == "normal"
|
||||
imageMagick = 'convert -background white -flatten '+Rails.root+'/public/warps/'+self.name+'/'+self.name+'-'+export_type+'.tif '+Rails.root+'/public/warps/'+self.name+'/'+self.name+'-nrg.jpg' if export_type == "nrg"
|
||||
system(Gdal.ulimit+imageMagick)
|
||||
end
|
||||
|
||||
|
||||
@@ -1,99 +1,80 @@
|
||||
require "open3"
|
||||
require "fileutils"
|
||||
|
||||
class Warpable < ActiveRecord::Base
|
||||
|
||||
has_attachment :content_type => :image,
|
||||
:storage => APP_CONFIG["file_storage"],
|
||||
#:storage => :s3,
|
||||
#:storage => :file_system,
|
||||
:path_prefix => APP_CONFIG["file_path_prefix"],
|
||||
#:path_prefix => 'public/warpables',
|
||||
:max_size => 30.megabytes,
|
||||
:processor => :image_science,
|
||||
:thumbnails => { :medium => '500x375', :small => '240x180', :thumb => '100x100>' }
|
||||
|
||||
# remaming configs from attachment_fu:
|
||||
# :storage => APP_CONFIG["file_storage"],
|
||||
|
||||
# validates_as_attachment
|
||||
# Paperclip
|
||||
has_attached_file :image,
|
||||
#:path => ":rails_root/public/warpables/:attachment/:id/:style/:filename",
|
||||
#:url => "/system/:attachment/:id/:style/:filename",
|
||||
:path => "paperclip/:id/:style/:filename",
|
||||
# should start using
|
||||
#:path => "warpables/:id/:style/:filename",
|
||||
:storage => :s3,
|
||||
:s3_credentials => ":rails_root/config/amazon_s3.yml",
|
||||
:styles => {
|
||||
:medium=> "500x375",
|
||||
:small=> "240x180",
|
||||
:thumb => "100x100>" }
|
||||
|
||||
def validate
|
||||
errors.add_to_base("You must choose a file to upload") unless self.filename
|
||||
|
||||
unless self.filename == nil
|
||||
|
||||
# Images should only be GIF, JPEG, or PNG
|
||||
[:content_type].each do |attr_name|
|
||||
enum = attachment_options[attr_name]
|
||||
unless enum.nil? || enum.include?(send(attr_name))
|
||||
errors.add_to_base("You can only upload images (GIF, JPEG, or PNG)")
|
||||
end
|
||||
end
|
||||
|
||||
# Images should be less than 5 MB
|
||||
[:size].each do |attr_name|
|
||||
enum = attachment_options[attr_name]
|
||||
unless enum.nil? || enum.include?(send(attr_name))
|
||||
errors.add_to_base("Images should be smaller than 10 MB in size")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
belongs_to :map
|
||||
|
||||
def poly_area
|
||||
area = 0
|
||||
nodes = self.nodes_array
|
||||
nodes.each_with_index do |node,index|
|
||||
if index < nodes.length-1
|
||||
nextnode = nodes[index+1]
|
||||
else
|
||||
nextnode = nodes[0]
|
||||
end
|
||||
if index > 0
|
||||
last = nodes[index-1]
|
||||
else
|
||||
last = nodes[nodes.length-1]
|
||||
end
|
||||
scale = 20037508.34
|
||||
# inefficient but workable, we don't use this that often:
|
||||
|
||||
nodey = Cartagen.spherical_mercator_lat_to_y(node.lat,scale)
|
||||
nodex = Cartagen.spherical_mercator_lon_to_x(node.lon,scale)
|
||||
lasty = Cartagen.spherical_mercator_lat_to_y(last.lat,scale)
|
||||
lastx = Cartagen.spherical_mercator_lon_to_x(last.lon,scale)
|
||||
nexty = Cartagen.spherical_mercator_lat_to_y(nextnode.lat,scale)
|
||||
nextx = Cartagen.spherical_mercator_lon_to_x(nextnode.lon,scale)
|
||||
area += lastx*nodey-nodex*lasty+nodex*nexty-nextx*nodey
|
||||
end
|
||||
(area/2).abs
|
||||
area = 0
|
||||
nodes = self.nodes_array
|
||||
nodes.each_with_index do |node,index|
|
||||
if index < nodes.length-1
|
||||
nextnode = nodes[index+1]
|
||||
else
|
||||
nextnode = nodes[0]
|
||||
end
|
||||
if index > 0
|
||||
last = nodes[index-1]
|
||||
else
|
||||
last = nodes[nodes.length-1]
|
||||
end
|
||||
scale = 20037508.34
|
||||
# inefficient but workable, we don't use this that often:
|
||||
|
||||
nodey = Cartagen.spherical_mercator_lat_to_y(node.lat,scale)
|
||||
nodex = Cartagen.spherical_mercator_lon_to_x(node.lon,scale)
|
||||
lasty = Cartagen.spherical_mercator_lat_to_y(last.lat,scale)
|
||||
lastx = Cartagen.spherical_mercator_lon_to_x(last.lon,scale)
|
||||
nexty = Cartagen.spherical_mercator_lat_to_y(nextnode.lat,scale)
|
||||
nextx = Cartagen.spherical_mercator_lon_to_x(nextnode.lon,scale)
|
||||
area += lastx*nodey-nodex*lasty+nodex*nexty-nextx*nodey
|
||||
end
|
||||
(area/2).abs
|
||||
end
|
||||
|
||||
def get_cm_per_pixel
|
||||
unless self.width.nil? || self.nodes == ''
|
||||
nodes = self.nodes_array
|
||||
# haversine might be more appropriate for large images
|
||||
scale = 20037508.34
|
||||
y1 = Cartagen.spherical_mercator_lat_to_y(nodes[0].lat,scale)
|
||||
x1 = Cartagen.spherical_mercator_lon_to_x(nodes[0].lon,scale)
|
||||
y2 = Cartagen.spherical_mercator_lat_to_y(nodes[1].lat,scale)
|
||||
x2 = Cartagen.spherical_mercator_lon_to_x(nodes[1].lon,scale)
|
||||
dist = Math.sqrt(((y2-y1)*(y2-y1))+((x2-x1)*(x2-x1)))
|
||||
#puts 'x1,y1: '+x1.to_s+','+y1.to_s+' x2,y2: '+x2.to_s+','+y2.to_s
|
||||
#puts (x2-x1).to_s+','+(y2-y1).to_s
|
||||
#puts 'scale: '+((warpable.width)/dist).to_s+' & dist: '+dist.to_s
|
||||
scale = (dist*100)/(self.width) unless self.width.nil? || dist.nil?
|
||||
end
|
||||
scale
|
||||
unless self.width.nil? || self.nodes == ''
|
||||
nodes = self.nodes_array
|
||||
# haversine might be more appropriate for large images
|
||||
scale = 20037508.34
|
||||
y1 = Cartagen.spherical_mercator_lat_to_y(nodes[0].lat,scale)
|
||||
x1 = Cartagen.spherical_mercator_lon_to_x(nodes[0].lon,scale)
|
||||
y2 = Cartagen.spherical_mercator_lat_to_y(nodes[1].lat,scale)
|
||||
x2 = Cartagen.spherical_mercator_lon_to_x(nodes[1].lon,scale)
|
||||
dist = Math.sqrt(((y2-y1)*(y2-y1))+((x2-x1)*(x2-x1)))
|
||||
#puts 'x1,y1: '+x1.to_s+','+y1.to_s+' x2,y2: '+x2.to_s+','+y2.to_s
|
||||
#puts (x2-x1).to_s+','+(y2-y1).to_s
|
||||
#puts 'scale: '+((warpable.width)/dist).to_s+' & dist: '+dist.to_s
|
||||
scale = (dist*100)/(self.width) unless self.width.nil? || dist.nil?
|
||||
end
|
||||
scale
|
||||
end
|
||||
|
||||
def self.histogram_cm_per_pixel
|
||||
w = Warpable.find :all, :conditions => ['cm_per_pixel != 0 AND cm_per_pixel < 500'], :order => "cm_per_pixel DESC"
|
||||
hist = []
|
||||
(0..w.first.cm_per_pixel.to_i).each do |bin|
|
||||
hist[bin] = 0
|
||||
end
|
||||
w.each do |warpable|
|
||||
hist[warpable.cm_per_pixel.to_i] += 1
|
||||
end
|
||||
hist
|
||||
w = Warpable.find :all, :conditions => ['cm_per_pixel != 0 AND cm_per_pixel < 500'], :order => "cm_per_pixel DESC"
|
||||
hist = []
|
||||
(0..w.first.cm_per_pixel.to_i).each do |bin|
|
||||
hist[bin] = 0
|
||||
end
|
||||
w.each do |warpable|
|
||||
hist[warpable.cm_per_pixel.to_i] += 1
|
||||
end
|
||||
hist
|
||||
end
|
||||
|
||||
def nodes_array
|
||||
@@ -101,6 +82,7 @@ class Warpable < ActiveRecord::Base
|
||||
end
|
||||
|
||||
# allow uploads via URL
|
||||
# needs update for Paperclip!!
|
||||
require 'open-uri'
|
||||
attr_reader :url
|
||||
def url=(uri)
|
||||
@@ -165,7 +147,7 @@ class Warpable < ActiveRecord::Base
|
||||
}
|
||||
}
|
||||
else
|
||||
File.copy(RAILS_ROOT+'/public'+self.public_filename,local_location)
|
||||
File.copy(Rails.root+'/public'+self.public_filename,local_location)
|
||||
end
|
||||
|
||||
points = ""
|
||||
@@ -174,20 +156,20 @@ class Warpable < ActiveRecord::Base
|
||||
first = true
|
||||
|
||||
#EXIF orientation values:
|
||||
#Value 0th Row 0th Column
|
||||
#1 top left side
|
||||
#2 top right side
|
||||
#3 bottom right side
|
||||
#4 bottom left side
|
||||
#5 left side top
|
||||
#6 right side top
|
||||
#7 right side bottom
|
||||
#8 left side bottom
|
||||
|
||||
rotation = (`identify -format %[exif:Orientation] #{local_location}`).to_i
|
||||
#stdin, stdout, stderr = Open3.popen3('identify -format %[exif:Orientation] #{local_location}')
|
||||
#rotation = stdout.readlines.first.to_s.to_i
|
||||
#puts stderr.readlines
|
||||
#Value 0th Row 0th Column
|
||||
#1 top left side
|
||||
#2 top right side
|
||||
#3 bottom right side
|
||||
#4 bottom left side
|
||||
#5 left side top
|
||||
#6 right side top
|
||||
#7 right side bottom
|
||||
#8 left side bottom
|
||||
|
||||
rotation = (`identify -format %[exif:Orientation] #{local_location}`).to_i
|
||||
#stdin, stdout, stderr = Open3.popen3('identify -format %[exif:Orientation] #{local_location}')
|
||||
#rotation = stdout.readlines.first.to_s.to_i
|
||||
#puts stderr.readlines
|
||||
|
||||
if rotation == 6
|
||||
puts 'rotated CCW'
|
||||
@@ -235,11 +217,11 @@ class Warpable < ActiveRecord::Base
|
||||
height = (y1-y2).to_i.to_s
|
||||
width = (-x1+x2).to_i.to_s
|
||||
|
||||
# http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=11319
|
||||
# http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=8764
|
||||
# read about equalization
|
||||
# -equalize
|
||||
# -contrast-stretch 0
|
||||
# http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=11319
|
||||
# http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=8764
|
||||
# read about equalization
|
||||
# -equalize
|
||||
# -contrast-stretch 0
|
||||
|
||||
imageMagick = "convert "
|
||||
imageMagick += "-contrast-stretch 0 "
|
||||
@@ -249,44 +231,44 @@ class Warpable < ActiveRecord::Base
|
||||
imageMagick += "-distort Perspective '"+points+"' "
|
||||
imageMagick += "-flatten "
|
||||
if width > height
|
||||
imageMagick += "-crop "+width+"x"+width+"+0+0\! "
|
||||
imageMagick += "-crop "+width+"x"+width+"+0+0\! "
|
||||
else
|
||||
imageMagick += "-crop "+height+"x"+height+"+0+0\! "
|
||||
imageMagick += "-crop "+height+"x"+height+"+0+0\! "
|
||||
end
|
||||
imageMagick += "+repage "
|
||||
imageMagick += completed_local_location
|
||||
puts imageMagick
|
||||
system(Gdal.ulimit+imageMagick)
|
||||
system(Gdal.ulimit+imageMagick)
|
||||
|
||||
# create a mask (later we can blur edges here)
|
||||
imageMagick2 = 'convert +antialias '
|
||||
if width > height
|
||||
imageMagick2 += "-size "+width+"x"+width+" "
|
||||
imageMagick2 += "-size "+width+"x"+width+" "
|
||||
else
|
||||
imageMagick2 += "-size "+height+"x"+height+" "
|
||||
imageMagick2 += "-size "+height+"x"+height+" "
|
||||
end
|
||||
# attempt at blurred edges in masking, but I've given up, as gdal_merge doesn't seem to respect variable-opacity alpha channels
|
||||
imageMagick2 += ' xc:none -draw "fill black stroke red stroke-width 30 polyline '
|
||||
imageMagick2 += maskpoints + '" '
|
||||
imageMagick2 += ' -alpha set -channel A -transparent red -blur 0x8 -channel R -evaluate set 0 +channel '+mask_location
|
||||
# attempt at blurred edges in masking, but I've given up, as gdal_merge doesn't seem to respect variable-opacity alpha channels
|
||||
imageMagick2 += ' xc:none -draw "fill black stroke red stroke-width 30 polyline '
|
||||
imageMagick2 += maskpoints + '" '
|
||||
imageMagick2 += ' -alpha set -channel A -transparent red -blur 0x8 -channel R -evaluate set 0 +channel '+mask_location
|
||||
#imageMagick2 += ' xc:none -draw "fill black stroke none polyline '
|
||||
#imageMagick2 += maskpoints + '" '
|
||||
#imageMagick2 += ' '+mask_location
|
||||
puts imageMagick2
|
||||
system(Gdal.ulimit+imageMagick2)
|
||||
system(Gdal.ulimit+imageMagick2)
|
||||
|
||||
imageMagick3 = 'composite '+mask_location+' '+completed_local_location+' -compose DstIn -alpha Set '+masked_local_location
|
||||
puts imageMagick3
|
||||
system(Gdal.ulimit+imageMagick3)
|
||||
system(Gdal.ulimit+imageMagick3)
|
||||
|
||||
gdal_translate = "gdal_translate -of GTiff -a_srs EPSG:4326 "+coordinates+' -co "TILED=NO" '+masked_local_location+' '+geotiff_location
|
||||
puts gdal_translate
|
||||
system(Gdal.ulimit+gdal_translate)
|
||||
system(Gdal.ulimit+gdal_translate)
|
||||
|
||||
#gdalwarp = 'gdalwarp -srcnodata "255" -dstnodata 0 -cblend 30 -of GTiff -t_srs EPSG:4326 '+geotiff_location+' '+warped_geotiff_location
|
||||
gdalwarp = 'gdalwarp -of GTiff -t_srs EPSG:4326 '+geotiff_location+' '+warped_geotiff_location
|
||||
puts gdalwarp
|
||||
system(Gdal.ulimit+gdalwarp)
|
||||
system(Gdal.ulimit+gdalwarp)
|
||||
|
||||
# deletions could happen here; do it in distinct method so we can run it independently
|
||||
self.delete_temp_files(path)
|
||||
|
||||
14
app/views/layouts/application.html.erb.rails3
Normal file
@@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Mapknitter</title>
|
||||
<%= stylesheet_link_tag "application", :media => "all" %>
|
||||
<%= javascript_include_tag "application" %>
|
||||
<%= csrf_meta_tags %>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<%= yield %>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -2,7 +2,7 @@
|
||||
<% odd = true %>
|
||||
<% for map in @maps %>
|
||||
<div class="map span4 <%= 'odd' if odd %>" style="margin:0;margin-right:10px;">
|
||||
<% if !map.private && map.warpables.length > 0 %><a href="/map/view/<%= map.name %>"><img style="width:100%;background:#ddd;" src="<%= map.warpables.first.public_filename(:small) %>" /></a><% end %>
|
||||
<% if !map.private && map.warpables.length > 0 %><a href="/map/view/<%= map.name %>"><img style="width:100%;background:#ddd;" src="<%= map.warpables.first.image.url(:small) %>" /></a><% end %>
|
||||
<h3><a href ="/map/view/<%= map.name %>"><%= map.name.capitalize %></a></h3>
|
||||
<p><small>by <a href="/profile/<%= map.author %>"><%= map.author %></a> | <%= map.location %></small></p>
|
||||
<p class="description"><small>
|
||||
|
||||
@@ -22,8 +22,10 @@
|
||||
<div id="new-map-form" style="display:none;">
|
||||
<% end %>
|
||||
|
||||
<% form_for :map, @map, :url => { :controller => "map", :action => "create" }, :html => {:id => "new_map", :class => "map"} do |f| %>
|
||||
<%= error_messages_for 'map' %>
|
||||
<% form_for :map, :html => {:id => "new_map", :class => "map"} do |f| %>
|
||||
|
||||
<%= errors_for @map, "Oops, we were unable to save your map." %>
|
||||
|
||||
<label for="name">Map title/URL (you won't be able to change this)</label>
|
||||
<input class="text" type="text" name="name" value="<%= params[:name] %>" id="name">
|
||||
<label for="location">Place (to enter lat/lon, <a href="javascript:void(0);" onClick="$('#lat_lon').toggle()">click here</a>)</label>
|
||||
|
||||
4
config.ru
Normal file
@@ -0,0 +1,4 @@
|
||||
# This file is used by Rack-based servers to start the application.
|
||||
|
||||
require ::File.expand_path('../config/environment', __FILE__)
|
||||
run Mapknitter::Application
|
||||
@@ -1,14 +1,11 @@
|
||||
development:
|
||||
bucket_name:
|
||||
bucket: "grassrootsmapping"
|
||||
access_key_id:
|
||||
secret_access_key:
|
||||
|
||||
test:
|
||||
bucket_name:
|
||||
access_key_id:
|
||||
secret_access_key:
|
||||
|
||||
production:
|
||||
bucket_name:
|
||||
bucket: "grassrootsmapping"
|
||||
access_key_id:
|
||||
secret_access_key:
|
||||
|
||||
62
config/application.rb
Normal file
@@ -0,0 +1,62 @@
|
||||
require File.expand_path('../boot', __FILE__)
|
||||
|
||||
require 'rails/all'
|
||||
|
||||
if defined?(Bundler)
|
||||
# If you precompile assets before deploying to production, use this line
|
||||
Bundler.require(*Rails.groups(:assets => %w(development test)))
|
||||
# If you want your assets lazily compiled in production, use this line
|
||||
# Bundler.require(:default, :assets, Rails.env)
|
||||
end
|
||||
|
||||
module Mapknitter
|
||||
class Application < Rails::Application
|
||||
# Settings in config/environments/* take precedence over those specified here.
|
||||
# Application configuration should go into files in config/initializers
|
||||
# -- all .rb files in that directory are automatically loaded.
|
||||
|
||||
# Custom directories with classes and modules you want to be autoloadable.
|
||||
# config.autoload_paths += %W(#{config.root}/extras)
|
||||
|
||||
# Only load the plugins named here, in the order given (default is alphabetical).
|
||||
# :all can be used as a placeholder for all plugins not explicitly named.
|
||||
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
||||
|
||||
# Activate observers that should always be running.
|
||||
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
||||
|
||||
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
||||
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
||||
# config.time_zone = 'Central Time (US & Canada)'
|
||||
|
||||
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
||||
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
||||
# config.i18n.default_locale = :de
|
||||
|
||||
# Configure the default encoding used in templates for Ruby 1.9.
|
||||
config.encoding = "utf-8"
|
||||
|
||||
# Configure sensitive parameters which will be filtered from the log file.
|
||||
config.filter_parameters += [:password]
|
||||
|
||||
# Enable escaping HTML in JSON.
|
||||
config.active_support.escape_html_entities_in_json = true
|
||||
|
||||
# Use SQL instead of Active Record's schema dumper when creating the database.
|
||||
# This is necessary if your schema can't be completely dumped by the schema dumper,
|
||||
# like if you have constraints or database-specific column types
|
||||
# config.active_record.schema_format = :sql
|
||||
|
||||
# Enforce whitelist mode for mass assignment.
|
||||
# This will create an empty whitelist of attributes available for mass-assignment for all models
|
||||
# in your app. As such, your models will need to explicitly whitelist or blacklist accessible
|
||||
# parameters by using an attr_accessible or attr_protected declaration.
|
||||
config.active_record.whitelist_attributes = true
|
||||
|
||||
# Enable the asset pipeline
|
||||
config.assets.enabled = true
|
||||
|
||||
# Version of your assets, change this if you want to expire all your assets
|
||||
config.assets.version = '1.0'
|
||||
end
|
||||
end
|
||||
116
config/boot.rb
@@ -1,114 +1,6 @@
|
||||
# Don't change this file!
|
||||
# Configure your app in config/environment.rb and config/environments/*.rb
|
||||
require 'rubygems'
|
||||
|
||||
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
|
||||
# Set up gems listed in the Gemfile.
|
||||
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
|
||||
|
||||
module Rails
|
||||
class << self
|
||||
def boot!
|
||||
unless booted?
|
||||
preinitialize
|
||||
pick_boot.run
|
||||
end
|
||||
end
|
||||
|
||||
def booted?
|
||||
defined? Rails::Initializer
|
||||
end
|
||||
|
||||
def pick_boot
|
||||
(vendor_rails? ? VendorBoot : GemBoot).new
|
||||
end
|
||||
|
||||
def vendor_rails?
|
||||
File.exist?("#{RAILS_ROOT}/vendor/rails")
|
||||
end
|
||||
|
||||
def preinitialize
|
||||
load(preinitializer_path) if File.exist?(preinitializer_path)
|
||||
end
|
||||
|
||||
def preinitializer_path
|
||||
"#{RAILS_ROOT}/config/preinitializer.rb"
|
||||
end
|
||||
end
|
||||
|
||||
class Boot
|
||||
def run
|
||||
load_initializer
|
||||
Rails::Initializer.run(:set_load_path)
|
||||
end
|
||||
end
|
||||
|
||||
class VendorBoot < Boot
|
||||
def load_initializer
|
||||
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
|
||||
Rails::Initializer.run(:install_gem_spec_stubs)
|
||||
Rails::GemDependency.add_frozen_gem_path
|
||||
end
|
||||
end
|
||||
|
||||
class GemBoot < Boot
|
||||
def load_initializer
|
||||
self.class.load_rubygems
|
||||
load_rails_gem
|
||||
require 'initializer'
|
||||
end
|
||||
|
||||
def load_rails_gem
|
||||
if version = self.class.gem_version
|
||||
gem 'rails', version
|
||||
else
|
||||
gem 'rails'
|
||||
end
|
||||
rescue Gem::LoadError => load_error
|
||||
if load_error.message =~ /Could not find RubyGem rails/
|
||||
STDERR.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
|
||||
exit 1
|
||||
else
|
||||
raise
|
||||
end
|
||||
end
|
||||
|
||||
class << self
|
||||
def rubygems_version
|
||||
Gem::RubyGemsVersion rescue nil
|
||||
end
|
||||
|
||||
def gem_version
|
||||
if defined? RAILS_GEM_VERSION
|
||||
RAILS_GEM_VERSION
|
||||
elsif ENV.include?('RAILS_GEM_VERSION')
|
||||
ENV['RAILS_GEM_VERSION']
|
||||
else
|
||||
parse_gem_version(read_environment_rb)
|
||||
end
|
||||
end
|
||||
|
||||
def load_rubygems
|
||||
min_version = '1.3.2'
|
||||
require 'rubygems'
|
||||
unless rubygems_version >= min_version
|
||||
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
|
||||
exit 1
|
||||
end
|
||||
|
||||
rescue LoadError
|
||||
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
|
||||
exit 1
|
||||
end
|
||||
|
||||
def parse_gem_version(text)
|
||||
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
|
||||
end
|
||||
|
||||
private
|
||||
def read_environment_rb
|
||||
File.read("#{RAILS_ROOT}/config/environment.rb")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# All that for this:
|
||||
Rails.boot!
|
||||
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
|
||||
|
||||
@@ -1,125 +1,5 @@
|
||||
# Be sure to restart your server when you modify this file
|
||||
# Load the rails application
|
||||
require File.expand_path('../application', __FILE__)
|
||||
|
||||
# Uncomment below to force Rails into production mode when
|
||||
# you don't control web/app server and can't set it the proper way
|
||||
# ENV['RAILS_ENV'] ||= 'production'
|
||||
|
||||
# Specifies gem version of Rails to use when vendor/rails is not present
|
||||
RAILS_GEM_VERSION = '2.3.15' unless defined? RAILS_GEM_VERSION
|
||||
|
||||
# Bootstrap the Rails environment, frameworks, and default configuration
|
||||
require File.join(File.dirname(__FILE__), 'boot')
|
||||
|
||||
# monkey patch for 2.0. Will ignore vendor gems. # via http://djellemah.com/blog/2013/02/27/rails-23-with-ruby-20/ #if RUBY_VERSION >= "2.0.0"
|
||||
module Gem
|
||||
def self.source_index
|
||||
sources
|
||||
end
|
||||
|
||||
def self.cache
|
||||
sources
|
||||
end
|
||||
|
||||
SourceIndex = Specification
|
||||
|
||||
class SourceList
|
||||
# If you want vendor gems, this is where to start writing code.
|
||||
def search( *args ); []; end
|
||||
def each( &block ); end
|
||||
include Enumerable
|
||||
end
|
||||
end
|
||||
#end
|
||||
|
||||
Rails::Initializer.run do |config|
|
||||
# Settings in config/environments/* take precedence over those specified here.
|
||||
# Application configuration should go into files in config/initializers
|
||||
# -- all .rb files in that directory are automatically loaded.
|
||||
# See Rails::Configuration for more options.
|
||||
|
||||
# Skip frameworks you're not going to use. To use Rails without a database
|
||||
# you must remove the Active Record framework.
|
||||
# config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
|
||||
|
||||
# Specify gems that this application depends on.
|
||||
# They can then be installed with "rake gems:install" on new installations.
|
||||
# You have to specify the :lib option for libraries, where the Gem name (sqlite3-ruby) differs from the file itself (sqlite3)
|
||||
# config.gem "bj"
|
||||
# config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
|
||||
# config.gem "sqlite3-ruby", :lib => "sqlite3"
|
||||
|
||||
# commented these out in order to use the Gemfile instead
|
||||
# config.gem "mysql", :version => '~> 2.9.1'
|
||||
# #config.gem "json_pure"
|
||||
# config.gem "httparty", :version => '~> 0.11.0'
|
||||
# config.gem "geokit-rails", :version => '~> 1.1.4'
|
||||
# #config.gem "RubyInline"
|
||||
# config.gem "image_science", :version => '~> 1.2.6'
|
||||
#Configure at config/initializers/recaptcha.rb, copy from recaptcha.rb.example
|
||||
# config.gem "recaptcha", :lib => "recaptcha/rails" # Passenger needs this line in order to load correctly -> why?
|
||||
# #config.gem "exifr" # didnt use as incompatible with ruby 1.8.6
|
||||
# config.gem 'will_paginate', :version => '~> 2.3.16'
|
||||
# config.gem 'oa-openid', :version => '~> 0.3.2'
|
||||
|
||||
# config.gem "rubyzip"
|
||||
# if you're going to use Amazon s3 for image storage:
|
||||
# config.gem "aws-s3"
|
||||
# you also need to install 'freeimage':
|
||||
##### sudo port install freeimage
|
||||
##### or: sudo aptitude install libfreeimage3 libfreeimage-dev
|
||||
# we also need davetroy-geohash, but it's not in the default gem sources, so try adding github to your gem sources:
|
||||
# gem sources -a http://gems.github.com
|
||||
# then run:
|
||||
# sudo gem install davetroy-geohash
|
||||
# Hmm, this might also be useful:
|
||||
#config.gem "davetroy-geohash", :lib => 'geohash', :source => "http://gems.github.com"
|
||||
|
||||
# Only load the plugins named here, in the order given. By default, all plugins
|
||||
# in vendor/plugins are loaded in alphabetical order.
|
||||
# :all can be used as a placeholder for all plugins not explicitly named
|
||||
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
||||
|
||||
# Add additional load paths for your own custom dirs
|
||||
# config.load_paths += %W( #{RAILS_ROOT}/extras )
|
||||
|
||||
# Force all environments to use the same logger level
|
||||
# (by default production uses :info, the others :debug)
|
||||
# config.log_level = :debug
|
||||
|
||||
# Make Time.zone default to the specified zone, and make Active Record store time values
|
||||
# in the database in UTC, and return them converted to the specified local zone.
|
||||
# Run "rake -D time" for a list of tasks for finding time zone names. Comment line to use default local time.
|
||||
config.time_zone = 'UTC'
|
||||
|
||||
# The internationalization framework can be changed to have another default locale (standard is :en) or more load paths.
|
||||
# All files from config/locales/*.rb,yml are added automatically.
|
||||
# config.i18n.load_path << Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
|
||||
# config.i18n.default_locale = :de
|
||||
|
||||
# Your secret key for verifying cookie session data integrity.
|
||||
# If you change this key, all old sessions will become invalid!
|
||||
# Make sure the secret is at least 30 characters and all random,
|
||||
# no regular words or you'll be exposed to dictionary attacks.
|
||||
config.action_controller.session = {
|
||||
:session_key => '_whooz_session',
|
||||
:secret => 'e420335fa23afd9cc84f118c9cb9985530d4f259b671fe1ec9c60466d6a07c6bbd268167674293b1cda7476f64f0012c23adca8fa0bcd9ee3ef70dcd0e9745e7'
|
||||
}
|
||||
|
||||
# Use the database for sessions instead of the cookie-based default,
|
||||
# which shouldn't be used to store highly confidential information
|
||||
# (create the session table with "rake db:sessions:create")
|
||||
# config.action_controller.session_store = :active_record_store
|
||||
|
||||
# Use SQL instead of Active Record's schema dumper when creating the test database.
|
||||
# This is necessary if your schema can't be completely dumped by the schema dumper,
|
||||
# like if you have constraints or database-specific column types
|
||||
# config.active_record.schema_format = :sql
|
||||
|
||||
# Activate observers that should always be running
|
||||
# Please note that observers generated using script/generate observer need to have an _observer suffix
|
||||
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
||||
|
||||
#require 'json/add/rails'
|
||||
end
|
||||
|
||||
ENV['PATH'] = "#{ENV['PATH']}:/Library/Frameworks/GDAL.framework/Programs"
|
||||
# Initialize the rails application
|
||||
Mapknitter::Application.initialize!
|
||||
|
||||
@@ -1,17 +1,37 @@
|
||||
# Settings specified here will take precedence over those in config/environment.rb
|
||||
Mapknitter::Application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb
|
||||
|
||||
# In the development environment your application's code is reloaded on
|
||||
# every request. This slows down response time but is perfect for development
|
||||
# since you don't have to restart the webserver when you make code changes.
|
||||
config.cache_classes = false
|
||||
# In the development environment your application's code is reloaded on
|
||||
# every request. This slows down response time but is perfect for development
|
||||
# since you don't have to restart the web server when you make code changes.
|
||||
config.cache_classes = false
|
||||
|
||||
# Log error messages when you accidentally call methods on nil.
|
||||
config.whiny_nils = true
|
||||
# Log error messages when you accidentally call methods on nil.
|
||||
config.whiny_nils = true
|
||||
|
||||
# Show full error reports and disable caching
|
||||
config.action_controller.consider_all_requests_local = true
|
||||
config.action_view.debug_rjs = true
|
||||
config.action_controller.perform_caching = true #
|
||||
# Show full error reports and disable caching
|
||||
config.consider_all_requests_local = true
|
||||
config.action_controller.perform_caching = false
|
||||
|
||||
# Don't care if the mailer can't send
|
||||
config.action_mailer.raise_delivery_errors = false
|
||||
# Don't care if the mailer can't send
|
||||
config.action_mailer.raise_delivery_errors = false
|
||||
|
||||
# Print deprecation notices to the Rails logger
|
||||
config.active_support.deprecation = :log
|
||||
|
||||
# Only use best-standards-support built into browsers
|
||||
config.action_dispatch.best_standards_support = :builtin
|
||||
|
||||
# Raise exception on mass assignment protection for Active Record models
|
||||
config.active_record.mass_assignment_sanitizer = :strict
|
||||
|
||||
# Log the query plan for queries taking more than this (works
|
||||
# with SQLite, MySQL, and PostgreSQL)
|
||||
config.active_record.auto_explain_threshold_in_seconds = 0.5
|
||||
|
||||
# Do not compress assets
|
||||
config.assets.compress = false
|
||||
|
||||
# Expands the lines which load the assets
|
||||
config.assets.debug = true
|
||||
end
|
||||
|
||||
@@ -1,24 +1,67 @@
|
||||
# Settings specified here will take precedence over those in config/environment.rb
|
||||
Mapknitter::Application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb
|
||||
|
||||
# The production environment is meant for finished, "live" apps.
|
||||
# Code is not reloaded between requests
|
||||
config.cache_classes = true
|
||||
# Code is not reloaded between requests
|
||||
config.cache_classes = true
|
||||
|
||||
# Enable threaded mode
|
||||
# config.threadsafe!
|
||||
# Full error reports are disabled and caching is turned on
|
||||
config.consider_all_requests_local = false
|
||||
config.action_controller.perform_caching = true
|
||||
|
||||
# Use a different logger for distributed setups
|
||||
# config.logger = SyslogLogger.new
|
||||
# Disable Rails's static asset server (Apache or nginx will already do this)
|
||||
config.serve_static_assets = false
|
||||
|
||||
# Full error reports are disabled and caching is turned on
|
||||
config.action_controller.consider_all_requests_local = false
|
||||
config.action_controller.perform_caching = true
|
||||
# Compress JavaScripts and CSS
|
||||
config.assets.compress = true
|
||||
|
||||
# Use a different cache store in production
|
||||
# config.cache_store = :mem_cache_store
|
||||
# Don't fallback to assets pipeline if a precompiled asset is missed
|
||||
config.assets.compile = false
|
||||
|
||||
# Enable serving of images, stylesheets, and javascripts from an asset server
|
||||
# config.action_controller.asset_host = "http://assets.example.com"
|
||||
# Generate digests for assets URLs
|
||||
config.assets.digest = true
|
||||
|
||||
# Disable delivery errors, bad email addresses will be ignored
|
||||
# config.action_mailer.raise_delivery_errors = false
|
||||
# Defaults to nil and saved in location specified by config.assets.prefix
|
||||
# config.assets.manifest = YOUR_PATH
|
||||
|
||||
# Specifies the header that your server uses for sending files
|
||||
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
|
||||
|
||||
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
||||
# config.force_ssl = true
|
||||
|
||||
# See everything in the log (default is :info)
|
||||
# config.log_level = :debug
|
||||
|
||||
# Prepend all log lines with the following tags
|
||||
# config.log_tags = [ :subdomain, :uuid ]
|
||||
|
||||
# Use a different logger for distributed setups
|
||||
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
||||
|
||||
# Use a different cache store in production
|
||||
# config.cache_store = :mem_cache_store
|
||||
|
||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
||||
# config.action_controller.asset_host = "http://assets.example.com"
|
||||
|
||||
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
|
||||
# config.assets.precompile += %w( search.js )
|
||||
|
||||
# Disable delivery errors, bad email addresses will be ignored
|
||||
# config.action_mailer.raise_delivery_errors = false
|
||||
|
||||
# Enable threaded mode
|
||||
# config.threadsafe!
|
||||
|
||||
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
||||
# the I18n.default_locale when a translation can not be found)
|
||||
config.i18n.fallbacks = true
|
||||
|
||||
# Send deprecation notices to registered listeners
|
||||
config.active_support.deprecation = :notify
|
||||
|
||||
# Log the query plan for queries taking more than this (works
|
||||
# with SQLite, MySQL, and PostgreSQL)
|
||||
# config.active_record.auto_explain_threshold_in_seconds = 0.5
|
||||
end
|
||||
|
||||
@@ -1,22 +1,37 @@
|
||||
# Settings specified here will take precedence over those in config/environment.rb
|
||||
Mapknitter::Application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb
|
||||
|
||||
# The test environment is used exclusively to run your application's
|
||||
# test suite. You never need to work with it otherwise. Remember that
|
||||
# your test database is "scratch space" for the test suite and is wiped
|
||||
# and recreated between test runs. Don't rely on the data there!
|
||||
config.cache_classes = true
|
||||
# The test environment is used exclusively to run your application's
|
||||
# test suite. You never need to work with it otherwise. Remember that
|
||||
# your test database is "scratch space" for the test suite and is wiped
|
||||
# and recreated between test runs. Don't rely on the data there!
|
||||
config.cache_classes = true
|
||||
|
||||
# Log error messages when you accidentally call methods on nil.
|
||||
config.whiny_nils = true
|
||||
# Configure static asset server for tests with Cache-Control for performance
|
||||
config.serve_static_assets = true
|
||||
config.static_cache_control = "public, max-age=3600"
|
||||
|
||||
# Show full error reports and disable caching
|
||||
config.action_controller.consider_all_requests_local = true
|
||||
config.action_controller.perform_caching = false
|
||||
# Log error messages when you accidentally call methods on nil
|
||||
config.whiny_nils = true
|
||||
|
||||
# Disable request forgery protection in test environment
|
||||
config.action_controller.allow_forgery_protection = false
|
||||
# Show full error reports and disable caching
|
||||
config.consider_all_requests_local = true
|
||||
config.action_controller.perform_caching = false
|
||||
|
||||
# Tell Action Mailer not to deliver emails to the real world.
|
||||
# The :test delivery method accumulates sent emails in the
|
||||
# ActionMailer::Base.deliveries array.
|
||||
config.action_mailer.delivery_method = :test
|
||||
# Raise exceptions instead of rendering exception templates
|
||||
config.action_dispatch.show_exceptions = false
|
||||
|
||||
# Disable request forgery protection in test environment
|
||||
config.action_controller.allow_forgery_protection = false
|
||||
|
||||
# Tell Action Mailer not to deliver emails to the real world.
|
||||
# The :test delivery method accumulates sent emails in the
|
||||
# ActionMailer::Base.deliveries array.
|
||||
config.action_mailer.delivery_method = :test
|
||||
|
||||
# Raise exception on mass assignment protection for Active Record models
|
||||
config.active_record.mass_assignment_sanitizer = :strict
|
||||
|
||||
# Print deprecation notices to the stderr
|
||||
config.active_support.deprecation = :stderr
|
||||
end
|
||||
|
||||
7
config/initializers/backtrace_silencers.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
|
||||
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
|
||||
|
||||
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
|
||||
# Rails.backtrace_cleaner.remove_silencers!
|
||||
@@ -1,57 +0,0 @@
|
||||
if defined? Geokit
|
||||
|
||||
# These defaults are used in Geokit::Mappable.distance_to and in acts_as_mappable
|
||||
Geokit::default_units = :miles
|
||||
Geokit::default_formula = :sphere
|
||||
|
||||
# This is the timeout value in seconds to be used for calls to the geocoder web
|
||||
# services. For no timeout at all, comment out the setting. The timeout unit
|
||||
# is in seconds.
|
||||
# Geokit::Geocoders::timeout = 3
|
||||
|
||||
# These settings are used if web service calls must be routed through a proxy.
|
||||
# These setting can be nil if not needed, otherwise, addr and port must be
|
||||
# filled in at a minimum. If the proxy requires authentication, the username
|
||||
# and password can be provided as well.
|
||||
Geokit::Geocoders::proxy_addr = nil
|
||||
Geokit::Geocoders::proxy_port = nil
|
||||
Geokit::Geocoders::proxy_user = nil
|
||||
Geokit::Geocoders::proxy_pass = nil
|
||||
|
||||
# This is your yahoo application key for the Yahoo Geocoder.
|
||||
# See http://developer.yahoo.com/faq/index.html#appid
|
||||
# and http://developer.yahoo.com/maps/rest/V1/geocode.html
|
||||
Geokit::Geocoders::yahoo = 'REPLACE_WITH_YOUR_YAHOO_KEY'
|
||||
|
||||
# This is your Google Maps geocoder key.
|
||||
# See http://www.google.com/apis/maps/signup.html
|
||||
# and http://www.google.com/apis/maps/documentation/#Geocoding_Examples
|
||||
# Geokit::Geocoders::google = 'ABQIAAAANO6Yx8ihhesSqnPHx9a3RxQWBoXWBrlkEUL-tdL_AsWXzvTH0xT-5lfSNkW4zpDMdK9jmjmggAHvYw'
|
||||
Geokit::Geocoders::google = 'ABQIAAAANO6Yx8ihhesSqnPHx9a3RxQWBoXWBrlkEUL-tdL_AsWXzvTH0xT-5lfSNkW4zpDMdK9jmjmggAHvYw'
|
||||
|
||||
# This is your username and password for geocoder.us.
|
||||
# To use the free service, the value can be set to nil or false. For
|
||||
# usage tied to an account, the value should be set to username:password.
|
||||
# See http://geocoder.us
|
||||
# and http://geocoder.us/user/signup
|
||||
# Geokit::Geocoders::geocoder_us = false
|
||||
|
||||
# This is your authorization key for geocoder.ca.
|
||||
# To use the free service, the value can be set to nil or false. For
|
||||
# usage tied to an account, set the value to the key obtained from
|
||||
# Geocoder.ca.
|
||||
# See http://geocoder.ca
|
||||
# and http://geocoder.ca/?register=1
|
||||
Geokit::Geocoders::geocoder_ca = false
|
||||
|
||||
# Uncomment to use a username with the Geonames geocoder
|
||||
#Geokit::Geocoders::geonames="REPLACE_WITH_YOUR_GEONAMES_USERNAME"
|
||||
|
||||
# This is the order in which the geocoders are called in a failover scenario
|
||||
# If you only want to use a single geocoder, put a single symbol in the array.
|
||||
# Valid symbols are :google, :yahoo, :us, and :ca.
|
||||
# Be aware that there are Terms of Use restrictions on how you can use the
|
||||
# various geocoders. Make sure you read up on relevant Terms of Use for each
|
||||
# geocoder you are going to use.
|
||||
Geokit::Geocoders::provider_order = [:google_v3_geocoder]
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Add new inflection rules using the following format
|
||||
# Add new inflection rules using the following format
|
||||
# (all these examples are active by default):
|
||||
# ActiveSupport::Inflector.inflections do |inflect|
|
||||
# inflect.plural /^(ox)$/i, '\1en'
|
||||
@@ -8,3 +8,8 @@
|
||||
# inflect.irregular 'person', 'people'
|
||||
# inflect.uncountable %w( fish sheep )
|
||||
# end
|
||||
#
|
||||
# These inflection rules are supported but not enabled by default:
|
||||
# ActiveSupport::Inflector.inflections do |inflect|
|
||||
# inflect.acronym 'RESTful'
|
||||
# end
|
||||
|
||||
@@ -1 +1 @@
|
||||
APP_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/config.yml")[RAILS_ENV]
|
||||
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
OpenIdAuthentication.store = :file
|
||||
|
||||
# Pickaxe-through-window solution:
|
||||
Rack::OpenID.class_eval do
|
||||
|
||||
def realm_url(req)
|
||||
url = req.scheme + "://"
|
||||
url << req.host
|
||||
|
||||
scheme, port = req.scheme, req.port
|
||||
if scheme == "https" && port != 443 ||
|
||||
scheme == "http" && port != 80
|
||||
#url << ":#{port}"
|
||||
end
|
||||
|
||||
url
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# gotta break the return_to port mismatch check too...
|
||||
# #<OpenID::Consumer::FailureResponse:0x7f29a34f0b68 @endpoint=#<OpenID::OpenIDServiceEndpoint:0x7f29a34e76d0 @display_identifier=nil, @type_uris=["http://specs.openid.net/auth/2.0/server"], @used_yadis=true, @server_url="http://publiclaboratory.org/openid/provider", @canonical_id=nil, @claimed_id=nil, @local_id=nil>, @message="return_to port does not match", @reference=nil, @contact=nil>
|
||||
|
||||
require "openid/message"
|
||||
require "openid/protocolerror"
|
||||
require "openid/kvpost"
|
||||
require "openid/consumer/discovery"
|
||||
require "openid/urinorm"
|
||||
|
||||
OpenID::Consumer::IdResHandler.class_eval do
|
||||
|
||||
def verify_return_to_base(msg_return_to)
|
||||
begin
|
||||
app_parsed = URI.parse(OpenID::URINorm::urinorm(@current_url))
|
||||
rescue URI::InvalidURIError
|
||||
raise OpenID::ProtocolError, "current_url is not a valid URI: #{@current_url}"
|
||||
end
|
||||
|
||||
#[:scheme, :host, :port, :path].each do |meth|
|
||||
[:scheme, :host, :path].each do |meth|
|
||||
if msg_return_to.send(meth) != app_parsed.send(meth)
|
||||
raise OpenID::ProtocolError, "return_to #{meth.to_s} does not match"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
7
config/initializers/secret_token.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Your secret key for verifying the integrity of signed cookies.
|
||||
# If you change this key, all old signed cookies will become invalid!
|
||||
# Make sure the secret is at least 30 characters and all random,
|
||||
# no regular words or you'll be exposed to dictionary attacks.
|
||||
Mapknitter::Application.config.secret_token = 'asdfjdasgaisaolghrwiohrkahguilboiwelkxwbranjkl'
|
||||
8
config/initializers/session_store.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
Mapknitter::Application.config.session_store :cookie_store, key: '_mapknitter_session'
|
||||
|
||||
# Use the database for sessions instead of the cookie-based default,
|
||||
# which shouldn't be used to store highly confidential information
|
||||
# (create the session table with "rails generate session_migration")
|
||||
# Mapknitter::Application.config.session_store :active_record_store
|
||||
14
config/initializers/wrap_parameters.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
#
|
||||
# This file contains settings for ActionController::ParamsWrapper which
|
||||
# is enabled by default.
|
||||
|
||||
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
||||
ActiveSupport.on_load(:action_controller) do
|
||||
wrap_parameters format: [:json]
|
||||
end
|
||||
|
||||
# Disable root element in JSON by default.
|
||||
ActiveSupport.on_load(:active_record) do
|
||||
self.include_root_in_json = false
|
||||
end
|
||||
@@ -1,5 +1,5 @@
|
||||
# Sample localization file for English. Add more files in this directory for other locales.
|
||||
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
||||
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
||||
|
||||
en:
|
||||
hello: "Hello world"
|
||||
hello: "Hello world"
|
||||
|
||||
131
config/routes.rb
@@ -1,83 +1,100 @@
|
||||
ActionController::Routing::Routes.draw do |map|
|
||||
map.local '/local/:login', :controller => 'sessions', :action => 'local'
|
||||
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
|
||||
map.login '/login', :controller => 'sessions', :action => 'new'
|
||||
map.register '/register', :controller => 'users', :action => 'create'
|
||||
map.signup '/signup', :controller => 'users', :action => 'new'
|
||||
map.resources :users
|
||||
map.tags '/tag/create', :controller => 'tag', :action => 'create'
|
||||
map.tags '/tag/:id', :controller => 'tag', :action => 'show'
|
||||
|
||||
map.open_id_complete '/session', :controller => "session", :action => "create", :conditions => { :method => :get }
|
||||
map.resource :session
|
||||
|
||||
|
||||
# The priority is based upon order of creation: first created -> highest priority.
|
||||
Mapknitter::Application.routes.draw do
|
||||
# The priority is based upon order of creation:
|
||||
# first created -> highest priority.
|
||||
|
||||
# Sample of regular route:
|
||||
# map.connect 'products/:id', :controller => 'catalog', :action => 'view'
|
||||
# match 'products/:id' => 'catalog#view'
|
||||
# Keep in mind you can assign values other than :controller and :action
|
||||
|
||||
# Sample of named route:
|
||||
# map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase'
|
||||
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
|
||||
# This route can be invoked with purchase_url(:id => product.id)
|
||||
|
||||
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
||||
# map.resources :products
|
||||
# resources :products
|
||||
|
||||
# Sample resource route with options:
|
||||
# map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get }
|
||||
# resources :products do
|
||||
# member do
|
||||
# get 'short'
|
||||
# post 'toggle'
|
||||
# end
|
||||
#
|
||||
# collection do
|
||||
# get 'sold'
|
||||
# end
|
||||
# end
|
||||
|
||||
# Sample resource route with sub-resources:
|
||||
# map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller
|
||||
|
||||
# resources :products do
|
||||
# resources :comments, :sales
|
||||
# resource :seller
|
||||
# end
|
||||
|
||||
# Sample resource route with more complex sub-resources
|
||||
# map.resources :products do |products|
|
||||
# products.resources :comments
|
||||
# products.resources :sales, :collection => { :recent => :get }
|
||||
# resources :products do
|
||||
# resources :comments
|
||||
# resources :sales do
|
||||
# get 'recent', :on => :collection
|
||||
# end
|
||||
# end
|
||||
|
||||
# Sample resource route within a namespace:
|
||||
# map.namespace :admin do |admin|
|
||||
# # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb)
|
||||
# admin.resources :products
|
||||
# namespace :admin do
|
||||
# # Directs /admin/products/* to Admin::ProductsController
|
||||
# # (app/controllers/admin/products_controller.rb)
|
||||
# resources :products
|
||||
# end
|
||||
|
||||
# You can have the root of your site routed with map.root -- just remember to delete public/index.html.
|
||||
# map.root :controller => "welcome"
|
||||
get 'local/:login' => 'sessions#local'
|
||||
get 'logout' => 'sessions#destroy'
|
||||
get 'login' => 'sessions#new'
|
||||
get 'register' => 'users#create'
|
||||
get 'signup' => 'users#new'
|
||||
resources :users
|
||||
get 'tag/create' => 'tag#create'
|
||||
get 'tag/:id' => 'tag#show'
|
||||
|
||||
# See how all your routes lay out with "rake routes"
|
||||
|
||||
# Install the default routes as the lowest priority.
|
||||
# Note: These default routes make all actions in every controller accessible via GET requests. You should
|
||||
# consider removing the them or commenting them out if you're using named routes and resources.
|
||||
get 'session' => 'session#create', :conditions => { :method => :get }
|
||||
resources :session
|
||||
|
||||
# Registered user pages:
|
||||
map.profile '/profile', :controller => 'users', :action => 'profile', :id => 0
|
||||
map.profile '/profile/:id', :controller => 'users', :action => 'profile'
|
||||
map.dashboard '/dashboard', :controller => 'users', :action => 'dashboard'
|
||||
map.assign '/assign/:id', :controller => 'map', :action => 'assign'
|
||||
#map.comments '/comments', :controller => 'users', :action => 'comments'
|
||||
get 'profile' => 'users#profile', :id => 0
|
||||
get 'profile/:id' => 'users#profile'
|
||||
get 'dashboard' => 'users#dashboard'
|
||||
get 'assign/:id' => 'map#assign'
|
||||
#map.comments '/comments' => 'users#comments'
|
||||
|
||||
map.root :controller => "map", :action => "index"
|
||||
map.connect 'sorter/', :controller => "utility", :action => "sorter"
|
||||
get 'sorter/' => 'utility#sorter'
|
||||
|
||||
map.connect 'tms/:id/alt/:z/:x/:y.png', :controller => "utility", :action => "tms_alt"
|
||||
map.connect 'tms/:id/', :controller => "utility", :action => "tms_info"
|
||||
map.connect 'tms/:id/alt/', :controller => "utility", :action => "tms_info"
|
||||
map.connect 'stylesheet/:id.gss', :controller => "map", :action => "stylesheet"
|
||||
map.connect 'maps', :controller => "map", :action => "index"
|
||||
map.connect 'maps/:id', :controller => "map", :action => "show"
|
||||
map.connect 'import/:name', :controller => "warper", :action => "import"
|
||||
get 'tms/:id/alt/:z/:x/:y.png' => 'utility#tms_alt'
|
||||
get 'tms/:id/' => 'utility#tms_info'
|
||||
get 'tms/:id/alt/' => 'utility#tms_info'
|
||||
get 'stylesheet/:id.gss' => 'map#stylesheet'
|
||||
get 'maps' => 'map#index'
|
||||
get 'map/create/:id' => 'map#index'
|
||||
get 'maps/:id' => 'map#show'
|
||||
get 'import/:name' => 'warper#import'
|
||||
|
||||
map.connect 'authors', :controller => 'users', :action => 'authors'
|
||||
map.connect 'author/list', :controller => 'author', :action => 'list'
|
||||
map.connect 'author/emails', :controller => 'author', :action => 'emails'
|
||||
map.connect 'author/:id', :controller => 'author', :action => 'show'
|
||||
map.connect 'api/0.6/geohash/:id.json', :controller => 'api', :action => 'planet'
|
||||
get 'authors' => 'users#authors'
|
||||
get 'author/list' => 'author#list'
|
||||
get 'author/emails' => 'author#emails'
|
||||
get 'author/:id' => 'author#show'
|
||||
get 'api/0.6/geohash/:id.json' => 'api#planet'
|
||||
|
||||
# You can have the root of your site routed with 'root'
|
||||
# just remember to delete public/index.html.
|
||||
root :to => 'map#index'
|
||||
|
||||
# See how all your routes lay out with 'rake routes'
|
||||
|
||||
# This is a legacy wild controller route that's not recommended for RESTful applications.
|
||||
# Note: This route will make all actions in every controller accessible via GET requests.
|
||||
# match ':controller(/:action(/:id))(.:format)'
|
||||
|
||||
get ':controller/:action/:id'
|
||||
#get ':controller.:format' # this doesn't work -- what's it for?
|
||||
get ':controller/:action.:format'
|
||||
get ':controller/:action/:id.:format'
|
||||
|
||||
map.connect ':controller/:action/:id'
|
||||
map.connect ':controller.:format'
|
||||
map.connect ':controller/:action.:format'
|
||||
map.connect ':controller/:action/:id.:format'
|
||||
end
|
||||
|
||||
13
db/migrate/20141103164503_change_warpable_columns.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
class ChangeWarpableColumns < ActiveRecord::Migration
|
||||
def up
|
||||
rename_column(:warpables, :photo_file_name, :filename)
|
||||
rename_column(:warpables, :photo_content_type, :content_type)
|
||||
rename_column(:warpables, :photo_file_size, :size)
|
||||
end
|
||||
|
||||
def down
|
||||
rename_column(:warpables, :filename, :photo_file_name)
|
||||
rename_column(:warpables, :content_type, :photo_content_type)
|
||||
rename_column(:warpables, :size, :photo_file_size)
|
||||
end
|
||||
end
|
||||
32
db/schema.rb
@@ -1,15 +1,17 @@
|
||||
# This file is auto-generated from the current state of the database. Instead of editing this file,
|
||||
# please use the migrations feature of Active Record to incrementally modify your database, and
|
||||
# then regenerate this schema definition.
|
||||
# encoding: UTF-8
|
||||
# This file is auto-generated from the current state of the database. Instead
|
||||
# of editing this file, please use the migrations feature of Active Record to
|
||||
# incrementally modify your database, and then regenerate this schema definition.
|
||||
#
|
||||
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
|
||||
# to create the application database on another system, you should be using db:schema:load, not running
|
||||
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
||||
# Note that this schema.rb definition is the authoritative source for your
|
||||
# database schema. If you need to create the application database on another
|
||||
# system, you should be using db:schema:load, not running all the migrations
|
||||
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
||||
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
||||
#
|
||||
# It's strongly recommended to check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(:version => 20130128184718) do
|
||||
ActiveRecord::Schema.define(:version => 20130124160539) do
|
||||
|
||||
create_table "exports", :force => true do |t|
|
||||
t.integer "map_id", :default => 0
|
||||
@@ -66,7 +68,6 @@ ActiveRecord::Schema.define(:version => 20130128184718) do
|
||||
t.string "description", :default => ""
|
||||
t.integer "map_id", :default => 0
|
||||
t.integer "way_order", :default => 0
|
||||
t.text "body"
|
||||
end
|
||||
|
||||
create_table "tags", :force => true do |t|
|
||||
@@ -112,6 +113,19 @@ ActiveRecord::Schema.define(:version => 20130128184718) do
|
||||
t.float "cm_per_pixel", :default => 0.0, :null => false
|
||||
end
|
||||
|
||||
create_table "warpeds", :force => true do |t|
|
||||
t.integer "parent_id"
|
||||
t.string "content_type"
|
||||
t.string "filename"
|
||||
t.string "thumbnail"
|
||||
t.integer "size"
|
||||
t.integer "width"
|
||||
t.integer "height"
|
||||
t.string "transform_type"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
end
|
||||
|
||||
create_table "ways", :force => true do |t|
|
||||
t.string "color", :default => "red"
|
||||
t.string "author", :default => "anonymous"
|
||||
@@ -123,9 +137,7 @@ ActiveRecord::Schema.define(:version => 20130128184718) do
|
||||
t.datetime "updated_at"
|
||||
t.string "name", :default => ""
|
||||
t.string "description", :default => ""
|
||||
t.boolean "complete", :default => true
|
||||
t.integer "map_id", :default => 0
|
||||
t.text "body"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
7
db/seeds.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
# This file should contain all the record creation needed to seed the database with its default values.
|
||||
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
|
||||
# Mayor.create(name: 'Emanuel', city: cities.first)
|
||||
@@ -1,5 +0,0 @@
|
||||
To build the guides:
|
||||
|
||||
* Install source-highlighter (http://www.gnu.org/software/src-highlite/source-highlight.html)
|
||||
* Install the mizuho gem (http://github.com/FooBarWidget/mizuho/tree/master)
|
||||
* Run `rake guides` from the railties directory
|
||||
0
lib/assets/.gitkeep
Normal file
0
lib/tasks/.gitkeep
Normal file
125
lib/tasks/attachment_tasks.rake
Normal file
@@ -0,0 +1,125 @@
|
||||
# see http://ramblingsonrails.com/how-to-migrate-a-rails-app-from-attachment_fu-to-paperclip
|
||||
require 'right_aws'
|
||||
|
||||
namespace :utils do
|
||||
namespace :attachments do
|
||||
task :initialize_s3 => :environment do
|
||||
s3_config = YAML.load_file(File.join(File.dirname(__FILE__), '/../../config/amazon_s3.yml'))
|
||||
s3_config = s3_config[RAILS_ENV].to_options
|
||||
|
||||
@s3 = RightAws::S3.new(s3_config[:access_key_id], s3_config[:secret_access_key])
|
||||
end
|
||||
|
||||
desc "Make a copy of an S3 bucket"
|
||||
task :copy_s3_bucket => :initialize_s3 do
|
||||
from_bucket = @s3.bucket(ENV['FROM'])
|
||||
to_bucket = @s3.bucket(ENV['TO'], true)
|
||||
|
||||
puts "Getting #{from_bucket.name} keys"
|
||||
keys = from_bucket.keys
|
||||
puts "keys retrieved: #{keys.size}"
|
||||
keys.each do |key|
|
||||
(1..10).each do |try|
|
||||
begin
|
||||
puts "Copying #{from_bucket.name}/#{key.name} to #{to_bucket.name}/#{key.name}"
|
||||
from_bucket.s3.interface.copy(from_bucket.name, key.name, to_bucket.name, key.name)
|
||||
break
|
||||
rescue Exception => e
|
||||
puts "problem, trying again..."
|
||||
sleep 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc "Empty an S3 bucket by deleting all the contained files"
|
||||
task :empty_s3_bucket => :initialize_s3 do
|
||||
from_bucket = @s3.bucket(ENV['BUCKET'])
|
||||
|
||||
puts "Emtptying #{from_bucket.name}"
|
||||
bucket.keys({'max-keys' => 100}).each do |key|
|
||||
(1..10).each do |try|
|
||||
begin
|
||||
print '.'
|
||||
STDOUT.flush
|
||||
key.delete
|
||||
break
|
||||
rescue Exception => e
|
||||
puts "\nproblem, trying again..."
|
||||
sleep 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc "Delete an S3 bucket and all its contents"
|
||||
task :delete_s3_bucket => :empty_s3_bucket do
|
||||
from_bucket = @s3.bucket(ENV['BUCKET'])
|
||||
from_bucket.delete
|
||||
end
|
||||
|
||||
desc "Migrate Attachement_fu to Paperclip"
|
||||
task :migrate_attachment_fu_to_paperclip => :initialize_s3 do
|
||||
#Set the Attachment_fu class you'll be migrating
|
||||
Klass = Warpable
|
||||
|
||||
bucket = @s3.bucket(ENV['BUCKET'])
|
||||
|
||||
#Move Attachment_fu files (keys) to new Paperclip names
|
||||
#Paperclip allows you to customise the naming schema of your
|
||||
#S3 keys (filenames) so you will need to handle that here manually
|
||||
#This scripts caters for the naming style :id/:style.:extension
|
||||
Klass.find(:all, :conditions => {:parent_id => nil}).each do |obj|
|
||||
parent_id = obj.id
|
||||
|
||||
original_key_name = "#{Klass.name.downcase.pluralize}/#{parent_id}/#{obj.filename}"
|
||||
new_key_name = "paperclip/#{parent_id}/original#{File.extname(obj.filename).downcase}"
|
||||
|
||||
# modified to copy not move
|
||||
#move_key bucket, original_key_name, new_key_name
|
||||
copy_key bucket, original_key_name, new_key_name
|
||||
|
||||
#Get thumbnails
|
||||
if obj.thumbnailable?
|
||||
Klass.find(obj.thumbnail_ids).each do |child|
|
||||
original_key_name = "#{Klass.name.downcase.pluralize}/#{parent_id}/#{child.filename}"
|
||||
new_key_name = "paperclip/#{parent_id}/#{child.thumbnail}#{File.extname(child.filename).downcase}"
|
||||
|
||||
#move_key bucket, original_key_name, new_key_name
|
||||
copy_key bucket, original_key_name, new_key_name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def copy_key(bucket, original_key_name, new_key_name)
|
||||
puts "Copying #{bucket.name}/#{original_key_name} to #{bucket.name}/#{new_key_name}"
|
||||
#Occationally I am getting a 500 error from amazon so I'm putting these in a loop so that we can retry a couple of times if we need to
|
||||
(1..10).each do |try|
|
||||
begin
|
||||
original_key = RightAws::S3::Key.create(bucket, original_key_name)
|
||||
bucket.copy_key original_key_name, new_key_name if original_key.exists?
|
||||
break
|
||||
rescue Exception => e
|
||||
puts "problem, trying again..."
|
||||
sleep 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def move_key(bucket, original_key_name, new_key_name)
|
||||
puts "Moving #{bucket.name}/#{original_key_name} to #{bucket.name}/#{new_key_name}"
|
||||
#Occationally I am getting a 500 error from amazon so I'm putting these in a loop so that we can retry a couple of times if we need to
|
||||
(1..10).each do |try|
|
||||
begin
|
||||
original_key = RightAws::S3::Key.create(bucket, original_key_name)
|
||||
bucket.move_key original_key_name, new_key_name if original_key.exists?
|
||||
break
|
||||
rescue Exception => e
|
||||
puts "problem, trying again..."
|
||||
sleep 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,23 +1,19 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>The page you were looking for doesn't exist (404)</title>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -27,4 +23,4 @@
|
||||
<p>You may have mistyped the address or the page may have moved.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,23 +1,19 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>The change you wanted was rejected (422)</title>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -27,4 +23,4 @@
|
||||
<p>Maybe you tried to change something you didn't have access to.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,33 +1,25 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>We're sorry, but something went wrong (500)</title>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- This file lives in public/500.html -->
|
||||
<div class="dialog">
|
||||
<h1>We're sorry, but something went wrong.</h1>
|
||||
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
|
||||
<p><small>(If you're the administrator of this website, then please read
|
||||
the log file "<%=h RAILS_ENV %>.log"
|
||||
to find out what went wrong.)</small></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
BIN
public/assets/rails-71e944d9b39043eba50b77788c0d767f.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 0 B |
1
public/fonts/league-gothic/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.DS_Store
|
||||
BIN
public/fonts/league-gothic/LeagueGothic-CondensedItalic.otf
Normal file
BIN
public/fonts/league-gothic/LeagueGothic-CondensedRegular.otf
Normal file
BIN
public/fonts/league-gothic/LeagueGothic-Italic.otf
Normal file
BIN
public/fonts/league-gothic/LeagueGothic-Regular.otf
Normal file
317
public/fonts/league-gothic/Open Font License FAQ.markdown
Normal file
@@ -0,0 +1,317 @@
|
||||
Version 1.1-update2 - 23 August 2010 | (See http://scripts.sil.org/OFL for updates)
|
||||
|
||||
Frequently Asked Questions
|
||||
==================================================================
|
||||
|
||||
### About the SIL Open Font License (OFL)
|
||||
|
||||
|
||||
Contents of This FAQ
|
||||
---------------------
|
||||
|
||||
1. Using and Distributing Fonts Licensed Under the OFL
|
||||
|
||||
2. Using OFL Fonts for Web Pages and Online Webfont Services
|
||||
|
||||
3. Modifying OFL-Licensed Fonts
|
||||
|
||||
4. Licensing Your Original Fonts Under the OFL
|
||||
|
||||
5. Choosing Reserved Font Names
|
||||
|
||||
6. About the Fontlog
|
||||
|
||||
7. Making Contributions to OFL Projects
|
||||
|
||||
8. About the License Itself
|
||||
|
||||
9. About SIL International
|
||||
|
||||
|
||||
1. Using and Distributing Fonts Licensed Under the OFL
|
||||
==========================================================
|
||||
|
||||
### 1.1 Can I use the fonts for a book or other print publication?
|
||||
>> Yes. You can mention the font and author in the book's colophon if you wish, but that is not required.
|
||||
|
||||
### 1.2 Can the fonts be included with Free/Libre and Open Source Software collections such as GNU/Linux and BSD distributions?
|
||||
>> Yes! Fonts licensed under the OFL can be freely included alongside other software under FLOSS (Free/Libre and Open Source Software) licenses. Since fonts are typically aggregated with, not merged into, existing software, there is little need to be concerned about incompatibility with existing software licenses. You may also repackage the fonts and the accompanying components in a .rpm or .deb package and include them in distribution CD/DVDs and online repositories. (Also see section 5.9 about rebuilding from source.)
|
||||
|
||||
### 1.3 I want to distribute the fonts with my program. Does this mean my program also has to be Free/Libre and Open Source Software?
|
||||
>> No. Only the portions based on the Font Software are required to be released under the OFL. The intent of the license is to allow aggregation or bundling with software under restricted licensing as well.
|
||||
|
||||
### 1.4 Can I sell a software package that includes these fonts?
|
||||
>> Yes, you can do this with both the Original Version and a Modified Version of the fonts. Examples of bundling made possible by the OFL would include: word processors, design and publishing applications, training and educational software, games and entertainment software, mobile device applications, etc.
|
||||
|
||||
### 1.5 Can I include the fonts on a CD of freeware or commercial fonts?
|
||||
>> Yes, as long some other font or software is also on the disk, so the OFL font is not sold by itself.
|
||||
|
||||
### 1.6 Why won't the OFL let me sell the fonts alone?
|
||||
>> The intent is to keep people from making money by simply redistributing the fonts. The only people who ought to profit directly from the fonts should be the original authors, and those authors have kindly given up potential direct income to distribute their fonts under the OFL. Please honour and respect their contribution!
|
||||
|
||||
### 1.7 What about sharing OFL fonts with friends on a CD, DVD or USB stick?
|
||||
>> You are very welcome to share open fonts with friends, family and colleagues through removable media. Just remember to include the full font package, including any copyright notices and licensing information as available in OFL.txt. In the case where you sell the font, it has to come bundled with software.
|
||||
|
||||
### 1.8 Can I host the fonts on a web site for others to use?
|
||||
>> Yes, as long as you make the full font package available. In most cases it may be best to point users to the main site that distributes the Original Version so they always get the most recent stable and complete version. See also discussion of webfonts in Section 2.
|
||||
|
||||
### 1.9 Can I host the fonts on a server for use over our internal network?
|
||||
>> Yes. If the fonts are transferred from the server to the client computer by means that allow them to be used even if the computer is no longer attached to the network, the full package (copyright notices, licensing information, etc.) should be included.
|
||||
|
||||
### 1.10 Does the full OFL license text always need to accompany the font?
|
||||
>> The only situation in which an OFL font can be distributed without the text of the OFL (either in a separate file or in font metadata), is when a font is embedded in a document or bundled within a program. In the case of metadata included within a font, it is legally sufficient to include only a link to the text of the OFL on http://scripts.sil.org/OFL, but we strongly recommend against this. Most modern font formats include metadata fields that will accept the full OFL text, and full inclusion increases the likelihood that users will understand and properly apply the license.
|
||||
|
||||
### 1.11 What do you mean by 'embedding'? How does that differ from other means of distribution?
|
||||
>> By 'embedding' we mean inclusion of the font in a document or file in a way that makes extraction (and redistribution) difficult or clearly discouraged. In many cases the names of embedded fonts might also not be obvious to those reading the document, the font data format might be altered, and only a subset of the font - only the glyphs required for the text - might be included. Any other means of delivering a font to another person is considered 'distribution', and needs to be accompanied by any copyright notices and licensing information available in OFL.txt.
|
||||
|
||||
### 1.12 So can I embed OFL fonts in my document?
|
||||
>> Yes, either in full or a subset. The restrictions regarding font modification and redistribution do not apply, as the font is not intended for use outside the document.
|
||||
|
||||
### 1.13 Does embedding alter the license of the document itself?
|
||||
>> No. Referencing or embedding an OFL font in any document does not change the license of the document itself. The requirement for fonts to remain under the OFL does not apply to any document created using the fonts and their derivatives. Similarly, creating any kind of graphic using a font under OFL does not make the resulting artwork subject to the OFL.
|
||||
|
||||
### 1.14 If OFL fonts are extracted from a document in which they are embedded (such as a PDF file), what can be done with them? Is this a risk to author(s)?
|
||||
>> The few utilities that can extract fonts embedded in a PDF will typically output limited amounts of outlines - not a complete font. To create a working font from this method is much more difficult and time consuming than finding the source of the original OFL font. So there is little chance that an OFL font would be extracted and redistributed inappropriately through this method. Even so, copyright laws address any misrepresentation of authorship. All Font Software released under the OFL and marked as such by the author(s) is intended to remain under this license regardless of the distribution method, and cannot be redistributed under any other license. We strongly discourage any font extraction - we recommend directly using the font sources instead - but if you extract font outlines from a document, please be considerate: use your common sense and respect the work of the author(s) and the licensing model.
|
||||
|
||||
### 1.15 What about distributing fonts with a document? Within a compressed folder structure? Is it distribution, bundling or embedding?
|
||||
>> Certain document formats may allow the inclusion of an unmodified font within their file structure which consists of a compressed folder containing the various resources forming the document (such as pictures and thumbnails). Including fonts within such a structure is understood as being different from embedding but rather similar to bundling (or mere aggregation) which the license explicitly allows. In this case the font is conveyed unchanged whereas embedding a font usually transforms it from the original format. The OFL does not allow anyone to extract the font from such a structure to then redistribute it under another license. The explicit permission to redistribute and embed does not cancel the requirement for the Font Software to remain under the license chosen by its author(s).
|
||||
|
||||
### 1.16 What about ebooks shipping with open fonts?
|
||||
>> The requirements differ depending on whether the fonts are linked, embedded or distributed (bundled or aggregated). Some ebook formats use web technologies to do font linking via @font-face, others are designed for font embedding, some use fonts distributed with the document or reading software, and a few rely solely on the fonts already present on the target system. The license requirements depend on the type of inclusion as discussed in 1.15.
|
||||
|
||||
### 1.17 Can Font Software released under the OFL be subject to URL-based access restrictions methods or DRM (Digital Rights Management) mechanisms?
|
||||
>> Yes, but these issues are out-of-scope for the OFL. The license itself neither encourages their use nor prohibits them since such mechanisms are not implemented in the components of the Font Software but through external software. Such restrictions are put in place for many different purposes corresponding to various usage scenarios. One common example is to limit potentially dangerous cross-site scripting attacks. However, in the spirit of libre/open fonts and unrestricted writing systems, we strongly encourage open sharing and reuse of OFL fonts, and the establishment of an environment where such restrictions are unnecessary. Note that whether you wish to use such mechanisms or you prefer not to, you must still abide by the rules set forth by the OFL when using fonts released by their authors under this license. Derivative fonts must be licensed under the OFL, even if they are part of a service for which you charge fees and/or for which access to source code is restricted. You may not sell the fonts on their own - they must be part of a larger software package, bundle or subscription plan. For example, even if the OFL font is distributed in a software package or via an online service using a DRM mechanism, the user would still have the right to extract that font, use, study, modify and redistribute it under the OFL.
|
||||
|
||||
### 1.18 I've come across a font released under the OFL. How can I easily get more information about the Original Version? How can I know where it stands compared to the Original Version or other Modified Versions?
|
||||
>> Consult the copyright statement(s) in the license for ways to contact the original authors. Consult the FONTLOG for information on how the font differs from the Original Version, and get in touch with the various contributors via the information in the acknowledgement section. Please consider using the Original Versions of the fonts whenever possible.
|
||||
|
||||
### 1.19 What do you mean in condition 4? Can you provide examples of abusive promotion / endorsement / advertisement vs. normal acknowledgement?
|
||||
>> The intent is that the goodwill and reputation of the author(s) should not be used in a way that makes it sound like the original author(s) endorse or approve of a specific Modified Version or software bundle. For example, it would not be right to advertise a word processor by naming the author(s) in a listing of software features, or to promote a Modified Version on a web site by saying "designed by ...". However, it would be appropriate to acknowledge the author(s) if your software package has a list of people who deserve thanks. We realize that this can seem to be a grey area, but the standard used to judge an acknowledgement is that if the acknowledgement benefits the author(s) it is allowed, but if it primarily benefits other parties, or could reflect poorly on the author(s), then it is not.
|
||||
|
||||
2. Using OFL Fonts for Webpages and Online Webfont Services
|
||||
===============================================================
|
||||
|
||||
### 2.1 Can I make webpages using these fonts?
|
||||
>> Yes! Go ahead! Using CSS (Cascading Style Sheets) is recommended. Your three best options:
|
||||
>> - referring directly in your stylesheet to open fonts which may be available on the user's system
|
||||
>> - providing links to download the full package of the font - either from your own website or from elsewhere - so users can install it themselves
|
||||
>> - using @font-face to distribute the font directly to browsers. This is recommended and explicitly allowed by the licensing model because it is distribution. The font file itself is distributed with other components of the webpage. It is not embedded in the webpage but referenced through a web address which will cause the browser to retrieve and use the corresponding font to render the webpage (see 1.11 and 1.15 for details related to embedding fonts into documents). As you take advantage of the @font-face cross-platform standard, be aware that webfonts are often tuned for a web environment and not intended for installation and use outside a browser. The reasons in favour of using webfonts are to allow design of dynamic text elements instead of static graphics, to make it easier for content to be localized and translated, indexed and searched, and all this with cross-platform open standards without depending on restricted extensions or plugins. You should check the CSS cascade (the order in which fonts are being called or delivered to your users) when testing.
|
||||
|
||||
### 2.2 Can I make and use WOFF (Web Open Font Format) versions of OFL fonts?
|
||||
>> Yes, but you need to be careful. A change in font format normally is considered modification, and Reserved Font Names (RFNs) cannot be used. Because of the design of the WOFF format, however, it is possible to create a WOFF version that is not considered modification, and so would not require a name change. You are allowed to create, use and distribute a WOFF version of an OFL font without changing the font name, but only if:
|
||||
|
||||
>> - the original font data remains unchanged except for WOFF compression, and
|
||||
>> - WOFF-specific metadata is either omitted altogether or present and includes, unaltered, the contents of all equivalent metadata in the original font.
|
||||
|
||||
>> If the original font data or metadata is changed, or the WOFF-specific metadata is incomplete, the font must be considered a Modified Version, the OFL restrictions would apply and the name of the font must be changed: any RFNs cannot be used and copyright notices and licensing information must be included and cannot be deleted or modified. You must come up with a unique name - we recommend one corresponding to your domain or your particular web application. Be aware that only the original author(s) can use RFNs. This is to prevent collisions between a derivative tuned to your audience and the original upstream version and so to reduce confusion.
|
||||
|
||||
>> Please note that most WOFF conversion tools and online services do not meet the two requirements listed above, and so their output must be considered a Modified Version. So be very careful and check to be sure that the tool or service you're using is compressing unchanged data and completely and accurately reflecting the original font metadata.
|
||||
|
||||
### 2.3 What about other webfont formats such as EOT/EOTLite/CWT/etc.?
|
||||
>> In most cases these formats alter the original font data more than WOFF, and do not completely support appropriate metadata, so their use must be considered modification and RFNs may not be used.
|
||||
|
||||
### 2.4 Can I make OFL fonts available through webfont online services?
|
||||
>> Yes, you are welcome to include OFL fonts in online webfont services as long as you properly meet all the conditions of the license. The origin and open status of the font should be clear among the other fonts you are hosting. Authorship, copyright notices and license information must be sufficiently visible to your users or subscribers so they know where the font comes from and the rights granted by the author(s). Make sure the font file contains the needed copyright notice(s) and licensing information in its metadata. Please double-check the accuracy of every field to prevent contradictory information. Other font formats, including EOT/EOTLite/CWT and superior alternatives like WOFF, already provide fields for this information. Remember that if you modify the font within your library or convert it to another format for any reason the OFL restrictions apply and you need to change the names accordingly. Please respect the author's wishes as expressed in the OFL and do not misrepresent original designers and their work. Don't lump quality open fonts together with dubious freeware or public domain fonts. Consider how you can best work with the original designers and foundries, support their efforts and generate goodwill that will benefit your service. (See 1.17 for details related to URL-based access restrictions methods or DRM mechanisms).
|
||||
|
||||
### 2.5 Can I make and publish CMS themes or templates that use OFL fonts? Can I include the fonts themselves in the themes or templates? Can I sell the whole package?
|
||||
>> Yes, you are very welcome to integrate open fonts into themes and templates for your preferred CMS and make them more widely available. Be aware that you can only sell the fonts and your CMS add-on as part of a software bundle. (See 1.4 for details and examples about selling bundles).
|
||||
|
||||
### 2.6 Some webfont formats and services provide ways of "optimising" the font for a particular website or web application; is that allowed?
|
||||
>> Yes, it is permitted, but remember that these optimised versions are Modified Versions and so must follow OFL requirements like appropriate renaming. Also you need to bear in mind the other important parameters beyond compression, speed and responsiveness: you need to consider the audience of your particular website or web application, as choosing some optimisation parameters may turn out to be less than ideal for them. Subsetting by removing certain glyphs or features may seriously limit functionality of the font in various languages used by your users. It may also introduce degradation of quality in the rendering or specific bugs on the various platforms compared to the original font. In other words, remember that one person's optimised font may be another person's missing feature. Various advanced typographic features are also available through CSS and may provide the desired effects without the need to modify the font.
|
||||
|
||||
|
||||
3. Modifying OFL-Licensed Fonts
|
||||
====================================
|
||||
|
||||
### 3.1 Can I change the fonts? Are there any limitations to what things I can and cannot change?
|
||||
>> You are allowed to change anything, as long as such changes do not violate the terms of the license. In other words, you are not allowed to remove the copyright statement(s) from the font, but you could put additional information into it that covers your contribution.
|
||||
|
||||
### 3.2 I have a font that needs a few extra glyphs - can I take them from an OFL licensed font and copy them into mine?
|
||||
>> Yes, but if you distribute that font to others it must be under the OFL, and include the information mentioned in condition 2 of the license.
|
||||
|
||||
### 3.3 Can I charge people for my additional work? In other words, if I add a bunch of special glyphs and/or OpenType/Graphite code, can I sell the enhanced font?
|
||||
>> Not by itself. Derivative fonts must be released under the OFL and cannot be sold by themselves. It is permitted, however, to include them in a larger software package (such as text editors, office suites or operating systems), even if the larger package is sold. In that case, you are strongly encouraged, but not required, to also make that derived font easily and freely available outside of the larger package.
|
||||
|
||||
### 3.4 Can I pay someone to enhance the fonts for my use and distribution?
|
||||
>> Yes. This is a good way to fund the further development of the fonts. Keep in mind, however, that if the font is distributed to others it must be under the OFL. You won't be able to recover your investment by exclusively selling the font, but you will be making a valuable contribution to the community. Please remember how you have benefited from the contributions of others.
|
||||
|
||||
### 3.5 I need to make substantial revisions to the font to make it work with my program. It will be a lot of work, and a big investment, and I want to be sure that it can only be distributed with my program. Can I restrict its use?
|
||||
>> No. If you redistribute a Modified Version of the font it must be under the OFL. You may not restrict it in any way beyond what the OFL permits and requires. This is intended to ensure that all released improvements to the fonts become available to everyone. But you will likely get an edge over competitors by being the first to distribute a bundle with the enhancements. Again, please remember how you have benefited from the contributions of others.
|
||||
|
||||
### 3.6 Do I have to make any derivative fonts (including extended source files, build scripts, documentation, etc.) publicly available?
|
||||
>> No, but please consider sharing your improvements with others. You may find that you receive in return more than what you gave.
|
||||
|
||||
### 3.7 If a trademark is claimed in the OFL font, does that trademark need to remain in modified fonts?
|
||||
>> Yes, any trademark notices must remain in any derivative fonts to respect trademark laws, but you may add any additional trademarks you claim, officially registered or not. For example if an OFL font called "Foo" contains a notice that "Foo is a trademark of Acme", then if you rename the font to "Bar" when creating a Modified Version, the new trademark notice could say "Foo is a trademark of Acme Inc. - Bar is a trademark of Roadrunner Technologies Ltd.". Trademarks work alongside the OFL and are not subject to the terms of the licensing agreement. Please refer to the appropriate trademark laws.
|
||||
|
||||
4. Licensing Your Original Fonts Under the OFL
|
||||
===================================================
|
||||
|
||||
### 4.1 Can I use the SIL OFL for my own fonts?
|
||||
>> Yes! We heartily encourage everyone to use the OFL to distribute their own original fonts. It is a carefully constructed license that allows great freedom along with enough artistic integrity protection for the work of the authors as well as clear rules for other contributors and those who redistribute the fonts. The licensing model is used successfully by various organisations, both for-profit and not-for-profit, to release fonts of varying levels of scope and complexity.
|
||||
|
||||
### 4.2 What do I have to do to apply the OFL to my font?
|
||||
>> If you want to release your fonts under the OFL, we recommend you do the following:
|
||||
|
||||
>> - **4.2.1** Put your copyright and Reserved Font Names information at the beginning of the main OFL.txt file in place of the dedicated placeholders. Include this file in your release package.
|
||||
|
||||
>> - **4.2.2** Put your copyright and the OFL text with Reserved Font Names into your font files (the copyright and license fields). A link to the OFL text on the OFL web site is an acceptable (but not recommended) alternative. Also add this information to any other components (build scripts, glyph databases, documentation, test files, etc). Depending on the format of your fonts and sources, you can use template human-readable headers or machine-readable metadata.
|
||||
|
||||
>> - **4.2.3** Write an initial FONTLOG.txt for your font and include it in the release package.
|
||||
|
||||
>> - **4.2.4** Include the relevant practical documentation on the license by including the OFL-FAQ.txt in your package.
|
||||
|
||||
### 4.3 Will you make my font OFL for me?
|
||||
>> We won't do the work for you. We can, however, try to answer your questions, unfortunately we do not have the resources to review and check your font packages for correct use of the OFL.
|
||||
|
||||
### 4.4 Will you distribute my OFL font for me?
|
||||
>> No, although if the font is of sufficient quality and general interest we may include a link to it on our partial list of OFL fonts on the OFL web site. You may wish to consider other open font catalogs or hosting services, such as the Unifont Font Guide (http://unifont.org/fontguide), The League of Movable Type (http://theleagueofmovabletype.com), Kernest (http://kernest.com/) or the Open Font Library (http://openfontlibrary.org/), which despite the name has no direct relationship to the OFL or SIL. We do not endorse any particular catalog or hosting service - it is your responsibility to determine if the service is right for you.
|
||||
|
||||
### 4.5 Why should I use the OFL for my fonts?
|
||||
>> - to meet needs for fonts that can be modified to support minority languages
|
||||
>> - to provide a legal and clear way for people to respect your work but still use it (and reduce piracy)
|
||||
>> - to involve others in your font project
|
||||
>> - to enable your fonts to be expanded with new weights and improved writing system/language support
|
||||
>> - to allow more technical font developers to add features to your design (such as OpenType and Graphite support)
|
||||
>> - to renew the life of an old font lying on your hard drive with no business model
|
||||
>> - to allow your font to be included in Libre Software operating systems like Ubuntu
|
||||
>> - to give your font world status and wide, unrestricted distribution
|
||||
>> - to educate students about quality typeface and font design
|
||||
>> - to expand your test base and get more useful feedback
|
||||
>> - to extend your reach to new markets when users see your metadata and go to your website
|
||||
>> - to get your font more easily into one of the webfont online services
|
||||
>> - to attract attention for your commercial fonts
|
||||
>> - to make money through webfont services
|
||||
>> - to make money by bundling fonts with applications
|
||||
>> - to make money adjusting and extending existing open fonts
|
||||
>> - to get a better chance that foundations/NGOs/charities/companies who commission fonts will pick you
|
||||
>> - to be part of a sharing design and development community
|
||||
>> - to give back and contribute to a growing body of font sources
|
||||
|
||||
|
||||
5. Choosing Reserved Font Names
|
||||
===================================
|
||||
|
||||
### 5.1 What are Reserved Font Names?
|
||||
>> These are font names, or portions of font names, that the author has chosen to reserve for use only with the Original Version of the font, or for Modified Version(s) created by the original author.
|
||||
|
||||
### 5.2 Why can't I use the Reserved Font Names in my derivative font names? I'd like people to know where the design came from.
|
||||
>> The best way to acknowledge the source of the design is to thank the original authors and any other contributors in the files that are distributed with your revised font (although no acknowledgement is required). The FONTLOG is a natural place to do this. Reserved Font Names ensure that the only fonts that have the original names are the unmodified Original Versions. This allows designers to maintain artistic integrity while allowing collaboration to happen. It eliminates potential confusion and name conflicts. When choosing a name, be creative and avoid names that reuse almost all the same letters in the same order or sound like the original. It will help everyone if Original Versions and Modified Versions can easily be distinguished from one another and from other derivatives. Any substitution and matching mechanism is outside the scope of the license.
|
||||
|
||||
### 5.3 What do you mean by "primary name as presented to the user"? Are you referring to the font menu name?
|
||||
>> Yes, this applies to the font menu name and other mechanisms that specify a font in a document. It would be fine, however, to keep a text reference to the original fonts in the description field, in your modified source file or in documentation provided alongside your derivative as long as no one could be confused that your modified source is the original. But you cannot use the Reserved Font Names in any way to identify the font to the user (unless the Copyright Holder(s) allow(s) it through a separate agreement). Users who install derivatives (Modified Versions) on their systems should not see any of the original Reserved Font Names in their font menus, for example. Again, this is to ensure that users are not confused and do not mistake one font for another and so expect features only another derivative or the Original Version can actually offer.
|
||||
|
||||
### 5.4 Am I not allowed to use any part of the Reserved Font Names?
|
||||
>> You may not use individual words from the Reserved Font Names, but you would be allowed to use parts of words, as long as you do not use any word from the Reserved Font Names entirely. We do not recommend using parts of words because of potential confusion, but it is allowed. For example, if "Foobar" was a Reserved Font Name, you would be allowed to use "Foo" or "bar", although we would not recommend it. Such an unfortunate choice would confuse the users of your fonts as well as make it harder for other designers to contribute.
|
||||
|
||||
### 5.5 So what should I, as an author, identify as Reserved Font Names?
|
||||
>> Original authors are encouraged to name their fonts using clear, distinct names, and only declare the unique parts of the name as Reserved Font Names. For example, the author of a font called "Foobar Sans" would declare "Foobar" as a Reserved Font Name, but not "Sans", as that is a common typographical term, and may be a useful word to use in a derivative font name. Reserved Font Names should also be single words. A font called "Flowing River" should have Reserved Font Names "Flowing" and "River", not "Flowing River". You also need to be very careful about reserving font names which are already linked to trademarks (whether registered or not) which you do not own.
|
||||
|
||||
### 5.6 Do I, as an author, have to identify any Reserved Font Names?
|
||||
>> No, but we strongly encourage you to do so. This is to avoid confusion between your work and Modified Versions.
|
||||
|
||||
### 5.7 Are any names (such as the main font name) reserved by default?
|
||||
>> No. That is a change to the license as of version 1.1. If you want any names to be Reserved Font Names, they must be specified after the copyright statement(s).
|
||||
|
||||
### 5.8 Is there any situation in which I can use Reserved Font Names for a Modified Version?
|
||||
>> The Copyright Holder(s) can give certain trusted parties the right to use any of the Reserved Font Names through separate written agreements. For example, even if "Foobar" is a RFN, you could write up an agreement to give company "XYZ" the right to distribute a modified version with a name that includes "Foobar". This allows for freedom without confusion.
|
||||
|
||||
### 5.9 Do font rebuilds require a name change? Do I have to change the name of the font when my packaging workflow includes a full rebuild from source?
|
||||
>> Yes, all rebuilds which change the font data and the smart code are Modified Versions and the requirements of the OFL apply: you need to respect what the Author(s) have chosen in terms of Reserved Font Names. However if a package (or installer) is simply a wrapper or a compressed structure around the final font - leaving them intact on the inside - then no name change is required. Please get in touch with the author(s) and copyright holder(s) to inquire about the presence of font sources beyond the final font file(s) and the recommended build path. That build path may very well be non-trivial and hard to reproduce accurately by the maintainer. If a full font build path is made available by the upstream author(s) please be aware that any regressions and changes you may introduce when doing a rebuild for packaging purposes is your responsibility as a package maintainer since you are effectively creating a separate branch. You should make it very clear to your users that your rebuilt version is not the canonical one from upstream.
|
||||
|
||||
### 5.10 Can I add other Reserved Font Names when making a derivative font?
|
||||
>> Yes. List your additional Reserved Font Names after your additional copyright statement, as indicated with example placeholders at the top of the OFL.txt file. Be sure you do not remove any exiting RFNs but only add your own.
|
||||
|
||||
|
||||
6. About the Fontlog
|
||||
========================
|
||||
|
||||
### 6.1 What is this FONTLOG thing exactly?
|
||||
>> It has three purposes: 1) to provide basic information on the font to users and other developers, 2) to document changes that have been made to the font or accompanying files, either by the original authors or others, and 3) to provide a place to acknowledge authors and other contributors. Please use it!
|
||||
|
||||
### 6.2 Is the FONTLOG required?
|
||||
>> It is not a requirement of the license, but we strongly recommend you have one.
|
||||
|
||||
### 6.3 Am I required to update the FONTLOG when making Modified Versions?
|
||||
>> No, but users, designers and other developers might get very frustrated with you if you don't. People need to know how derivative fonts differ from the original, and how to take advantage of the changes, or build on them. There are utilities that can help create and maintain a FONTLOG, such as the FONTLOG support in FontForge.
|
||||
|
||||
### 6.4 What should the FONTLOG look like?
|
||||
>> It is typically a separate text file (FONTLOG.txt), but can take other formats. It commonly includes these four sections:
|
||||
|
||||
>> - brief header describing the FONTLOG itself and name of the font family
|
||||
>> - Basic Font Information - description of the font family, purpose and breadth
|
||||
>> - ChangeLog - chronological listing of changes
|
||||
>> - Acknowledgements - list of authors and contributors with contact information
|
||||
|
||||
>> It could also include other sections, such as: where to find documentation, how to make contributions, information on contributing organizations, source code details, and a short design guide.
|
||||
|
||||
7. Making Contributions to OFL Projects
|
||||
===========================================
|
||||
|
||||
### 7.1 Can I contribute work to OFL projects?
|
||||
>> In many cases, yes. It is common for OFL fonts to be developed by a team of people who welcome contributions from the wider community. Contact the original authors for specific information on how to participate in their projects.
|
||||
|
||||
### 7.2 Why should I contribute my changes back to the original authors?
|
||||
>> It would benefit many people if you contributed back in response to what you've received. Your contributions and improvements to the fonts and other components could be a tremendous help and would encourage others to contribute as well and 'give back'. You will then benefit from other people's contributions as well. Sometimes maintaining your own separate version takes more effort than merging back with the original. Be aware that any contributions, however, must be either your own original creation or work that you own, and you may be asked to affirm that clearly when you contribute.
|
||||
|
||||
### 7.3 I've made some very nice improvements to the font. Will you consider adopting them and putting them into future Original Versions?
|
||||
>> Most authors would be very happy to receive such contributions. Keep in mind that it is unlikely that they would want to incorporate major changes that would require additional work on their end. Any contributions would likely need to be made for all the fonts in a family and match the overall design and style. Authors are encouraged to include a guide to the design with the fonts. It would also help to have contributions submitted as patches or clearly marked changes - the use of smart source revision control systems like subversion, svk, mercurial, git or bzr is a good idea. Please follow the recommendations given by the author(s) in terms of preferred source formats and configuration parameters for sending contributions. If this is not indicated in a FONTLOG or other documentation of the font, consider asking them directly. Examples of useful contributions are bug fixes, additional glyphs, stylistic alternates (and the smart font code to access them) or improved hinting. Keep in mind that some kinds of changes (esp. hinting) may be technically difficult to integrate.
|
||||
|
||||
### 7.4 How can I financially support the development of OFL fonts?
|
||||
>> It is likely that most authors of OFL fonts would accept financial contributions - contact them for instructions on how to do this. Such contributions would support future development. You can also pay for others to enhance the fonts and contribute the results back to the original authors for inclusion in the Original Version.
|
||||
|
||||
8. About the License Itself
|
||||
===============================
|
||||
|
||||
### 8.1 I see that this is version 1.1 of the license. Will there be later changes?
|
||||
>> Version 1.1 is the first minor revision of the OFL. We are confident that version 1.1 will meet most needs, but are open to future improvements. Any revisions would be for future font releases, and previously existing licenses would remain in effect. No retroactive changes are possible, although the Copyright Holder(s) can re-release the font under a revised OFL. All versions will be available on our web site: http://scripts.sil.org/OFL.
|
||||
|
||||
### 8.2 Does this license restrict the rights of the Copyright Holder(s)?
|
||||
>> No. The Copyright Holder(s) still retain(s) all the rights to their creation; they are only releasing a portion of it for use in a specific way. For example, the Copyright Holder(s) may choose to release a 'basic' version of their font under the OFL, but sell a restricted 'enhanced' version. Only the Copyright Holder(s) can do this.
|
||||
|
||||
### 8.3 Is the OFL a contract or a license?
|
||||
>> The OFL is a license and not a contract and so does not require you to sign it to have legal validity. By using, modifying and redistributing components under the OFL you indicate that you accept the license.
|
||||
|
||||
### 8.4 I really like the terms of the OFL, but want to change it a little. Am I allowed to take ideas and actual wording from the OFL and put them into my own custom license for distributing my fonts?
|
||||
>> We strongly recommend against creating your very own unique open licensing model. Using a modified or derivative license will likely cut you off - along with the font(s) under that license - from the community of designers using the OFL, potentially expose you and your users to legal liabilities, and possibly put your work and rights at risk. The OFL went though a community and legal review process that took years of effort, and that review is only applicable to an unmodified OFL. The text of the OFL has been written by SIL (with review and consultation from the community) and is copyright (c) 2005-2010 SIL International. You may re-use the ideas and wording (in part, not in whole) in another non-proprietary license provided that you call your license by another unambiguous name, that you do not use the preamble, that you do not mention SIL and that you clearly present your license as different from the OFL so as not to cause confusion by being too similar to the original. If you feel the OFL does not meet your needs for an open license, please contact us.
|
||||
|
||||
### 8.5 Can I translate the license and the FAQ into other languages?
|
||||
>> SIL certainly recognises the need for people who are not familiar with English to be able to understand the OFL and its use. Making the license very clear and readable has been a key goal for the OFL, but we know that people understand their own language best.
|
||||
|
||||
>> If you are an experienced translator, you are very welcome to translate the OFL and OFL-FAQ so that designers and users in your language community can understand the license better. But only the original English version of the license has legal value and has been approved by the community. Translations do not count as legal substitutes and should only serve as a way to explain the original license. SIL - as the author and steward of the license for the community at large - does not approve any translation of the OFL as legally valid because even small translation ambiguities could be abused and create problems.
|
||||
|
||||
>> SIL gives permission to publish unofficial translations into other languages provided that they comply with the following guidelines:
|
||||
|
||||
>> - Put the following disclaimer in both English and the target language stating clearly that the translation is unofficial:
|
||||
|
||||
>> "This is an unofficial translation of the SIL Open Font License into `<language_name>`. It was not published by SIL International, and does not legally state the distribution terms for fonts that use the OFL. A release under the OFL is only valid when using the original English text. However, we recognize that this unofficial translation will help users and designers not familiar with English to better understand and use the OFL. We encourage designers who consider releasing their creation under the OFL to read the OFL-FAQ in their own language if it is available. Please go to http://scripts.sil.org/OFL for the official version of the license and the accompanying OFL-FAQ."
|
||||
|
||||
>> - Keep your unofficial translation current and update it at our request if needed, for example if there is any ambiguity which could lead to confusion.
|
||||
|
||||
>> If you start such a unofficial translation effort of the OFL and OFL-FAQ please let us know.
|
||||
|
||||
9. About SIL International
|
||||
==============================
|
||||
|
||||
### 9.1 Who is SIL International and what do they do?
|
||||
>> SIL serves language communities worldwide, building their capacity for sustainable language development, by means of research, translation, training and materials development. SIL makes its services available to all without regard to religious belief, political ideology, gender, race, or ethnic background. SIL's members and volunteers share a Christian commitment.
|
||||
|
||||
### 9.2 What does this have to do with font licensing?
|
||||
>> The ability to read, write, type and publish in one's own language is one of the most critical needs for millions of people around the world. This requires fonts that are widely available and support lesser-known languages. SIL develops - and encourages others to develop - a complete stack of writing systems implementation components available under open licenses. This open stack includes input methods, smart fonts, smart rendering libraries and smart applications. There has been a need for a common open license that is specifically applicable to fonts and related software (a crucial component of this stack), so SIL developed the SIL Open Font License with the help of the Free/Libre and Open Source Software community.
|
||||
|
||||
### 9.3 How can I contact SIL?
|
||||
>> Our main web site is: http://www.sil.org/
|
||||
Our site about complex scripts is: http://scripts.sil.org/
|
||||
Information about this license (and contact information) is at: http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
- OFL License modified to Markdown
|
||||
|
||||
N: Micah Rich
|
||||
E: micah@micahrich.com
|
||||
W: http://www.theleagueofmoveabletype.com
|
||||
|
||||
- The League of Moveable Type is an open-source font foundry, working to make the world of typography a better place.
|
||||
|
||||
105
public/fonts/league-gothic/Open Font License.markdown
Normal file
@@ -0,0 +1,105 @@
|
||||
Copyright (c) 2010, Caroline Hadilaksono & Micah Rich <caroline@hadilaksono, micah@micahrich.com>, with Reserved Font Name: "League Gothic".
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
Version 1.1 - 26 February 2007
|
||||
|
||||
|
||||
SIL Open Font License
|
||||
====================================================
|
||||
|
||||
|
||||
Preamble
|
||||
----------
|
||||
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
Definitions
|
||||
-------------
|
||||
|
||||
`"Font Software"` refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
`"Reserved Font Name"` refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
`"Original Version"` refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
`"Modified Version"` refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
`"Author"` refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
Permission & Conditions
|
||||
------------------------
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1. Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2. Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3. No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5. The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
Termination
|
||||
-----------
|
||||
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
|
||||
DISCLAIMER
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
BIN
public/fonts/league-gothic/images/league-gothic-1.png
Normal file
|
After Width: | Height: | Size: 283 KiB |
BIN
public/fonts/league-gothic/images/league-gothic-2.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
public/fonts/league-gothic/images/league-gothic-3.png
Normal file
|
After Width: | Height: | Size: 406 KiB |
BIN
public/fonts/league-gothic/images/league-gothic-4.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
public/fonts/league-gothic/images/league-gothic-5.jpg
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
public/fonts/league-gothic/images/league-gothic-6.png
Normal file
|
After Width: | Height: | Size: 292 KiB |
9
public/fonts/league-gothic/readme.markdown
Normal file
@@ -0,0 +1,9 @@
|
||||

|
||||
|
||||
League Gothic
|
||||
=============
|
||||
_by [Caroline Hadilaksono](http://www.hadilaksono.com), [Micah Rich](http://micahrich.com), & [Tyler Finck](http://sursly.com)_
|
||||
|
||||
League Gothic is a revival of an old classic, and one of our favorite typefaces, Alternate Gothic #1. It was originally designed by [Morris Fuller Benton](http://en.wikipedia.org/wiki/Morris_Fuller_Benton) for the [American Type Founders Company](http://en.wikipedia.org/wiki/American_Type_Founders) in 1903. The company went bankrupt in 1993, and since the original typeface was created before 1923, the typeface is in the public domain.
|
||||
|
||||
We decided to make our own version, and contribute it to the Open Source Type Movement. Thanks to a commission from the fine & patient folks over at [WND.com](http://wnd.com), it's been revised & updated with contributions from Micah Rich, Tyler Finck, and [Dannci](https://twitter.com/#!/dannci), who contributing extra glyphs.
|
||||
17939
public/fonts/league-gothic/source/League Gothic Condensed Italic.glyphs
Normal file
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>ascender</key>
|
||||
<integer>735</integer>
|
||||
<key>capHeight</key>
|
||||
<integer>735</integer>
|
||||
<key>copyright</key>
|
||||
<string>Copyright (c) 2012 by The League of Moveable Type</string>
|
||||
<key>descender</key>
|
||||
<integer>-265</integer>
|
||||
<key>familyName</key>
|
||||
<string>League Gothic Condensed Italic</string>
|
||||
<key>italicAngle</key>
|
||||
<real>0.0</real>
|
||||
<key>openTypeHeadCreated</key>
|
||||
<string>2012/08/26 13:29:30</string>
|
||||
<key>openTypeHheaAscender</key>
|
||||
<integer>735</integer>
|
||||
<key>openTypeHheaDescender</key>
|
||||
<integer>-265</integer>
|
||||
<key>openTypeNameDesigner</key>
|
||||
<string>Tyler Finck</string>
|
||||
<key>openTypeNameDesignerURL</key>
|
||||
<string>http://sursly.com</string>
|
||||
<key>openTypeNameManufacturer</key>
|
||||
<string>The League of Moveable Type</string>
|
||||
<key>openTypeNameManufacturerURL</key>
|
||||
<string>http://theleagueofmoveabletype.com</string>
|
||||
<key>openTypeNamePreferredFamilyName</key>
|
||||
<string>League Gothic</string>
|
||||
<key>openTypeNamePreferredSubfamilyName</key>
|
||||
<string>Condensed Italic</string>
|
||||
<key>openTypeOS2WeightClass</key>
|
||||
<integer>400</integer>
|
||||
<key>openTypeOS2WidthClass</key>
|
||||
<integer>3</integer>
|
||||
<key>postscriptBlueValues</key>
|
||||
<array>
|
||||
<integer>-8</integer>
|
||||
<integer>0</integer>
|
||||
<integer>547</integer>
|
||||
<integer>555</integer>
|
||||
<integer>735</integer>
|
||||
<integer>743</integer>
|
||||
</array>
|
||||
<key>postscriptFontName</key>
|
||||
<string>LeagueGothic-CondensedItalic</string>
|
||||
<key>postscriptFullName</key>
|
||||
<string>League Gothic Condensed Italic</string>
|
||||
<key>postscriptOtherBlues</key>
|
||||
<array>
|
||||
<integer>-196</integer>
|
||||
<integer>-188</integer>
|
||||
</array>
|
||||
<key>postscriptStemSnapH</key>
|
||||
<array>
|
||||
<integer>82</integer>
|
||||
<integer>90</integer>
|
||||
<integer>111</integer>
|
||||
<integer>735</integer>
|
||||
</array>
|
||||
<key>postscriptStemSnapV</key>
|
||||
<array>
|
||||
<integer>61</integer>
|
||||
<integer>75</integer>
|
||||
<integer>83</integer>
|
||||
</array>
|
||||
<key>postscriptWeightName</key>
|
||||
<string>Regular</string>
|
||||
<key>styleMapStyleName</key>
|
||||
<string>regular</string>
|
||||
<key>styleName</key>
|
||||
<string>Regular</string>
|
||||
<key>unitsPerEm</key>
|
||||
<integer>1000</integer>
|
||||
<key>versionMajor</key>
|
||||
<integer>1</integer>
|
||||
<key>versionMinor</key>
|
||||
<integer>1</integer>
|
||||
<key>xHeight</key>
|
||||
<integer>547</integer>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="AE" format="1">
|
||||
<advance width="352"/>
|
||||
<unicode hex="00C6"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="113" y="0" type="line"/>
|
||||
<point x="279" y="0" type="line"/>
|
||||
<point x="303" y="111" type="line"/>
|
||||
<point x="220" y="111" type="line"/>
|
||||
<point x="263" y="313" type="line"/>
|
||||
<point x="323" y="313" type="line"/>
|
||||
<point x="348" y="431" type="line"/>
|
||||
<point x="288" y="431" type="line"/>
|
||||
<point x="329" y="624" type="line"/>
|
||||
<point x="412" y="624" type="line"/>
|
||||
<point x="436" y="735" type="line"/>
|
||||
<point x="236" y="735" type="line"/>
|
||||
<point x="-43" y="0" type="line"/>
|
||||
<point x="38" y="0" type="line"/>
|
||||
<point x="96" y="150" type="line"/>
|
||||
<point x="145" y="150" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="228" y="538" type="line"/>
|
||||
<point x="217" y="485"/>
|
||||
<point x="179" y="309"/>
|
||||
<point x="170" y="264" type="curve"/>
|
||||
<point x="138" y="264" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="176" y="735" type="move" name="top"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="A" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="0041"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="38" y="0" type="line"/>
|
||||
<point x="81" y="150" type="line"/>
|
||||
<point x="127" y="150" type="line"/>
|
||||
<point x="106" y="0" type="line"/>
|
||||
<point x="187" y="0" type="line"/>
|
||||
<point x="278" y="735" type="line"/>
|
||||
<point x="181" y="735" type="line"/>
|
||||
<point x="-42" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="145" y="264" type="line"/>
|
||||
<point x="114" y="264" type="line"/>
|
||||
<point x="191" y="556" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="229" y="10" type="move" name="ogonek"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="127" y="735" type="move" name="top"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Aacute" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="00C1"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="249" y="890" type="line"/>
|
||||
<point x="199" y="800" type="line"/>
|
||||
<point x="263" y="800" type="line"/>
|
||||
<point x="329" y="890" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="30" y="0" type="line"/>
|
||||
<point x="73" y="150" type="line"/>
|
||||
<point x="119" y="150" type="line"/>
|
||||
<point x="98" y="0" type="line"/>
|
||||
<point x="179" y="0" type="line"/>
|
||||
<point x="269" y="735" type="line"/>
|
||||
<point x="172" y="735" type="line"/>
|
||||
<point x="-50" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="136" y="264" type="line"/>
|
||||
<point x="105" y="264" type="line"/>
|
||||
<point x="182" y="556" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Abreve" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="0102"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="28" y="0" type="line"/>
|
||||
<point x="71" y="150" type="line"/>
|
||||
<point x="117" y="150" type="line"/>
|
||||
<point x="96" y="0" type="line"/>
|
||||
<point x="177" y="0" type="line"/>
|
||||
<point x="268" y="735" type="line"/>
|
||||
<point x="171" y="735" type="line"/>
|
||||
<point x="-52" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="134" y="264" type="line"/>
|
||||
<point x="103" y="264" type="line"/>
|
||||
<point x="180" y="556" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="296" y="925" type="line"/>
|
||||
<point x="296" y="925"/>
|
||||
<point x="270" y="894"/>
|
||||
<point x="254" y="894" type="curve" smooth="yes"/>
|
||||
<point x="236" y="894"/>
|
||||
<point x="228" y="926"/>
|
||||
<point x="228" y="926" type="curve"/>
|
||||
<point x="175" y="869" type="line"/>
|
||||
<point x="182" y="843"/>
|
||||
<point x="208" y="821"/>
|
||||
<point x="239" y="821" type="curve" smooth="yes"/>
|
||||
<point x="270" y="821"/>
|
||||
<point x="299" y="841"/>
|
||||
<point x="323" y="869" type="curve"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Acircumflex" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="00C2"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="214" y="890" type="line"/>
|
||||
<point x="153" y="800" type="line"/>
|
||||
<point x="218" y="800" type="line"/>
|
||||
<point x="244" y="839" type="line"/>
|
||||
<point x="252" y="800" type="line"/>
|
||||
<point x="317" y="800" type="line"/>
|
||||
<point x="295" y="890" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="30" y="0" type="line"/>
|
||||
<point x="73" y="150" type="line"/>
|
||||
<point x="119" y="150" type="line"/>
|
||||
<point x="98" y="0" type="line"/>
|
||||
<point x="179" y="0" type="line"/>
|
||||
<point x="269" y="735" type="line"/>
|
||||
<point x="172" y="735" type="line"/>
|
||||
<point x="-50" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="136" y="264" type="line"/>
|
||||
<point x="105" y="264" type="line"/>
|
||||
<point x="182" y="556" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Adieresis" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="00C4"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="150" y="800" type="line"/>
|
||||
<point x="224" y="800" type="line"/>
|
||||
<point x="245" y="898" type="line"/>
|
||||
<point x="171" y="898" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="247" y="800" type="line"/>
|
||||
<point x="320" y="800" type="line"/>
|
||||
<point x="341" y="898" type="line"/>
|
||||
<point x="268" y="898" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="30" y="0" type="line"/>
|
||||
<point x="74" y="150" type="line"/>
|
||||
<point x="118" y="150" type="line"/>
|
||||
<point x="98" y="0" type="line"/>
|
||||
<point x="179" y="0" type="line"/>
|
||||
<point x="269" y="735" type="line"/>
|
||||
<point x="172" y="735" type="line"/>
|
||||
<point x="-50" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="135" y="264" type="line"/>
|
||||
<point x="106" y="264" type="line"/>
|
||||
<point x="176" y="526" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Agrave" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="00C0"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="174" y="890" type="line"/>
|
||||
<point x="203" y="800" type="line"/>
|
||||
<point x="267" y="800" type="line"/>
|
||||
<point x="254" y="890" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="30" y="0" type="line"/>
|
||||
<point x="73" y="150" type="line"/>
|
||||
<point x="119" y="150" type="line"/>
|
||||
<point x="98" y="0" type="line"/>
|
||||
<point x="179" y="0" type="line"/>
|
||||
<point x="269" y="735" type="line"/>
|
||||
<point x="172" y="735" type="line"/>
|
||||
<point x="-50" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="136" y="264" type="line"/>
|
||||
<point x="105" y="264" type="line"/>
|
||||
<point x="182" y="556" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Amacron" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="0100"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="174" y="830" type="line"/>
|
||||
<point x="308" y="830" type="line"/>
|
||||
<point x="324" y="909" type="line"/>
|
||||
<point x="190" y="909" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="29" y="0" type="line"/>
|
||||
<point x="72" y="150" type="line"/>
|
||||
<point x="118" y="150" type="line"/>
|
||||
<point x="97" y="0" type="line"/>
|
||||
<point x="178" y="0" type="line"/>
|
||||
<point x="268" y="735" type="line"/>
|
||||
<point x="171" y="735" type="line"/>
|
||||
<point x="-51" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="135" y="264" type="line"/>
|
||||
<point x="104" y="264" type="line"/>
|
||||
<point x="181" y="556" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Aogonek" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="0104"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="197" y="0" type="line"/>
|
||||
<point x="288" y="735" type="line"/>
|
||||
<point x="191" y="735" type="line"/>
|
||||
<point x="-32" y="0" type="line"/>
|
||||
<point x="48" y="0" type="line"/>
|
||||
<point x="91" y="150" type="line"/>
|
||||
<point x="137" y="150" type="line"/>
|
||||
<point x="116" y="0" type="line"/>
|
||||
<point x="124" y="0" type="line"/>
|
||||
<point x="114" y="-11"/>
|
||||
<point x="106" y="-21"/>
|
||||
<point x="101" y="-28" type="curve"/>
|
||||
<point x="100" y="-29"/>
|
||||
<point x="99" y="-30"/>
|
||||
<point x="98" y="-31" type="curve"/>
|
||||
<point x="84" y="-50"/>
|
||||
<point x="67" y="-79"/>
|
||||
<point x="62" y="-103" type="curve" smooth="yes"/>
|
||||
<point x="52" y="-148"/>
|
||||
<point x="69" y="-188"/>
|
||||
<point x="114" y="-188" type="curve" smooth="yes"/>
|
||||
<point x="127" y="-188"/>
|
||||
<point x="138" y="-185"/>
|
||||
<point x="156" y="-176" type="curve"/>
|
||||
<point x="176" y="-101" type="line"/>
|
||||
<point x="159" y="-112"/>
|
||||
<point x="143" y="-121"/>
|
||||
<point x="138" y="-121" type="curve" smooth="yes"/>
|
||||
<point x="128" y="-121"/>
|
||||
<point x="119" y="-112"/>
|
||||
<point x="125" y="-83" type="curve"/>
|
||||
<point x="127" y="-71"/>
|
||||
<point x="131" y="-60"/>
|
||||
<point x="136" y="-50" type="curve" smooth="yes"/>
|
||||
<point x="146" y="-30"/>
|
||||
<point x="158" y="-13"/>
|
||||
<point x="168" y="0" type="curve"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="155" y="264" type="line"/>
|
||||
<point x="124" y="264" type="line"/>
|
||||
<point x="201" y="556" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Aring" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="00C5"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="183" y="819"/>
|
||||
<point x="201" y="790"/>
|
||||
<point x="231" y="790" type="curve" smooth="yes"/>
|
||||
<point x="260" y="790"/>
|
||||
<point x="290" y="819"/>
|
||||
<point x="299" y="860" type="curve" smooth="yes"/>
|
||||
<point x="308" y="901"/>
|
||||
<point x="290" y="930"/>
|
||||
<point x="261" y="930" type="curve" smooth="yes"/>
|
||||
<point x="231" y="930"/>
|
||||
<point x="201" y="901"/>
|
||||
<point x="192" y="860" type="curve" smooth="yes"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="235" y="879"/>
|
||||
<point x="245" y="891"/>
|
||||
<point x="252" y="891" type="curve" smooth="yes"/>
|
||||
<point x="258" y="891"/>
|
||||
<point x="265" y="879"/>
|
||||
<point x="261" y="860" type="curve" smooth="yes"/>
|
||||
<point x="257" y="841"/>
|
||||
<point x="245" y="828"/>
|
||||
<point x="239" y="828" type="curve" smooth="yes"/>
|
||||
<point x="232" y="828"/>
|
||||
<point x="227" y="841"/>
|
||||
<point x="231" y="860" type="curve" smooth="yes"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="28" y="0" type="line"/>
|
||||
<point x="72" y="150" type="line"/>
|
||||
<point x="116" y="150" type="line"/>
|
||||
<point x="96" y="0" type="line"/>
|
||||
<point x="177" y="0" type="line"/>
|
||||
<point x="267" y="735" type="line"/>
|
||||
<point x="170" y="735" type="line"/>
|
||||
<point x="-52" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="133" y="264" type="line"/>
|
||||
<point x="104" y="264" type="line"/>
|
||||
<point x="174" y="526" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Atilde" format="1">
|
||||
<advance width="254"/>
|
||||
<unicode hex="00C3"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="30" y="0" type="line"/>
|
||||
<point x="72" y="150" type="line"/>
|
||||
<point x="118" y="150" type="line"/>
|
||||
<point x="98" y="0" type="line"/>
|
||||
<point x="179" y="0" type="line"/>
|
||||
<point x="269" y="735" type="line"/>
|
||||
<point x="172" y="735" type="line"/>
|
||||
<point x="-50" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="136" y="264" type="line"/>
|
||||
<point x="105" y="264" type="line"/>
|
||||
<point x="182" y="556" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="164" y="783" type="line"/>
|
||||
<point x="170" y="790"/>
|
||||
<point x="198" y="813"/>
|
||||
<point x="210" y="813" type="curve" smooth="yes"/>
|
||||
<point x="230" y="813"/>
|
||||
<point x="237" y="794"/>
|
||||
<point x="260" y="794" type="curve" smooth="yes"/>
|
||||
<point x="278" y="794"/>
|
||||
<point x="295" y="806"/>
|
||||
<point x="306" y="819" type="curve"/>
|
||||
<point x="323" y="902" type="line"/>
|
||||
<point x="315" y="892"/>
|
||||
<point x="290" y="873"/>
|
||||
<point x="277" y="873" type="curve" smooth="yes"/>
|
||||
<point x="258" y="873"/>
|
||||
<point x="251" y="890"/>
|
||||
<point x="228" y="890" type="curve" smooth="yes"/>
|
||||
<point x="213" y="890"/>
|
||||
<point x="194" y="882"/>
|
||||
<point x="182" y="869" type="curve"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="B" format="1">
|
||||
<advance width="248"/>
|
||||
<unicode hex="0042"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="84" y="0" type="line" smooth="yes"/>
|
||||
<point x="127" y="0"/>
|
||||
<point x="157" y="39"/>
|
||||
<point x="171" y="63" type="curve" smooth="yes"/>
|
||||
<point x="185" y="87"/>
|
||||
<point x="206" y="153"/>
|
||||
<point x="218" y="208" type="curve" smooth="yes"/>
|
||||
<point x="225" y="244"/>
|
||||
<point x="234" y="293"/>
|
||||
<point x="234" y="316" type="curve"/>
|
||||
<point x="233" y="357"/>
|
||||
<point x="222" y="372"/>
|
||||
<point x="208" y="388" type="curve"/>
|
||||
<point x="230" y="402"/>
|
||||
<point x="243" y="423"/>
|
||||
<point x="255" y="445" type="curve"/>
|
||||
<point x="266" y="469"/>
|
||||
<point x="276" y="505"/>
|
||||
<point x="283" y="540" type="curve" smooth="yes"/>
|
||||
<point x="298" y="611"/>
|
||||
<point x="296" y="660"/>
|
||||
<point x="282" y="692" type="curve"/>
|
||||
<point x="268" y="721"/>
|
||||
<point x="247" y="735"/>
|
||||
<point x="205" y="735" type="curve" smooth="yes"/>
|
||||
<point x="132" y="735" type="line"/>
|
||||
<point x="-24" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="192" y="628" type="line"/>
|
||||
<point x="198" y="628"/>
|
||||
<point x="206" y="628"/>
|
||||
<point x="211" y="622" type="curve"/>
|
||||
<point x="216" y="611"/>
|
||||
<point x="213" y="583"/>
|
||||
<point x="202" y="530" type="curve" smooth="yes"/>
|
||||
<point x="191" y="477"/>
|
||||
<point x="182" y="449"/>
|
||||
<point x="172" y="438" type="curve"/>
|
||||
<point x="166" y="432"/>
|
||||
<point x="155" y="432"/>
|
||||
<point x="150" y="432" type="curve"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="129" y="333" type="line"/>
|
||||
<point x="134" y="333"/>
|
||||
<point x="143" y="334"/>
|
||||
<point x="148" y="328" type="curve" smooth="yes"/>
|
||||
<point x="156" y="318"/>
|
||||
<point x="149" y="282"/>
|
||||
<point x="136" y="220" type="curve" smooth="yes"/>
|
||||
<point x="123" y="157"/>
|
||||
<point x="113" y="123"/>
|
||||
<point x="102" y="112" type="curve" smooth="yes"/>
|
||||
<point x="96" y="106"/>
|
||||
<point x="85" y="107"/>
|
||||
<point x="81" y="107" type="curve"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="CR" format="1">
|
||||
<advance width="108"/>
|
||||
<unicode hex="000D"/>
|
||||
<outline>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="C" format="1">
|
||||
<advance width="238"/>
|
||||
<unicode hex="0043"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="139" y="252" type="line"/>
|
||||
<point x="115" y="141" type="line" smooth="yes"/>
|
||||
<point x="112" y="127"/>
|
||||
<point x="105" y="97"/>
|
||||
<point x="89" y="97" type="curve" smooth="yes"/>
|
||||
<point x="77" y="97"/>
|
||||
<point x="81" y="127"/>
|
||||
<point x="84" y="141" type="curve" smooth="yes"/>
|
||||
<point x="182" y="598" type="line" smooth="yes"/>
|
||||
<point x="185" y="614"/>
|
||||
<point x="191" y="638"/>
|
||||
<point x="204" y="638" type="curve" smooth="yes"/>
|
||||
<point x="220" y="638"/>
|
||||
<point x="215" y="607"/>
|
||||
<point x="212" y="594" type="curve" smooth="yes"/>
|
||||
<point x="188" y="483" type="line"/>
|
||||
<point x="269" y="483" type="line"/>
|
||||
<point x="293" y="594" type="line" smooth="yes"/>
|
||||
<point x="304" y="646"/>
|
||||
<point x="305" y="743"/>
|
||||
<point x="225" y="743" type="curve" smooth="yes"/>
|
||||
<point x="150" y="743"/>
|
||||
<point x="110" y="659"/>
|
||||
<point x="96" y="594" type="curve" smooth="yes"/>
|
||||
<point x="0" y="141" type="line" smooth="yes"/>
|
||||
<point x="-13" y="76"/>
|
||||
<point x="-11" y="-8"/>
|
||||
<point x="66" y="-8" type="curve" smooth="yes"/>
|
||||
<point x="142" y="-8"/>
|
||||
<point x="180" y="64"/>
|
||||
<point x="196" y="141" type="curve" smooth="yes"/>
|
||||
<point x="220" y="252" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="119" y="735" type="move" name="top"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="119" y="0" type="move" name="bottom"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Cacute" format="1">
|
||||
<advance width="238"/>
|
||||
<unicode hex="0106"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="226" y="915" type="line"/>
|
||||
<point x="176" y="825" type="line"/>
|
||||
<point x="239" y="825" type="line"/>
|
||||
<point x="306" y="915" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="130" y="252" type="line"/>
|
||||
<point x="106" y="141" type="line" smooth="yes"/>
|
||||
<point x="103" y="127"/>
|
||||
<point x="96" y="97"/>
|
||||
<point x="80" y="97" type="curve" smooth="yes"/>
|
||||
<point x="68" y="97"/>
|
||||
<point x="72" y="127"/>
|
||||
<point x="75" y="141" type="curve" smooth="yes"/>
|
||||
<point x="172" y="598" type="line"/>
|
||||
<point x="176" y="614"/>
|
||||
<point x="182" y="638"/>
|
||||
<point x="195" y="638" type="curve" smooth="yes"/>
|
||||
<point x="211" y="638"/>
|
||||
<point x="205" y="607"/>
|
||||
<point x="203" y="594" type="curve"/>
|
||||
<point x="179" y="483" type="line"/>
|
||||
<point x="260" y="483" type="line"/>
|
||||
<point x="284" y="594" type="line" smooth="yes"/>
|
||||
<point x="295" y="646"/>
|
||||
<point x="296" y="743"/>
|
||||
<point x="216" y="743" type="curve" smooth="yes"/>
|
||||
<point x="141" y="743"/>
|
||||
<point x="100" y="659"/>
|
||||
<point x="87" y="594" type="curve" smooth="yes"/>
|
||||
<point x="-9" y="141" type="line" smooth="yes"/>
|
||||
<point x="-22" y="76"/>
|
||||
<point x="-20" y="-8"/>
|
||||
<point x="57" y="-8" type="curve" smooth="yes"/>
|
||||
<point x="133" y="-8"/>
|
||||
<point x="171" y="64"/>
|
||||
<point x="187" y="141" type="curve" smooth="yes"/>
|
||||
<point x="211" y="252" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Ccaron" format="1">
|
||||
<advance width="238"/>
|
||||
<unicode hex="010C"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="130" y="252" type="line"/>
|
||||
<point x="106" y="141" type="line" smooth="yes"/>
|
||||
<point x="103" y="127"/>
|
||||
<point x="96" y="97"/>
|
||||
<point x="80" y="97" type="curve" smooth="yes"/>
|
||||
<point x="68" y="97"/>
|
||||
<point x="72" y="127"/>
|
||||
<point x="75" y="141" type="curve" smooth="yes"/>
|
||||
<point x="172" y="598" type="line"/>
|
||||
<point x="176" y="614"/>
|
||||
<point x="182" y="638"/>
|
||||
<point x="195" y="638" type="curve" smooth="yes"/>
|
||||
<point x="211" y="638"/>
|
||||
<point x="205" y="607"/>
|
||||
<point x="203" y="594" type="curve"/>
|
||||
<point x="179" y="483" type="line"/>
|
||||
<point x="260" y="483" type="line"/>
|
||||
<point x="284" y="594" type="line" smooth="yes"/>
|
||||
<point x="295" y="646"/>
|
||||
<point x="296" y="743"/>
|
||||
<point x="216" y="743" type="curve" smooth="yes"/>
|
||||
<point x="141" y="743"/>
|
||||
<point x="100" y="659"/>
|
||||
<point x="87" y="594" type="curve" smooth="yes"/>
|
||||
<point x="-9" y="141" type="line" smooth="yes"/>
|
||||
<point x="-22" y="76"/>
|
||||
<point x="-20" y="-8"/>
|
||||
<point x="57" y="-8" type="curve" smooth="yes"/>
|
||||
<point x="133" y="-8"/>
|
||||
<point x="171" y="64"/>
|
||||
<point x="187" y="141" type="curve" smooth="yes"/>
|
||||
<point x="211" y="252" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="274" y="825" type="line"/>
|
||||
<point x="334" y="915" type="line"/>
|
||||
<point x="269" y="915" type="line"/>
|
||||
<point x="244" y="876" type="line"/>
|
||||
<point x="235" y="915" type="line"/>
|
||||
<point x="170" y="915" type="line"/>
|
||||
<point x="193" y="825" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Ccedilla" format="1">
|
||||
<advance width="238"/>
|
||||
<unicode hex="00C7"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="97" y="-54" type="line"/>
|
||||
<point x="29" y="-54" type="line"/>
|
||||
<point x="14" y="-123" type="line"/>
|
||||
<point x="32" y="-123" type="line"/>
|
||||
<point x="6" y="-188" type="line"/>
|
||||
<point x="55" y="-188" type="line"/>
|
||||
<point x="82" y="-123" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="149" y="252" type="line"/>
|
||||
<point x="125" y="141" type="line" smooth="yes"/>
|
||||
<point x="122" y="127"/>
|
||||
<point x="115" y="97"/>
|
||||
<point x="99" y="97" type="curve" smooth="yes"/>
|
||||
<point x="87" y="97"/>
|
||||
<point x="91" y="127"/>
|
||||
<point x="94" y="141" type="curve" smooth="yes"/>
|
||||
<point x="191" y="598" type="line"/>
|
||||
<point x="195" y="614"/>
|
||||
<point x="201" y="638"/>
|
||||
<point x="214" y="638" type="curve" smooth="yes"/>
|
||||
<point x="230" y="638"/>
|
||||
<point x="224" y="607"/>
|
||||
<point x="221" y="594" type="curve" smooth="yes"/>
|
||||
<point x="198" y="483" type="line"/>
|
||||
<point x="279" y="483" type="line"/>
|
||||
<point x="302" y="594" type="line" smooth="yes"/>
|
||||
<point x="313" y="646"/>
|
||||
<point x="315" y="743"/>
|
||||
<point x="235" y="743" type="curve" smooth="yes"/>
|
||||
<point x="160" y="743"/>
|
||||
<point x="119" y="659"/>
|
||||
<point x="105" y="594" type="curve" smooth="yes"/>
|
||||
<point x="9" y="141" type="line" smooth="yes"/>
|
||||
<point x="-4" y="76"/>
|
||||
<point x="-2" y="-8"/>
|
||||
<point x="75" y="-8" type="curve" smooth="yes"/>
|
||||
<point x="151" y="-8"/>
|
||||
<point x="190" y="64"/>
|
||||
<point x="206" y="141" type="curve" smooth="yes"/>
|
||||
<point x="230" y="252" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Ccircumflex" format="1">
|
||||
<advance width="238"/>
|
||||
<unicode hex="0108"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="131" y="252" type="line"/>
|
||||
<point x="108" y="141" type="line" smooth="yes"/>
|
||||
<point x="105" y="127"/>
|
||||
<point x="97" y="97"/>
|
||||
<point x="81" y="97" type="curve" smooth="yes"/>
|
||||
<point x="69" y="97"/>
|
||||
<point x="74" y="127"/>
|
||||
<point x="77" y="141" type="curve" smooth="yes"/>
|
||||
<point x="174" y="598" type="line" smooth="yes"/>
|
||||
<point x="177" y="614"/>
|
||||
<point x="183" y="638"/>
|
||||
<point x="196" y="638" type="curve" smooth="yes"/>
|
||||
<point x="212" y="638"/>
|
||||
<point x="207" y="607"/>
|
||||
<point x="204" y="594" type="curve" smooth="yes"/>
|
||||
<point x="180" y="483" type="line"/>
|
||||
<point x="261" y="483" type="line"/>
|
||||
<point x="285" y="594" type="line" smooth="yes"/>
|
||||
<point x="296" y="646"/>
|
||||
<point x="298" y="743"/>
|
||||
<point x="218" y="743" type="curve" smooth="yes"/>
|
||||
<point x="143" y="743"/>
|
||||
<point x="102" y="659"/>
|
||||
<point x="88" y="594" type="curve" smooth="yes"/>
|
||||
<point x="-7" y="141" type="line" smooth="yes"/>
|
||||
<point x="-21" y="76"/>
|
||||
<point x="-19" y="-8"/>
|
||||
<point x="58" y="-8" type="curve" smooth="yes"/>
|
||||
<point x="134" y="-8"/>
|
||||
<point x="172" y="64"/>
|
||||
<point x="189" y="141" type="curve" smooth="yes"/>
|
||||
<point x="212" y="252" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="206" y="890" type="line"/>
|
||||
<point x="145" y="800" type="line"/>
|
||||
<point x="210" y="800" type="line"/>
|
||||
<point x="235" y="839" type="line"/>
|
||||
<point x="244" y="800" type="line"/>
|
||||
<point x="309" y="800" type="line"/>
|
||||
<point x="287" y="890" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Cdotaccent" format="1">
|
||||
<advance width="238"/>
|
||||
<unicode hex="010A"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="191" y="822" type="line"/>
|
||||
<point x="270" y="822" type="line"/>
|
||||
<point x="291" y="923" type="line"/>
|
||||
<point x="212" y="923" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="129" y="252" type="line"/>
|
||||
<point x="106" y="141" type="line" smooth="yes"/>
|
||||
<point x="103" y="127"/>
|
||||
<point x="96" y="97"/>
|
||||
<point x="80" y="97" type="curve" smooth="yes"/>
|
||||
<point x="68" y="97"/>
|
||||
<point x="72" y="127"/>
|
||||
<point x="75" y="141" type="curve" smooth="yes"/>
|
||||
<point x="172" y="598" type="line" smooth="yes"/>
|
||||
<point x="175" y="614"/>
|
||||
<point x="182" y="638"/>
|
||||
<point x="195" y="638" type="curve" smooth="yes"/>
|
||||
<point x="211" y="638"/>
|
||||
<point x="205" y="607"/>
|
||||
<point x="202" y="594" type="curve" smooth="yes"/>
|
||||
<point x="179" y="483" type="line"/>
|
||||
<point x="260" y="483" type="line"/>
|
||||
<point x="283" y="594" type="line" smooth="yes"/>
|
||||
<point x="294" y="646"/>
|
||||
<point x="296" y="743"/>
|
||||
<point x="216" y="743" type="curve" smooth="yes"/>
|
||||
<point x="141" y="743"/>
|
||||
<point x="100" y="659"/>
|
||||
<point x="86" y="594" type="curve" smooth="yes"/>
|
||||
<point x="-9" y="141" type="line" smooth="yes"/>
|
||||
<point x="-23" y="76"/>
|
||||
<point x="-21" y="-8"/>
|
||||
<point x="56" y="-8" type="curve" smooth="yes"/>
|
||||
<point x="132" y="-8"/>
|
||||
<point x="171" y="64"/>
|
||||
<point x="187" y="141" type="curve" smooth="yes"/>
|
||||
<point x="210" y="252" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="D" format="1">
|
||||
<advance width="253"/>
|
||||
<unicode hex="0044"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="55" y="0" type="line" smooth="yes"/>
|
||||
<point x="121" y="0"/>
|
||||
<point x="151" y="26"/>
|
||||
<point x="172" y="65" type="curve" smooth="yes"/>
|
||||
<point x="197" y="109"/>
|
||||
<point x="221" y="223"/>
|
||||
<point x="252" y="367" type="curve" smooth="yes"/>
|
||||
<point x="282" y="511"/>
|
||||
<point x="300" y="603"/>
|
||||
<point x="295" y="659" type="curve"/>
|
||||
<point x="288" y="715"/>
|
||||
<point x="267" y="735"/>
|
||||
<point x="201" y="735" type="curve" smooth="yes"/>
|
||||
<point x="132" y="735" type="line"/>
|
||||
<point x="-24" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="192" y="627" type="line"/>
|
||||
<point x="204" y="626"/>
|
||||
<point x="219" y="629"/>
|
||||
<point x="217" y="603" type="curve" smooth="yes"/>
|
||||
<point x="212" y="558"/>
|
||||
<point x="195" y="487"/>
|
||||
<point x="163" y="336" type="curve" smooth="yes"/>
|
||||
<point x="144" y="248"/>
|
||||
<point x="125" y="156"/>
|
||||
<point x="117" y="132" type="curve"/>
|
||||
<point x="106" y="104"/>
|
||||
<point x="94" y="108"/>
|
||||
<point x="81" y="108" type="curve"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="127" y="368" type="move" name="center"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="127" y="735" type="move" name="top"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Dcaron" format="1">
|
||||
<advance width="253"/>
|
||||
<unicode hex="010E"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="46" y="0" type="line" smooth="yes"/>
|
||||
<point x="112" y="0"/>
|
||||
<point x="141" y="26"/>
|
||||
<point x="163" y="65" type="curve" smooth="yes"/>
|
||||
<point x="187" y="109"/>
|
||||
<point x="211" y="223"/>
|
||||
<point x="242" y="367" type="curve" smooth="yes"/>
|
||||
<point x="273" y="511"/>
|
||||
<point x="290" y="603"/>
|
||||
<point x="285" y="659" type="curve" smooth="yes"/>
|
||||
<point x="279" y="715"/>
|
||||
<point x="257" y="735"/>
|
||||
<point x="191" y="735" type="curve" smooth="yes"/>
|
||||
<point x="122" y="735" type="line"/>
|
||||
<point x="-33" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="182" y="627" type="line"/>
|
||||
<point x="194" y="626"/>
|
||||
<point x="210" y="629"/>
|
||||
<point x="207" y="603" type="curve" smooth="yes"/>
|
||||
<point x="203" y="558"/>
|
||||
<point x="185" y="487"/>
|
||||
<point x="153" y="336" type="curve" smooth="yes"/>
|
||||
<point x="135" y="248"/>
|
||||
<point x="115" y="156"/>
|
||||
<point x="107" y="132" type="curve"/>
|
||||
<point x="96" y="104"/>
|
||||
<point x="85" y="108"/>
|
||||
<point x="72" y="108" type="curve"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="276" y="825" type="line"/>
|
||||
<point x="336" y="915" type="line"/>
|
||||
<point x="271" y="915" type="line"/>
|
||||
<point x="246" y="876" type="line"/>
|
||||
<point x="237" y="915" type="line"/>
|
||||
<point x="172" y="915" type="line"/>
|
||||
<point x="195" y="825" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Dcroat" format="1">
|
||||
<advance width="253"/>
|
||||
<unicode hex="0110"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="55" y="0" type="line" smooth="yes"/>
|
||||
<point x="121" y="0"/>
|
||||
<point x="151" y="26"/>
|
||||
<point x="172" y="65" type="curve" smooth="yes"/>
|
||||
<point x="197" y="109"/>
|
||||
<point x="221" y="223"/>
|
||||
<point x="252" y="367" type="curve" smooth="yes"/>
|
||||
<point x="282" y="511"/>
|
||||
<point x="300" y="603"/>
|
||||
<point x="295" y="659" type="curve"/>
|
||||
<point x="288" y="715"/>
|
||||
<point x="267" y="735"/>
|
||||
<point x="201" y="735" type="curve" smooth="yes"/>
|
||||
<point x="132" y="735" type="line"/>
|
||||
<point x="63" y="410" type="line"/>
|
||||
<point x="28" y="410" type="line"/>
|
||||
<point x="11" y="331" type="line"/>
|
||||
<point x="46" y="331" type="line"/>
|
||||
<point x="-24" y="0" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="192" y="627" type="line"/>
|
||||
<point x="204" y="626"/>
|
||||
<point x="219" y="629"/>
|
||||
<point x="217" y="603" type="curve" smooth="yes"/>
|
||||
<point x="212" y="558"/>
|
||||
<point x="195" y="487"/>
|
||||
<point x="163" y="336" type="curve" smooth="yes"/>
|
||||
<point x="144" y="248"/>
|
||||
<point x="125" y="156"/>
|
||||
<point x="117" y="132" type="curve"/>
|
||||
<point x="106" y="104"/>
|
||||
<point x="94" y="108"/>
|
||||
<point x="81" y="108" type="curve"/>
|
||||
<point x="129" y="331" type="line"/>
|
||||
<point x="145" y="331" type="line"/>
|
||||
<point x="162" y="410" type="line"/>
|
||||
<point x="146" y="410" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="E" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="0045"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="-24" y="0" type="line"/>
|
||||
<point x="141" y="0" type="line"/>
|
||||
<point x="165" y="111" type="line"/>
|
||||
<point x="82" y="111" type="line"/>
|
||||
<point x="125" y="313" type="line"/>
|
||||
<point x="185" y="313" type="line"/>
|
||||
<point x="210" y="431" type="line"/>
|
||||
<point x="150" y="431" type="line"/>
|
||||
<point x="191" y="624" type="line"/>
|
||||
<point x="274" y="624" type="line"/>
|
||||
<point x="298" y="735" type="line"/>
|
||||
<point x="132" y="735" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="193" y="10" type="move" name="ogonek"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="107" y="0" type="move" name="bottom"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="107" y="735" type="move" name="top"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Eacute" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="00C9"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="232" y="890" type="line"/>
|
||||
<point x="182" y="800" type="line"/>
|
||||
<point x="246" y="800" type="line"/>
|
||||
<point x="312" y="890" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="-32" y="0" type="line"/>
|
||||
<point x="133" y="0" type="line"/>
|
||||
<point x="157" y="111" type="line"/>
|
||||
<point x="74" y="111" type="line"/>
|
||||
<point x="117" y="313" type="line"/>
|
||||
<point x="177" y="313" type="line"/>
|
||||
<point x="202" y="431" type="line"/>
|
||||
<point x="142" y="431" type="line"/>
|
||||
<point x="183" y="624" type="line"/>
|
||||
<point x="266" y="624" type="line"/>
|
||||
<point x="289" y="735" type="line"/>
|
||||
<point x="123" y="735" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Ebreve" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="0114"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="275" y="928" type="line"/>
|
||||
<point x="256" y="905" type="line"/>
|
||||
<point x="248" y="899"/>
|
||||
<point x="239" y="894"/>
|
||||
<point x="233" y="894" type="curve" smooth="yes"/>
|
||||
<point x="230" y="894"/>
|
||||
<point x="226" y="895"/>
|
||||
<point x="223" y="897" type="curve"/>
|
||||
<point x="218" y="899"/>
|
||||
<point x="214" y="911"/>
|
||||
<point x="208" y="929" type="curve"/>
|
||||
<point x="154" y="870" type="line"/>
|
||||
<point x="155" y="866"/>
|
||||
<point x="160" y="857"/>
|
||||
<point x="167" y="847" type="curve"/>
|
||||
<point x="177" y="835"/>
|
||||
<point x="191" y="824"/>
|
||||
<point x="218" y="824" type="curve" smooth="yes"/>
|
||||
<point x="231" y="824"/>
|
||||
<point x="244" y="826"/>
|
||||
<point x="253" y="831" type="curve"/>
|
||||
<point x="252" y="831" type="line"/>
|
||||
<point x="275" y="842"/>
|
||||
<point x="291" y="856"/>
|
||||
<point x="302" y="870" type="curve"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="-34" y="0" type="line"/>
|
||||
<point x="131" y="0" type="line"/>
|
||||
<point x="155" y="111" type="line"/>
|
||||
<point x="72" y="111" type="line"/>
|
||||
<point x="115" y="313" type="line"/>
|
||||
<point x="175" y="313" type="line"/>
|
||||
<point x="200" y="431" type="line"/>
|
||||
<point x="140" y="431" type="line"/>
|
||||
<point x="181" y="624" type="line"/>
|
||||
<point x="264" y="624" type="line"/>
|
||||
<point x="287" y="735" type="line"/>
|
||||
<point x="121" y="735" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Ecaron" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="011A"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="-33" y="0" type="line"/>
|
||||
<point x="132" y="0" type="line"/>
|
||||
<point x="156" y="111" type="line"/>
|
||||
<point x="73" y="111" type="line"/>
|
||||
<point x="115" y="313" type="line"/>
|
||||
<point x="175" y="313" type="line"/>
|
||||
<point x="201" y="431" type="line"/>
|
||||
<point x="141" y="431" type="line"/>
|
||||
<point x="182" y="624" type="line"/>
|
||||
<point x="265" y="624" type="line"/>
|
||||
<point x="288" y="735" type="line"/>
|
||||
<point x="122" y="735" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="264" y="825" type="line"/>
|
||||
<point x="324" y="915" type="line"/>
|
||||
<point x="259" y="915" type="line"/>
|
||||
<point x="234" y="876" type="line"/>
|
||||
<point x="225" y="915" type="line"/>
|
||||
<point x="160" y="915" type="line"/>
|
||||
<point x="183" y="825" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Ecircumflex" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="00CA"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="-32" y="0" type="line"/>
|
||||
<point x="133" y="0" type="line"/>
|
||||
<point x="157" y="111" type="line"/>
|
||||
<point x="74" y="111" type="line"/>
|
||||
<point x="117" y="313" type="line"/>
|
||||
<point x="177" y="313" type="line"/>
|
||||
<point x="202" y="431" type="line"/>
|
||||
<point x="142" y="431" type="line"/>
|
||||
<point x="183" y="624" type="line"/>
|
||||
<point x="266" y="624" type="line"/>
|
||||
<point x="289" y="735" type="line"/>
|
||||
<point x="123" y="735" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="201" y="890" type="line"/>
|
||||
<point x="140" y="800" type="line"/>
|
||||
<point x="205" y="800" type="line"/>
|
||||
<point x="231" y="839" type="line"/>
|
||||
<point x="239" y="800" type="line"/>
|
||||
<point x="304" y="800" type="line"/>
|
||||
<point x="282" y="890" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Edieresis" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="00CB"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="-32" y="0" type="line"/>
|
||||
<point x="133" y="0" type="line"/>
|
||||
<point x="156" y="111" type="line"/>
|
||||
<point x="73" y="111" type="line"/>
|
||||
<point x="116" y="313" type="line"/>
|
||||
<point x="176" y="313" type="line"/>
|
||||
<point x="201" y="431" type="line"/>
|
||||
<point x="141" y="431" type="line"/>
|
||||
<point x="182" y="624" type="line"/>
|
||||
<point x="265" y="624" type="line"/>
|
||||
<point x="289" y="735" type="line"/>
|
||||
<point x="123" y="735" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="137" y="800" type="line"/>
|
||||
<point x="211" y="800" type="line"/>
|
||||
<point x="232" y="898" type="line"/>
|
||||
<point x="158" y="898" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="234" y="800" type="line"/>
|
||||
<point x="307" y="800" type="line"/>
|
||||
<point x="328" y="898" type="line"/>
|
||||
<point x="255" y="898" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Edotaccent" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="0116"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="178" y="822" type="line"/>
|
||||
<point x="257" y="822" type="line"/>
|
||||
<point x="279" y="923" type="line"/>
|
||||
<point x="200" y="923" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="-33" y="0" type="line"/>
|
||||
<point x="132" y="0" type="line"/>
|
||||
<point x="155" y="111" type="line"/>
|
||||
<point x="72" y="111" type="line"/>
|
||||
<point x="115" y="313" type="line"/>
|
||||
<point x="175" y="313" type="line"/>
|
||||
<point x="200" y="431" type="line"/>
|
||||
<point x="140" y="431" type="line"/>
|
||||
<point x="181" y="624" type="line"/>
|
||||
<point x="264" y="624" type="line"/>
|
||||
<point x="288" y="735" type="line"/>
|
||||
<point x="122" y="735" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Egrave" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="00C8"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="165" y="890" type="line"/>
|
||||
<point x="194" y="800" type="line"/>
|
||||
<point x="258" y="800" type="line"/>
|
||||
<point x="245" y="890" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="-32" y="0" type="line"/>
|
||||
<point x="133" y="0" type="line"/>
|
||||
<point x="157" y="111" type="line"/>
|
||||
<point x="74" y="111" type="line"/>
|
||||
<point x="117" y="313" type="line"/>
|
||||
<point x="177" y="313" type="line"/>
|
||||
<point x="202" y="431" type="line"/>
|
||||
<point x="142" y="431" type="line"/>
|
||||
<point x="183" y="624" type="line"/>
|
||||
<point x="266" y="624" type="line"/>
|
||||
<point x="289" y="735" type="line"/>
|
||||
<point x="123" y="735" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Emacron" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="0112"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="154" y="830" type="line"/>
|
||||
<point x="288" y="830" type="line"/>
|
||||
<point x="304" y="909" type="line"/>
|
||||
<point x="170" y="909" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="-33" y="0" type="line"/>
|
||||
<point x="132" y="0" type="line"/>
|
||||
<point x="156" y="111" type="line"/>
|
||||
<point x="73" y="111" type="line"/>
|
||||
<point x="116" y="313" type="line"/>
|
||||
<point x="176" y="313" type="line"/>
|
||||
<point x="201" y="431" type="line"/>
|
||||
<point x="141" y="431" type="line"/>
|
||||
<point x="182" y="624" type="line"/>
|
||||
<point x="265" y="624" type="line"/>
|
||||
<point x="288" y="735" type="line"/>
|
||||
<point x="122" y="735" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Eng" format="1">
|
||||
<advance width="267"/>
|
||||
<unicode hex="014A"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="268" y="735" type="line"/>
|
||||
<point x="194" y="386" type="line"/>
|
||||
<point x="209" y="735" type="line"/>
|
||||
<point x="138" y="735" type="line"/>
|
||||
<point x="-17" y="0" type="line"/>
|
||||
<point x="59" y="0" type="line"/>
|
||||
<point x="134" y="352" type="line"/>
|
||||
<point x="113" y="0" type="line"/>
|
||||
<point x="105" y="-12"/>
|
||||
<point x="96" y="-20"/>
|
||||
<point x="85" y="-16" type="curve"/>
|
||||
<point x="62" y="-120" type="line"/>
|
||||
<point x="104" y="-126"/>
|
||||
<point x="135" y="-110"/>
|
||||
<point x="153" y="-84" type="curve" smooth="yes"/>
|
||||
<point x="169" y="-61"/>
|
||||
<point x="181" y="-31"/>
|
||||
<point x="189" y="0" type="curve"/>
|
||||
<point x="345" y="735" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Eogonek" format="1">
|
||||
<advance width="214"/>
|
||||
<unicode hex="0118"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="151" y="0" type="line"/>
|
||||
<point x="175" y="111" type="line"/>
|
||||
<point x="92" y="111" type="line"/>
|
||||
<point x="135" y="313" type="line"/>
|
||||
<point x="195" y="313" type="line"/>
|
||||
<point x="220" y="431" type="line"/>
|
||||
<point x="160" y="431" type="line"/>
|
||||
<point x="201" y="624" type="line"/>
|
||||
<point x="284" y="624" type="line"/>
|
||||
<point x="308" y="735" type="line"/>
|
||||
<point x="142" y="735" type="line"/>
|
||||
<point x="-14" y="0" type="line"/>
|
||||
<point x="80" y="0" type="line"/>
|
||||
<point x="69" y="-11"/>
|
||||
<point x="60" y="-22"/>
|
||||
<point x="55" y="-28" type="curve"/>
|
||||
<point x="54" y="-29"/>
|
||||
<point x="53" y="-30"/>
|
||||
<point x="52" y="-31" type="curve"/>
|
||||
<point x="38" y="-50"/>
|
||||
<point x="20" y="-80"/>
|
||||
<point x="16" y="-103" type="curve"/>
|
||||
<point x="6" y="-148"/>
|
||||
<point x="23" y="-188"/>
|
||||
<point x="68" y="-188" type="curve" smooth="yes"/>
|
||||
<point x="82" y="-188"/>
|
||||
<point x="92" y="-185"/>
|
||||
<point x="110" y="-176" type="curve"/>
|
||||
<point x="131" y="-101" type="line"/>
|
||||
<point x="114" y="-112"/>
|
||||
<point x="98" y="-121"/>
|
||||
<point x="93" y="-121" type="curve" smooth="yes"/>
|
||||
<point x="83" y="-121"/>
|
||||
<point x="74" y="-112"/>
|
||||
<point x="80" y="-83" type="curve"/>
|
||||
<point x="82" y="-71"/>
|
||||
<point x="86" y="-60"/>
|
||||
<point x="91" y="-50" type="curve" smooth="yes"/>
|
||||
<point x="102" y="-28"/>
|
||||
<point x="112" y="-11"/>
|
||||
<point x="122" y="0" type="curve"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Eth" format="1">
|
||||
<advance width="253"/>
|
||||
<unicode hex="00D0"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="26" y="320" type="line"/>
|
||||
<point x="44" y="320" type="line"/>
|
||||
<point x="-24" y="0" type="line"/>
|
||||
<point x="35" y="0" type="line" smooth="yes"/>
|
||||
<point x="169" y="0"/>
|
||||
<point x="188" y="66"/>
|
||||
<point x="252" y="367" type="curve" smooth="yes"/>
|
||||
<point x="317" y="673"/>
|
||||
<point x="328" y="735"/>
|
||||
<point x="192" y="735" type="curve" smooth="yes"/>
|
||||
<point x="132" y="735" type="line"/>
|
||||
<point x="67" y="431" type="line"/>
|
||||
<point x="49" y="431" type="line"/>
|
||||
</contour>
|
||||
<contour>
|
||||
<point x="192" y="627" type="line"/>
|
||||
<point x="203" y="626"/>
|
||||
<point x="219" y="623"/>
|
||||
<point x="218" y="593" type="curve" smooth="yes"/>
|
||||
<point x="217" y="575"/>
|
||||
<point x="213" y="544"/>
|
||||
<point x="206" y="510" type="curve" smooth="yes"/>
|
||||
<point x="199" y="475"/>
|
||||
<point x="189" y="428"/>
|
||||
<point x="177" y="368" type="curve" smooth="yes"/>
|
||||
<point x="164" y="308"/>
|
||||
<point x="154" y="261"/>
|
||||
<point x="146" y="226" type="curve" smooth="yes"/>
|
||||
<point x="138" y="191"/>
|
||||
<point x="129" y="160"/>
|
||||
<point x="122" y="143" type="curve"/>
|
||||
<point x="112" y="114"/>
|
||||
<point x="92" y="110"/>
|
||||
<point x="81" y="108" type="curve"/>
|
||||
<point x="127" y="320" type="line"/>
|
||||
<point x="142" y="320" type="line"/>
|
||||
<point x="165" y="431" type="line"/>
|
||||
<point x="150" y="431" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="Euro" format="1">
|
||||
<advance width="268"/>
|
||||
<unicode hex="20AC"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="53" y="401" type="line"/>
|
||||
<point x="84" y="401" type="line"/>
|
||||
<point x="69" y="334" type="line"/>
|
||||
<point x="38" y="334" type="line"/>
|
||||
<point x="24" y="267" type="line"/>
|
||||
<point x="55" y="267" type="line"/>
|
||||
<point x="31" y="151" type="line" smooth="yes"/>
|
||||
<point x="24" y="121"/>
|
||||
<point x="22" y="94"/>
|
||||
<point x="25" y="71" type="curve"/>
|
||||
<point x="25" y="55"/>
|
||||
<point x="32" y="33"/>
|
||||
<point x="40" y="17" type="curve"/>
|
||||
<point x="49" y="2"/>
|
||||
<point x="67" y="-8"/>
|
||||
<point x="92" y="-8" type="curve" smooth="yes"/>
|
||||
<point x="119" y="-8"/>
|
||||
<point x="139" y="2"/>
|
||||
<point x="154" y="17" type="curve" smooth="yes"/>
|
||||
<point x="170" y="34"/>
|
||||
<point x="184" y="54"/>
|
||||
<point x="194" y="71" type="curve"/>
|
||||
<point x="204" y="94"/>
|
||||
<point x="214" y="121"/>
|
||||
<point x="222" y="151" type="curve"/>
|
||||
<point x="230" y="192" type="line"/>
|
||||
<point x="151" y="192" type="line"/>
|
||||
<point x="143" y="151" type="line" smooth="yes"/>
|
||||
<point x="141" y="142"/>
|
||||
<point x="137" y="131"/>
|
||||
<point x="135" y="124" type="curve"/>
|
||||
<point x="129" y="111"/>
|
||||
<point x="121" y="97"/>
|
||||
<point x="115" y="97" type="curve" smooth="yes"/>
|
||||
<point x="115" y="97"/>
|
||||
<point x="113" y="102"/>
|
||||
<point x="112" y="105" type="curve"/>
|
||||
<point x="113" y="105" type="line"/>
|
||||
<point x="110" y="115"/>
|
||||
<point x="109" y="129"/>
|
||||
<point x="114" y="151" type="curve" smooth="yes"/>
|
||||
<point x="138" y="267" type="line"/>
|
||||
<point x="206" y="267" type="line"/>
|
||||
<point x="220" y="334" type="line"/>
|
||||
<point x="152" y="334" type="line"/>
|
||||
<point x="167" y="401" type="line"/>
|
||||
<point x="235" y="401" type="line"/>
|
||||
<point x="249" y="468" type="line"/>
|
||||
<point x="181" y="468" type="line"/>
|
||||
<point x="206" y="584" type="line" smooth="yes"/>
|
||||
<point x="208" y="594"/>
|
||||
<point x="211" y="603"/>
|
||||
<point x="214" y="611" type="curve"/>
|
||||
<point x="220" y="624"/>
|
||||
<point x="227" y="638"/>
|
||||
<point x="230" y="638" type="curve" smooth="yes"/>
|
||||
<point x="231" y="638"/>
|
||||
<point x="234" y="634"/>
|
||||
<point x="236" y="630" type="curve"/>
|
||||
<point x="235" y="630" type="line"/>
|
||||
<point x="238" y="619"/>
|
||||
<point x="239" y="604"/>
|
||||
<point x="235" y="584" type="curve" smooth="yes"/>
|
||||
<point x="226" y="543" type="line"/>
|
||||
<point x="305" y="543" type="line"/>
|
||||
<point x="314" y="584" type="line"/>
|
||||
<point x="319" y="613"/>
|
||||
<point x="321" y="640"/>
|
||||
<point x="319" y="663" type="curve" smooth="yes"/>
|
||||
<point x="317" y="680"/>
|
||||
<point x="314" y="699"/>
|
||||
<point x="303" y="718" type="curve" smooth="yes"/>
|
||||
<point x="294" y="733"/>
|
||||
<point x="278" y="743"/>
|
||||
<point x="251" y="743" type="curve" smooth="yes"/>
|
||||
<point x="225" y="743"/>
|
||||
<point x="204" y="733"/>
|
||||
<point x="189" y="718" type="curve" smooth="yes"/>
|
||||
<point x="172" y="701"/>
|
||||
<point x="159" y="680"/>
|
||||
<point x="150" y="663" type="curve"/>
|
||||
<point x="139" y="640"/>
|
||||
<point x="129" y="613"/>
|
||||
<point x="123" y="584" type="curve" smooth="yes"/>
|
||||
<point x="98" y="468" type="line"/>
|
||||
<point x="67" y="468" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glyph name="F" format="1">
|
||||
<advance width="211"/>
|
||||
<unicode hex="0046"/>
|
||||
<outline>
|
||||
<contour>
|
||||
<point x="304" y="735" type="line"/>
|
||||
<point x="132" y="735" type="line"/>
|
||||
<point x="-24" y="0" type="line"/>
|
||||
<point x="58" y="0" type="line"/>
|
||||
<point x="127" y="320" type="line"/>
|
||||
<point x="187" y="320" type="line"/>
|
||||
<point x="210" y="431" type="line"/>
|
||||
<point x="150" y="431" type="line"/>
|
||||
<point x="191" y="624" type="line"/>
|
||||
<point x="280" y="624" type="line"/>
|
||||
</contour>
|
||||
</outline>
|
||||
</glyph>
|
||||