vocco 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/vocco.rb +64 -29
- data/lib/vocco/generator.rb +23 -95
- data/lib/vocco/generator/source_file.rb +81 -0
- data/lib/vocco/generator/source_file/html_template.rb +6 -4
- data/notes/README.md +3 -1
- data/notes/vocco.rb.md +9 -0
- data/notes/vocco/cli.rb.md +2 -0
- data/notes/vocco/generator.rb.md +13 -0
- data/notes/vocco/generator/css.rb.md +4 -0
- data/notes/vocco/generator/source_file.rb.md +7 -0
- data/notes/vocco/generator/source_file/html_template.rb.md +4 -0
- data/template/html.slim +4 -2
- data/vocco.gemspec +9 -2
- metadata +10 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/lib/vocco.rb
CHANGED
@@ -1,59 +1,94 @@
|
|
1
1
|
|
2
2
|
|
3
|
-
|
4
|
-
require '
|
5
|
-
require '
|
3
|
+
# Gem Use
|
4
|
+
require 'hpricot' # parse and modify html
|
5
|
+
require 'tilt' # generate sidebar html
|
6
|
+
require 'tempfile' # temporary vimscript
|
6
7
|
|
7
8
|
|
8
9
|
module Vocco
|
9
10
|
|
10
|
-
|
11
|
-
require 'vocco/
|
11
|
+
# File Responsibility
|
12
|
+
require 'vocco/generator' # Generate docs
|
13
|
+
require 'vocco/cli' # Command line interface
|
12
14
|
|
13
15
|
class << self
|
14
|
-
|
15
|
-
|
16
|
+
|
17
|
+
# Vocco::run is the interface for using Vocco as a gem.
|
18
|
+
def run(opts)
|
19
|
+
validate(opts)
|
20
|
+
Generator.new(
|
21
|
+
DEFAULTS.merge(opts)
|
22
|
+
).run
|
16
23
|
end
|
17
24
|
|
18
|
-
|
19
|
-
|
25
|
+
alias :run! :run
|
26
|
+
alias :start :run
|
27
|
+
|
28
|
+
def validate(opts)
|
29
|
+
bad_opts = opts.keys - OPTION_NAMES
|
30
|
+
|
31
|
+
if bad_opts.any?
|
32
|
+
raise "Invalid options: #{bad_opts}"
|
33
|
+
end
|
20
34
|
end
|
21
35
|
|
36
|
+
# Tries to read a property from the gemspec with the same name
|
37
|
+
# as the working dir, in the working dir.
|
22
38
|
def gemspec(prop)
|
23
39
|
begin
|
24
40
|
require 'rubygems'
|
25
|
-
@gemspec ||= Gem::Specification.load(
|
41
|
+
@gemspec ||= Gem::Specification.load(
|
42
|
+
File.basename(Dir.pwd) + '.gemspec')
|
26
43
|
@gemspec.send prop
|
27
44
|
rescue
|
28
45
|
nil
|
29
46
|
end
|
30
47
|
end
|
48
|
+
end
|
31
49
|
|
32
|
-
|
50
|
+
|
51
|
+
# These are the available options. They can be given on
|
52
|
+
# the command line, the linux way, or as a hash to
|
53
|
+
# Vocco.run(...), the Rubygem way. The format is:
|
54
|
+
#
|
55
|
+
# [name, description,
|
56
|
+
# default_value
|
57
|
+
# ]
|
33
58
|
|
34
|
-
|
59
|
+
OPTIONS = [
|
60
|
+
[:files, "File match globs",
|
61
|
+
%w{**/*.rb README LICENSE}
|
62
|
+
],
|
35
63
|
|
36
|
-
|
37
|
-
|
38
|
-
|
64
|
+
[:out, "Output directory",
|
65
|
+
'./docs'
|
66
|
+
],
|
39
67
|
|
40
|
-
|
41
|
-
|
42
|
-
|
68
|
+
[:notes, "Note directories",
|
69
|
+
['./notes']
|
70
|
+
],
|
43
71
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
72
|
+
[:name, "Project name",
|
73
|
+
gemspec(:name) || File.basename(Dir.pwd)
|
74
|
+
],
|
48
75
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
[:
|
54
|
-
|
55
|
-
[:vim, "Vim command", %w{macvim gvim vim} ]
|
76
|
+
[:site, "Project url",
|
77
|
+
gemspec(:homepage)
|
78
|
+
],
|
79
|
+
|
80
|
+
[:vim, "Vim command", %w{macvim gvim vim}
|
81
|
+
]
|
56
82
|
]
|
83
|
+
|
84
|
+
OPTION_NAMES = OPTIONS.map(&:first)
|
85
|
+
|
86
|
+
DEFAULTS = {}
|
87
|
+
|
88
|
+
OPTIONS.each do |opt|
|
89
|
+
DEFAULTS[opt[0]] = opt[2]
|
90
|
+
end
|
91
|
+
|
57
92
|
end
|
58
93
|
|
59
94
|
|
data/lib/vocco/generator.rb
CHANGED
@@ -1,39 +1,40 @@
|
|
1
1
|
|
2
|
+
require 'fileutils'
|
3
|
+
|
2
4
|
|
3
5
|
class Vocco::Generator
|
4
6
|
|
5
|
-
|
7
|
+
# File What
|
8
|
+
require 'vocco/generator/css' # CSS additions
|
9
|
+
require 'vocco/generator/source_file' # SourceFile class
|
6
10
|
|
7
11
|
attr_reader :globs, :notes, :out, :name, :site
|
8
12
|
|
9
13
|
def initialize(opts)
|
10
|
-
@globs = opts[:files]
|
14
|
+
@globs = Array(opts[:files]
|
15
|
+
).compact.map do |glob|
|
16
|
+
glob.gsub(/(^\.\/)|(\/$)/, '')
|
17
|
+
end
|
11
18
|
@out = opts[:out]
|
12
|
-
@notes = opts[:notes]
|
19
|
+
@notes = Array(opts[:notes]).compact
|
13
20
|
@name = opts[:name].capitalize
|
14
21
|
@site = opts[:site]
|
15
|
-
@vim = opts[:vim]
|
16
|
-
validate_out
|
17
|
-
end
|
18
|
-
|
19
|
-
def run
|
20
|
-
run_vim; postprocess
|
21
|
-
end
|
22
|
-
alias :run! :run
|
22
|
+
@vim = Array(opts[:vim]).compact
|
23
23
|
|
24
|
-
|
25
|
-
@trimmed_globs ||= @globs.map do |glob|
|
26
|
-
glob.gsub(/(^\.\/)|(\/$)/, '')
|
27
|
-
end
|
24
|
+
FileUtils.mkdir_p(@out) # ensure out dir exists
|
28
25
|
end
|
29
26
|
|
27
|
+
# the paths underneath which the @globs are globbing;
|
28
|
+
# the static part of the glob, or "scope" of sorts
|
30
29
|
def scopes
|
31
|
-
@scopes ||=
|
30
|
+
@scopes ||= @globs.map do |glob|
|
32
31
|
tokens = glob.split('*')
|
33
32
|
tokens.size > 1 ? tokens.first : nil
|
34
33
|
end.compact
|
35
34
|
end
|
36
35
|
|
36
|
+
# regex to trim the glob dir scopes off a source
|
37
|
+
# file path.
|
37
38
|
def glob_regex
|
38
39
|
@glob_regex ||= begin
|
39
40
|
str = scopes.map do |scope|
|
@@ -43,13 +44,7 @@ class Vocco::Generator
|
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
46
|
-
|
47
|
-
@doc_regex ||= begin
|
48
|
-
str = Regexp::escape(@out) + '/'
|
49
|
-
/^#{str}/
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
47
|
+
# array of SourceFile's mapped from the glob matches
|
53
48
|
def files
|
54
49
|
@files ||= @globs.map do |glob|
|
55
50
|
Dir[glob]
|
@@ -58,13 +53,12 @@ class Vocco::Generator
|
|
58
53
|
end
|
59
54
|
end
|
60
55
|
|
61
|
-
|
56
|
+
def run
|
57
|
+
run_vim; postprocess
|
58
|
+
end
|
59
|
+
alias :run! :run
|
62
60
|
|
63
|
-
|
64
|
-
unless File.directory?(@out)
|
65
|
-
raise "#{@out} is not a valid directory."
|
66
|
-
end
|
67
|
-
end
|
61
|
+
private
|
68
62
|
|
69
63
|
def run_vim
|
70
64
|
script = Tempfile.new('vimdocco')
|
@@ -112,69 +106,3 @@ class Vocco::Generator
|
|
112
106
|
end
|
113
107
|
end
|
114
108
|
|
115
|
-
class Vocco::Generator::SourceFile
|
116
|
-
require 'vocco/generator/source_file/html_template'
|
117
|
-
|
118
|
-
def initialize(file, generator)
|
119
|
-
@file = file
|
120
|
-
@gen = generator
|
121
|
-
end
|
122
|
-
|
123
|
-
attr_reader :file
|
124
|
-
|
125
|
-
def short_path
|
126
|
-
@short_path ||= @file.sub(@gen.glob_regex, '')
|
127
|
-
end
|
128
|
-
|
129
|
-
def short_dirname
|
130
|
-
File.dirname(short_path).sub(/^\.\//, '')
|
131
|
-
end
|
132
|
-
|
133
|
-
def dirname
|
134
|
-
File.dirname(@file)
|
135
|
-
end
|
136
|
-
|
137
|
-
def basename
|
138
|
-
File.basename(@file)
|
139
|
-
end
|
140
|
-
|
141
|
-
def doc_prefix
|
142
|
-
short_dirname == '.' ? '' : short_dirname.gsub('/', '-') + '-'
|
143
|
-
end
|
144
|
-
|
145
|
-
def doc_path
|
146
|
-
File.join(@gen.out, doc_prefix + basename + '.html')
|
147
|
-
end
|
148
|
-
|
149
|
-
def doc_link
|
150
|
-
'./' + doc_path.sub(@gen.doc_regex, '')
|
151
|
-
end
|
152
|
-
|
153
|
-
def notes
|
154
|
-
rendered = render_notes
|
155
|
-
rendered.any? ?
|
156
|
-
rendered.join("\n") : nil
|
157
|
-
end
|
158
|
-
|
159
|
-
def render_notes
|
160
|
-
Dir[note_glob].map do |path|
|
161
|
-
Tilt.new(path).render
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def note_glob
|
166
|
-
dirs = [dirname]
|
167
|
-
@gen.notes.each do |dir|
|
168
|
-
dirs << File.join(dir, short_dirname)
|
169
|
-
end
|
170
|
-
ext = '.{textile,md,mkd,markdown,rdoc}'
|
171
|
-
dir_glob = '{' + dirs.join(',') + '}/'
|
172
|
-
dir_glob + basename + ext
|
173
|
-
end
|
174
|
-
|
175
|
-
class_eval <<-EOF, '(template)'
|
176
|
-
def render_template
|
177
|
-
#{HTML_TEMPLATE}
|
178
|
-
end
|
179
|
-
EOF
|
180
|
-
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
class Vocco::Generator::SourceFile
|
5
|
+
require 'vocco/generator/source_file/html_template'
|
6
|
+
|
7
|
+
NOTE_FORMATS = '.{textile,md,mkd,markdown,rdoc}'
|
8
|
+
|
9
|
+
def initialize(file, generator)
|
10
|
+
@file = file
|
11
|
+
@gen = generator
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :file # full file path
|
15
|
+
|
16
|
+
# full dirname
|
17
|
+
def dirname
|
18
|
+
File.dirname(@file)
|
19
|
+
end
|
20
|
+
|
21
|
+
def basename
|
22
|
+
File.basename(@file)
|
23
|
+
end
|
24
|
+
|
25
|
+
# file path with glob dir scope trimmed off
|
26
|
+
def short_path
|
27
|
+
@short_path ||= @file.sub(@gen.glob_regex, '')
|
28
|
+
end
|
29
|
+
|
30
|
+
# dirname of the above
|
31
|
+
def short_dirname
|
32
|
+
File.dirname(short_path).sub(/^\.\//, '')
|
33
|
+
end
|
34
|
+
|
35
|
+
# corresponding doc file basename
|
36
|
+
def doc_basename
|
37
|
+
doc_scope + basename + '.html'
|
38
|
+
end
|
39
|
+
|
40
|
+
# corresponding doc file path
|
41
|
+
def doc_path
|
42
|
+
File.join(@gen.out, doc_basename)
|
43
|
+
end
|
44
|
+
|
45
|
+
# relative link to doc
|
46
|
+
def doc_link
|
47
|
+
'./' + doc_basename
|
48
|
+
end
|
49
|
+
|
50
|
+
def notes
|
51
|
+
@notes ||= Dir[note_glob].map do |path|
|
52
|
+
Tilt.new(path).render
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# make a method for the html template
|
57
|
+
class_eval <<-EOF, '(template)'
|
58
|
+
def render_template
|
59
|
+
#{HTML_TEMPLATE}
|
60
|
+
end
|
61
|
+
EOF
|
62
|
+
|
63
|
+
private
|
64
|
+
# doc filename prefix based on source file folder
|
65
|
+
def doc_scope
|
66
|
+
short_dirname == '.' ? '' : short_dirname.gsub('/', '-') + '-'
|
67
|
+
end
|
68
|
+
|
69
|
+
# the dirs in which to look for notes concerning this file.
|
70
|
+
def note_dirs
|
71
|
+
@gen.notes.inject([dirname]) do |dirs, dir|
|
72
|
+
dirs << File.join(dir, short_dirname)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# glob matching notes concerning this file
|
77
|
+
def note_glob
|
78
|
+
'{' + note_dirs.join(',') + '}/' + basename + NOTE_FORMATS
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
@@ -18,10 +18,12 @@ _buf = [] ; _temple_pre_tags = /<pre|<textarea/ ; _buf << ("<div class=\"nav\"><
|
|
18
18
|
"<a href=\"#{file.doc_link}\">#{file.basename}"\
|
19
19
|
"</a><br>"\
|
20
20
|
""\
|
21
|
-
"") ; end ; _buf << ("</p>") ; end ; _buf << ("</div>") ; if notes ;
|
22
|
-
; _buf << ("<div class=\"notes area\"
|
23
|
-
|
24
|
-
|
21
|
+
"") ; end ; _buf << ("</p>") ; end ; _buf << ("</div>") ; if notes.any? ;
|
22
|
+
; _buf << ("<div class=\"notes area\">") ;
|
23
|
+
; notes.each do |note| ;
|
24
|
+
; _buf << (note) ;
|
25
|
+
;
|
26
|
+
; end ; _buf << ("</div>") ; end ; _buf << ("<div class=\"area\"><table><tr><th>Generated:</th><td>"\
|
25
27
|
""\
|
26
28
|
""\
|
27
29
|
""\
|
data/notes/README.md
CHANGED
@@ -6,4 +6,6 @@ These paragraphs are actually "notes" attached to the README -- they were automa
|
|
6
6
|
|
7
7
|
The supported note format extensions are: md, mkd, markdown, textile and rdoc.
|
8
8
|
|
9
|
-
|
9
|
+
Browse around the source code if you like -- mouse over the header just above this text to see a file list.
|
10
|
+
|
11
|
+
♥
|
data/notes/vocco.rb.md
ADDED
data/template/html.slim
CHANGED
data/vocco.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{vocco}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["jbe"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-04}
|
13
13
|
s.default_executable = %q{vocco}
|
14
14
|
s.description = %q{vocco is an extra super quick-and-dirty documentation generator based on Vim, written in Ruby.}
|
15
15
|
s.email = %q{post@jostein.be}
|
@@ -33,8 +33,15 @@ Gem::Specification.new do |s|
|
|
33
33
|
"lib/vocco/cli.rb",
|
34
34
|
"lib/vocco/generator.rb",
|
35
35
|
"lib/vocco/generator/css.rb",
|
36
|
+
"lib/vocco/generator/source_file.rb",
|
36
37
|
"lib/vocco/generator/source_file/html_template.rb",
|
37
38
|
"notes/README.md",
|
39
|
+
"notes/vocco.rb.md",
|
40
|
+
"notes/vocco/cli.rb.md",
|
41
|
+
"notes/vocco/generator.rb.md",
|
42
|
+
"notes/vocco/generator/css.rb.md",
|
43
|
+
"notes/vocco/generator/source_file.rb.md",
|
44
|
+
"notes/vocco/generator/source_file/html_template.rb.md",
|
38
45
|
"template/css.sass",
|
39
46
|
"template/html.slim",
|
40
47
|
"vocco.gemspec"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 3
|
9
|
+
version: 0.1.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- jbe
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-03-
|
17
|
+
date: 2011-03-04 00:00:00 +01:00
|
18
18
|
default_executable: vocco
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -184,8 +184,15 @@ files:
|
|
184
184
|
- lib/vocco/cli.rb
|
185
185
|
- lib/vocco/generator.rb
|
186
186
|
- lib/vocco/generator/css.rb
|
187
|
+
- lib/vocco/generator/source_file.rb
|
187
188
|
- lib/vocco/generator/source_file/html_template.rb
|
188
189
|
- notes/README.md
|
190
|
+
- notes/vocco.rb.md
|
191
|
+
- notes/vocco/cli.rb.md
|
192
|
+
- notes/vocco/generator.rb.md
|
193
|
+
- notes/vocco/generator/css.rb.md
|
194
|
+
- notes/vocco/generator/source_file.rb.md
|
195
|
+
- notes/vocco/generator/source_file/html_template.rb.md
|
189
196
|
- template/css.sass
|
190
197
|
- template/html.slim
|
191
198
|
- vocco.gemspec
|