reacco 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,3 +1,12 @@
1
+ v0.0.3 - Sep 19, 2011
2
+ ---------------------
3
+
4
+ ### Added:
5
+ * Support Google Analytics.
6
+
7
+ ### Fixed:
8
+ * CSS issues (float drops, the sectioning being crappy).
9
+
1
10
  v0.0.2 - Sep 19, 2011
2
11
  ---------------------
3
12
 
data/README.md CHANGED
@@ -1,11 +1,95 @@
1
- # Reacco
1
+ # [Reacco](http://ricostacruz.com/reacco)
2
2
  #### Readme documentation prettifier
3
3
 
4
- In progress. Check out http://ricostacruz.com/sinatra-assetpack for an example.
4
+ Reacco is a dead simple documentation generator that lets you document your
5
+ project using Markdown.
6
+
7
+ ## Usage
8
+
9
+ #### Installation
10
+ Install Reacco first. It is a Ruby gem.
11
+
12
+ $ gem install reacco
13
+
14
+ #### Generation
15
+ To generate documentation, type `reacco`. This takes your `README.md` file and
16
+ prettifies it.
17
+
18
+ $ reacco
19
+
20
+ #### Literate style blocks
21
+ To make literate-style blocks (that is, code on the right, explanation on the
22
+ left), use `reacco --literate`.
23
+
24
+ $ reacco --literate
25
+
26
+ ## Documenting API
27
+ To extract documentation from your code files, add `--api <path here>`. This
28
+ extracts comment blocks from files in that path.
29
+
30
+ As Reacco only parses out Markdown from your comments, almost all programming
31
+ languages are supported. It does not care about code at all, just comments.
32
+
33
+ $ reacco --literate --api lib/
34
+
35
+ #### Documenting classes
36
+ You will need to add Markdown comment blocks to your code. The first line needs
37
+ to be a Markdown heading in the form of `### <heading name>`.
38
+
39
+ Classes are often made to be H2's.
40
+
41
+ ``` ruby
42
+ # ## Reacco [class]
43
+ # The main class.
44
+ #
45
+ # Class documentation goes here in Markdown form.
46
+ #
47
+ class Reacco
48
+ ...
49
+ end
50
+ ```
51
+
52
+ #### Documenting class methods
53
+ Class methods are often made as H3's. Sub-sections are often always H4's.
54
+
55
+ ``` ruby
56
+ # ## Reacco [class]
57
+ # The main class.
58
+ #
59
+ class Reacco
60
+ # ### version [class method]
61
+ # Returns a string of the library's version.
62
+ #
63
+ # #### Example
64
+ # This example returns the version.
65
+ #
66
+ # Reacco.version
67
+ # #=> "0.0.1"
68
+ #
69
+ def self.version
70
+ ...
71
+ end
72
+ end
73
+ ```
74
+
75
+ #### Adding the placeholder
76
+ To specify where the docs will be in the README, put a line with the text
77
+ `[](#api_reference)`. This will tell Reacco where to "inject" your API
78
+ documentation.
79
+
80
+ # README.md:
81
+ Please see http://you.github.com/project. [](#api_reference)
5
82
 
6
83
  # API reference
7
84
 
8
- (API reference goes here)
85
+ For usage and API reference, please see http://ricostacruz.com/reacco. [](#api_reference)
86
+
87
+ Warning
88
+ -------
89
+
90
+ **Here be dragons!** this is mostly made for my own projects, so I may change
91
+ things quite often (though I'd try to be mostly API-compatible with older
92
+ versions).
9
93
 
10
94
  Acknowledgements
11
95
  ----------------
data/Rakefile CHANGED
@@ -18,7 +18,8 @@ namespace :doc do
18
18
  # http://github.com/rstacruz/reacco
19
19
  desc "Builds the documentation into doc/"
20
20
  task :build do
21
- system "reacco -a --github #{gh} --api lib"
21
+ analytics = "--analytics #{ENV['ANALYTICS_ID']}" if ENV['ANALYTICS_ID']
22
+ system "reacco -a --github #{gh} #{analytics} --api lib"
22
23
  end
23
24
 
24
25
  # http://github.com/rstacruz/git-update-ghpages
data/bin/reacco CHANGED
@@ -27,6 +27,7 @@ if ARGV == ['-h'] || ARGV == ['--help']
27
27
  tip " --api PATH Where to get stuff."
28
28
  tip ""
29
29
  tip "More:"
30
+ tip " --analytics ID Google Analytics ID."
30
31
  tip " --github REPO Adds a 'Fork me on GitHub' badge. Repo should be in"
