elegant 0.0.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.travis.yml +2 -2
- data/CHANGELOG.md +11 -0
- data/{LICENSE.txt → MIT-LICENSE} +1 -1
- data/README.md +53 -21
- data/Rakefile +8 -0
- data/bin/console +5 -5
- data/bin/elegant +99 -0
- data/elegant.gemspec +12 -5
- data/lib/elegant/config.rb +42 -0
- data/lib/elegant/configuration.rb +49 -0
- data/lib/elegant/document.rb +81 -0
- data/lib/elegant/fonts/DejaVuLicense.txt +97 -0
- data/lib/elegant/fonts/DejaVuSans.ttf +0 -0
- data/lib/elegant/fonts/DejaVuSansBold.ttf +0 -0
- data/lib/elegant/footer.rb +46 -0
- data/lib/elegant/header.rb +91 -0
- data/lib/elegant/images/default_watermark.png +0 -0
- data/lib/elegant/typography.rb +17 -0
- data/lib/elegant/version.rb +1 -1
- data/lib/elegant.rb +4 -2
- metadata +93 -12
- data/bin/dhh +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49d380d40dfac8ce477d00db75bc1604695432a3
|
4
|
+
data.tar.gz: 75459d4ca3def9cfe6a639196ea3285744282f74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5591417ffb9d7fe2496f7c381fc35cea285c2339d886eca283d19cacdcf29c3b81b3a37d2c8a6d6b8ca8545e68ef2429a14f5095db9c83cb5aa67a62bf1bb09c
|
7
|
+
data.tar.gz: 5cf7843617579048f2f96f305b2c0e04ad3af0c18e2f7ed851da1838b3efd88336fcd473512bf024c10e4f6d6f40fc492007795aeed1e909cd81082dc0608482
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
For more information about changelogs, check
|
6
|
+
[Keep a Changelog](http://keepachangelog.com) and
|
7
|
+
[Vandamme](http://tech-angels.github.io/vandamme).
|
8
|
+
|
9
|
+
## 1.0.0 - 2015.11.03
|
10
|
+
|
11
|
+
* [FEATURE] New `Elegant::Document` class with `title` method.
|
data/{LICENSE.txt → MIT-LICENSE}
RENAMED
data/README.md
CHANGED
@@ -1,41 +1,73 @@
|
|
1
|
-
|
1
|
+
Elegant
|
2
|
+
=======
|
2
3
|
|
3
|
-
|
4
|
+
Elegant provides a nice layout for PDF reports generated in Ruby.
|
4
5
|
|
5
|
-
|
6
|
+
The **source code** is available on [GitHub](https://github.com/Fullscreen/elegant) and the **documentation** on [RubyDoc](http://www.rubydoc.info/github/Fullscreen/elegant/master/Elegant/Interface).
|
6
7
|
|
7
|
-
|
8
|
+
[![Build Status](http://img.shields.io/travis/Fullscreen/elegant/master.svg)](https://travis-ci.org/Fullscreen/elegant)
|
9
|
+
[![Coverage Status](http://img.shields.io/coveralls/Fullscreen/elegant/master.svg)](https://coveralls.io/r/Fullscreen/elegant)
|
10
|
+
[![Dependency Status](http://img.shields.io/gemnasium/Fullscreen/elegant.svg)](https://gemnasium.com/Fullscreen/elegant)
|
11
|
+
[![Code Climate](http://img.shields.io/codeclimate/github/Fullscreen/elegant.svg)](https://codeclimate.com/github/Fullscreen/elegant)
|
12
|
+
[![Online docs](http://img.shields.io/badge/docs-✓-green.svg)](http://www.rubydoc.info/github/Fullscreen/elegant/master/Elegant)
|
13
|
+
[![Gem Version](http://img.shields.io/gem/v/elegant.svg)](http://rubygems.org/gems/elegant)
|
8
14
|
|
9
|
-
|
15
|
+
Elegant is a library built on top of [Prawn](http://prawnpdf.org) to generate PDF files in Ruby.
|
10
16
|
|
11
|
-
|
12
|
-
|
13
|
-
|
17
|
+
Whereas Prawn creates PDF pages that are completely blank (letting users customize them at will),
|
18
|
+
Elegant comes with a nice layout that makes each page look… elegant! :wink:
|
19
|
+
|
20
|
+
How to use
|
21
|
+
==========
|
14
22
|
|
15
|
-
|
23
|
+
If you have never used [Prawn](http://prawnpdf.org/) to generate PDF files, you should first read [its manual](http://prawnpdf.org/manual.pdf).
|
16
24
|
|
17
|
-
|
25
|
+
Using Elegant is as simple as replacing any instance of `Prawn::Document` with `Elegant::Document`:
|
18
26
|
|
19
|
-
|
27
|
+
```ruby
|
28
|
+
# with Prawn
|
29
|
+
Prawn::Document.new do
|
30
|
+
text 'Hello, World!'
|
31
|
+
end
|
32
|
+
|
33
|
+
# with Elegant
|
34
|
+
Elegant::Document.new do
|
35
|
+
text 'Hello, World!'
|
36
|
+
end
|
37
|
+
|
38
|
+
# with Elegant and extra options
|
39
|
+
header = {text: 'A report', logo: {url: 'http://lorempixel.com/500/500'}}
|
40
|
+
footer = {text: 'A link', url: 'http://www.example.com'}
|
41
|
+
Elegant::Document.new(header: header, footer: footer) do
|
42
|
+
title 'Welcome'
|
43
|
+
text 'Hello, world!'
|
44
|
+
end
|
45
|
+
```
|
20
46
|
|
21
|
-
|
47
|
+
![Prawn vs. Elegant](https://cloud.githubusercontent.com/assets/7408595/10898333/433a6072-817e-11e5-8c95-999c5629e84c.jpg)
|
22
48
|
|
23
|
-
|
49
|
+
`Elegant::Document` accepts some options [... TODO ...]
|
24
50
|
|
25
|
-
|
51
|
+
How to install
|
52
|
+
==============
|
26
53
|
|
27
|
-
|
54
|
+
Elegant requires **Ruby 2.1 or higher**.
|
28
55
|
|
29
|
-
|
56
|
+
To include in your project, add `gem 'elegant', ~> '1.0'` to the `Gemfile` file of your Ruby project.
|
30
57
|
|
31
|
-
|
58
|
+
How to generate the manual
|
59
|
+
==========================
|
32
60
|
|
33
|
-
|
61
|
+
`rake manual`
|
34
62
|
|
35
|
-
|
63
|
+
How to contribute
|
64
|
+
=================
|
36
65
|
|
66
|
+
If you’ve made it this far in the README… thanks! :v:
|
67
|
+
Feel free to try it the gem, explore the code, and send issues or pull requests.
|
37
68
|
|
38
|
-
|
69
|
+
All pull requests will have to make Travis and Code Climate happy in order to be accepted. :kissing_smiling_eyes:
|
39
70
|
|
40
|
-
|
71
|
+
You can also run the tests locally with `bundle exec rspec`.
|
41
72
|
|
73
|
+
Happy hacking!
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "bundler/setup"
|
4
|
+
require "elegant"
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require
|
11
|
-
# Pry.
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require "irb"
|
14
14
|
IRB.start
|
data/bin/elegant
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'elegant'
|
5
|
+
rescue LoadError
|
6
|
+
require 'rubygems'
|
7
|
+
require 'elegant'
|
8
|
+
end
|
9
|
+
|
10
|
+
class Section
|
11
|
+
attr_accessor :title, :page, :alignment
|
12
|
+
def initialize(title:, page:, alignment:)
|
13
|
+
@title, @page, @alignment = title, page, alignment
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :document
|
17
|
+
include Prawn::View
|
18
|
+
def render_to(pdf)
|
19
|
+
@document = pdf
|
20
|
+
render
|
21
|
+
end
|
22
|
+
|
23
|
+
def render
|
24
|
+
header
|
25
|
+
|
26
|
+
bounding_box [0, cursor], width: bounds.width, height: 170 do
|
27
|
+
stroke_bounds
|
28
|
+
end
|
29
|
+
|
30
|
+
footer
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def header
|
36
|
+
if alignment == :top and page > 1
|
37
|
+
start_new_page
|
38
|
+
end
|
39
|
+
|
40
|
+
move_down 10
|
41
|
+
formatted_text_box [{text: title.upcase, font: sans_serif, styles: [:bold], valign: :center, color: '556270', size: 14}], height: 15, at: [0, cursor]
|
42
|
+
move_down 30 # 15 of the float box, and 15 real
|
43
|
+
end
|
44
|
+
|
45
|
+
def footer
|
46
|
+
unless alignment == :bottom
|
47
|
+
document.move_down 25
|
48
|
+
document.stroke_horizontal_rule
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def sans_serif
|
53
|
+
'Sans Serif' if document.font_families['Sans Serif']
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
sections = [
|
58
|
+
Section.new(title: 'Lifetime Metrics', page: 1, alignment: :top),
|
59
|
+
Section.new(title: 'Monetization', page: 1, alignment: :middle),
|
60
|
+
Section.new(title: 'Month over month view tracking', page: 1, alignment: :bottom),
|
61
|
+
Section.new(title: 'Lifetime Metrics', page: 2, alignment: :top),
|
62
|
+
Section.new(title: 'Month over month view tracking', page: 2, alignment: :middle),
|
63
|
+
]
|
64
|
+
|
65
|
+
def font_files_for(family)
|
66
|
+
{normal: ttf("#{family}-Regular"), bold: ttf("#{family}-Bold")}
|
67
|
+
end
|
68
|
+
|
69
|
+
def ttf(basename)
|
70
|
+
asset "fonts/#{basename}.ttf"
|
71
|
+
end
|
72
|
+
|
73
|
+
def png(basename)
|
74
|
+
asset "images/#{basename}.png"
|
75
|
+
end
|
76
|
+
|
77
|
+
def asset(path)
|
78
|
+
File.expand_path "../../tmp/#{path}", __FILE__
|
79
|
+
end
|
80
|
+
|
81
|
+
fonts = {}.tap do |families|
|
82
|
+
families['Helvetica'] = font_files_for 'HelveticaWorld'
|
83
|
+
families['Fallback'] = font_files_for 'ArialUnicode'
|
84
|
+
families['Sans Serif'] = font_files_for 'ProximaNova'
|
85
|
+
end
|
86
|
+
|
87
|
+
company_logo = png('logo')
|
88
|
+
company_name = 'Fullscreen'
|
89
|
+
title = 'March 2015'
|
90
|
+
thumbnail = png('thumbnail')
|
91
|
+
footer = "Report for channelpl.us (2015/02/12 – 2015/10/12)"
|
92
|
+
|
93
|
+
filename = 'elegant.pdf'
|
94
|
+
|
95
|
+
Elegant::Document.new(fonts: fonts, title: title, company_logo: company_logo, thumbnail: thumbnail, footer: footer, company_name: company_name) do |pdf|
|
96
|
+
sections.each{|section| section.render_to pdf}
|
97
|
+
end.render_file filename
|
98
|
+
|
99
|
+
`open #{filename}`
|
data/elegant.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
lib = File.expand_path('../lib', __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'elegant/version'
|
@@ -9,16 +8,24 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ['claudiob']
|
10
9
|
spec.email = ['claudiob@gmail.com']
|
11
10
|
|
12
|
-
spec.summary = %q{
|
13
|
-
spec.description = %q{
|
14
|
-
spec.homepage = 'https://github.com/
|
11
|
+
spec.summary = %q{An elegant layout for PDF reports generated in Ruby.}
|
12
|
+
spec.description = %q{Elegant expands Prawn providing a new class to generate new pages with an elegant layout.}
|
13
|
+
spec.homepage = 'https://github.com/Fullscreen/elegant'
|
15
14
|
spec.license = 'MIT'
|
16
15
|
|
16
|
+
spec.required_ruby_version = '>= 2.1' # 2.0 does not have Array#to_h
|
17
|
+
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
19
|
spec.bindir = 'exe'
|
19
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
21
|
spec.require_paths = ['lib']
|
21
22
|
|
22
|
-
spec.
|
23
|
+
spec.add_dependency 'prawn', '~> 2.0'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'pdf-inspector', '~> 1.2'
|
26
|
+
spec.add_development_dependency 'prawn-manual_builder', '~> 0.2.0'
|
23
27
|
spec.add_development_dependency 'rake', '~> 10.0'
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.3'
|
29
|
+
spec.add_development_dependency 'coveralls', '~> 0.8.2'
|
30
|
+
spec.add_development_dependency 'pry-nav', '~> 0.2.4'
|
24
31
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'elegant/configuration'
|
2
|
+
|
3
|
+
module Elegant
|
4
|
+
# Provides methods to read and write global configuration settings.
|
5
|
+
#
|
6
|
+
# @example Set the author of PDF files to 'John Doe':
|
7
|
+
# Elegant.configure do |config|
|
8
|
+
# config.author = 'John Doe'
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
module Config
|
12
|
+
# Yields the global configuration to the given block.
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# Elegant.configure do |config|
|
16
|
+
# config.author = 'John Doe'
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# @yield [Elegant::Configuration] The global configuration.
|
20
|
+
def configure
|
21
|
+
yield configuration if block_given?
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the global {Elegant::Models::Configuration} object.
|
25
|
+
#
|
26
|
+
# While this method _can_ be used to read and write configuration settings,
|
27
|
+
# it is easier to use {Elegant::Config#configure} Elegant.configure}.
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
# Elegant.configuration.author = 'John Doe'
|
31
|
+
#
|
32
|
+
# @return [Elegant::Configuration] The global configuration.
|
33
|
+
def configuration
|
34
|
+
@configuration ||= Elegant::Configuration.new
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# @note Config is the only module auto-loaded in the Elegant module,
|
39
|
+
# in order to have a syntax as easy as Elegant.configure
|
40
|
+
|
41
|
+
extend Config
|
42
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Elegant
|
2
|
+
# Provides an object to store global configuration settings.
|
3
|
+
#
|
4
|
+
# This class is typically not used directly, but by calling
|
5
|
+
# {Elegant::Config#configure Elegant.configure}, which creates and updates a
|
6
|
+
# single instance of {Elegant::Configuration}.
|
7
|
+
#
|
8
|
+
# @example Set the author of PDF files to 'John Doe':
|
9
|
+
# Elegant.configure do |config|
|
10
|
+
# config.author = 'John Doe'
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# @see Elegant::Config for more examples.
|
14
|
+
class Configuration
|
15
|
+
# @return [String] the Author to store in the PDF metadata
|
16
|
+
attr_accessor :author
|
17
|
+
|
18
|
+
# @return [String] the Creator to store in the PDF metadata
|
19
|
+
attr_accessor :creator
|
20
|
+
|
21
|
+
# @return [String] the Producer to store in the PDF metadata
|
22
|
+
attr_accessor :producer
|
23
|
+
|
24
|
+
# @return [String] the path of an image to display on every page
|
25
|
+
attr_accessor :watermark
|
26
|
+
|
27
|
+
# @return [Array<Hash<Symbol, Hash<Symbol, String>] the fonts to use.
|
28
|
+
attr_accessor :fonts
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
@author = 'Elegant'
|
32
|
+
@creator = 'Elegant'
|
33
|
+
@producer = 'Elegant'
|
34
|
+
@watermark = asset 'images/default_watermark.png'
|
35
|
+
@fonts = {'Sans Serif' => default_font, 'Fallback' => default_font}
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def default_font
|
41
|
+
type = 'DejaVuSans'
|
42
|
+
{normal: asset("fonts/#{type}.ttf"), bold: asset("fonts/#{type}Bold.ttf")}
|
43
|
+
end
|
44
|
+
|
45
|
+
def asset(file)
|
46
|
+
File.expand_path "../#{file}", __FILE__
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'elegant/config'
|
2
|
+
require 'elegant/footer'
|
3
|
+
require 'elegant/header'
|
4
|
+
require 'elegant/typography'
|
5
|
+
|
6
|
+
module Elegant
|
7
|
+
# A wrapper around Prawn::Document that enforces an elegant layout, setting
|
8
|
+
# nice dimensions and margins so that each page can fit up to three sections
|
9
|
+
# of content properly aligned along the vertical axis.
|
10
|
+
class Document < ::Prawn::Document
|
11
|
+
# Creates a new Elegant Document.
|
12
|
+
# @param [Hash] options. All the options of Prawn::Document are
|
13
|
+
# available, plus the following extra options.
|
14
|
+
# @option options [Hash] :header ({}) The options for the header. Accepted
|
15
|
+
# values are :text (the title to write in the top-right corner) and :logo
|
16
|
+
# (a Hash with a :url key with the location of the logo image and
|
17
|
+
# optional :width and :height, which default to 50x50).
|
18
|
+
# @option options [Hash] :footer ({}) The options for the footer. Accepted
|
19
|
+
# values are :text (the text in the bottom-center of the page) and :url
|
20
|
+
# (to make that text a link to a URL).
|
21
|
+
# @see http://www.rubydoc.info/gems/prawn/Prawn/Document
|
22
|
+
def initialize(options = {}, &block)
|
23
|
+
options = options.dup
|
24
|
+
@header = Header.new self, options.delete(:header) {{}}
|
25
|
+
@footer = Footer.new self, options.delete(:footer) {{}}
|
26
|
+
|
27
|
+
super(with_elegant options) do
|
28
|
+
Typography.new(self).set_fonts
|
29
|
+
@header.render
|
30
|
+
|
31
|
+
if block
|
32
|
+
block.arity < 1 ? instance_eval(&block) : block[self]
|
33
|
+
end
|
34
|
+
|
35
|
+
@footer.render
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# An additional method provided by Elegant::Document to render a title
|
40
|
+
# with an elegant font and padding above and below.
|
41
|
+
def title(text, options = {})
|
42
|
+
move_down 10
|
43
|
+
|
44
|
+
width = bounds.width - @header.title_padding
|
45
|
+
title = text_options.merge text: text.upcase, color: '556270', size: 14
|
46
|
+
options = {width: width, height: 15, at: [0, cursor]}
|
47
|
+
formatted_text_box [title], options
|
48
|
+
|
49
|
+
move_down 30
|
50
|
+
end
|
51
|
+
|
52
|
+
# Determines the total height occupied by the header
|
53
|
+
def header_height
|
54
|
+
50
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# Applies some elegant defaults to the options provided by the user. For
|
60
|
+
# instance forces the layout to be letter portrait, and set the metadata
|
61
|
+
# from the configuration if not explicitly provided.
|
62
|
+
def with_elegant(options)
|
63
|
+
options[:page_size] = 'LETTER'
|
64
|
+
options[:page_layout] = :portrait
|
65
|
+
options[:print_scaling] = :none
|
66
|
+
options[:top_margin] = (default_margin = 36) + header_height / 2
|
67
|
+
options[:info] = default_metadata.merge(options.fetch :info, {})
|
68
|
+
options
|
69
|
+
end
|
70
|
+
|
71
|
+
def default_metadata
|
72
|
+
%i(Author Creator Producer).map do |key|
|
73
|
+
[key, Elegant.configuration.public_send(key.to_s.downcase)]
|
74
|
+
end.to_h
|
75
|
+
end
|
76
|
+
|
77
|
+
def text_options
|
78
|
+
{font: 'Sans Serif', styles: [:bold]}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
2
|
+
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
|
3
|
+
|
4
|
+
Bitstream Vera Fonts Copyright
|
5
|
+
------------------------------
|
6
|
+
|
7
|
+
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
|
8
|
+
a trademark of Bitstream, Inc.
|
9
|
+
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
11
|
+
of the fonts accompanying this license ("Fonts") and associated
|
12
|
+
documentation files (the "Font Software"), to reproduce and distribute the
|
13
|
+
Font Software, including without limitation the rights to use, copy, merge,
|
14
|
+
publish, distribute, and/or sell copies of the Font Software, and to permit
|
15
|
+
persons to whom the Font Software is furnished to do so, subject to the
|
16
|
+
following conditions:
|
17
|
+
|
18
|
+
The above copyright and trademark notices and this permission notice shall
|
19
|
+
be included in all copies of one or more of the Font Software typefaces.
|
20
|
+
|
21
|
+
The Font Software may be modified, altered, or added to, and in particular
|
22
|
+
the designs of glyphs or characters in the Fonts may be modified and
|
23
|
+
additional glyphs or characters may be added to the Fonts, only if the fonts
|
24
|
+
are renamed to names not containing either the words "Bitstream" or the word
|
25
|
+
"Vera".
|
26
|
+
|
27
|
+
This License becomes null and void to the extent applicable to Fonts or Font
|
28
|
+
Software that has been modified and is distributed under the "Bitstream
|
29
|
+
Vera" names.
|
30
|
+
|
31
|
+
The Font Software may be sold as part of a larger software package but no
|
32
|
+
copy of one or more of the Font Software typefaces may be sold by itself.
|
33
|
+
|
34
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
35
|
+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
|
36
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
|
37
|
+
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
|
38
|
+
FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
|
39
|
+
ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
|
40
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
41
|
+
THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
|
42
|
+
FONT SOFTWARE.
|
43
|
+
|
44
|
+
Except as contained in this notice, the names of Gnome, the Gnome
|
45
|
+
Foundation, and Bitstream Inc., shall not be used in advertising or
|
46
|
+
otherwise to promote the sale, use or other dealings in this Font Software
|
47
|
+
without prior written authorization from the Gnome Foundation or Bitstream
|
48
|
+
Inc., respectively. For further information, contact: fonts at gnome dot
|
49
|
+
org.
|
50
|
+
|
51
|
+
Arev Fonts Copyright
|
52
|
+
------------------------------
|
53
|
+
|
54
|
+
Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
|
55
|
+
|
56
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
57
|
+
a copy of the fonts accompanying this license ("Fonts") and
|
58
|
+
associated documentation files (the "Font Software"), to reproduce
|
59
|
+
and distribute the modifications to the Bitstream Vera Font Software,
|
60
|
+
including without limitation the rights to use, copy, merge, publish,
|
61
|
+
distribute, and/or sell copies of the Font Software, and to permit
|
62
|
+
persons to whom the Font Software is furnished to do so, subject to
|
63
|
+
the following conditions:
|
64
|
+
|
65
|
+
The above copyright and trademark notices and this permission notice
|
66
|
+
shall be included in all copies of one or more of the Font Software
|
67
|
+
typefaces.
|
68
|
+
|
69
|
+
The Font Software may be modified, altered, or added to, and in
|
70
|
+
particular the designs of glyphs or characters in the Fonts may be
|
71
|
+
modified and additional glyphs or characters may be added to the
|
72
|
+
Fonts, only if the fonts are renamed to names not containing either
|
73
|
+
the words "Tavmjong Bah" or the word "Arev".
|
74
|
+
|
75
|
+
This License becomes null and void to the extent applicable to Fonts
|
76
|
+
or Font Software that has been modified and is distributed under the
|
77
|
+
"Tavmjong Bah Arev" names.
|
78
|
+
|
79
|
+
The Font Software may be sold as part of a larger software package but
|
80
|
+
no copy of one or more of the Font Software typefaces may be sold by
|
81
|
+
itself.
|
82
|
+
|
83
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
84
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
85
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
86
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
|
87
|
+
TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
88
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
89
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
90
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
91
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
92
|
+
|
93
|
+
Except as contained in this notice, the name of Tavmjong Bah shall not
|
94
|
+
be used in advertising or otherwise to promote the sale, use or other
|
95
|
+
dealings in this Font Software without prior written authorization
|
96
|
+
from Tavmjong Bah. For further information, contact: tavmjong @ free
|
97
|
+
. fr.
|
Binary file
|
Binary file
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'open-uri' # for open(http://...)
|
2
|
+
module Elegant
|
3
|
+
class Footer
|
4
|
+
include Prawn::View
|
5
|
+
|
6
|
+
def initialize(document, options = {})
|
7
|
+
@document = document
|
8
|
+
@text, @url = options.values_at :text, :url
|
9
|
+
end
|
10
|
+
|
11
|
+
# Draws in the header of each page a horizontal line, the name of the
|
12
|
+
# author, the title and the page number. The author must be provided in
|
13
|
+
# the configuration, and the title when initializing the document.
|
14
|
+
def render
|
15
|
+
repeat(:all) do
|
16
|
+
transparent(0.25) { stroke_horizontal_line 0, bounds.width, at: 0 }
|
17
|
+
render_author
|
18
|
+
render_text if @text
|
19
|
+
end
|
20
|
+
render_page_number
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def render_author
|
26
|
+
options = {at: [0, -6], width: 50, height: 10, size: 7, valign: :top}
|
27
|
+
text_box Elegant.configuration.author, options
|
28
|
+
end
|
29
|
+
|
30
|
+
def render_text
|
31
|
+
text = @url ? "<link href='#{@url}'>#{@text}</link>" : @text
|
32
|
+
left = 50
|
33
|
+
options = {size: 7, align: :center, valign: :top, inline_format: true}
|
34
|
+
options[:at] = [left, -6]
|
35
|
+
options[:width] = bounds.width - 2 * left
|
36
|
+
options[:height] = 10
|
37
|
+
text_box text, options
|
38
|
+
end
|
39
|
+
|
40
|
+
def render_page_number
|
41
|
+
options = {width: 50, height: 10, size: 7, align: :right, valign: :top}
|
42
|
+
options[:at] = [bounds.width - options[:width], -6]
|
43
|
+
number_pages "Page <page>", options
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'open-uri' # for open(http://...)
|
2
|
+
module Elegant
|
3
|
+
class Header
|
4
|
+
include Prawn::View
|
5
|
+
|
6
|
+
def initialize(document, options = {})
|
7
|
+
@document = document
|
8
|
+
@text, @logo = options.values_at :text, :logo
|
9
|
+
@logo_width = @logo.fetch(:width, 50) if @logo
|
10
|
+
@logo_height = @logo.fetch(:height, 50) if @logo
|
11
|
+
end
|
12
|
+
|
13
|
+
# Draws in the header of each page a watermark logo (provided via the
|
14
|
+
# configuration), a horizontal line, a title and an image for the content.
|
15
|
+
def render
|
16
|
+
repeat(:all) do
|
17
|
+
render_watermark
|
18
|
+
stroke_horizontal_rule
|
19
|
+
render_logo if @logo
|
20
|
+
render_heading
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Sets the right padding for title based on whether the page has a logo
|
25
|
+
# or not.
|
26
|
+
def title_padding
|
27
|
+
@logo_width ? @logo_width + (margin = 7) : 0
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# Renders a watermark at the top-left corner of each page. The watermark
|
33
|
+
# must be provided via configuration.
|
34
|
+
def render_watermark
|
35
|
+
image = Elegant.configuration.watermark
|
36
|
+
height = (document.header_height * 0.25).ceil
|
37
|
+
y = bounds.top + (document.header_height * 0.375).floor
|
38
|
+
image image, at: [0, y], height: height.ceil
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# Renders an image in the top-right corner of each page. The image must be
|
43
|
+
# provided when initializing the document.
|
44
|
+
def render_logo
|
45
|
+
float do
|
46
|
+
render_logo_frame
|
47
|
+
render_logo_image
|
48
|
+
end if @logo
|
49
|
+
end
|
50
|
+
|
51
|
+
# Renders a frame around the logo in the top-right corner.
|
52
|
+
def render_logo_frame(options = {})
|
53
|
+
width = @logo_width + line_width
|
54
|
+
height = @logo_height + line_width
|
55
|
+
left = bounds.right - width - 0.5 * line_width
|
56
|
+
top = bounds.top + 0.5 * height
|
57
|
+
bounding_box([left, top], width: width, height: height) {stroke_bounds}
|
58
|
+
end
|
59
|
+
|
60
|
+
# Renders the actual image as the logo in the top-right corner.
|
61
|
+
def render_logo_image
|
62
|
+
left = bounds.right - @logo_width - line_width
|
63
|
+
top = bounds.top + @logo_height / 2
|
64
|
+
options = {width: @logo_width, height: @logo_height, at: [left, top]}
|
65
|
+
image open(@logo[:url]), options
|
66
|
+
rescue OpenURI::HTTPError, OpenSSL::SSL::SSLError, SocketError
|
67
|
+
end
|
68
|
+
|
69
|
+
# Writes the heading for the document in the top-right corner of each page,
|
70
|
+
# to the left of the logo. The heading must be provided when initializing
|
71
|
+
# the document.
|
72
|
+
def render_heading
|
73
|
+
transparent(0.25) do
|
74
|
+
font('Sans Serif', style: :bold) {text_box @text, heading_options}
|
75
|
+
end if @text
|
76
|
+
end
|
77
|
+
|
78
|
+
def heading_options(options = {})
|
79
|
+
left = 25
|
80
|
+
width = (@logo_width || 0) + 2 * line_width + (margin = 5)
|
81
|
+
options[:valign] = :center
|
82
|
+
options[:align] = :right
|
83
|
+
options[:size] = 17
|
84
|
+
options[:overflow] = :shrink_to_fit
|
85
|
+
options[:width] = bounds.width - width - left
|
86
|
+
options[:height] = document.header_height / 2.0
|
87
|
+
options[:at] = [left, bounds.top + options[:height]]
|
88
|
+
options
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
Binary file
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Elegant
|
2
|
+
class Typography
|
3
|
+
include Prawn::View
|
4
|
+
|
5
|
+
def initialize(document, options = {})
|
6
|
+
@document = document
|
7
|
+
end
|
8
|
+
|
9
|
+
# Set the fonts for the document. Fonts are provided via configuration and
|
10
|
+
# a 'Fallback' font must be set to be used for special characters. A
|
11
|
+
# 'Sans Serif' font is also required for titles and headers.
|
12
|
+
def set_fonts
|
13
|
+
font_families.update Elegant.configuration.fonts
|
14
|
+
fallback_fonts ['Fallback']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/elegant/version.rb
CHANGED
data/lib/elegant.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elegant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- claudiob
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: prawn
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pdf-inspector
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.2'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: prawn-manual_builder
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.2.0
|
20
48
|
type: :development
|
21
49
|
prerelease: false
|
22
50
|
version_requirements: !ruby/object:Gem::Requirement
|
23
51
|
requirements:
|
24
52
|
- - "~>"
|
25
53
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
54
|
+
version: 0.2.0
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rake
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,7 +66,50 @@ dependencies:
|
|
38
66
|
- - "~>"
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: '10.0'
|
41
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.3'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: coveralls
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.8.2
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.8.2
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-nav
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.2.4
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.2.4
|
111
|
+
description: Elegant expands Prawn providing a new class to generate new pages with
|
112
|
+
an elegant layout.
|
42
113
|
email:
|
43
114
|
- claudiob@gmail.com
|
44
115
|
executables: []
|
@@ -47,17 +118,28 @@ extra_rdoc_files: []
|
|
47
118
|
files:
|
48
119
|
- ".gitignore"
|
49
120
|
- ".travis.yml"
|
121
|
+
- CHANGELOG.md
|
50
122
|
- Gemfile
|
51
|
-
- LICENSE
|
123
|
+
- MIT-LICENSE
|
52
124
|
- README.md
|
53
125
|
- Rakefile
|
54
126
|
- bin/console
|
55
|
-
- bin/
|
127
|
+
- bin/elegant
|
56
128
|
- bin/setup
|
57
129
|
- elegant.gemspec
|
58
130
|
- lib/elegant.rb
|
131
|
+
- lib/elegant/config.rb
|
132
|
+
- lib/elegant/configuration.rb
|
133
|
+
- lib/elegant/document.rb
|
134
|
+
- lib/elegant/fonts/DejaVuLicense.txt
|
135
|
+
- lib/elegant/fonts/DejaVuSans.ttf
|
136
|
+
- lib/elegant/fonts/DejaVuSansBold.ttf
|
137
|
+
- lib/elegant/footer.rb
|
138
|
+
- lib/elegant/header.rb
|
139
|
+
- lib/elegant/images/default_watermark.png
|
140
|
+
- lib/elegant/typography.rb
|
59
141
|
- lib/elegant/version.rb
|
60
|
-
homepage: https://github.com/
|
142
|
+
homepage: https://github.com/Fullscreen/elegant
|
61
143
|
licenses:
|
62
144
|
- MIT
|
63
145
|
metadata: {}
|
@@ -69,7 +151,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
69
151
|
requirements:
|
70
152
|
- - ">="
|
71
153
|
- !ruby/object:Gem::Version
|
72
|
-
version: '
|
154
|
+
version: '2.1'
|
73
155
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
156
|
requirements:
|
75
157
|
- - ">="
|
@@ -80,6 +162,5 @@ rubyforge_project:
|
|
80
162
|
rubygems_version: 2.4.5.1
|
81
163
|
signing_key:
|
82
164
|
specification_version: 4
|
83
|
-
summary:
|
165
|
+
summary: An elegant layout for PDF reports generated in Ruby.
|
84
166
|
test_files: []
|
85
|
-
has_rdoc:
|
data/bin/dhh
DELETED