code2pdf 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +2 -0
- data/Gemfile.lock +12 -2
- data/README.textile +2 -2
- data/bin/code2pdf +8 -60
- data/code2pdf.gemspec +2 -2
- data/lib/code2pdf.rb +3 -0
- data/lib/code2pdf/convert_to_pdf.rb +65 -4
- data/lib/code2pdf/version.rb +1 -1
- data/spec/code2pdf/convert_to_pdf_spec.rb +32 -0
- data/spec/fixtures/hello_world/.code2pdf +7 -0
- data/spec/fixtures/hello_world/doc/HelloWorld.html +162 -0
- data/spec/fixtures/hello_world/doc/HelloWorld/Gambi.html +150 -0
- data/spec/fixtures/hello_world/doc/HelloWorld/Goodbye.html +199 -0
- data/spec/fixtures/hello_world/doc/HelloWorld/Helo.html +199 -0
- data/spec/fixtures/hello_world/doc/created.rid +5 -0
- data/spec/fixtures/hello_world/doc/index.html +66 -0
- data/spec/fixtures/hello_world/doc/lib/gambi_rb.html +52 -0
- data/spec/fixtures/hello_world/doc/lib/goodbye_rb.html +52 -0
- data/spec/fixtures/hello_world/doc/lib/hello_rb.html +52 -0
- data/spec/fixtures/hello_world/doc/rdoc.css +706 -0
- data/spec/fixtures/hello_world/doc/tmp_txt.html +90 -0
- data/spec/fixtures/hello_world/lib/gambi.rb +5 -0
- data/spec/fixtures/hello_world/lib/goodbye.rb +7 -0
- data/spec/fixtures/hello_world/lib/hello.rb +7 -0
- data/spec/fixtures/hello_world/tmp.txt +1 -0
- data/spec/fixtures/purplelist.yml +3 -0
- data/spec/spec_helper.rb +2 -0
- metadata +55 -16
data/.rspec
ADDED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,27 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
code2pdf (0.0
|
4
|
+
code2pdf (0.2.0)
|
5
|
+
prawn (~> 0.11.1)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: http://rubygems.org/
|
8
9
|
specs:
|
9
10
|
Ascii85 (1.0.1)
|
11
|
+
diff-lcs (1.1.2)
|
10
12
|
pdf-reader (0.9.2)
|
11
13
|
Ascii85 (>= 0.9)
|
12
14
|
prawn (0.11.1)
|
13
15
|
pdf-reader (>= 0.9.0)
|
14
16
|
ttfunk (~> 1.0.0)
|
17
|
+
rspec (2.6.0)
|
18
|
+
rspec-core (~> 2.6.0)
|
19
|
+
rspec-expectations (~> 2.6.0)
|
20
|
+
rspec-mocks (~> 2.6.0)
|
21
|
+
rspec-core (2.6.4)
|
22
|
+
rspec-expectations (2.6.0)
|
23
|
+
diff-lcs (~> 1.1.2)
|
24
|
+
rspec-mocks (2.6.0)
|
15
25
|
ttfunk (1.0.1)
|
16
26
|
|
17
27
|
PLATFORMS
|
@@ -19,4 +29,4 @@ PLATFORMS
|
|
19
29
|
|
20
30
|
DEPENDENCIES
|
21
31
|
code2pdf!
|
22
|
-
|
32
|
+
rspec
|
data/README.textile
CHANGED
@@ -12,11 +12,11 @@ h1. Usage
|
|
12
12
|
|
13
13
|
Open a terminal and run:
|
14
14
|
|
15
|
-
<pre><code>code2pdf <project path
|
15
|
+
<pre><code>code2pdf <project path></code></pre>
|
16
16
|
|
17
17
|
h2. BlackList file example:
|
18
18
|
|
19
|
-
The blacklist file must be a yaml file,
|
19
|
+
The blacklist file must be a yaml file, named .code2pdf and it should be located in <project path> root, containing a list of ignored files and/or directories, such as:
|
20
20
|
<pre><code>:directories:
|
21
21
|
- .git
|
22
22
|
- db/migrate
|
data/bin/code2pdf
CHANGED
@@ -4,23 +4,22 @@
|
|
4
4
|
# Created by Lucas Caton at 2011, may 31
|
5
5
|
#
|
6
6
|
|
7
|
-
require 'optparse'
|
8
|
-
require 'yaml'
|
9
7
|
require 'rubygems'
|
10
|
-
require '
|
11
|
-
|
8
|
+
require 'optparse'
|
9
|
+
$:.push File.expand_path('../../lib', __FILE__)
|
10
|
+
require 'code2pdf'
|
12
11
|
|
13
12
|
options = {}
|
14
13
|
|
15
14
|
optparse = OptionParser.new do |opts|
|
16
|
-
opts.banner = "Usage: code2pdf <project path
|
15
|
+
opts.banner = "Usage: code2pdf <project path>\n\nYou can use flags as such:"
|
17
16
|
|
18
17
|
opts.on('-h', '--help', 'Display this screen') do
|
19
18
|
puts opts
|
20
19
|
exit
|
21
20
|
end
|
22
21
|
|
23
|
-
if ARGV.size <
|
22
|
+
if ARGV.size < 1
|
24
23
|
puts opts
|
25
24
|
exit
|
26
25
|
end
|
@@ -34,58 +33,7 @@ rescue OptionParser::InvalidOption => e
|
|
34
33
|
end
|
35
34
|
|
36
35
|
PATH = ARGV[0].gsub(/\/$/, '')
|
37
|
-
|
38
|
-
# Check if path exists
|
39
|
-
if !File.exists?(PATH) || FileTest.file?(PATH)
|
40
|
-
puts "'#{PATH}' path does not exist or it is not a directory."
|
41
|
-
exit
|
42
|
-
end
|
43
|
-
|
44
|
-
BLACK_LIST_YML_FILE = ARGV[1]
|
45
|
-
|
46
|
-
# Check if blacklist file exists
|
47
|
-
if !File.exists?(BLACK_LIST_YML_FILE) || FileTest.directory?(BLACK_LIST_YML_FILE)
|
48
|
-
puts "'#{BLACK_LIST_YML_FILE}' file does not exist or it is not a regular file."
|
49
|
-
exit
|
50
|
-
end
|
51
|
-
|
52
|
-
BLACK_LIST = YAML.load File.read(BLACK_LIST_YML_FILE)
|
53
|
-
|
54
|
-
# Check if blacklist file has directories and files keys
|
55
|
-
if !BLACK_LIST.keys.include?(:directories) || !BLACK_LIST.keys.include?(:files)
|
56
|
-
puts "'#{BLACK_LIST_YML_FILE}' file has no directories and files keys."
|
57
|
-
exit
|
58
|
-
end
|
59
|
-
|
60
|
-
BLACK_LIST_DIRECTORIES = BLACK_LIST[:directories].map {|directory| "#{PATH}/#{directory}"}
|
61
|
-
BLACK_LIST_FILES = BLACK_LIST[:files]
|
62
|
-
|
63
|
-
@code_files = []
|
64
|
-
|
65
|
-
# Read code files from path
|
66
|
-
def read_code_files_from_path(path)
|
67
|
-
Dir.foreach path do |it|
|
68
|
-
path_and_name = "#{path}/#{it}"
|
69
|
-
if FileTest.directory?(path_and_name) && it != '.' && it != '..'
|
70
|
-
read_code_files_from_path path_and_name unless BLACK_LIST_DIRECTORIES.include? path_and_name
|
71
|
-
elsif FileTest.file?(path_and_name) && !BLACK_LIST_FILES.include?(it)
|
72
|
-
puts "Processing => #{path_and_name}"
|
73
|
-
file = File.open(path_and_name, 'r')
|
74
|
-
file_content = ''
|
75
|
-
line_number = 1
|
76
|
-
file.each_line do |line|
|
77
|
-
file_content << line.gsub(/</, '<').gsub(/^/, "<color rgb='AAAAAA'>#{line_number}</color> "); line_number += 1
|
78
|
-
end
|
79
|
-
file.close
|
80
|
-
@code_files << [path_and_name, file_content]
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
read_code_files_from_path PATH
|
86
|
-
|
36
|
+
BLACK_LIST_YML_FILE = "#{PATH}/.code2pdf"
|
87
37
|
# Convert to PDF
|
88
|
-
|
89
|
-
|
90
|
-
pdf = ConvertToPDF.new "#{filename}.pdf", @code_files
|
91
|
-
pdf.save
|
38
|
+
filename = "#{PATH.gsub(/(\.|\/)/, '_')}.pdf"
|
39
|
+
ConvertToPDF.new :from => PATH, :to => filename, :except => BLACK_LIST_YML_FILE
|
data/code2pdf.gemspec
CHANGED
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.summary = %q{Convert your source code to PDF}
|
13
13
|
s.description = %q{Convert your source code to PDF}
|
14
14
|
|
15
|
-
s.
|
16
|
-
s.add_development_dependency '
|
15
|
+
s.add_dependency 'prawn', '~> 0.11.1'
|
16
|
+
s.add_development_dependency 'rspec'
|
17
17
|
|
18
18
|
s.rubyforge_project = 'code2pdf'
|
19
19
|
|
data/lib/code2pdf.rb
ADDED
@@ -4,13 +4,27 @@ class ConvertToPDF
|
|
4
4
|
:page_size => 'A4'
|
5
5
|
}
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
|
7
|
+
def initialize(params={})
|
8
|
+
if not params.has_key?(:from) or params[:from].nil?
|
9
|
+
raise ArgumentError.new 'where are the codes you want to convert to pdf?'
|
10
|
+
elsif not valid_directory?(params[:from])
|
11
|
+
raise LoadError.new "#{params[:from]} not found"
|
12
|
+
elsif not params.has_key?(:to) or params[:to].nil?
|
13
|
+
raise ArgumentError.new 'where should I save the generated pdf file?'
|
14
|
+
else
|
15
|
+
@from, @to = params[:from], params[:to]
|
16
|
+
if params.has_key?(:except)
|
17
|
+
@except = params[:except]
|
18
|
+
raise LoadError.new "#{@except} is not a valid blacklist yaml file" unless valid_blacklist?
|
19
|
+
end
|
20
|
+
save
|
21
|
+
end
|
9
22
|
end
|
10
23
|
|
24
|
+
private
|
11
25
|
def pdf
|
12
26
|
Prawn::Document.new PDF_OPTIONS do |pdf|
|
13
|
-
|
27
|
+
read_files.each do |file|
|
14
28
|
puts "Converting to PDF => #{file.first}"
|
15
29
|
pdf.font 'Courier' do
|
16
30
|
pdf.text "File: <strong>#{file.first}</strong>", :size => 12, :inline_format => true
|
@@ -23,6 +37,53 @@ class ConvertToPDF
|
|
23
37
|
end
|
24
38
|
|
25
39
|
def save
|
26
|
-
pdf.render_file @
|
40
|
+
pdf.render_file @to
|
41
|
+
end
|
42
|
+
|
43
|
+
def valid_blacklist?
|
44
|
+
return false if not File.exists?(@except) or FileTest.directory?(@except)
|
45
|
+
@blacklist = YAML.load(File.read(@except))
|
46
|
+
@blacklist.has_key?(:directories) and @blacklist.has_key?(:files)
|
47
|
+
end
|
48
|
+
|
49
|
+
def in_blacklist?(item)
|
50
|
+
if @blacklist
|
51
|
+
@blacklist[:directories].include?(item) or @blacklist[:files].include?(item)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def valid_directory?(dir)
|
56
|
+
File.exists?(dir) and FileTest.directory?(dir)
|
57
|
+
end
|
58
|
+
|
59
|
+
def valid_file?(file)
|
60
|
+
File.exists?(file) and FileTest.file?(file)
|
61
|
+
end
|
62
|
+
|
63
|
+
def read_files(path=nil)
|
64
|
+
@files ||= [] ; path ||= @from
|
65
|
+
Dir.foreach(path) do |item|
|
66
|
+
item_path = "#{path}/#{item}"
|
67
|
+
unless in_blacklist?(item)
|
68
|
+
if valid_directory?(item_path) and not ['.','..'].include?(item)
|
69
|
+
read_files(item_path)
|
70
|
+
elsif valid_file?(item_path)
|
71
|
+
content = processing_file(item_path)
|
72
|
+
@files << ["File: <strong>#{item_path}</strong>", content]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
@files
|
77
|
+
end
|
78
|
+
|
79
|
+
def processing_file(file)
|
80
|
+
content = ''
|
81
|
+
File.open(file,'r') do |f|
|
82
|
+
f.each_line.with_index do |line_content,line_number|
|
83
|
+
# TODO: this line is ugly, need find a better way ;D
|
84
|
+
content << line_content.gsub(/</,'<').gsub(/^/, "<color rgb='AAAAAA'>#{line_number+1}</color> ")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
content
|
27
88
|
end
|
28
89
|
end
|
data/lib/code2pdf/version.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'digest/md5'
|
3
|
+
|
4
|
+
describe ConvertToPDF do
|
5
|
+
describe '#pdf' do
|
6
|
+
it 'should create a PDF file containing all desired source code' do
|
7
|
+
path = 'spec/fixtures/hello_world'
|
8
|
+
pdf = 'spec/fixtures/hello_world.pdf'
|
9
|
+
blacklist = 'spec/fixtures/hello_world/.code2pdf'
|
10
|
+
ConvertToPDF.new :from => path, :to => pdf, :except => blacklist
|
11
|
+
Digest::MD5.hexdigest(File.read(pdf)).should eq 'f0270dcebd0abc942739d3c83ad4b978'
|
12
|
+
File.delete pdf
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should verify if essential params are present' do
|
16
|
+
expect{ConvertToPDF.new(:foo => 'bar')}.to raise_error ArgumentError
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should verify if specified path exists' do
|
20
|
+
path = 'spec/fixtures/isto_non_existe_quevedo'
|
21
|
+
pdf = 'spec/fixtures/isto_non_existe_quevedo.pdf'
|
22
|
+
expect{ConvertToPDF.new(:from => path, :to => pdf)}.to raise_error LoadError
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should verify if specified blacklist file is valid' do
|
26
|
+
path = 'spec/fixtures/hello_world'
|
27
|
+
pdf = 'spec/fixtures/hello_world.pdf'
|
28
|
+
blacklist = 'spec/fixtures/purplelist.yml'
|
29
|
+
expect{ConvertToPDF.new :from => path, :to => pdf, :except => blacklist}.to raise_error LoadError
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
5
|
+
<head>
|
6
|
+
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
7
|
+
|
8
|
+
<title>Module: HelloWorld</title>
|
9
|
+
|
10
|
+
<link rel="stylesheet" href="./rdoc.css" type="text/css" media="screen" />
|
11
|
+
|
12
|
+
<script src="./js/jquery.js" type="text/javascript"
|
13
|
+
charset="utf-8"></script>
|
14
|
+
<script src="./js/thickbox-compressed.js" type="text/javascript"
|
15
|
+
charset="utf-8"></script>
|
16
|
+
<script src="./js/quicksearch.js" type="text/javascript"
|
17
|
+
charset="utf-8"></script>
|
18
|
+
<script src="./js/darkfish.js" type="text/javascript"
|
19
|
+
charset="utf-8"></script>
|
20
|
+
|
21
|
+
</head>
|
22
|
+
<body class="module">
|
23
|
+
|
24
|
+
<div id="metadata">
|
25
|
+
<div id="home-metadata">
|
26
|
+
<div id="home-section" class="section">
|
27
|
+
<h3 class="section-header">
|
28
|
+
<a href="./index.html">Home</a>
|
29
|
+
<a href="./index.html#classes">Classes</a>
|
30
|
+
<a href="./index.html#methods">Methods</a>
|
31
|
+
</h3>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="file-metadata">
|
36
|
+
<div id="file-list-section" class="section">
|
37
|
+
<h3 class="section-header">In Files</h3>
|
38
|
+
<div class="section-body">
|
39
|
+
<ul>
|
40
|
+
|
41
|
+
<li><a href="./lib/gambi_rb.html?TB_iframe=true&height=550&width=785"
|
42
|
+
class="thickbox" title="lib/gambi.rb">lib/gambi.rb</a></li>
|
43
|
+
|
44
|
+
<li><a href="./lib/goodbye_rb.html?TB_iframe=true&height=550&width=785"
|
45
|
+
class="thickbox" title="lib/goodbye.rb">lib/goodbye.rb</a></li>
|
46
|
+
|
47
|
+
<li><a href="./lib/hello_rb.html?TB_iframe=true&height=550&width=785"
|
48
|
+
class="thickbox" title="lib/hello.rb">lib/hello.rb</a></li>
|
49
|
+
|
50
|
+
</ul>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
|
54
|
+
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<div id="class-metadata">
|
58
|
+
|
59
|
+
<!-- Parent Class -->
|
60
|
+
|
61
|
+
|
62
|
+
<!-- Namespace Contents -->
|
63
|
+
|
64
|
+
<div id="namespace-list-section" class="section">
|
65
|
+
<h3 class="section-header">Namespace</h3>
|
66
|
+
<ul class="link-list">
|
67
|
+
|
68
|
+
<li><span class="type">CLASS</span> <a href="HelloWorld/Gambi.html">HelloWorld::Gambi</a></li>
|
69
|
+
|
70
|
+
<li><span class="type">CLASS</span> <a href="HelloWorld/Goodbye.html">HelloWorld::Goodbye</a></li>
|
71
|
+
|
72
|
+
<li><span class="type">CLASS</span> <a href="HelloWorld/Helo.html">HelloWorld::Helo</a></li>
|
73
|
+
|
74
|
+
</ul>
|
75
|
+
</div>
|
76
|
+
|
77
|
+
|
78
|
+
<!-- Method Quickref -->
|
79
|
+
|
80
|
+
|
81
|
+
<!-- Included Modules -->
|
82
|
+
|
83
|
+
</div>
|
84
|
+
|
85
|
+
<div id="project-metadata">
|
86
|
+
|
87
|
+
|
88
|
+
<div id="fileindex-section" class="section project-section">
|
89
|
+
<h3 class="section-header">Files</h3>
|
90
|
+
<ul>
|
91
|
+
|
92
|
+
<li class="file"><a href="./tmp_txt.html">tmp.txt</a></li>
|
93
|
+
|
94
|
+
</ul>
|
95
|
+
</div>
|
96
|
+
|
97
|
+
|
98
|
+
<div id="classindex-section" class="section project-section">
|
99
|
+
<h3 class="section-header">Class Index
|
100
|
+
<span class="search-toggle"><img src="./images/find.png"
|
101
|
+
height="16" width="16" alt="[+]"
|
102
|
+
title="show/hide quicksearch" /></span></h3>
|
103
|
+
<form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
|
104
|
+
<fieldset>
|
105
|
+
<legend>Quicksearch</legend>
|
106
|
+
<input type="text" name="quicksearch" value=""
|
107
|
+
class="quicksearch-field" />
|
108
|
+
</fieldset>
|
109
|
+
</form>
|
110
|
+
|
111
|
+
<ul class="link-list">
|
112
|
+
|
113
|
+
<li><a href="./HelloWorld.html">HelloWorld</a></li>
|
114
|
+
|
115
|
+
<li><a href="./HelloWorld/Gambi.html">HelloWorld::Gambi</a></li>
|
116
|
+
|
117
|
+
<li><a href="./HelloWorld/Goodbye.html">HelloWorld::Goodbye</a></li>
|
118
|
+
|
119
|
+
<li><a href="./HelloWorld/Helo.html">HelloWorld::Helo</a></li>
|
120
|
+
|
121
|
+
</ul>
|
122
|
+
<div id="no-class-search-results" style="display: none;">No matching classes.</div>
|
123
|
+
</div>
|
124
|
+
|
125
|
+
|
126
|
+
</div>
|
127
|
+
</div>
|
128
|
+
|
129
|
+
<div id="documentation">
|
130
|
+
<h1 class="module">HelloWorld</h1>
|
131
|
+
|
132
|
+
<div id="description">
|
133
|
+
|
134
|
+
</div>
|
135
|
+
|
136
|
+
<!-- Constants -->
|
137
|
+
|
138
|
+
|
139
|
+
<!-- Attributes -->
|
140
|
+
|
141
|
+
|
142
|
+
<!-- Methods -->
|
143
|
+
|
144
|
+
|
145
|
+
</div>
|
146
|
+
|
147
|
+
|
148
|
+
<div id="rdoc-debugging-section-dump" class="debugging-section">
|
149
|
+
|
150
|
+
<p>Disabled; run with --debug to generate this.</p>
|
151
|
+
|
152
|
+
</div>
|
153
|
+
|
154
|
+
<div id="validator-badges">
|
155
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
156
|
+
<p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
|
157
|
+
Rdoc Generator</a> 1.1.6</small>.</p>
|
158
|
+
</div>
|
159
|
+
|
160
|
+
</body>
|
161
|
+
</html>
|
162
|
+
|