31
32
  tip " 'username/reponame' format."
32
33
  tip " -o, --output PATH Sets the path to put HTML files in. Defaults to 'doc/'."
@@ -35,13 +36,14 @@ if ARGV == ['-h'] || ARGV == ['--help']
35
36
 
36
37
  else
37
38
  # Build options from arguments.
38
- switches = [:literate, :toc]
39
- docpath = ARGV.extract('-o') || ARGV.extract('--output') || 'doc'
40
- template = ARGV.extract('-t') || ARGV.extract('--template') || nil
41
- github = ARGV.extract('--github') || nil
42
- css = ARGV.extract('--css') || nil
43
- awesome = ARGV.delete('-a') || ARGV.extract('--awesome')
44
- options = Hash.new
39
+ switches = [:literate, :toc]
40
+ docpath = ARGV.extract('-o') || ARGV.extract('--output') || 'doc'
41
+ template = ARGV.extract('-t') || ARGV.extract('--template') || nil
42
+ analytics = ARGV.extract('--analytics') || nil
43
+ github = ARGV.extract('--github') || nil
44
+ css = ARGV.extract('--css') || nil
45
+ awesome = ARGV.delete('-a') || ARGV.extract('--awesome')
46
+ options = Hash.new
45
47
 
46
48
  extract = Array.new
47
49
  while (x = ARGV.extract('--api'))
@@ -54,7 +56,8 @@ else
54
56
 
55
57
  switches.each { |opt| options[opt] = true } if awesome
56
58
 
57
- options[:github] = github if github
59
+ options[:github] = github if github
60
+ options[:analytics] = analytics if analytics
58
61
 
59
62
  if ARGV.any?
60
63
  puts "Invalid usage. See `reacco --help` for help."
@@ -5,6 +5,19 @@
5
5
  <title><%= title %></title>
6
6
  <link href="style.css" rel="stylesheet" />
7
7
  <link href='http://fonts.googleapis.com/css?family=Shanti:400|PT+Sans:700,700italic' rel='stylesheet' type='text/css'>
8
+ <% if analytics %>
9
+ <script type='text/javascript'>
10
+ var _gaq = _gaq || [];
11
+ _gaq.push(['_setAccount', '<%= analytics %>']);
12
+ _gaq.push(['_trackPageview']);
13
+
14
+ (function() {
15
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
16
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
17
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
18
+ })();
19
+ </script>
20
+ <% end %>
8
21
  </head>
9
22
  <body class='<%= body_class %>'>
10
23
  <% if github %>
@@ -285,7 +285,6 @@ aside#toc {
285
285
  aside#toc h1,
286
286
  aside#toc h2,
287
287
  aside#toc h3 {
288
- overflow: hidden;
289
288
  margin: 10px 0;
290
289
  padding: 0;
291
290
  font-size: 1.1em; }
@@ -295,12 +294,14 @@ aside#toc h1 {
295
294
  text-shadow: none;
296
295
  font-size: 1.3em; }
297
296
 
297
+ aside#toc h2,
298
298
  aside#toc h3 {
299
299
  border-top: solid 1px #ddd;
300
300
  padding-top: 10px; }
301
301
 
302
302
  aside#toc h2 .type,
303
303
  aside#toc h3 .type {
304
+ margin-top: 2px;
304
305
  margin-left: 0; }
305
306
 
306
307
  aside#toc ul,
@@ -315,7 +316,10 @@ aside#toc h3 a {
315
316
  color: #333; }
316
317
 
317
318
  aside#toc a {
319
+ height: 1.6em;
318
320
  overflow: hidden;
321
+ line-height: 1.6em;
322
+ position: relative;
319
323
  display: block;
320
324
  border-bottom: 0;
321
325
  color: #555; }
@@ -324,11 +328,10 @@ aside#toc a span.args {
324
328
  display: none; }
325
329
 
326
330
  aside#toc a span.type {
327
- font-size: 0.8em;
331
+ font-weight: normal;
332
+ color: #999;
328
333
  text-transform: uppercase;
329
- color: #999; }
330
-
331
- aside#toc .type {
334
+ font-size: 8pt;
332
335
  float: right; }
333
336
 
334
337
  aside#toc::-webkit-scrollbar {
@@ -14,14 +14,20 @@ module Reacco
14
14
  # Returns the root path of the Reacco gem.
15
15
  # You may pass additional parameters.
16
16
  #
17
- # Reacco.root #=> '/usr/local/ruby/gems/reacco-0.0.1'
17
+ # Reacco.root
18
+ # #=> '/usr/local/ruby/gems/reacco-0.0.1'
18
19
  #
