chili_pdf 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/.autotest +14 -0
- data/Gemfile +8 -2
- data/Gemfile.lock +29 -2
- data/History.txt +18 -0
- data/Manifest.txt +14 -0
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/app/controllers/extended_wiki_controller.rb +14 -15
- data/app/views/layouts/pdf.pdf.erb +0 -2
- data/app/views/settings/_chili_pdf_settings.html.erb +82 -0
- data/assets/stylesheets/pdf.css +12 -1
- data/autotest/discover.rb +1 -3
- data/config/locales/en.yml +5 -0
- data/init.rb +3 -0
- data/lang/en.yml +3 -0
- data/lib/chili_pdf.rb +6 -1
- data/lib/chili_pdf/config.rb +112 -0
- data/lib/chili_pdf/formatter.rb +80 -0
- data/lib/chili_pdf/string_token.rb +73 -0
- data/lib/chili_pdf/token_manager.rb +45 -0
- data/lib/tasks/chili_pdf_tasks.rb +0 -1
- data/lib/tasks/contributor_tasks.rb +73 -0
- data/lib/tasks/test_lib_dir.rake +12 -0
- data/test/chili_pdf/config_test.rb +69 -0
- data/test/chili_pdf/formatter_test.rb +134 -0
- data/test/chili_pdf/string_token_test.rb +58 -0
- data/test/chili_pdf/token_manager_test.rb +9 -0
- data/test/test_helper.rb +17 -58
- metadata +20 -6
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/.autotest
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Autotest.add_hook(:initialize) {|at|
|
2
|
+
%w{.git .svn .hg .swp .DS_Store ._* tmp}.each do |exception|
|
3
|
+
at.add_exception(exception)
|
4
|
+
end
|
5
|
+
|
6
|
+
at.add_mapping(%r%^test/chili_pdf/.*_test.rb$%) { |filename, _|
|
7
|
+
filename
|
8
|
+
}
|
9
|
+
at.add_mapping(/test_helper.rb/) {
|
10
|
+
at.files_matching /^test.*rb$/
|
11
|
+
}
|
12
|
+
#nil
|
13
|
+
}
|
14
|
+
|
data/Gemfile
CHANGED
@@ -3,8 +3,14 @@ source 'http://rubygems.org'
|
|
3
3
|
gem 'wicked_pdf'
|
4
4
|
|
5
5
|
group :development do
|
6
|
-
gem 'autotest-rails', '~> 4.1
|
6
|
+
gem 'autotest-rails', '~> 4.1'
|
7
7
|
gem 'fakeweb'
|
8
|
-
gem 'hoe', '~> 2.8
|
8
|
+
gem 'hoe', '~> 2.8'
|
9
|
+
gem 'hoe-git'
|
9
10
|
gem 'ZenTest'
|
11
|
+
gem 'redmine_plugin_support'
|
12
|
+
gem 'cucumber', '0.10'
|
13
|
+
gem 'rspec', '1.3.1'
|
14
|
+
gem 'rspec-rails', '1.3.2'
|
15
|
+
gem 'i18n', '0.4.2'
|
10
16
|
end
|
data/Gemfile.lock
CHANGED
@@ -4,10 +4,31 @@ GEM
|
|
4
4
|
ZenTest (4.5.0)
|
5
5
|
autotest-rails (4.1.0)
|
6
6
|
ZenTest
|
7
|
+
builder (3.0.0)
|
8
|
+
cucumber (0.10.0)
|
9
|
+
builder (>= 2.1.2)
|
10
|
+
diff-lcs (~> 1.1.2)
|
11
|
+
gherkin (~> 2.3.2)
|
12
|
+
json (~> 1.4.6)
|
13
|
+
term-ansicolor (~> 1.0.5)
|
14
|
+
diff-lcs (1.1.2)
|
7
15
|
fakeweb (1.3.0)
|
16
|
+
gherkin (2.3.3)
|
17
|
+
json (~> 1.4.6)
|
8
18
|
hoe (2.8.0)
|
9
19
|
rake (>= 0.8.7)
|
20
|
+
hoe-git (1.4.0)
|
21
|
+
hoe (>= 2.2.0)
|
22
|
+
i18n (0.4.2)
|
23
|
+
json (1.4.6)
|
24
|
+
rack (1.0.1)
|
10
25
|
rake (0.8.7)
|
26
|
+
redmine_plugin_support (0.0.4)
|
27
|
+
rspec (1.3.1)
|
28
|
+
rspec-rails (1.3.2)
|
29
|
+
rack (>= 1.0.0)
|
30
|
+
rspec (>= 1.3.0)
|
31
|
+
term-ansicolor (1.0.5)
|
11
32
|
wicked_pdf (0.7.0)
|
12
33
|
|
13
34
|
PLATFORMS
|
@@ -15,7 +36,13 @@ PLATFORMS
|
|
15
36
|
|
16
37
|
DEPENDENCIES
|
17
38
|
ZenTest
|
18
|
-
autotest-rails (~> 4.1
|
39
|
+
autotest-rails (~> 4.1)
|
40
|
+
cucumber (= 0.10)
|
19
41
|
fakeweb
|
20
|
-
hoe (~> 2.8
|
42
|
+
hoe (~> 2.8)
|
43
|
+
hoe-git
|
44
|
+
i18n (= 0.4.2)
|
45
|
+
redmine_plugin_support
|
46
|
+
rspec (= 1.3.1)
|
47
|
+
rspec-rails (= 1.3.2)
|
21
48
|
wicked_pdf
|
data/History.txt
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=== 0.3.0 / 2011-06-13
|
2
|
+
|
3
|
+
* New features
|
4
|
+
* Added header/footer support [closes #2]
|
5
|
+
* Implemented 'footer_enabled' and 'header_enabled' settings to
|
6
|
+
control whether footers/headers are included [closes #3]
|
7
|
+
* Added 'dynamic' content which can be used to customize the
|
8
|
+
header/footer sections of exported PDFs (see TokenManager and
|
9
|
+
TokenString for details) [closes #4]
|
10
|
+
|
11
|
+
* Minor enhancements:
|
12
|
+
|
13
|
+
* Added testing harness
|
14
|
+
* Updated layout to include any :header_tag content_for blocks
|
15
|
+
* PDF content was previously not being wrapped in PDF layout...fixed
|
16
|
+
* Threw in a fix for ul->li's showing numbers [closes #6]
|
17
|
+
* Added Formatter class which will be used for managing PDF formatting
|
18
|
+
|
1
19
|
=== 0.2.0 / 2011-05-23
|
2
20
|
|
3
21
|
* Fixed layout & stylesheet inclusions
|
data/Manifest.txt
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
.autotest
|
1
2
|
Gemfile
|
2
3
|
Gemfile.lock
|
3
4
|
History.txt
|
@@ -9,12 +10,25 @@ app/controllers/extended_wiki_controller.rb
|
|
9
10
|
app/helpers/chili_pdf_helper.rb
|
10
11
|
app/views/extended_wiki/show.pdf.html.erb
|
11
12
|
app/views/layouts/pdf.pdf.erb
|
13
|
+
app/views/settings/_chili_pdf_settings.html.erb
|
12
14
|
assets/stylesheets/pdf.css
|
13
15
|
autotest/discover.rb
|
16
|
+
config/locales/en.yml
|
14
17
|
config/routes.rb
|
15
18
|
init.rb
|
19
|
+
lang/en.yml
|
16
20
|
lib/chili_pdf.rb
|
21
|
+
lib/chili_pdf/config.rb
|
22
|
+
lib/chili_pdf/formatter.rb
|
23
|
+
lib/chili_pdf/string_token.rb
|
24
|
+
lib/chili_pdf/token_manager.rb
|
17
25
|
lib/tasks/chili_pdf_tasks.rb
|
26
|
+
lib/tasks/contributor_tasks.rb
|
27
|
+
lib/tasks/test_lib_dir.rake
|
18
28
|
lib/user_patch.rb
|
19
29
|
rails/init.rb
|
30
|
+
test/chili_pdf/config_test.rb
|
31
|
+
test/chili_pdf/formatter_test.rb
|
32
|
+
test/chili_pdf/string_token_test.rb
|
33
|
+
test/chili_pdf/token_manager_test.rb
|
20
34
|
test/test_helper.rb
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ ChiliProject (/Redmine) plugin which implements/enhances PDF-export functionalit
|
|
30
30
|
|
31
31
|
## SCREENSHOTS:
|
32
32
|
|
33
|
-
You can find a few screenshots [here](http://www.flickr.com/photos/tomkersten/sets/
|
33
|
+
You can find a few screenshots [here](http://www.flickr.com/photos/tomkersten/sets/72157626827940413/).
|
34
34
|
|
35
35
|
## PROBLEMS:
|
36
36
|
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ RedminePluginSupport::Base.setup do |plugin|
|
|
11
11
|
plugin.redmine_root = File.expand_path(File.dirname(__FILE__) + '/../../../')
|
12
12
|
end
|
13
13
|
|
14
|
-
Dir["
|
14
|
+
Dir["lib/tasks/**/*.rake"].sort.each { |ext| load ext }
|
15
15
|
|
16
16
|
task :default => [:test]
|
17
17
|
|
@@ -7,22 +7,21 @@ class ExtendedWikiController < WikiController
|
|
7
7
|
super
|
8
8
|
unless performed? # Prevent double render
|
9
9
|
respond_to do |format|
|
10
|
-
format.
|
11
|
-
format.pdf {
|
12
|
-
filename = "#{@project.name.underscore}_#{@page.title}".gsub(/\s/,'')
|
13
|
-
render :pdf => filename,
|
14
|
-
:template => 'extended_wiki/show.pdf.html.erb',
|
15
|
-
:page_size => "Letter",
|
16
|
-
:show_as_html => params[:debug],
|
17
|
-
:margin => {
|
18
|
-
:top => "0.5in",
|
19
|
-
:bottom => "0.5in",
|
20
|
-
:left => "0.5in",
|
21
|
-
:right => "0.5in"
|
22
|
-
},
|
23
|
-
:layout => 'pdf.pdf.erb'
|
24
|
-
}
|
10
|
+
format.pdf {render formatter.render_options}
|
25
11
|
end
|
26
12
|
end
|
27
13
|
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def formatter
|
17
|
+
ChiliPDF::Formatter.new(filename, page_title)
|
18
|
+
end
|
19
|
+
|
20
|
+
def filename
|
21
|
+
"#{@project.name.underscore}_#{@page.title}".gsub(/\s/,'')
|
22
|
+
end
|
23
|
+
|
24
|
+
def page_title
|
25
|
+
"#{@project.name}, #{@page.title}"
|
26
|
+
end
|
28
27
|
end
|
@@ -13,8 +13,6 @@
|
|
13
13
|
<link rel="stylesheet" href="<%= root_url %>stylesheets/pdf.css">
|
14
14
|
<%- end %>
|
15
15
|
|
16
|
-
<!-- Mobile viewport optimized: j.mp/bplateviewport -->
|
17
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
18
16
|
<%= yield(:header_tags) %>
|
19
17
|
</head>
|
20
18
|
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<% content_for :header_tags do %>
|
2
|
+
<%= stylesheet_link_tag '/plugin_assets/chili_pdf/stylesheets/pdf' %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<p>
|
6
|
+
<label for='settings_<%= ChiliPDF::Config::HEADER_ENABLED_KEYNAME %>'><%= l(:header_enabled_label) %></label>
|
7
|
+
<%= check_box_tag "settings[#{ChiliPDF::Config::HEADER_ENABLED_KEYNAME}]", ChiliPDF::Config::ENABLED_VALUE, ChiliPDF::Config.header_enabled? %>
|
8
|
+
</p>
|
9
|
+
|
10
|
+
<p>
|
11
|
+
<label for='settings_<%= ChiliPDF::Config::FOOTER_ENABLED_KEYNAME %>'><%= l(:footer_enabled_label) %></label>
|
12
|
+
<%= check_box_tag "settings[#{ChiliPDF::Config::FOOTER_ENABLED_KEYNAME}]", ChiliPDF::Config::ENABLED_VALUE, ChiliPDF::Config.footer_enabled? %>
|
13
|
+
</p>
|
14
|
+
|
15
|
+
<h3>Custom Header/Footer Content</h3>
|
16
|
+
|
17
|
+
<h4>Rules</h4>
|
18
|
+
<ol>
|
19
|
+
<li>Any "plain text" will render, as is...</li>
|
20
|
+
<li>
|
21
|
+
There are a few 'variables' you can use to dynamically replace content. For example,
|
22
|
+
you can add the current date to any page.
|
23
|
+
</li>
|
24
|
+
<li>All input will be escaped HTML, so injecting dynamic content via JavaScript will not work.</li>
|
25
|
+
</ol>
|
26
|
+
|
27
|
+
<table>
|
28
|
+
<thead>
|
29
|
+
<tr>
|
30
|
+
<td></td>
|
31
|
+
<td>Left</td>
|
32
|
+
<td>Center</td>
|
33
|
+
<td>Right</td>
|
34
|
+
</tr>
|
35
|
+
</thead>
|
36
|
+
<tbody>
|
37
|
+
<tr>
|
38
|
+
<td>Header</td>
|
39
|
+
<td>
|
40
|
+
<%= text_field_tag "settings[#{ChiliPDF::Config::HEADER_LEFT_KEYNAME}]", ChiliPDF::Config.header_values[:left] %>
|
41
|
+
</td>
|
42
|
+
<td>
|
43
|
+
<%= text_field_tag "settings[#{ChiliPDF::Config::HEADER_CENTER_KEYNAME}]", ChiliPDF::Config.header_values[:center] %>
|
44
|
+
</td>
|
45
|
+
<td>
|
46
|
+
<%= text_field_tag "settings[#{ChiliPDF::Config::HEADER_RIGHT_KEYNAME}]", ChiliPDF::Config.header_values[:right] %>
|
47
|
+
</td>
|
48
|
+
</tr>
|
49
|
+
<tr>
|
50
|
+
<td>Footer</td>
|
51
|
+
<td>
|
52
|
+
<%= text_field_tag "settings[#{ChiliPDF::Config::FOOTER_LEFT_KEYNAME}]", ChiliPDF::Config.footer_values[:left] %>
|
53
|
+
</td>
|
54
|
+
<td>
|
55
|
+
<%= text_field_tag "settings[#{ChiliPDF::Config::FOOTER_CENTER_KEYNAME}]", ChiliPDF::Config.footer_values[:center] %>
|
56
|
+
</td>
|
57
|
+
<td>
|
58
|
+
<%= text_field_tag "settings[#{ChiliPDF::Config::FOOTER_RIGHT_KEYNAME}]", ChiliPDF::Config.footer_values[:right] %>
|
59
|
+
</td>
|
60
|
+
</tr>
|
61
|
+
</tbody>
|
62
|
+
</table>
|
63
|
+
|
64
|
+
<div id="pdf-token-help">
|
65
|
+
<h4>Dynamic text legend</h4>
|
66
|
+
<table>
|
67
|
+
<thead>
|
68
|
+
<tr>
|
69
|
+
<td>Enter this</td>
|
70
|
+
<td>...to show this</td>
|
71
|
+
</tr>
|
72
|
+
</thead>
|
73
|
+
<tbody>
|
74
|
+
<%- ChiliPDF::TokenManager.tokens.each do |token| %>
|
75
|
+
<tr>
|
76
|
+
<td class="token"><%= token.matcher_with_delimiters %></td>
|
77
|
+
<td class="description"><%= token.description %></td>
|
78
|
+
</tr>
|
79
|
+
<%- end %>
|
80
|
+
</tbody>
|
81
|
+
</table>
|
82
|
+
</div>
|
data/assets/stylesheets/pdf.css
CHANGED
@@ -29,5 +29,16 @@ a.wiki-anchor { display:none; }
|
|
29
29
|
|
30
30
|
h1, h2, h3, h4 { margin: 0.5em 0; }
|
31
31
|
ul,ol {margin: 0 0 0 3em; padding: 0.1em;}
|
32
|
-
li {
|
32
|
+
li { padding: 0.1em; }
|
33
|
+
ol li {list-style-type: decimal;}
|
34
|
+
ul li {list-style-type: disc;}
|
33
35
|
h1, h2 {font-weight: bold;}
|
36
|
+
|
37
|
+
#pdf-token-help {
|
38
|
+
margin-top: 20px;
|
39
|
+
}
|
40
|
+
|
41
|
+
#pdf-token-help table {width: 100%; border: 1px #AAA solid;}
|
42
|
+
#pdf-token-help td {border-bottom: 1px dotted #CCC;}
|
43
|
+
|
44
|
+
#pdf-token-help thead td {font-weight: bold; border-bottom: 2px solid #CCC;}
|
data/autotest/discover.rb
CHANGED
data/init.rb
CHANGED
@@ -10,6 +10,9 @@ Redmine::Plugin.register :chili_pdf do
|
|
10
10
|
version ChiliPDF::VERSION
|
11
11
|
url 'https://github.com/tomkersten/chili_pdf'
|
12
12
|
author_url 'http://tomkersten.com/'
|
13
|
+
|
14
|
+
settings :partial => 'settings/chili_pdf_settings',
|
15
|
+
:default => ChiliPDF::Config.defaults
|
13
16
|
end
|
14
17
|
|
15
18
|
Dispatcher.to_prepare :chili_pdf do
|
data/lang/en.yml
ADDED
data/lib/chili_pdf.rb
CHANGED
@@ -0,0 +1,112 @@
|
|
1
|
+
module ChiliPDF
|
2
|
+
module Config
|
3
|
+
extend self
|
4
|
+
|
5
|
+
PLUGIN_KEYNAME = 'plugin_chili_pdf'
|
6
|
+
ENABLED_VALUE = '1'
|
7
|
+
DISABLED_VALUE = '0'
|
8
|
+
FOOTER_ENABLED_KEYNAME = 'footer_enabled'
|
9
|
+
HEADER_ENABLED_KEYNAME = 'header_enabled'
|
10
|
+
|
11
|
+
HEADER_LEFT_KEYNAME = :header_content_left
|
12
|
+
HEADER_CENTER_KEYNAME = :header_content_center
|
13
|
+
HEADER_RIGHT_KEYNAME = :header_content_right
|
14
|
+
FOOTER_LEFT_KEYNAME = :footer_content_left
|
15
|
+
FOOTER_CENTER_KEYNAME = :footer_content_center
|
16
|
+
FOOTER_RIGHT_KEYNAME = :footer_content_right
|
17
|
+
|
18
|
+
HEADER_LEFT_DEFAULT_VALUE = '{{page_title}}'
|
19
|
+
HEADER_CENTER_DEFAULT_VALUE = ''
|
20
|
+
HEADER_RIGHT_DEFAULT_VALUE = ''
|
21
|
+
FOOTER_LEFT_DEFAULT_VALUE = '{{datestamp}}'
|
22
|
+
FOOTER_CENTER_DEFAULT_VALUE = ''
|
23
|
+
FOOTER_RIGHT_DEFAULT_VALUE = '{{current_page}}/{{total_pages}}'
|
24
|
+
|
25
|
+
def defaults
|
26
|
+
{
|
27
|
+
FOOTER_ENABLED_KEYNAME => ENABLED_VALUE,
|
28
|
+
HEADER_ENABLED_KEYNAME => ENABLED_VALUE,
|
29
|
+
HEADER_LEFT_KEYNAME => HEADER_LEFT_DEFAULT_VALUE,
|
30
|
+
HEADER_CENTER_KEYNAME => HEADER_CENTER_DEFAULT_VALUE,
|
31
|
+
HEADER_RIGHT_KEYNAME => HEADER_RIGHT_DEFAULT_VALUE,
|
32
|
+
FOOTER_LEFT_KEYNAME => FOOTER_LEFT_DEFAULT_VALUE,
|
33
|
+
FOOTER_CENTER_KEYNAME => FOOTER_CENTER_DEFAULT_VALUE,
|
34
|
+
FOOTER_RIGHT_KEYNAME => FOOTER_RIGHT_DEFAULT_VALUE
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: Returns whether the footer will be printed when exporting
|
39
|
+
# a PDF.
|
40
|
+
#
|
41
|
+
# Returns either true or false.
|
42
|
+
def footer_enabled?
|
43
|
+
footer_enabled == ENABLED_VALUE
|
44
|
+
end
|
45
|
+
|
46
|
+
# Public: Returns whether the header will be printed when exporting
|
47
|
+
# a PDF.
|
48
|
+
#
|
49
|
+
# Returns either true or false.
|
50
|
+
def header_enabled?
|
51
|
+
header_enabled == ENABLED_VALUE
|
52
|
+
end
|
53
|
+
|
54
|
+
# Public: Accepts anything which responds to '[]' and '.has_key?'
|
55
|
+
# (ie: Hash-like objects)
|
56
|
+
#
|
57
|
+
# Utilizes following keys (values of):
|
58
|
+
# - HEADER_ENABLED_KEYNAME
|
59
|
+
# - FOOTER_ENABLED_KEYNAME
|
60
|
+
#
|
61
|
+
# Returns true. Always.
|
62
|
+
def update(options)
|
63
|
+
Setting[PLUGIN_KEYNAME] = defaults.merge(options)
|
64
|
+
true
|
65
|
+
end
|
66
|
+
|
67
|
+
def header_values
|
68
|
+
default_header_values.merge(stored_header_settings)
|
69
|
+
end
|
70
|
+
|
71
|
+
def footer_values
|
72
|
+
default_footer_values.merge(stored_footer_settings)
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
def default_header_values
|
77
|
+
{:left => HEADER_LEFT_DEFAULT_VALUE,
|
78
|
+
:center => HEADER_CENTER_DEFAULT_VALUE,
|
79
|
+
:right => HEADER_RIGHT_DEFAULT_VALUE}
|
80
|
+
end
|
81
|
+
|
82
|
+
def stored_header_settings
|
83
|
+
{:left => plugin_settings[HEADER_LEFT_KEYNAME],
|
84
|
+
:center => plugin_settings[HEADER_CENTER_KEYNAME],
|
85
|
+
:right => plugin_settings[HEADER_RIGHT_KEYNAME]}.reject {|k,v| v.nil?}
|
86
|
+
end
|
87
|
+
|
88
|
+
def default_footer_values
|
89
|
+
{:left => FOOTER_LEFT_DEFAULT_VALUE,
|
90
|
+
:center => FOOTER_CENTER_DEFAULT_VALUE,
|
91
|
+
:right => FOOTER_RIGHT_DEFAULT_VALUE}
|
92
|
+
end
|
93
|
+
|
94
|
+
def stored_footer_settings
|
95
|
+
{:left => plugin_settings[FOOTER_LEFT_KEYNAME],
|
96
|
+
:center => plugin_settings[FOOTER_CENTER_KEYNAME],
|
97
|
+
:right => plugin_settings[FOOTER_RIGHT_KEYNAME]}.reject {|k,v| v.nil?}
|
98
|
+
end
|
99
|
+
|
100
|
+
def footer_enabled
|
101
|
+
plugin_settings[FOOTER_ENABLED_KEYNAME]
|
102
|
+
end
|
103
|
+
|
104
|
+
def header_enabled
|
105
|
+
plugin_settings[HEADER_ENABLED_KEYNAME]
|
106
|
+
end
|
107
|
+
|
108
|
+
def plugin_settings
|
109
|
+
Setting[PLUGIN_KEYNAME]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module ChiliPDF
|
2
|
+
class Formatter
|
3
|
+
HEADER_FOOTER_FONT_SIZE = 8
|
4
|
+
DEFAULT_MARGIN = '0.5in'
|
5
|
+
DEFAULT_PAGE_SIZE = "Letter"
|
6
|
+
DEFAULT_PAGE_TITLE = "Untitled"
|
7
|
+
DEFAULT_LAYOUT = 'pdf.pdf.erb'
|
8
|
+
DEFAULT_VIEW_TEMPLATE = 'extended_wiki/show.pdf.html.erb'
|
9
|
+
|
10
|
+
attr_reader :page_title
|
11
|
+
|
12
|
+
# TODO: Hack...need to come up with better approach for this...
|
13
|
+
TokenManager.add_token_definition do
|
14
|
+
{:page_title => {:replacement_object => (DEFAULT_PAGE_TITLE),
|
15
|
+
:description => "The project & wiki page name (eg: 'My Project, Wiki Page Title')"}}
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(filename, title = nil)
|
19
|
+
@page_title = title
|
20
|
+
@filename = filename
|
21
|
+
|
22
|
+
# TODO: Hack...need to come up with better approach for this...
|
23
|
+
TokenManager.add_token_definition do
|
24
|
+
{:page_title => {:replacement_object => (@page_title || DEFAULT_PAGE_TITLE),
|
25
|
+
:description => "The project & wiki page name (eg: 'My Project, Wiki Page Title')"}}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def render_options
|
30
|
+
default_options = {
|
31
|
+
:pdf => @filename,
|
32
|
+
:template => view_template,
|
33
|
+
:page_size => DEFAULT_PAGE_SIZE,
|
34
|
+
:margin => {
|
35
|
+
:top => DEFAULT_MARGIN,
|
36
|
+
:bottom => DEFAULT_MARGIN,
|
37
|
+
:left => DEFAULT_MARGIN,
|
38
|
+
:right => DEFAULT_MARGIN
|
39
|
+
},
|
40
|
+
:layout => DEFAULT_LAYOUT
|
41
|
+
}
|
42
|
+
|
43
|
+
default_options.merge!(footer_options) if ChiliPDF::Config.footer_enabled?
|
44
|
+
default_options.merge!(header_options) if ChiliPDF::Config.header_enabled?
|
45
|
+
default_options
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def footer_options
|
50
|
+
{:footer => {
|
51
|
+
:font_size => 8,
|
52
|
+
:line => true,
|
53
|
+
:spacing => 2
|
54
|
+
}.merge(substitute_tokens(ChiliPDF::Config.footer_values))}
|
55
|
+
end
|
56
|
+
|
57
|
+
def header_options
|
58
|
+
{:header => {
|
59
|
+
:font_size => HEADER_FOOTER_FONT_SIZE,
|
60
|
+
:line => true,
|
61
|
+
:spacing => 2
|
62
|
+
}.merge(substitute_tokens(ChiliPDF::Config.header_values))}
|
63
|
+
end
|
64
|
+
|
65
|
+
def substitute_tokens(hash)
|
66
|
+
hash.inject({}) do |converted_list, unconverted_item|
|
67
|
+
header_location,header_location_value = unconverted_item
|
68
|
+
converted_list.merge({header_location => replace_tokens_in(header_location_value)})
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def replace_tokens_in(string)
|
73
|
+
TokenManager.apply_tokens_to string
|
74
|
+
end
|
75
|
+
|
76
|
+
def view_template
|
77
|
+
DEFAULT_VIEW_TEMPLATE
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module ChiliPDF
|
2
|
+
# Associates documentation of a "string to replace" (matcher) with it's
|
3
|
+
# "replacement text" (replacement_object) and allows either either static
|
4
|
+
# or dynamic string replacement declarations.
|
5
|
+
class StringToken
|
6
|
+
# Description used if the default description is empty
|
7
|
+
DEFAULT_DESCRIPTION = "[No description provided]"
|
8
|
+
|
9
|
+
# String used to denote the begining of a token
|
10
|
+
STARTING_DELIMITER = "{{"
|
11
|
+
|
12
|
+
# String used to denote the ending of a token
|
13
|
+
ENDING_DELIMITER = "}}"
|
14
|
+
|
15
|
+
# Public: Get the matcher of the token
|
16
|
+
# Returns the String matcher of token
|
17
|
+
attr_reader :matcher
|
18
|
+
|
19
|
+
# Returns the String replacement_object of token
|
20
|
+
attr_reader :replacement_object
|
21
|
+
|
22
|
+
# Returns the String description of the token
|
23
|
+
attr_reader :description
|
24
|
+
|
25
|
+
|
26
|
+
# Public: Create new instance of StringToken class
|
27
|
+
#
|
28
|
+
# matcher - the #to_s value to search for
|
29
|
+
# replacement_object - the value to replace 'matcher' with
|
30
|
+
# description - a friendly description which can be used
|
31
|
+
# to explain what purpose the matcher is
|
32
|
+
# intended to serve
|
33
|
+
#
|
34
|
+
# 'replacement_object' may be any object, but special behavior
|
35
|
+
# exists if the value is a Proc object. Refer to the #apply_to
|
36
|
+
# documentation for details on said behavior.
|
37
|
+
#
|
38
|
+
# Returns new instance of StringToken
|
39
|
+
def initialize(matcher, replacement_object, description = nil)
|
40
|
+
@matcher = matcher
|
41
|
+
@replacement_object = replacement_object
|
42
|
+
@description = description.blank? ? DEFAULT_DESCRIPTION : description
|
43
|
+
end
|
44
|
+
|
45
|
+
# Public: Substitutes any occurrences of #replacement_object in the specified
|
46
|
+
# object's response to #to_s. If #replacement_object returns a Proc
|
47
|
+
# object, #call will be issued to it.
|
48
|
+
#
|
49
|
+
# string - string to search for token occurrences in
|
50
|
+
#
|
51
|
+
# Examples:
|
52
|
+
# Returns copy of string with matcher text occurrences replaced.
|
53
|
+
def apply_to(string)
|
54
|
+
string.gsub(replacement_regexp(string), replacement_value.to_s)
|
55
|
+
end
|
56
|
+
|
57
|
+
def matcher_with_delimiters
|
58
|
+
"#{STARTING_DELIMITER}#{matcher}#{ENDING_DELIMITER}"
|
59
|
+
end
|
60
|
+
private
|
61
|
+
def replacement_regexp(string)
|
62
|
+
Regexp.new(/#{escaped(STARTING_DELIMITER)}#{matcher.to_s}#{escaped(ENDING_DELIMITER)}/)
|
63
|
+
end
|
64
|
+
|
65
|
+
def replacement_value
|
66
|
+
replacement_object.is_a?(Proc) ? replacement_object.call(self) : replacement_object
|
67
|
+
end
|
68
|
+
|
69
|
+
def escaped(string)
|
70
|
+
Regexp.escape string
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module ChiliPDF
|
2
|
+
module TokenManager
|
3
|
+
extend self
|
4
|
+
|
5
|
+
MAPPINGS = {:current_page => {
|
6
|
+
:replacement_object => "[page]",
|
7
|
+
:description => "The current page of the PDF document."},
|
8
|
+
:total_pages => {
|
9
|
+
:replacement_object => '[topage]',
|
10
|
+
:description => "The total number of pages in the PDF document."},
|
11
|
+
:datestamp => {
|
12
|
+
:replacement_object => lambda {Time.now.strftime('%d-%b-%Y')},
|
13
|
+
:description => "The current date in the format of DD-MON-YYYY'"},
|
14
|
+
:current_quarter => {
|
15
|
+
:replacement_object => lambda {calculate_quarter.to_s},
|
16
|
+
:description => "The current fiscal quarter (assuming Jan-Mar is thefirst quarter). Example output: '1'."},
|
17
|
+
:current_year => {
|
18
|
+
:replacement_object => lambda {Time.now.strftime('%Y')},
|
19
|
+
:description => "The current year in YYYY-format"}}
|
20
|
+
|
21
|
+
def tokens
|
22
|
+
raw_tokens.map {|matcher, meta|
|
23
|
+
StringToken.new(matcher, meta[:replacement_object], meta[:description])
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_token_definition
|
28
|
+
raw_tokens.merge!(yield)
|
29
|
+
end
|
30
|
+
|
31
|
+
def apply_tokens_to(string)
|
32
|
+
tokens.inject(string.dup) {|modified, token| modified = token.apply_to modified}
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def raw_tokens
|
37
|
+
@raw_tokens ||= MAPPINGS.dup
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.calculate_quarter
|
41
|
+
month = Time.now.strftime('%m').to_i
|
42
|
+
((month - 1) / 3) + 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -22,7 +22,6 @@ class ChiliPDFTasks < Rake::TaskLib
|
|
22
22
|
task :symlink_assets => [:environment] do
|
23
23
|
# HACK: Symlinks the files from plugindir/assets to the appropriate place in
|
24
24
|
# the rails application
|
25
|
-
remove_symlink(asset_destination_dir)
|
26
25
|
puts "Symlinking assets (stylesheets, etc)..."
|
27
26
|
add_symlink asset_source_dir, asset_destination_dir
|
28
27
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
class ContributorTasks < Rake::TaskLib
|
5
|
+
def initialize
|
6
|
+
define
|
7
|
+
end
|
8
|
+
|
9
|
+
def define
|
10
|
+
desc "Update contributors list in README"
|
11
|
+
task :update_contributors do
|
12
|
+
if new_contributors?
|
13
|
+
puts "New contributors!"
|
14
|
+
new_contributors.each {|name| puts "- #{name}"}
|
15
|
+
puts ""
|
16
|
+
|
17
|
+
print "Updating the 'Contributors' section of README..."
|
18
|
+
|
19
|
+
File.open("README.md", "w+") do |file|
|
20
|
+
file.puts readme_without_contributors_section
|
21
|
+
file.puts "## Contributors (sorted alphabetically)"
|
22
|
+
file.puts ""
|
23
|
+
committers.each {|name| file.puts "* #{name}"}
|
24
|
+
end
|
25
|
+
puts "done!"
|
26
|
+
else
|
27
|
+
puts "No new contributors."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
task :release do
|
32
|
+
puts "#####################"
|
33
|
+
puts "For the twitters"
|
34
|
+
puts "#####################"
|
35
|
+
puts "[ANN] chili_pdf v#{ChiliPDF::VERSION} released. Changes: http://bit.ly/lEfOaJ, Repo: http://bit.ly/lu5bjP /cc @chiliproject"
|
36
|
+
puts "#####################"
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def all_committers
|
43
|
+
all_names = `git shortlog -s |cut -s -f2`
|
44
|
+
all_names.gsub!(/\sand\s/, "\n").split("\n").uniq!.sort!
|
45
|
+
end
|
46
|
+
|
47
|
+
def committers
|
48
|
+
excluded_committers = ["Tom Kersten"]
|
49
|
+
@committers ||= all_committers - excluded_committers
|
50
|
+
end
|
51
|
+
|
52
|
+
def readme_file_contents
|
53
|
+
@readme_contents ||= `cat README.md`
|
54
|
+
end
|
55
|
+
|
56
|
+
def existing_contributors
|
57
|
+
existing_contributors = readme_file_contents[/## Contributors(.|\n)*/].strip.split("\n* ")
|
58
|
+
existing_contributors.shift # remove "Contributors..." line
|
59
|
+
existing_contributors
|
60
|
+
end
|
61
|
+
|
62
|
+
def new_contributors
|
63
|
+
@new_contributors ||= committers - existing_contributors
|
64
|
+
end
|
65
|
+
|
66
|
+
def new_contributors?
|
67
|
+
!new_contributors.empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
def readme_without_contributors_section
|
71
|
+
readme_file_contents.sub(/## Contributors(.|\n)*/, '')
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace :test do
|
2
|
+
desc "Test lib source"
|
3
|
+
Rake::TestTask.new(:lib) do |t|
|
4
|
+
t.libs << "test"
|
5
|
+
t.pattern = 'test/chili_pdf/**/*_test.rb'
|
6
|
+
t.verbose = true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
lib_task = Rake::Task["test:lib"]
|
11
|
+
test_task = Rake::Task[:test]
|
12
|
+
test_task.enhance { lib_task.invoke }
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class ConfigTest < ActiveSupport::TestCase
|
4
|
+
setup do
|
5
|
+
Setting["plugin_chili_pdf"] = HashWithIndifferentAccess.new(ChiliPDF::Config.defaults)
|
6
|
+
end
|
7
|
+
|
8
|
+
context '#header_values' do
|
9
|
+
context 'when no customizations have taken place' do
|
10
|
+
should "return the 'defaults' values for the header fields" do
|
11
|
+
defaults = {
|
12
|
+
:left => ChiliPDF::Config.defaults[ChiliPDF::Config::HEADER_LEFT_KEYNAME],
|
13
|
+
:center => ChiliPDF::Config.defaults[ChiliPDF::Config::HEADER_CENTER_KEYNAME],
|
14
|
+
:right => ChiliPDF::Config.defaults[ChiliPDF::Config::HEADER_RIGHT_KEYNAME]
|
15
|
+
}
|
16
|
+
assert_equal defaults, ChiliPDF::Config.header_values
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when the content has been customized' do
|
21
|
+
setup do
|
22
|
+
@left = 'left_header'
|
23
|
+
@center = 'center header'
|
24
|
+
@right = 'right header'
|
25
|
+
|
26
|
+
Setting["plugin_chili_pdf"] = {ChiliPDF::Config::HEADER_LEFT_KEYNAME => @left,
|
27
|
+
ChiliPDF::Config::HEADER_CENTER_KEYNAME => @center,
|
28
|
+
ChiliPDF::Config::HEADER_RIGHT_KEYNAME => @right}
|
29
|
+
end
|
30
|
+
|
31
|
+
should "return the customized values for the header fields" do
|
32
|
+
assert_equal @left, ChiliPDF::Config.header_values[:left]
|
33
|
+
assert_equal @center, ChiliPDF::Config.header_values[:center]
|
34
|
+
assert_equal @right, ChiliPDF::Config.header_values[:right]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context '#footer_values' do
|
40
|
+
context 'when no customizations have taken place' do
|
41
|
+
should "return the 'defaults' values for the footer fields" do
|
42
|
+
defaults = {
|
43
|
+
:left => ChiliPDF::Config.defaults[ChiliPDF::Config::FOOTER_LEFT_KEYNAME],
|
44
|
+
:center => ChiliPDF::Config.defaults[ChiliPDF::Config::FOOTER_CENTER_KEYNAME],
|
45
|
+
:right => ChiliPDF::Config.defaults[ChiliPDF::Config::FOOTER_RIGHT_KEYNAME]
|
46
|
+
}
|
47
|
+
assert_equal defaults, ChiliPDF::Config.footer_values
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when the footer content has been customized' do
|
52
|
+
setup do
|
53
|
+
@left = 'left footer'
|
54
|
+
@center = 'center footer'
|
55
|
+
@right = 'right footer'
|
56
|
+
|
57
|
+
Setting["plugin_chili_pdf"] = {ChiliPDF::Config::FOOTER_LEFT_KEYNAME => @left,
|
58
|
+
ChiliPDF::Config::FOOTER_CENTER_KEYNAME => @center,
|
59
|
+
ChiliPDF::Config::FOOTER_RIGHT_KEYNAME => @right}
|
60
|
+
end
|
61
|
+
|
62
|
+
should "return the customized values for the footer fields" do
|
63
|
+
assert_equal @left, ChiliPDF::Config.footer_values[:left]
|
64
|
+
assert_equal @center, ChiliPDF::Config.footer_values[:center]
|
65
|
+
assert_equal @right, ChiliPDF::Config.footer_values[:right]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class FormatterTest < Test::Unit::TestCase
|
4
|
+
include HeaderHelpers
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@formatter = Formatter.new('filename.pdf')
|
8
|
+
end
|
9
|
+
|
10
|
+
context "#render_options" do
|
11
|
+
should "render_options returns hash with pdf filename set" do
|
12
|
+
assert_equal 'filename.pdf', Formatter.new('filename.pdf').render_options[:pdf]
|
13
|
+
end
|
14
|
+
|
15
|
+
should "set the return the default layout of 'pdf.pdf.erb'" do
|
16
|
+
assert_equal ChiliPDF::Formatter::DEFAULT_LAYOUT, @formatter.render_options[:layout]
|
17
|
+
end
|
18
|
+
|
19
|
+
should "set 'extended_wiki/show.pdf.html.erb' as the default template" do
|
20
|
+
assert_equal ChiliPDF::Formatter::DEFAULT_VIEW_TEMPLATE, @formatter.render_options[:template]
|
21
|
+
end
|
22
|
+
|
23
|
+
should "set the default page_size to be 'Letter'" do
|
24
|
+
assert_equal ChiliPDF::Formatter::DEFAULT_PAGE_SIZE, @formatter.render_options[:page_size]
|
25
|
+
end
|
26
|
+
|
27
|
+
should "set the default margins" do
|
28
|
+
def_margin = ChiliPDF::Formatter::DEFAULT_MARGIN
|
29
|
+
default_margins = {:top => def_margin, :bottom => def_margin, :left => def_margin, :right => def_margin}
|
30
|
+
assert_equal default_margins, @formatter.render_options[:margin]
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when footers are enabled' do
|
34
|
+
setup do
|
35
|
+
enable_footers
|
36
|
+
end
|
37
|
+
|
38
|
+
should 'include footer options' do
|
39
|
+
assert ChiliPDF::Config.footer_enabled?
|
40
|
+
assert @formatter.render_options.has_key?(:footer)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when footers are disabled' do
|
45
|
+
setup do
|
46
|
+
disable_footers
|
47
|
+
end
|
48
|
+
|
49
|
+
should "not include a 'footer' key" do
|
50
|
+
assert !@formatter.render_options.has_key?(:footer)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when headers are enabled' do
|
55
|
+
setup do
|
56
|
+
enable_headers
|
57
|
+
end
|
58
|
+
|
59
|
+
should 'include header options' do
|
60
|
+
assert @formatter.render_options.has_key?(:header)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when headers are disabled' do
|
65
|
+
setup do
|
66
|
+
disable_headers
|
67
|
+
end
|
68
|
+
|
69
|
+
should "not include a 'header' key" do
|
70
|
+
assert !@formatter.render_options.has_key?(:header)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "replacing 'dynamic tokens' with expected content" do
|
75
|
+
should "substitues '{{current_page}}' with '[page]'" do
|
76
|
+
set_header_field_to "{{current_page}}"
|
77
|
+
|
78
|
+
assert ChiliPDF::Config.footer_enabled?
|
79
|
+
assert_equal '[page]', @formatter.render_options[:header][:left]
|
80
|
+
end
|
81
|
+
|
82
|
+
should "substitues '{{total_pages}}' with '[topage]'" do
|
83
|
+
set_header_field_to "{{total_pages}}"
|
84
|
+
|
85
|
+
assert ChiliPDF::Config.footer_enabled?
|
86
|
+
assert_equal '[topage]', @formatter.render_options[:header][:left]
|
87
|
+
end
|
88
|
+
|
89
|
+
should "substitues '{{datestamp}}' with a date formated as 'DD-MON-YYYY'" do
|
90
|
+
todays_date = Time.now.strftime('%d-%b-%Y')
|
91
|
+
|
92
|
+
set_header_field_to "{{datestamp}}"
|
93
|
+
assert_equal todays_date, header_value
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when a page title is supplied" do
|
97
|
+
setup do
|
98
|
+
@custom_title = 'Custom title'
|
99
|
+
@formatter = ChiliPDF::Formatter.new('filename.pdf', @custom_title)
|
100
|
+
end
|
101
|
+
|
102
|
+
should "substitute '{{page_title}}' with a string value passed in as the 'page_title' argument" do
|
103
|
+
set_header_field_to "{{page_title}}"
|
104
|
+
|
105
|
+
assert ChiliPDF::Config.footer_enabled?
|
106
|
+
assert_equal @custom_title, header_value
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when a page title is not supplied" do
|
111
|
+
should "substitues '{{page_title}}' with the default page title value '#{ChiliPDF::Formatter::DEFAULT_PAGE_TITLE}'" do
|
112
|
+
set_header_field_to "{{page_title}}"
|
113
|
+
assert_equal ChiliPDF::Formatter::DEFAULT_PAGE_TITLE, header_value
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# The next couple are slightly hacky (or...maybe super-hacky)
|
118
|
+
should "substitues '{{current_year}}' with the current year (formated as 'YYYY')" do
|
119
|
+
todays_date = Time.now.strftime('%Y')
|
120
|
+
|
121
|
+
set_header_field_to "{{current_year}}"
|
122
|
+
assert_equal todays_date, header_value
|
123
|
+
end
|
124
|
+
|
125
|
+
should "substitues '{{current_quarter}}' with a string value of 1, 2, 3, 4...depending on month of year" do
|
126
|
+
month = Time.now.strftime('%m').to_i
|
127
|
+
expected = (((month - 1) / 3) + 1).to_s
|
128
|
+
|
129
|
+
set_header_field_to '{{current_quarter}}'
|
130
|
+
assert_equal expected, header_value
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class StringTokenTest < Test::Unit::TestCase
|
4
|
+
context ".apply_to" do
|
5
|
+
setup do
|
6
|
+
@sdelim = StringToken::STARTING_DELIMITER
|
7
|
+
@edelim = StringToken::ENDING_DELIMITER
|
8
|
+
@matcher = "matcher_here"
|
9
|
+
@replacement_object = 'text_added'
|
10
|
+
@token = StringToken.new(@matcher, @replacement_object)
|
11
|
+
end
|
12
|
+
|
13
|
+
should "returns does not modify the original string passed in" do
|
14
|
+
original = '{{test}}'
|
15
|
+
string = original.dup
|
16
|
+
assert_not_equal original.object_id, @token.apply_to(string).object_id
|
17
|
+
end
|
18
|
+
|
19
|
+
should "set a default value for a description when not provided" do
|
20
|
+
assert_equal StringToken::DEFAULT_DESCRIPTION, @token.description
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when the token's matcher does not exist in the specified string" do
|
24
|
+
should "return the same string value" do
|
25
|
+
assert_equal 'string', @token.apply_to('string')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when the token's matcher does exist in the specified string" do
|
30
|
+
setup do
|
31
|
+
@string = "This does have the matcher twice '#{@sdelim}#{@matcher}#{@edelim}' '#{@sdelim}#{@matcher}#{@edelim}'"
|
32
|
+
end
|
33
|
+
|
34
|
+
should "return a string value with only the matcher text replaced" do
|
35
|
+
expected_string = "This does have the matcher twice '#{@replacement_object}' '#{@replacement_object}'"
|
36
|
+
assert_equal expected_string, @token.apply_to(@string)
|
37
|
+
end
|
38
|
+
|
39
|
+
context "and the replacement object is a Proc object" do
|
40
|
+
setup do
|
41
|
+
@string = "This does have the matcher twice '#{@sdelim}#{@matcher}#{@edelim}' '#{@sdelim}#{@matcher}#{@edelim}'"
|
42
|
+
@result = 'resulting_replaced_text'
|
43
|
+
faker_class = Struct.new("Faker", :name)
|
44
|
+
faker = faker_class.new(@result)
|
45
|
+
|
46
|
+
@replacement_object = lambda {faker.name}
|
47
|
+
end
|
48
|
+
|
49
|
+
should "return a string value with the result of calling the Proc and passing 'self' as an argument" do
|
50
|
+
token = StringToken.new(@matcher, @replacement_object)
|
51
|
+
|
52
|
+
expected_string = "This does have the matcher twice '#{@result}' '#{@result}'"
|
53
|
+
assert_equal expected_string, token.apply_to(@string)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,77 +1,36 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
1
3
|
require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper')
|
2
4
|
|
3
5
|
# Ensure that we are using the temporary fixture path
|
4
6
|
Engines::Testing.set_fixture_path
|
5
7
|
|
8
|
+
require 'chili_pdf'
|
9
|
+
include ChiliPDF
|
6
10
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
FakeWeb.allow_net_connect = false
|
12
|
-
|
13
|
-
Webrat.configure do |config|
|
14
|
-
config.mode = :rails
|
15
|
-
end
|
16
|
-
|
17
|
-
module IntegrationTestHelper
|
18
|
-
def login_as(user="existing", password="existing")
|
19
|
-
visit "/login"
|
20
|
-
fill_in 'Login', :with => user
|
21
|
-
fill_in 'Password', :with => password
|
22
|
-
click_button 'login'
|
23
|
-
assert_response :success
|
24
|
-
assert User.current.logged?
|
25
|
-
end
|
26
|
-
|
27
|
-
def visit_project(project)
|
28
|
-
visit '/'
|
29
|
-
assert_response :success
|
30
|
-
|
31
|
-
click_link 'Projects'
|
32
|
-
assert_response :success
|
33
|
-
|
34
|
-
click_link project.name
|
35
|
-
assert_response :success
|
11
|
+
module HeaderHelpers
|
12
|
+
def set_header_field_to(value)
|
13
|
+
ChiliPDF::Config.update({ChiliPDF::Config::HEADER_LEFT_KEYNAME => value})
|
36
14
|
end
|
37
15
|
|
38
|
-
def
|
39
|
-
|
40
|
-
assert_template 'common/403'
|
16
|
+
def header_value
|
17
|
+
@formatter.render_options[:header][:left]
|
41
18
|
end
|
42
19
|
|
43
|
-
|
44
|
-
|
45
|
-
return nil if current_url.nil?
|
46
|
-
return current_url.gsub("http://www.example.com","")
|
20
|
+
def disable_footers
|
21
|
+
ChiliPDF::Config.update(ChiliPDF::Config::FOOTER_ENABLED_KEYNAME => ChiliPDF::Config::DISABLED_VALUE)
|
47
22
|
end
|
48
23
|
|
49
|
-
|
50
|
-
|
51
|
-
module TransloaditServiceHelper
|
52
|
-
def workflow_results(identifier = :standard)
|
53
|
-
YAML.load(File.open("test/fixtures/#{identifier}_transloadit_response.json"))
|
24
|
+
def enable_footers
|
25
|
+
ChiliPDF::Config.update({ChiliPDF::Config::FOOTER_ENABLED_KEYNAME => ChiliPDF::Config::ENABLED_VALUE})
|
54
26
|
end
|
55
27
|
|
56
|
-
def
|
57
|
-
|
58
|
-
url = assembly.blank? ? assembly_url : assembly.assembly_url
|
59
|
-
FakeWeb.register_uri(:get, url, :response => response)
|
28
|
+
def enable_headers
|
29
|
+
ChiliPDF::Config.update({ChiliPDF::Config::HEADER_ENABLED_KEYNAME => ChiliPDF::Config::ENABLED_VALUE})
|
60
30
|
end
|
61
31
|
|
62
|
-
def
|
63
|
-
|
32
|
+
def disable_headers
|
33
|
+
ChiliPDF::Config.update({ChiliPDF::Config::HEADER_ENABLED_KEYNAME => ChiliPDF::Config::DISABLED_VALUE})
|
64
34
|
end
|
65
35
|
end
|
66
36
|
|
67
|
-
class ActionController::IntegrationTest
|
68
|
-
include IntegrationTestHelper
|
69
|
-
end
|
70
|
-
|
71
|
-
class ActiveSupport::TestCase
|
72
|
-
include TransloaditServiceHelper
|
73
|
-
end
|
74
|
-
|
75
|
-
class ActionController::TestCase
|
76
|
-
include TransloaditServiceHelper
|
77
|
-
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chili_pdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tom Kersten
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
NVADJA==
|
37
37
|
-----END CERTIFICATE-----
|
38
38
|
|
39
|
-
date: 2011-
|
39
|
+
date: 2011-06-13 00:00:00 -05:00
|
40
40
|
default_executable:
|
41
41
|
dependencies:
|
42
42
|
- !ruby/object:Gem::Dependency
|
@@ -84,6 +84,7 @@ extra_rdoc_files:
|
|
84
84
|
- README.md
|
85
85
|
- LICENSE
|
86
86
|
files:
|
87
|
+
- .autotest
|
87
88
|
- Gemfile
|
88
89
|
- Gemfile.lock
|
89
90
|
- History.txt
|
@@ -95,14 +96,27 @@ files:
|
|
95
96
|
- app/helpers/chili_pdf_helper.rb
|
96
97
|
- app/views/extended_wiki/show.pdf.html.erb
|
97
98
|
- app/views/layouts/pdf.pdf.erb
|
99
|
+
- app/views/settings/_chili_pdf_settings.html.erb
|
98
100
|
- assets/stylesheets/pdf.css
|
99
101
|
- autotest/discover.rb
|
102
|
+
- config/locales/en.yml
|
100
103
|
- config/routes.rb
|
101
104
|
- init.rb
|
105
|
+
- lang/en.yml
|
102
106
|
- lib/chili_pdf.rb
|
107
|
+
- lib/chili_pdf/config.rb
|
108
|
+
- lib/chili_pdf/formatter.rb
|
109
|
+
- lib/chili_pdf/string_token.rb
|
110
|
+
- lib/chili_pdf/token_manager.rb
|
103
111
|
- lib/tasks/chili_pdf_tasks.rb
|
112
|
+
- lib/tasks/contributor_tasks.rb
|
113
|
+
- lib/tasks/test_lib_dir.rake
|
104
114
|
- lib/user_patch.rb
|
105
115
|
- rails/init.rb
|
116
|
+
- test/chili_pdf/config_test.rb
|
117
|
+
- test/chili_pdf/formatter_test.rb
|
118
|
+
- test/chili_pdf/string_token_test.rb
|
119
|
+
- test/chili_pdf/token_manager_test.rb
|
106
120
|
- test/test_helper.rb
|
107
121
|
has_rdoc: true
|
108
122
|
homepage: http://github.com/tomkersten/chili_pdf
|
@@ -135,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
149
|
requirements: []
|
136
150
|
|
137
151
|
rubyforge_project: chili_pdf
|
138
|
-
rubygems_version: 1.
|
152
|
+
rubygems_version: 1.6.2
|
139
153
|
signing_key:
|
140
154
|
specification_version: 3
|
141
155
|
summary: ChiliProject (/Redmine) plugin which implements/enhances PDF-export functionality using the Webkit rendering engine.
|
metadata.gz.sig
CHANGED
Binary file
|