htmls_to_pdf 0.0.8 → 0.0.9

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.
data/.gitignore CHANGED
@@ -4,3 +4,4 @@
4
4
  *.css
5
5
  *.pdf
6
6
  **/noko_ruby-doc.rb
7
+ .rbenv-version
@@ -4,15 +4,17 @@
4
4
 
5
5
  HtmlsToPdf enables you to package one or more (ordered) HTML pages as a PDF.
6
6
 
7
- ## USEFULNESS
7
+ ## WHY?
8
8
 
9
- I created HtmlsToPdf because I often see multi-page websites with content I would rather have in a single PDF file for searching and offline viewing. Examples include: The Ruby on Rails Guides and RSpec documentation.
9
+ I often see multi-page websites with content I would rather have in a single PDF file for searching and offline viewing. Examples include: *The Ruby on Rails Guides* and *RSpec documentation*.
10
+
11
+ Viewing docs offline also reduces browser "tab-itis," browser crashes, and unnecessary re-downloading of server content.
10
12
 
11
13
  ## REQUIREMENTS
12
14
 
13
15
  I have run this only on Linux. It likely works on OS X. It may not work on Windows.
14
16
 
15
- HtmlsToPdf uses the PDFKit gem, which itself uses the [wkhtmltopdf](http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html) program, which uses qtwebkit.
17
+ HtmlsToPdf uses [the PDFKit gem](https://github.com/pdfkit/PDFKit/), which itself uses [the wkhtmltopdf program](http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html), which uses qtwebkit.
16
18
 
17
19
  Dependence chain summary: HtmlsToPdf -> PDFKit -> wkhtmltopdf -> qtwebkit -> webkit
18
20
 
@@ -38,21 +40,27 @@ For information on PDFKit:
38
40
 
39
41
  ## BASIC USAGE
40
42
 
41
- To use HtmlsToPdf, you create a new HtmlsToPdf object and pass in all your configuration options. You then call create_pdf on the new object:
43
+ Create a new HtmlsToPdf object, passing in all your configuration options. Then tell the new object to .create_pdf:
42
44
 
43
45
  require 'rubygems'
44
46
  require 'htmls_to_pdf'
45
47
 
46
48
  config = {}
47
- config[:urls] = ['http://.../url1.htm', 'https://.../url2.html']
48
- config[:savedir] = '~/my/savedir'
49
+ config[:urls] = ['http://.../url1.htm', 'https://.../url2.html']
50
+ config[:savedir] = '~/my/savedir'
49
51
  config[:savename] = 'Name_to_save_file_as.pdf'
52
+ config[:css] = ['http://www.example.com/css_file.css',
53
+ 'h1 {color: red; margin: 10px 5px;} p {color: blue; border: 1px solid green; font-size: 80%;}']
50
54
 
51
55
  HtmlsToPdf.new(config).create_pdf
52
56
 
57
+ (Alternatively, you can set configuration options by calling setters on an HtmlsToPdf instance, e.g.: h2p = HtmlsToPdf.new({}); h2p.savedir = '~/my/savedir')
58
+
53
59
  ## OPTIONS
54
60
 
55
- `config[:css]` takes an array of CSS files to apply during PDF rendering. (You can also pass a single CSS file as a string.)
61
+ `config[:css]` takes an array of CSS file URLs and/or valid CSS strings (you can mix URLs and CSS strings within an array) to apply during PDF rendering. (If you have just one CSS URL/string, you can pass it without an array.)
62
+
63
+ `config[:debug]` (default: false) determines whether the program outputs verbose information while processing create_pdf()
56
64
 
57
65
  `config[:overwrite_existing_pdf]` (default: false) determines whether the program can overwrite a previously generated PDF file
58
66
 
@@ -68,15 +76,17 @@ To use HtmlsToPdf, you create a new HtmlsToPdf object and pass in all your confi
68
76
 
69
77
  ## EXAMPLES
70
78
 
71
- You will find 18 example scripts in the /examples directory. Each creates a PDF from a website:
79
+ You will find 20 example scripts in the /examples directory. Each creates a PDF from a website:
72
80
 
73
81
  - [The 12 Factor App](http://www.12factor.net) (Adam Wiggins)
82
+ - [Advanced Rails - Five-Day](http://tutorials.jumpstartlab.com/paths/advanced_rails_five_day.html) (Jumpstart Labs)
83
+ - [Backbone Fundamentals](https://github.com/addyosmani/backbone-fundamentals/blob/master/book.md) (Addy Osmani)
74
84
  - [Bash Guide](http://mywiki.wooledge.org/BashGuide) (Greg Wooledge)
75
85
  - [Coffeescript Meet Backbone.js](http://adamjspooner.github.com/coffeescript-meet-backbonejs/) (Adam J. Spooner)
76
86
  - [Coffeescript Cookbook](http://coffeescriptcookbook.com) ([Various authors](http://coffeescriptcookbook.com/authors))
77
87
  - [Coffeescript official documentation](http://coffeescript.org/)
78
88
  - [Exploring Coffeescript](http://elegantcode.com/2011/08/09/exploring-coffeescript-part-6-show-me-the-goodies/) (ElegantCode.com)
79
- - [Advanced Rails - Five-Day](http://tutorials.jumpstartlab.com/paths/advanced_rails_five_day.html) (Jumpstart Labs)
89
+ - [Jasmine Wiki](https://github.com/pivotal/jasmine/wiki/) (Pivotal Labs)
80
90
  - [The Little Book on Coffeescript](http://arcturo.github.com/library/coffeescript/) (Alex MacCaw)
81
91
  - [Natural Language Processing for the Working Programmer](nlpwp.org/book/) (Daniël de Kok)
82
92
  - [Learn Python the Hard Way](http://learnpythonthehardway.org) (Zed A. Shaw)
@@ -91,7 +101,7 @@ You will find 18 example scripts in the /examples directory. Each creates a PDF
91
101
 
92
102
  After you install HtmlsToPdf and its dependencies, you can write an ordinary Ruby script to save multiple ordered HTML pages as a single PDF.
93
103
 
94
- ### EXAMPLE 1: Single HTML page without CSS
104
+ ### EXAMPLE 1: Single HTML page without CSS, with debugging
95
105
 
96
106
  Annotated version of /examples/get\_rails\_3\_1\_release\_notes.rb:
97
107
 
@@ -106,6 +116,9 @@ Annotated version of /examples/get\_rails\_3\_1\_release\_notes.rb:
106
116
  config = {}
107
117
  config[:urls] = ['http://guides.rubyonrails.org/3_1_release_notes.html']
108
118
 
119
+ # enable verbose messages during PDF creation process
120
+ config[:debug] = true
121
+
109
122
  # set a :savedir key with a string value indicating the directory to create
110
123
  # your PDF file in. If the directory does not exist, it will be created
111
124
  config[:savedir] = '~/Tech/Rails/3.1'
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'htmls_to_pdf'
3
+
4
+ # Get "addyosmani's Developing Backbone.js Applications" as pdf file
5
+ # Source: 'https://github.com/addyosmani/backbone-fundamentals/blob/master/book.md'
6
+ #
7
+ # I used only the first Github stylesheet and added the following
8
+ # at the bottom:
9
+ #
10
+ # header, .header, #header, #userbox, .title-actions-bar, .subnav, .meta, .scope, .repostats, .breadcrumb, .file-history-tease, ul.tabs, .topsearch, #footer, #footer-push {
11
+ # display: none;
12
+ # }
13
+
14
+ config = {}
15
+ config[:urls] = ['https://github.com/addyosmani/backbone-fundamentals/blob/master/book.md']
16
+
17
+ config[:savedir] = '~/Tech/Javascript/BACKBONE.JS'
18
+ config[:css] = ['https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-e2fb92c4dcb5e5b1ce2ffd0e84d6bf80937d9197.css'] #,
19
+ #'https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github2-98a6177ed18ac7b415e311fdb34652f17ad0038c.css']
20
+ config[:savename] = 'Developing_Backbone.js_Applications.pdf'
21
+ config[:remove_css_files] = false
22
+ config[:overwrite_existing_pdf] = true
23
+
24
+ HtmlsToPdf.new(config).create_pdf
@@ -2,13 +2,13 @@ require 'rubygems'
2
2
  require 'htmls_to_pdf'
3
3
 
4
4
  # Get 'CoffeeScript_documentation' as pdf file
5
- # Source: 'http://jashkenas.github.com/coffee-script/'
5
+ # Source: 'http://coffeescript.org/'
6
6
 
7
7
  config = {}
8
- config[:urls] = ['http://jashkenas.github.com/coffee-script/']
8
+ config[:urls] = ['http://coffeescript.org/']
9
9
  config[:savedir] = '~/Tech/Javascript/COFFEESCRIPT/DOCUMENTATION'
10
10
  config[:savename] = 'CoffeeScript_documentation.pdf'
11
- config[:css] = ['http://jashkenas.github.com/coffee-script/documentation/css/docs.css',
12
- 'http://jashkenas.github.com/coffee-script/documentation/css/idle.css']
11
+ config[:css] = ['http://coffeescript.org/documentation/css/docs.css',
12
+ 'http://coffeescript.org/documentation/css/idle.css']
13
13
 
14
14
  HtmlsToPdf.new(config).create_pdf
@@ -7,18 +7,19 @@ require 'htmls_to_pdf'
7
7
  config = {}
8
8
  config[:urls] = [
9
9
  'http://coffeescriptcookbook.com/',
10
- 'http://coffeescriptcookbook.com/chapters/syntax',
10
+ 'http://coffeescriptcookbook.com/chapters/syntax/',
11
11
  'http://coffeescriptcookbook.com/chapters/syntax/embedding_javascript',
12
12
  'http://coffeescriptcookbook.com/chapters/syntax/comparing_ranges',
13
+ 'http://coffeescriptcookbook.com/chapters/syntax/code_reuse_on_client_and_server',
13
14
  'http://coffeescriptcookbook.com/chapters/syntax/for_loops',
14
- 'http://coffeescriptcookbook.com/chapters/classes_and_objects',
15
+ 'http://coffeescriptcookbook.com/chapters/classes_and_objects/',
15
16
  'http://coffeescriptcookbook.com/chapters/classes_and_objects/class-methods-and-instance-methods',
16
17
  'http://coffeescriptcookbook.com/chapters/classes_and_objects/cloning',
17
18
  'http://coffeescriptcookbook.com/chapters/classes_and_objects/object-literal',
18
19
  'http://coffeescriptcookbook.com/chapters/classes_and_objects/type-function',
19
20
  'http://coffeescriptcookbook.com/chapters/classes_and_objects/class-variables',
20
21
  'http://coffeescriptcookbook.com/chapters/classes_and_objects/chaining',
21
- 'http://coffeescriptcookbook.com/chapters/strings',
22
+ 'http://coffeescriptcookbook.com/chapters/strings/',
22
23
  'http://coffeescriptcookbook.com/chapters/strings/repeating',
23
24
  'http://coffeescriptcookbook.com/chapters/strings/lowercasing-a-string',
24
25
  'http://coffeescriptcookbook.com/chapters/strings/uppercasing-a-string',
@@ -29,13 +30,14 @@ config[:urls] = [
29
30
  'http://coffeescriptcookbook.com/chapters/strings/interpolation',
30
31
  'http://coffeescriptcookbook.com/chapters/strings/matching-strings',
31
32
  'http://coffeescriptcookbook.com/chapters/strings/generating-a-unique-id',
32
- 'http://coffeescriptcookbook.com/chapters/arrays',
33
+ 'http://coffeescriptcookbook.com/chapters/arrays/',
33
34
  'http://coffeescriptcookbook.com/chapters/arrays/creating-a-string-from-an-array',
34
35
  'http://coffeescriptcookbook.com/chapters/arrays/zip-function',
35
36
  'http://coffeescriptcookbook.com/chapters/arrays/max-array-value',
36
37
  'http://coffeescriptcookbook.com/chapters/arrays/using-arrays-to-swap-variables',
37
38
  'http://coffeescriptcookbook.com/chapters/arrays/define-ranges',
38
39
  'http://coffeescriptcookbook.com/chapters/arrays/shuffling-array-elements',
40
+ 'http://coffeescriptcookbook.com/chapters/arrays/creating-a-dictionary-object-from-an-array',
39
41
  'http://coffeescriptcookbook.com/chapters/arrays/mapping-arrays',
40
42
  'http://coffeescriptcookbook.com/chapters/arrays/reducing-arrays',
41
43
  'http://coffeescriptcookbook.com/chapters/arrays/filtering-arrays',
@@ -44,13 +46,14 @@ config[:urls] = [
44
46
  'http://coffeescriptcookbook.com/chapters/arrays/testing-every-element',
45
47
  'http://coffeescriptcookbook.com/chapters/arrays/list-comprehensions',
46
48
  'http://coffeescriptcookbook.com/chapters/arrays/removing-duplicate-elements-from-arrays',
47
- 'http://coffeescriptcookbook.com/chapters/dates_and_times',
49
+ 'http://coffeescriptcookbook.com/chapters/dates_and_times/',
48
50
  'http://coffeescriptcookbook.com/chapters/dates_and_times/date-of-easter',
49
51
  'http://coffeescriptcookbook.com/chapters/dates_and_times/date-of-thanksgiving',
50
52
  'http://coffeescriptcookbook.com/chapters/dates_and_times/finding-last-day-of-the-month',
51
53
  'http://coffeescriptcookbook.com/chapters/dates_and_times/days-between-two-dates',
54
+ 'http://coffeescriptcookbook.com/chapters/dates_and_times/moon-phase-for-date',
52
55
  'http://coffeescriptcookbook.com/chapters/dates_and_times/finding-last-or-next-month',
53
- 'http://coffeescriptcookbook.com/chapters/math',
56
+ 'http://coffeescriptcookbook.com/chapters/math/',
54
57
  'http://coffeescriptcookbook.com/chapters/math/fast-fibonacci',
55
58
  'http://coffeescriptcookbook.com/chapters/math/random-integer',
56
59
  'http://coffeescriptcookbook.com/chapters/math/generating-random-numbers',
@@ -58,30 +61,32 @@ config[:urls] = [
58
61
  'http://coffeescriptcookbook.com/chapters/math/generating-predictable-random-numbers',
59
62
  'http://coffeescriptcookbook.com/chapters/math/fast-inv-square',
60
63
  'http://coffeescriptcookbook.com/chapters/math/radians-degrees',
61
- 'http://coffeescriptcookbook.com/chapters/functions',
64
+ 'http://coffeescriptcookbook.com/chapters/functions/',
62
65
  'http://coffeescriptcookbook.com/chapters/functions/recursion',
63
66
  'http://coffeescriptcookbook.com/chapters/functions/parentheses',
64
67
  'http://coffeescriptcookbook.com/chapters/functions/splat_arguments',
65
- 'http://coffeescriptcookbook.com/chapters/metaprogramming',
68
+ 'http://coffeescriptcookbook.com/chapters/metaprogramming/',
66
69
  'http://coffeescriptcookbook.com/chapters/metaprogramming/detecting-and-replacing-functions',
67
70
  'http://coffeescriptcookbook.com/chapters/metaprogramming/extending-built-in-objects',
68
- 'http://coffeescriptcookbook.com/chapters/jquery',
71
+ 'http://coffeescriptcookbook.com/chapters/jquery/',
69
72
  'http://coffeescriptcookbook.com/chapters/jquery/ajax',
70
73
  'http://coffeescriptcookbook.com/chapters/jquery/plugin',
71
74
  'http://coffeescriptcookbook.com/chapters/jquery/callback-bindings-jquery',
72
- 'http://coffeescriptcookbook.com/chapters/regular_expressions',
75
+ 'http://coffeescriptcookbook.com/chapters/ajax/',
76
+ 'http://coffeescriptcookbook.com/chapters/ajax/ajax_request_without_jquery',
77
+ 'http://coffeescriptcookbook.com/chapters/regular_expressions/',
73
78
  'http://coffeescriptcookbook.com/chapters/regular_expressions/replacing-substrings',
74
79
  'http://coffeescriptcookbook.com/chapters/regular_expressions/replacing-html-tags-with-html-named-entities',
75
80
  'http://coffeescriptcookbook.com/chapters/regular_expressions/heregexes',
76
81
  'http://coffeescriptcookbook.com/chapters/regular_expressions/searching-for-substrings',
77
- 'http://coffeescriptcookbook.com/chapters/networking',
82
+ 'http://coffeescriptcookbook.com/chapters/networking/',
78
83
  'http://coffeescriptcookbook.com/chapters/networking/bi-directional-server',
79
84
  'http://coffeescriptcookbook.com/chapters/networking/bi-directional-client',
80
85
  'http://coffeescriptcookbook.com/chapters/networking/basic-client',
81
86
  'http://coffeescriptcookbook.com/chapters/networking/basic-http-client',
82
87
  'http://coffeescriptcookbook.com/chapters/networking/basic-server',
83
88
  'http://coffeescriptcookbook.com/chapters/networking/basic-http-server',
84
- 'http://coffeescriptcookbook.com/chapters/design_patterns',
89
+ 'http://coffeescriptcookbook.com/chapters/design_patterns/',
85
90
  'http://coffeescriptcookbook.com/chapters/design_patterns/builder',
86
91
  'http://coffeescriptcookbook.com/chapters/design_patterns/bridge',
87
92
  'http://coffeescriptcookbook.com/chapters/design_patterns/decorator',
@@ -91,11 +96,15 @@ config[:urls] = [
91
96
  'http://coffeescriptcookbook.com/chapters/design_patterns/strategy',
92
97
  'http://coffeescriptcookbook.com/chapters/design_patterns/memento',
93
98
  'http://coffeescriptcookbook.com/chapters/design_patterns/singleton',
94
- 'http://coffeescriptcookbook.com/chapters/databases',
99
+ 'http://coffeescriptcookbook.com/chapters/databases/',
95
100
  'http://coffeescriptcookbook.com/chapters/databases/mongodb',
96
- 'http://coffeescriptcookbook.com/chapters/databases/sqlite']
101
+ 'http://coffeescriptcookbook.com/chapters/databases/sqlite',
102
+ 'http://coffeescriptcookbook.com/chapters/testing/',
103
+ 'http://coffeescriptcookbook.com/chapters/testing/testing_with_jasmine']
97
104
  config[:savedir] = '~/Tech/Javascript/COFFEESCRIPT/DOCUMENTATION'
98
105
  config[:savename] = 'CoffeeScript_Cookbook.pdf'
99
106
  config[:css] = ['http://coffeescriptcookbook.com/css/default.css']
107
+ config[:debug] = true
108
+ config[:overwrite_existing_pdf] = true
100
109
 
101
110
  HtmlsToPdf.new(config).create_pdf
@@ -0,0 +1,61 @@
1
+ require 'rubygems'
2
+ require 'htmls_to_pdf'
3
+
4
+ # Get Pivotal Labs' "Jasmine Wiki" as pdf file
5
+ # Source: 'https://github.com/pivotal/jasmine/wiki/'
6
+ #
7
+
8
+ config = {}
9
+ config[:urls] = ['https://github.com/pivotal/jasmine/wiki/Background',
10
+ 'https://github.com/pivotal/jasmine/wiki/Suites-and-specs',
11
+ 'https://github.com/pivotal/jasmine/wiki/Matchers',
12
+ 'https://github.com/pivotal/jasmine/wiki/Before-and-After',
13
+ 'https://github.com/pivotal/jasmine/wiki/Spies',
14
+ 'https://github.com/pivotal/jasmine/wiki/Asynchronous-specs',
15
+ 'https://github.com/pivotal/jasmine/wiki/A-simple-project',
16
+ 'https://github.com/pivotal/jasmine/wiki/A-ruby-project-%28with-or-without-rails%29',
17
+ 'https://github.com/pivotal/jasmine/wiki/Spider-monkey',
18
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.html',
19
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Spy.html',
20
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_base.js.html',
21
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Block.html',
22
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Block.js.html',
23
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Clock.html',
24
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_mock-timeout.js.html',
25
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Env.html',
26
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Env.js.html',
27
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.JsApiReporter.html',
28
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_JsApiReporter.js.html',
29
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Matchers.html',
30
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Matchers.js.html',
31
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.NestedResults.html',
32
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_NestedResults.js.html',
33
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_PrettyPrinter.js.html',
34
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Reporter.html',
35
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.MultiReporter.html',
36
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_html_TrivialReporter.js.html',
37
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Reporter.js.html',
38
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_MultiReporter.js.html',
39
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Runner.html',
40
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Runner.js.html',
41
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Queue.js.html',
42
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Spec.html',
43
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Spec.js.html',
44
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Suite.html',
45
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_Suite.js.html',
46
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.util.html',
47
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_util.js.html',
48
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.WaitsForBlock.html',
49
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_WaitsBlock.js.html',
50
+ 'http://pivotal.github.com/jasmine/jsdoc/symbols/src/src_core_WaitsForBlock.js.html']
51
+
52
+ config[:savedir] = '~/Tech/Javascript/JASMINE'
53
+ #config[:css] = ['https://a248.e.akamai.net/assets.github.com/assets/github-d32e243bf8eb8ccb9713860d2989f567c74780f5.css',
54
+ # 'https://a248.e.akamai.net/assets.github.com/assets/github2-9618739f589609d8af1547d00def64a14f3f4410.css']
55
+ config[:css] = 'div#header{display:none;} ul.tabs{display:none;} div#logo-popup{display:none;} div#footer{display:none;} div#markdown-help{display:none;} div.pagehead{display:none;} ul.wiki-actions{display:none;} div#keyboard_shortcuts_pane{display:none;} div.js-hidden-pane{display:none;} div#ajax-error-message{display:none;}'
56
+ config[:savename] = 'Jasmine_wiki.pdf'
57
+ config[:remove_css_files] = true
58
+ config[:remove_html_files] = false
59
+ config[:overwrite_existing_pdf] = true
60
+
61
+ HtmlsToPdf.new(config).create_pdf
@@ -41,8 +41,12 @@ config[:urls] = [
41
41
  ]
42
42
  config[:savedir] = '~/Tech/Rails/RAILS_GUIDES'
43
43
  config[:savename] = 'Ruby_on_Rails_Guides.pdf'
44
- config[:css] = [
45
- 'http://guides.rubyonrails.org/stylesheets/print.css']
44
+ config[:css] = ['http://guides.rubyonrails.org/stylesheets/style.css',
45
+ 'http://guides.rubyonrails.org/stylesheets/print.css',
46
+ 'http://guides.rubyonrails.org/stylesheets/syntaxhighlighter/shCore.css',
47
+ 'http://guides.rubyonrails.org/stylesheets/syntaxhighlighter/shThemeRailsGuides.css',
48
+ 'http://guides.rubyonrails.org/stylesheets/fixes.css']
46
49
  config[:remove_temp_files] = true
50
+ config[:overwrite_existing_pdf] = true
47
51
 
48
52
  HtmlsToPdf.new(config).create_pdf
@@ -7,109 +7,111 @@ require 'htmls_to_pdf'
7
7
  config = {}
8
8
  config[:urls] = [
9
9
  'https://www.relishapp.com/rspec/rspec-core/docs',
10
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/autotest',
11
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/example-groups',
12
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/example-groups/basic-structure-describe-it',
13
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/example-groups/shared-examples',
14
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/example-groups/shared-context',
15
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line',
16
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/example-option',
17
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/format-option',
18
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/line-number-option',
19
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/tag-option',
20
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/line-number-appended-to-file-path',
21
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/exit-status',
22
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/rake-task',
23
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/init-option',
24
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/order-new-in-rspec-core-2-8',
25
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/pattern-option',
26
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/command-line/run-with-ruby-command',
27
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/pending/pending-examples',
28
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/hooks/before-and-after-hooks',
29
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/hooks/around-hooks',
30
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/hooks/filters',
31
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/subject/implicitly-defined-subject',
32
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/subject/explicit-subject',
33
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/subject/attribute-of-subject',
34
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/subject/implicit-receiver',
35
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/helper-methods/let-and-let',
36
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/helper-methods/arbitrary-helper-methods',
37
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/helper-methods/define-helper-methods-in-a-module',
38
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/metadata/current-example',
39
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/metadata/described-class',
40
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/metadata/user-defined-metadata',
41
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/filtering/inclusion-filters',
42
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/filtering/exclusion-filters',
43
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/filtering/if-and-unless',
44
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/filtering/run-all-when-everything-filtered',
45
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/configuration/read-command-line-configuration-options-from-files',
46
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/configuration/fail-fast',
47
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/configuration/custom-settings',
48
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/configuration/alias-example-to',
49
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/configuration/default-path',
50
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/expectation-framework-integration/configure-expectation-framework',
51
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/mock-framework-integration/mock-with-rspec',
52
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/mock-framework-integration/mock-with-flexmock',
53
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/mock-framework-integration/mock-with-mocha',
54
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/mock-framework-integration/mock-with-rr',
55
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/mock-framework-integration/mock-with-an-alternative-framework',
56
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/formatters/custom-formatters',
57
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/formatters/text-formatter',
58
- 'https://www.relishapp.com/rspec/rspec-core/v/2-8/docs/spec-files/arbitrary-file-suffix',
10
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/upgrade',
11
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/autotest',
12
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups',
13
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups/basic-structure-describe-it',
14
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups/shared-examples',
15
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups/shared-context',
16
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line',
17
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/example-option',
18
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/format-option',
19
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/line-number-option',
20
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/tag-option',
21
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/line-number-appended-to-file-path',
22
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/exit-status',
23
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/rake-task',
24
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/init-option',
25
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/order-new-in-rspec-core-2-8',
26
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/pattern-option',
27
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/command-line/run-with-ruby-command',
28
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/pending/pending-examples',
29
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/hooks/before-and-after-hooks',
30
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/hooks/around-hooks',
31
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/hooks/filters',
32
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/subject/implicitly-defined-subject',
33
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/subject/explicit-subject',
34
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/subject/attribute-of-subject',
35
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/subject/implicit-receiver',
36
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/helper-methods/let-and-let',
37
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/helper-methods/arbitrary-helper-methods',
38
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/helper-methods/define-helper-methods-in-a-module',
39
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/metadata/current-example',
40
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/metadata/described-class',
41
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/metadata/user-defined-metadata',
42
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/filtering/inclusion-filters',
43
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/filtering/exclusion-filters',
44
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/filtering/if-and-unless',
45
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/filtering/run-all-when-everything-filtered',
46
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/configuration/read-command-line-configuration-options-from-files',
47
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/configuration/fail-fast',
48
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/configuration/custom-settings',
49
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/configuration/alias-example-to',
50
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/configuration/default-path',
51
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/expectation-framework-integration/configure-expectation-framework',
52
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/mock-framework-integration/mock-with-rspec',
53
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/mock-framework-integration/mock-with-flexmock',
54
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/mock-framework-integration/mock-with-mocha',
55
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/mock-framework-integration/mock-with-rr',
56
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/mock-framework-integration/mock-with-an-alternative-framework',
57
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/formatters/custom-formatters',
58
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/formatters/text-formatter',
59
+ 'https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/spec-files/arbitrary-file-suffix',
59
60
  'https://www.relishapp.com/rspec/rspec-expectations/docs',
60
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/customized-message',
61
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/diffing',
62
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/implicit-docstrings',
63
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers',
64
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/be-matchers',
65
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/be-within-matcher',
66
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/equality-matchers',
67
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/exist-matcher',
68
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/expect-change',
69
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/raise-error-matcher',
70
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/have-n-items-matcher',
71
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/include-matcher',
72
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/match-matcher',
73
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/operator-matchers',
74
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/predicate-matchers',
75
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/respond-to-matcher',
76
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/satisfy-matcher',
77
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/throw-symbol-matcher',
78
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/specify-types-of-objects',
79
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/cover-matcher',
80
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/custom-matchers',
81
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/custom-matchers/define-matcher',
82
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/custom-matchers/define-diffable-matcher',
83
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/custom-matchers/define-matcher-with-fluent-interface',
84
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/custom-matchers/access-running-example',
85
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/custom-matchers/define-matcher-outside-rspec',
86
- 'https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/test-frameworks/test-unit-integration',
61
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/customized-message',
62
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/diffing',
63
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/implicit-docstrings',
64
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers',
65
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/be-matchers',
66
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/be-within-matcher',
67
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/equality-matchers',
68
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/exist-matcher',
69
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/expect-change',
70
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/raise-error-matcher',
71
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/have-n-items-matcher',
72
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/include-matcher',
73
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/match-matcher',
74
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/operator-matchers',
75
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/predicate-matchers',
76
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/respond-to-matcher',
77
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/satisfy-matcher',
78
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/throw-symbol-matcher',
79
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/specify-types-of-objects',
80
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/cover-matcher',
81
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/custom-matchers',
82
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/custom-matchers/define-matcher',
83
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/custom-matchers/define-diffable-matcher',
84
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/custom-matchers/define-matcher-with-fluent-interface',
85
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/custom-matchers/access-running-example',
86
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/custom-matchers/define-matcher-outside-rspec',
87
+ 'https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/test-frameworks/test-unit-integration',
87
88
  'https://www.relishapp.com/rspec/rspec-mocks/docs',
88
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/method-stubs',
89
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/method-stubs/stub-with-a-simple-return-value',
90
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/method-stubs/stub-with-substitute-implementation',
91
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/method-stubs/stub-a-chain-of-methods',
92
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/method-stubs/stub-on-any-instance-of-a-class',
93
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/method-stubs/as-null-object',
94
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/method-stubs/double-handling-to-ary',
95
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/message-expectations',
96
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/message-expectations/expect-a-message',
97
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/message-expectations/expect-a-message-on-any-instance-of-a-class',
98
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/message-expectations/warn-when-expectation-is-set-on-nil',
99
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/message-expectations/receive-counts',
100
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/argument-matchers',
101
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/argument-matchers/explicit-arguments',
102
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/argument-matchers/general-matchers',
103
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/argument-matchers/stub-with-argument-constraints',
104
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/outside-rspec/configure-any-test-framework-to-use-rspec-mocks',
105
- 'https://www.relishapp.com/rspec/rspec-mocks/v/2-8/docs/outside-rspec/standalone'
89
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs',
90
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs/stub-with-a-simple-return-value',
91
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs/stub-with-substitute-implementation',
92
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs/stub-a-chain-of-methods',
93
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs/stub-on-any-instance-of-a-class',
94
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs/as-null-object',
95
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs/double-handling-to-ary',
96
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/message-expectations',
97
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/message-expectations/expect-a-message',
98
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/message-expectations/expect-a-message-on-any-instance-of-a-class',
99
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/message-expectations/warn-when-expectation-is-set-on-nil',
100
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/message-expectations/receive-counts',
101
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/argument-matchers',
102
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/argument-matchers/explicit-arguments',
103
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/argument-matchers/general-matchers',
104
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/argument-matchers/stub-with-argument-constraints',
105
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/outside-rspec/configure-any-test-framework-to-use-rspec-mocks',
106
+ 'https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/outside-rspec/standalone'
106
107
  ]
107
108
  config[:savedir] = '~/Tech/Ruby/TESTING/RSPEC'
108
109
  config[:savename] = 'RSpec_documentation.pdf'
109
110
  config[:css] = [
110
- 'https://www.relishapp.com/stylesheets/global.css',
111
+ #'https://www.relishapp.com/stylesheets/global.css',
111
112
  #'https://www.relishapp.com/stylesheets/application.css',
112
113
  'https://www.relishapp.com/stylesheets/print.css']
113
114
  config[:remove_temp_files] = true
115
+ config[:debug] = true
114
116
 
115
117
  HtmlsToPdf.new(config).create_pdf
@@ -4,42 +4,44 @@ require 'pdfkit'
4
4
  require 'uri'
5
5
  #include URI
6
6
  require 'net/http'
7
+ require 'net/https'
7
8
 
9
+ # HtmlsToPdf.new takes a configuration hash and returns an object with a create_pdf() method
10
+ # Calling create_pdf() on the HtmlsToPdf object generates a PDF file configured according to
11
+ # the configuration hash settings
12
+ #
13
+ # Usage:
14
+ # HtmlsToPdf.new(options_hash).create_pdf
8
15
  class HtmlsToPdf
9
16
 
10
- attr_reader :htmlarray, :pdfarray, :cssarray, :urls, :savedir, :savename, :remove_temp_files, :remove_html_files, :remove_css_files, :remove_tmp_pdf_files, :options, :overwrite_existing_pdf
17
+ attr_accessor :debug, :htmlarray, :pdfarray, :cssarray, :urls, :savedir, :savename, :remove_temp_files, :remove_html_files, :remove_css_files, :remove_tmp_pdf_files, :options, :overwrite_existing_pdf
11
18
 
12
19
  TMP_HTML_PREFIX = 'tmp_html_file_'
13
20
  TMP_PDF_PREFIX = 'tmp_pdf_file_'
14
21
 
15
- def initialize(in_config = {})
16
- config = {
17
- :css => [],
18
- :remove_css_files => true,
19
- :remove_html_files => true,
20
- :remove_tmp_pdf_files => true,
21
- :overwrite_existing_pdf => false,
22
- :options => {},
23
- :savedir => "~",
24
- :savename => 'htmls_to_pdf.pdf'
25
- }.merge(in_config)
26
- set_dir(File.expand_path(config[:savedir]))
27
- @savename = config[:savename]
28
- @overwrite_existing_pdf = config[:overwrite_existing_pdf]
22
+ def initialize(config = {})
23
+ defaults = {
24
+ remove_css_files: true,
25
+ remove_html_files: true,
26
+ remove_tmp_pdf_files: true,
27
+ overwrite_existing_pdf: false,
28
+ savedir: "~",
29
+ savename: 'htmls_to_pdf.pdf',
30
+ debug: false
31
+ }
32
+ config = defaults.merge!(config)
33
+
34
+ set_instance_vars(config)
35
+
36
+ set_dir(@savedir)
37
+
29
38
  exit_if_pdf_exists unless @overwrite_existing_pdf
30
- @urls = clean_urls(config[:urls])
31
- @pdfarray = create_pdfarray
32
- @cssarray = config[:css].kind_of?(Array) ? config[:css] : Array[ config[:css] ]
33
- @remove_css_files = config[:remove_css_files]
34
- @remove_html_files = config[:remove_html_files]
35
- @remove_tmp_pdf_files = config[:remove_tmp_pdf_files]
36
- @remove_css_files = @remove_html_files = @remove_tmp_pdf_files = true if in_config[:remove_temp_files]
37
- @options = config[:options]
38
39
  end
39
40
 
40
41
  def create_pdf
41
42
  clean_temp_files
42
- download_files
43
+ get_temp_files
44
+ # update_asset_urls
43
45
  generate_pdfs
44
46
  join_pdfs
45
47
  clean_temp_files
@@ -47,6 +49,21 @@ class HtmlsToPdf
47
49
 
48
50
  private
49
51
 
52
+ def set_instance_vars(config)
53
+ @savedir = File.expand_path(config[:savedir])
54
+ @savename = config[:savename]
55
+ @overwrite_existing_pdf = config[:overwrite_existing_pdf]
56
+ @urls = clean_urls(config[:urls])
57
+ @pdfarray = create_pdfarray
58
+ @cssarray = Array(config[:css])
59
+ @remove_css_files = config[:remove_css_files]
60
+ @remove_html_files = config[:remove_html_files]
61
+ @remove_tmp_pdf_files = config[:remove_tmp_pdf_files]
62
+ @remove_css_files = @remove_html_files = @remove_tmp_pdf_files = true if config[:remove_temp_files]
63
+ @debug = config[:debug]
64
+ @options = config[:options] || {}
65
+ end
66
+
50
67
  def clean_temp_files
51
68
  delete_html_files if @remove_html_files
52
69
  delete_css_files if @remove_css_files
@@ -78,6 +95,16 @@ class HtmlsToPdf
78
95
  urls.map { |url| url.match(/\.s?html?$/) ? url : url + '.html' }
79
96
  end
80
97
 
98
+ def update_asset_urls
99
+ img_urls = []
100
+ html_array.each do |html_file|
101
+ File.open(html_file) do |f|
102
+ img_urls
103
+ end
104
+ end
105
+ exit
106
+ end
107
+
81
108
  def create_pdfarray
82
109
  outarray = []
83
110
  (0...@urls.length).each do |idx|
@@ -87,63 +114,109 @@ class HtmlsToPdf
87
114
  end
88
115
 
89
116
  def exit_if_pdf_exists
90
- if File.exists?(@savename)
91
- puts "File #{@savename} already exists. Please rename or delete and re-run this program."
117
+ if File.exists?(savename)
118
+ message = "File #{savename} already exists in #{savedir}. Please rename or delete and re-run this program."
119
+ puts message
92
120
  exit
93
121
  end
94
122
  end
95
123
 
96
124
  def set_dir(savedir)
97
- @savedir = savedir
98
- save_to = File.expand_path(savedir)
99
- FileUtils.mkdir_p(save_to)
100
- Dir.chdir(save_to)
125
+ FileUtils.mkdir_p(savedir)
126
+ Dir.chdir(savedir)
101
127
  end
102
128
 
103
129
  #def add_css(css_file)
104
130
  # @cssarray << css_file
105
131
  #end
106
132
 
107
- def download_files
108
- download_html_files
109
- download_css_files
133
+ def get_temp_files
134
+ get_html_files
135
+ get_css_files
110
136
  end
111
137
 
112
- def save_url_to_savename(url, savename)
138
+ def get_http_https(url)
113
139
  uri = URI.parse(url)
114
- file_content = Net::HTTP.get_response(uri).body
115
- File.open(savename, 'w') { |f| f.write(file_content) }
140
+ if /^https:\/\//.match(url)
141
+ https = Net::HTTP.new(uri.host, uri.port)
142
+ https.use_ssl = true
143
+ https.verify_mode = OpenSSL::SSL::VERIFY_NONE
144
+ request = Net::HTTP::Get.new(uri.request_uri)
145
+ puts "Downloading #{url}" if debug
146
+ response = https.request(request)
147
+ return response.body
148
+ elsif /^http:\/\//.match(url)
149
+ puts "Downloading #{url}" if debug
150
+ return Net::HTTP.get_response(uri).body
151
+ else
152
+ raise "Cannot parse URI: #{uri}"
153
+ end
154
+ end
155
+
156
+ def save_url_to_filename(url, filename)
157
+ file_content = get_http_https(url)
158
+ puts "Saving #{url} to #{filename}" if debug
159
+ File.open(filename, 'w') { |f| f.write(file_content) }
160
+ end
161
+
162
+ def save_string_to_filename(string, filename)
163
+ puts "Saving to #{filename}" if debug
164
+ File.open(filename, 'w') { |f| f.write(string) }
116
165
  end
117
166
 
118
- def download_html_files
167
+ def get_html_files
119
168
  existing_files = Dir.entries(".")
120
169
  @htmlarray = []
121
170
  @urls.each_with_index do |url,idx|
122
- savename = TMP_HTML_PREFIX + idx.to_s
123
- unless existing_files.include?(savename)
124
- save_url_to_savename(url, savename)
125
- #`wget #{url} -O #{savename}`
171
+ filename = TMP_HTML_PREFIX + idx.to_s
172
+ unless existing_files.include?(filename)
173
+ puts "Saving #{url} to #{filename}" if debug
174
+ save_url_to_filename(url, filename)
175
+ #`wget #{url} -O #{filename}`
126
176
  end
127
- @htmlarray << savename
177
+ @htmlarray << filename
128
178
  end
129
179
  end
130
180
 
131
- def download_css_files
132
- existing_files = Dir.entries(".")
133
- @cssarray.each do |css_url|
134
- savename = File.basename(css_url)
135
- next if existing_files.include?(savename)
136
- save_url_to_savename(css_url, savename)
137
- #`wget #{css_url}` unless existing_files.include?(File.basename(css_url))
181
+ # accepts css files as URLs or as text strings
182
+ def process_css_input(css_input)
183
+ begin
184
+ URI::regexp.match(css_input)
185
+ process_css_url(css_input)
186
+ rescue URI::InvalidURIError
187
+ process_css_string(css_input)
138
188
  end
139
189
  end
140
190
 
191
+ def process_css_url(css_url)
192
+ filename = File.basename(css_url)
193
+ existing_files = Dir.entries(".")
194
+ return filename if existing_files.include?(filename)
195
+ puts "Saving #{css_url} to #{filename}" if debug
196
+ save_url_to_filename(css_url, filename)
197
+ return filename
198
+ end
199
+
200
+ def process_css_string(css_string)
201
+ #filename = rand(36**7).to_s(36) + '.css'
202
+ filename = Digest::SHA1.hexdigest(css_string) + '.css'
203
+ existing_files = Dir.entries(".")
204
+ return filename if existing_files.include?(filename)
205
+ puts "Saving #{css_string} to #{filename}" if debug
206
+ save_string_to_filename(css_string, filename)
207
+ return filename
208
+ end
209
+
210
+ def get_css_files
211
+ @cssarray.map! { |css_input| process_css_input(css_input) }
212
+ end
213
+
141
214
  def generate_pdfs
142
215
  @urls.each_with_index { |url,i| html_to_pdf(TMP_HTML_PREFIX + i.to_s,@pdfarray[i]) }
143
216
  end
144
217
 
145
218
  def html_to_pdf(html_file,pdf_file)
146
- puts "creating #{pdf_file} from #{html_file}"
219
+ puts "Creating #{pdf_file} from #{html_file}" if debug
147
220
  html = nil
148
221
  unless Dir.entries(".").include?(pdf_file)
149
222
  File.open(html_file, 'r') { |inf| html = inf.read }
@@ -155,22 +228,27 @@ class HtmlsToPdf
155
228
  end
156
229
 
157
230
  def join_pdfs
158
- unless File.exists?(@savename) && !overwrite_existing_pdf
231
+ unless File.exists?(savename) && !overwrite_existing_pdf
232
+ puts "Merging PDF files into single PDF #{savename}" if debug
159
233
  pdfs_string = @pdfarray.join(" ")
160
- `pdftk #{pdfs_string} output #{@savename}`
234
+ `pdftk #{pdfs_string} output #{savename}`
235
+ puts "Saved PDF file as #{savedir}/#{savename}"
161
236
  end
162
237
  end
163
238
 
164
239
  def delete_tmp_pdf_files
240
+ puts "Deleting temporary PDF files" if debug
165
241
  @pdfarray.each { |pdffile| File.delete(pdffile) if File.exist?(File.basename(pdffile)) } unless @pdfarray.empty?
166
242
  end
167
243
 
168
244
  def delete_html_files
245
+ puts "Deleting HTML files" if debug
169
246
  to_delete = Dir.glob("#{TMP_HTML_PREFIX}*")
170
247
  to_delete.each { |f| File.delete(f) }
171
248
  end
172
249
 
173
250
  def delete_css_files
251
+ puts "Deleting CSS files" if debug
174
252
  @cssarray.each { |cssfile| File.delete(File.basename(cssfile)) if File.exist?(File.basename(cssfile)) } unless @cssarray.empty?
175
253
  end
176
254
 
@@ -1,3 +1,3 @@
1
1
  module HtmlsToPdf
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -1,13 +1,17 @@
1
1
  require "spec_helper"
2
2
  require 'htmls_to_pdf'
3
3
 
4
- describe "initialization" do
4
+ describe HtmlsToPdf do
5
+
6
+ let(:url_arr) { %w(http://www.fakeurl.com/adfsdafds.html https://fakesshurl.com/blog/posts/143.htm) }
7
+
8
+ subject { HtmlsToPdf.new(in_config) }
9
+
5
10
  context "without argument" do
6
- let(:in_config) { }
7
- subject { HtmlsToPdf.new }
8
- it "should initialize" do
9
- subject.should be_true
10
- end
11
+
12
+ let(:in_config) { {} }
13
+
14
+ it { should be_true }
11
15
  its(:overwrite_existing_pdf) { should be_false }
12
16
  its(:remove_temp_files) { should be_false }
13
17
  its(:remove_css_files) { should be_true }
@@ -17,20 +21,21 @@ describe "initialization" do
17
21
  its(:urls) { should be_empty }
18
22
  its(:savedir) { should == File.expand_path("~") }
19
23
  its(:savename) { should == 'htmls_to_pdf.pdf' }
24
+ its(:debug) { should be_false }
20
25
  its(:options) { should be_kind_of Hash }
21
26
  its(:options) { should be_empty }
27
+
22
28
  end
29
+
23
30
  context "with basic config" do
24
- let(:url_arr) { %w(http://www.fakeurl.com/adfsdafds.html https://anotherfakedomain.com/blog/posts/143.htm) }
31
+
32
+
25
33
  let(:in_config) { {savedir: '~/my/savedir',
26
34
  savename: 'Name_to_save_file_as.pdf',
27
35
  urls: url_arr }
28
36
  }
29
- subject { HtmlsToPdf.new(in_config) }
30
- #subject { HtmlsToPdf.new(attributes_for(:config)) }
31
- it "should initialize" do
32
- subject.should be_true
33
- end
37
+
38
+ it { should be_true }
34
39
  its(:overwrite_existing_pdf) { should be_false }
35
40
  its(:remove_temp_files) { should be_false }
36
41
  its(:remove_css_files) { should be_true }
@@ -44,15 +49,95 @@ describe "initialization" do
44
49
  its(:options) { should be_empty }
45
50
  it "should call all subfunctions of create_pdf" do
46
51
  subject.should_receive(:clean_temp_files).twice.and_return('Temp files cleaned')
47
- subject.should_receive(:download_files).once.and_return('HTML files downloaded')
52
+ subject.should_receive(:get_temp_files).once.and_return('HTML files downloaded')
48
53
  subject.should_receive(:generate_pdfs).once.and_return('PDF files generated')
49
54
  subject.should_receive(:join_pdfs).once.and_return('PDF files joined')
55
+ stub_request(:get, "http://www.fakeurl.com/adfsdafds.html").
56
+ with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
57
+ to_return(:status => 200, :body => "", :headers => {})
58
+ stub_request(:get, "https://fakesshurl.com/blog/posts/143.htm").
59
+ with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
60
+ to_return(:status => 200, :body => "", :headers => {})
50
61
  subject.create_pdf
51
62
  end
63
+
64
+ end
65
+
66
+ context "with debug" do
67
+
68
+ let(:in_config) { {savedir: '~/my/savedir',
69
+ savename: 'Name_to_save_file_as.pdf',
70
+ urls: url_arr,
71
+ debug: true } }
72
+
73
+ its(:debug) { should be_true }
74
+
75
+ it "should output the correct debugging information" do
76
+ subject.should_receive(:clean_temp_files).twice.and_return('Temp files cleaned')
77
+ # let subject.get_temp_files play out
78
+ STDOUT.should_receive(:write).at_least(:once).with("Downloading #{url_arr[0]}")
79
+ STDOUT.should_receive(:write).at_least(:once).with("Saving #{url_arr[0]} to tmp_html_file_0")
80
+ STDOUT.should_receive(:write).at_least(:once).with("\n") # I have no idea why this is necessary, but test fails without it
81
+ STDOUT.should_receive(:write).at_least(:once).with("Downloading #{url_arr[1]}")
82
+ STDOUT.should_receive(:write).at_least(:once).with("Saving #{url_arr[1]} to tmp_html_file_1")
83
+ subject.should_receive(:generate_pdfs).once.and_return('PDF files generated')
84
+ subject.should_receive(:join_pdfs).once.and_return('PDF files joined')
85
+ stub_request(:get, "http://www.fakeurl.com/adfsdafds.html").
86
+ with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
87
+ to_return(:status => 200, :body => "", :headers => {})
88
+ stub_request(:get, "https://fakesshurl.com/blog/posts/143.htm").
89
+ with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
90
+ to_return(:status => 200, :body => "", :headers => {})
91
+ subject.create_pdf
92
+ end
93
+
94
+ end
95
+
96
+ context "if savename already exists" do
97
+
98
+ let(:in_config) { {savedir: '~/my/savedir',
99
+ savename: 'Name_to_save_file_as.pdf',
100
+ urls: url_arr } }
101
+ before do
102
+ @dirname = File.expand_path('~/my/savedir')
103
+ FileUtils.mkdir_p(@dirname)
104
+ FileUtils.touch(@dirname + '/Name_to_save_file_as.pdf')
105
+ end
106
+
107
+ it "should generate an informative error message" do
108
+ # I really want to test message, but the test fails
109
+ # message = "File Name_to_save_file_as.pdf already exists in #{@dirname}. Please rename or delete and re-run this program."
110
+ # $stdout.should_receive(:write).at_least(:once).with(message)
111
+ $stdout.should_receive(:write).at_least(:once)
112
+ begin
113
+ subject
114
+ rescue SystemExit
115
+ end
116
+ end
117
+
118
+ it "should terminate" do
119
+ expect { subject }.to raise_error SystemExit
120
+ end
121
+
52
122
  end
123
+
124
+ context "if savedir does not already exist" do
125
+
126
+ let(:in_config) { {savedir: '~/my/savedir',
127
+ savename: 'Name_to_save_file_as.pdf',
128
+ urls: url_arr } }
129
+
130
+ it "should create savedir" do
131
+ subject
132
+ File.directory?(File.expand_path('~/my/savedir')).should be_true
133
+ end
134
+
135
+ end
136
+
53
137
  context "with more complicated config" do
54
- let(:url_arr) { %w(http://www.fakeurl.com/adfsdafds.html https://anotherfakedomain.com/blog/posts/143.htm) }
55
- let(:css_arr) { %w(http://fakeurl.com/assets/cssfile.css https://www.anotherfakedomain.com/public/css/CSS-file.css) }
138
+
139
+ let(:css_arr) { %w(http://fakeurl.com/assets/cssfile.css https://www.fakesshurl.com/public/css/CSS-file.css) }
140
+
56
141
  let(:in_config) { {savedir: '~/my/savedir',
57
142
  savename: 'Name_to_save_file_as.pdf',
58
143
  urls: url_arr,
@@ -61,11 +146,8 @@ describe "initialization" do
61
146
  remove_html_files: false,
62
147
  overwrite_existing_pdf: true }
63
148
  }
64
- subject { HtmlsToPdf.new(in_config) }
65
- #subject { HtmlsToPdf.new(attributes_for(:config)) }
66
- it "should initialize" do
67
- subject.should be_true
68
- end
149
+
150
+ it { should be_true }
69
151
  its(:overwrite_existing_pdf) { should be_true }
70
152
  its(:remove_temp_files) { should be_false }
71
153
  its(:remove_css_files) { should be_false }
@@ -77,24 +159,29 @@ describe "initialization" do
77
159
  its(:savename) { should == 'Name_to_save_file_as.pdf' }
78
160
  its(:options) { should be_kind_of Hash }
79
161
  its(:options) { should be_empty }
162
+
80
163
  it "should call all subfunctions of create_pdf" do
81
164
  subject.should_receive(:clean_temp_files).twice.and_return('Temp files cleaned')
82
- subject.should_receive(:download_files).once.and_return('HTML files downloaded')
165
+ subject.should_receive(:get_temp_files).once.and_return('HTML files downloaded')
83
166
  subject.should_receive(:generate_pdfs).once.and_return('PDF files generated')
84
167
  subject.should_receive(:join_pdfs).once.and_return('PDF files joined')
168
+ stub_request(:get, "http://www.fakeurl.com/adfsdafds.html").
169
+ with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
170
+ to_return(:status => 200, :body => "", :headers => {})
85
171
  subject.create_pdf
86
172
  end
173
+
87
174
  it "should not delete html or css files" do
88
175
  stub_request(:get, "http://www.fakeurl.com/adfsdafds.html").
89
176
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
90
177
  to_return(:status => 200, :body => "", :headers => {})
91
- stub_request(:get, "http://anotherfakedomain.com:443/blog/posts/143.htm").
178
+ stub_request(:get, "https://fakesshurl.com/blog/posts/143.htm").
92
179
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
93
180
  to_return(:status => 200, :body => "", :headers => {})
94
181
  stub_request(:get, "http://fakeurl.com/assets/cssfile.css").
95
182
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
96
183
  to_return(:status => 200, :body => "", :headers => {})
97
- stub_request(:get, "http://www.anotherfakedomain.com:443/public/css/CSS-file.css").
184
+ stub_request(:get, "https://www.fakesshurl.com/public/css/CSS-file.css").
98
185
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
99
186
  to_return(:status => 200, :body => "", :headers => {})
100
187
  subject.should_receive(:generate_pdfs).once.and_return('PDF files generated')
@@ -103,27 +190,29 @@ describe "initialization" do
103
190
  subject.should_not_receive(:delete_css_files)
104
191
  subject.create_pdf
105
192
  end
193
+
106
194
  it "should request the HTML files" do
107
195
  stub_request(:get, "http://www.fakeurl.com/adfsdafds.html").
108
196
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
109
197
  to_return(:status => 200, :body => "", :headers => {})
110
- stub_request(:get, "http://anotherfakedomain.com:443/blog/posts/143.htm").
198
+ stub_request(:get, "https://fakesshurl.com/blog/posts/143.htm").
111
199
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
112
200
  to_return(:status => 200, :body => "", :headers => {})
113
201
  stub_request(:get, "http://fakeurl.com/assets/cssfile.css").
114
202
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
115
203
  to_return(:status => 200, :body => "", :headers => {})
116
- stub_request(:get, "http://www.anotherfakedomain.com:443/public/css/CSS-file.css").
204
+ stub_request(:get, "https://www.fakesshurl.com/public/css/CSS-file.css").
117
205
  with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
118
206
  to_return(:status => 200, :body => "", :headers => {})
119
207
  subject.should_receive(:generate_pdfs).once.and_return('PDF files generated')
120
208
  subject.should_receive(:join_pdfs).once.and_return('PDF files joined')
121
209
  subject.create_pdf
122
210
  a_request(:get, "www.fakeurl.com/adfsdafds.html").should have_been_made
123
- a_request(:get, "anotherfakedomain.com:443/blog/posts/143.htm").should have_been_made
211
+ a_request(:get, "https://fakesshurl.com/blog/posts/143.htm").should have_been_made
124
212
  a_request(:get, "fakeurl.com/assets/cssfile.css").should have_been_made
125
- a_request(:get, "www.anotherfakedomain.com:443/public/css/CSS-file.css").should have_been_made
213
+ a_request(:get, "https://www.fakesshurl.com/public/css/CSS-file.css").should have_been_made
126
214
  end
127
215
 
128
216
  end
217
+
129
218
  end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: htmls_to_pdf
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.8
5
+ version: 0.0.9
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Lavin
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-29 00:00:00.000000000Z
12
+ date: 2012-08-24 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pdfkit
@@ -68,11 +68,13 @@ files:
68
68
  - .gitignore
69
69
  - README.markdown
70
70
  - examples/get_12factor.rb
71
+ - examples/get_backbone_fundamentals.rb
71
72
  - examples/get_bash_guide.rb
72
73
  - examples/get_coffeescript.rb
73
74
  - examples/get_coffeescript_cookbook.rb
74
75
  - examples/get_coffeescript_meet_backbone.rb
75
76
  - examples/get_exploring_coffeescript.rb
77
+ - examples/get_jasmine_wiki.rb
76
78
  - examples/get_jumpstartlabs_advanced_rails.rb
77
79
  - examples/get_little_book_on_coffeescript.rb
78
80
  - examples/get_nlp_for_working_programmer.rb