19
20
  def root(*a)
20
21
  File.join File.expand_path('../../', __FILE__), *a
21
22
  end
22
23
 
23
24
  # ### markdown [class method]
24
- # Returns the Redcarpet Markdown processor.
25
+ # Returns the Redcarpet Markdown processor. This is an instance of
26
+ # `Redcarpet` with all the right options plugged in.
27
+ #
28
+ # Reacco.markdown
29
+ # #=> #<Redcarpet::Markdown ...>
30
+ #
25
31
  def markdown
26
32
  Redcarpet::Markdown.new(Redcarpet::Render::HTML,
27
33
  :fenced_code_blocks => true)
@@ -3,7 +3,8 @@ module Reacco
3
3
  module Sections
4
4
  # Wraps in sections.
5
5
  def section_wrap(html)
6
- %w(h1 h2 h3 h4 h5).each do |h|
6
+ headings = %w(h1 h2 h3 h4 h5)
7
+ headings.each do |h|
7
8
  nodes = html.css(h)
8
9
  nodes.each do |alpha|
9
10
  # For those affected by --hgroup, don't bother.
@@ -11,7 +12,7 @@ module Reacco
11
12
  next unless alpha.parent
12
13
 
13
14
  # Find the boundary, and get the nodes until that one.
14
- omega = from_x_until(alpha, alpha.name)
15
+ omega = from_x_until(alpha, *headings[0..headings.index(alpha.name)])
15
16
  section_nodes = between(alpha, omega)
16
17
 
17
18
  # Create the <section>.
@@ -26,13 +27,19 @@ module Reacco
26
27
  end
27
28
 
28
29
  private
29
- def from_x_until(alpha, name)
30
+ def from_x_until(alpha, *names)
30
31
  omega = nil
31
32
  n = alpha
32
33
 
33
34
  while true
34
35
  n = n.next_sibling
35
- break if n.nil? || n.name == name
36
+ break if n.nil?
37
+
38
+ name = n.name
39
+ if name == 'section'
40
+ name = (h = n.at_css('h1, h2, h3, h4, h5, h6')) && h.name
41
+ end
42
+ break if !name || names.include?(name)
36
43
  omega = n
37
44
  end
38
45
 
@@ -1,5 +1,21 @@
1
1
  # ## Reacco::Readme [class]
2
2
  # A readme file.
3
+ #
4
+ # #### Instanciating
5
+ # This is often instanciated by the `reacco` executable, but you can instantiate
6
+ # it yourself like so. It's assumed the the base dir will be the current working
7
+ # directory.
8
+ #
9
+ # readme = Reacco::Readme.new
10
+ # readme = Reacco::Readme.new [OPTIONS HASH]
11
+ #
12
+ # #### Options
13
+ # Avaiable options are *(all are optional)*:
14
+ #
15
+ # * `file` - String *(the filename of the README file)*
16
+ # * `literate` - Boolean
17
+ # * `toc` - Boolean
18
+ #
3
19
  module Reacco
4
20
  class Readme
5
21
  def initialize(options={})
@@ -8,7 +24,10 @@ module Reacco
8
24
  end
9
25
 
10
26
  # ### file [method]
11
- # The path to the README file. Returns nil if not available.
27
+ # The path to the README file. Returns `nil` if not available.
28
+ #
29
+ # readme.file #=> "README.md"
30
+ #
12
31
  def file
13
32
  @file ||= (Dir['README.*'].first || Dir['readme.*'].first || Dir['README'].first)
14
33
  end
@@ -18,25 +37,42 @@ module Reacco
18
37
  end
19
38
 
20
39
  # ### switches [method]
21
- # The switches, like 'literate' and 'hgroup'. Returns an array of strings.
40
+ # The switches, like *literate* and *toc*. Returns an array of strings.
41
+ #
42
+ # readme.switches #=> [ 'literate' ]
22
43
  def switches
23
44
  @options.keys.map { |k| k.to_s }
24
45
  end
25
46
 
26
47
  # ### exists? [method]
27
48
  # Returns true if the file (given in the constructor) exists.
49
+ #
50
+ # readme = Readme.new :file => 'non-existent-file.txt'
51
+ # readme.exists?
52
+ # #=> false (maybe)
53
+ #
28
54
  def exists?
29
55
  file && File.exists?(file)
30
56
  end
31
57
 
32
58
  # ### raw [method]
33
59
  # Returns raw Markdown markup.
60
+ #
61
+ # readme.raw
62
+ # #=> "# My project\n#### This is my project\n\n..."
63
+ #
34
64
  def raw
