elegant 0.0.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](https://travis-ci.org/Fullscreen/elegant)
|
9
|
+
[](https://coveralls.io/r/Fullscreen/elegant)
|
10
|
+
[](https://gemnasium.com/Fullscreen/elegant)
|
11
|
+
[](https://codeclimate.com/github/Fullscreen/elegant)
|
12
|
+
[](http://www.rubydoc.info/github/Fullscreen/elegant/master/Elegant)
|
13
|
+
[](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
|
+

|
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