35
65
  @raw ||= File.read(file)
36
66
  end
37
67
 
38
68
  # ### title [method]
39
- # Returns a string of the title of the document (the first h1).
69
+ # Returns a string of the title of the document. Often, this is the first
70
+ # H1, but if that's not available, then it is inferred from the current
71
+ # directory's name.
72
+ #
73
+ # readme.title
74
+ # #=> "My project"
75
+ #
40
76
  def title
41
77
  @title ||= begin
42
78
  h1 = (h1 = doc.at_css('h1')) && h1.text
@@ -49,7 +85,12 @@ module Reacco
49
85
  end
50
86
 
51
87
  # ### raw_html [method]
52
- # Raw HTML data.
88
+ # Returns a string of the raw HTML data built from the markdown source.
89
+ # This does not have the transformations applied to it yet.
90
+ #
91
+ # readme.raw_html
92
+ # #=> "<h1>My project</h1>..."
93
+ #
53
94
  def raw_html
54
95
  @raw_html ||= markdown.render(raw)
55
96
  end
@@ -60,6 +101,7 @@ module Reacco
60
101
 
61
102
  # ### inject_api_block [method]
62
103
  # Adds an API block. Takes an `html` argument.
104
+ #
63
105
  def inject_api_block(html)
64
106
  @api_blocks = "#{api_blocks}\n#{html}\n"
65
107
  end
@@ -68,8 +110,12 @@ module Reacco
68
110
  @api_blocks ||= ""
69
111
  end
70
112
 
71
- # ### doc [method]
72
- # Returns HTML as a Nokogiri document.
113
+ # ### doc([options]) [method]
114
+ # Returns HTML as a Nokogiri document with all the transformations applied.
115
+ #
116
+ # readme.doc
117
+ # #=> #<Nokogiri::HTML ...>
118
+ #
73
119
  def doc(options={})
74
120
  @doc ||= begin
75
121
  add_api(api_blocks)
@@ -88,21 +134,35 @@ module Reacco
88
134
  end
89
135
 
90
136
  # ### html [method]
91
- # Returns body's inner HTML.
137
+ # Returns body's inner HTML *with* transformatinos.
138
+ #
139
+ # readme.raw_html
140
+ # #=> "<h1>My project</h1>..."
141
+ #
92
142
  def html
93
143
  doc.at_css('body').inner_html
94
144
  end
95
145
 
96
146
  # ### github [method]
97
147
  # Returns the GitHub URL, or nil if not applicable.
148
+ #
149
+ # readme.github
150
+ # #=> "https://github.com/rstacruz/reacco"
151
+ #
98
152
  def github
99
153
  "https://github.com/#{@options[:github]}" if @options[:github]
100
154
  end
101
155
 
102
- # Returns locals for the template.
156
+ # ### locals [method]
157
+ # Returns a hash with the local variables to be used for the ERB template.
158
+ #
159
+ # readme.locals
160
+ # #=> { :title => 'My project', ... }
161
+ #
103
162
  def locals
104
163
  { :title => title,
105
164
  :body_class => switches.join(' '),
165
+ :analytics => @options[:analytics],
106
166
  :github => github }
107
167
  end
108
168
 
@@ -118,7 +178,7 @@ module Reacco
118
178
  # Puts `blocks` inside `raw_html`.
119
179
  def add_api(blocks)
120
180
  re1 = %r{^.*api reference goes here.*$}i
121
- re2 = %r{^.*#api_reference.*$}i
181
+ re2 = %r{^.*href=['"]#api_reference['"].*$}i
122
182
 
123
183
  if raw_html =~ re1
124
184
  raw_html.gsub! re1, blocks
@@ -1,5 +1,5 @@
1
1
  module Reacco
2
2
  def self.version
3
- "0.0.2"
3
+ "0.0.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reacco
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-18 00:00:00.000000000Z
12
+ date: 2011-09-19 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redcarpet
16
- requirement: &2156349300 !ruby/object:Gem::Requirement
16
+ requirement: &2156896460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.0.0b3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156349300
24
+ version_requirements: *2156896460
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &2156348320 !ruby/object:Gem::Requirement
27
+ requirement: &2156895880 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.5'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2156348320
35
+ version_requirements: *2156895880
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: tilt
38
- requirement: &2156347220 !ruby/object:Gem::Requirement
38
+ requirement: &2156895460 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2156347220
46
+ version_requirements: *2156895460
47
47
  description: Reacco makes your readme's pretty.
48
48
  email:
49
49
  - rico@sinefunc.com