mvz-dnote 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/COPYING.rdoc +31 -0
- data/HISTORY.rdoc +171 -0
- data/README.rdoc +113 -0
- data/bin/dnote +4 -0
- data/lib/dnote.rb +4 -0
- data/lib/dnote.yml +1 -0
- data/lib/dnote/core_ext.rb +92 -0
- data/lib/dnote/format.rb +173 -0
- data/lib/dnote/note.rb +150 -0
- data/lib/dnote/notes.rb +320 -0
- data/lib/dnote/rake/dnotetask.rb +116 -0
- data/lib/dnote/session.rb +269 -0
- data/lib/dnote/templates/html.erb +49 -0
- data/lib/dnote/templates/html/file.erb +48 -0
- data/lib/dnote/templates/html/label.erb +49 -0
- data/lib/dnote/templates/html/list.erb +42 -0
- data/lib/dnote/templates/json.erb +8 -0
- data/lib/dnote/templates/json/file.erb +8 -0
- data/lib/dnote/templates/json/label.erb +8 -0
- data/lib/dnote/templates/json/list.erb +8 -0
- data/lib/dnote/templates/md.erb +19 -0
- data/lib/dnote/templates/md/file.erb +14 -0
- data/lib/dnote/templates/md/label.erb +19 -0
- data/lib/dnote/templates/md/list.erb +10 -0
- data/lib/dnote/templates/rdoc.erb +12 -0
- data/lib/dnote/templates/rdoc/file.erb +10 -0
- data/lib/dnote/templates/rdoc/label.erb +12 -0
- data/lib/dnote/templates/rdoc/list.erb +7 -0
- data/lib/dnote/templates/soap.erb +4 -0
- data/lib/dnote/templates/soap/file.erb +4 -0
- data/lib/dnote/templates/soap/label.erb +4 -0
- data/lib/dnote/templates/soap/list.erb +4 -0
- data/lib/dnote/templates/text.erb +12 -0
- data/lib/dnote/templates/text/file.erb +11 -0
- data/lib/dnote/templates/text/label.erb +11 -0
- data/lib/dnote/templates/text/list.erb +8 -0
- data/lib/dnote/templates/xml.erb +23 -0
- data/lib/dnote/templates/xml/file.erb +23 -0
- data/lib/dnote/templates/xml/label.erb +23 -0
- data/lib/dnote/templates/xml/list.erb +14 -0
- data/lib/dnote/templates/xoxo.erb +4 -0
- data/lib/dnote/templates/xoxo/file.erb +4 -0
- data/lib/dnote/templates/xoxo/label.erb +4 -0
- data/lib/dnote/templates/xoxo/list.erb +6 -0
- data/lib/dnote/templates/yaml.erb +1 -0
- data/lib/dnote/templates/yaml/file.erb +1 -0
- data/lib/dnote/templates/yaml/label.erb +1 -0
- data/lib/dnote/templates/yaml/list.erb +1 -0
- data/lib/dnote/version.rb +17 -0
- data/test/notes_case.rb +59 -0
- data/try/sample.bas +7 -0
- data/try/sample.js +11 -0
- data/try/sample.rb +11 -0
- metadata +131 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 98fb559fd41018e820045b6bc49f6d8bba90b0fb
|
4
|
+
data.tar.gz: 3d6ebc561fd714f6ff33ecb45f9e55396b8fb6c7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 571aec135e69a01abab0658f214f9ac0baa3913081598a5026e73f6660efc31f80c14b22b7291521f8e6a1c7be5fb3c88a862f4c86ac98e87351b9497c6b5975
|
7
|
+
data.tar.gz: 413450876f72af24fb04d3a81e62a86f28d459ac504931a5d8856eabe77d7638ad0f0e795b244a98ffc73460521fc5d45003db1aa718388ea07e118ab8f3a45a
|
data/COPYING.rdoc
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
= COPYRIGHT NOTICES
|
2
|
+
|
3
|
+
== DNote
|
4
|
+
|
5
|
+
Copyright:: (c) 2006 Thomas Sawyer, Rubyworks
|
6
|
+
License:: BSD-2-Clause
|
7
|
+
Website:: http://rubyworks.github.com/tapout
|
8
|
+
|
9
|
+
Copyright 2006 Thomas Sawyer, Rubyworks. All rights reserved.
|
10
|
+
|
11
|
+
Redistribution and use in source and binary forms, with or without
|
12
|
+
modification, are permitted provided that the following conditions are met:
|
13
|
+
|
14
|
+
1. Redistributions of source code must retain the above copyright notice,
|
15
|
+
this list of conditions and the following disclaimer.
|
16
|
+
|
17
|
+
2. Redistributions in binary form must reproduce the above copyright
|
18
|
+
notice, this list of conditions and the following disclaimer in the
|
19
|
+
documentation and/or other materials provided with the distribution.
|
20
|
+
|
21
|
+
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
22
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
23
|
+
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
24
|
+
COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
25
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
26
|
+
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
28
|
+
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
29
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
30
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
|
data/HISTORY.rdoc
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
= RELEASE HISTORY
|
2
|
+
|
3
|
+
|
4
|
+
== 1.7.0 / 2011-10-25
|
5
|
+
|
6
|
+
This release finishes adding code context support to all formats. Use the `-c`
|
7
|
+
option to set the number of lines to include. Note also that the rake task has
|
8
|
+
been moved to `dnote/rake/dnotetask`.
|
9
|
+
|
10
|
+
Changes:
|
11
|
+
|
12
|
+
* Support code contexts in all formats.
|
13
|
+
* Rake task moved to `dnote/rake/dnotetask`.
|
14
|
+
|
15
|
+
|
16
|
+
== 1.6.1 / 2011-05-18
|
17
|
+
|
18
|
+
Last release reused the `-c` option for context lines. This clobbered
|
19
|
+
the shortcut option for `--custom`. To fix, this release capitalizes
|
20
|
+
the custom shortcut to `-C`.
|
21
|
+
|
22
|
+
Changes:
|
23
|
+
|
24
|
+
* Capitalize custom shortcut option (-c becomes -C).
|
25
|
+
|
26
|
+
|
27
|
+
== 1.6.0 / 2011-05-17
|
28
|
+
|
29
|
+
This release adds code conext output. Select the number of
|
30
|
+
context lines to display with the `-c` option. Currently
|
31
|
+
only the HTML, YAML and JSON formats support context.
|
32
|
+
|
33
|
+
This release also fixes the false note match that can arise when
|
34
|
+
a class or module name with double-colons starts a comment line.
|
35
|
+
We have changed the regex to ALWAYS REQUIRE a space after the
|
36
|
+
label colon. Please make a note of it!
|
37
|
+
|
38
|
+
Changes:
|
39
|
+
|
40
|
+
* Add code context count option and output.
|
41
|
+
* Regex changed to REQUIRE space after label colon.
|
42
|
+
|
43
|
+
|
44
|
+
== 1.5.0 / 2010-11-27
|
45
|
+
|
46
|
+
This release adds a `--url` option for defining a URL template
|
47
|
+
string used in certain HTML/XML formats. In addition a parsing
|
48
|
+
bug was corrected that limited some notes to one line.
|
49
|
+
|
50
|
+
Changes:
|
51
|
+
|
52
|
+
* Add support for configurable URLs.
|
53
|
+
* Fix multi-line note parsing bug.
|
54
|
+
|
55
|
+
|
56
|
+
== 1.4.0 / 2010-06-26
|
57
|
+
|
58
|
+
This release adds auto-determination of marker based on file
|
59
|
+
extension. This means DNote can now scan multiple file types
|
60
|
+
in a single pass. The supported types are fairly small at this
|
61
|
+
point, but cover the command cases and will expand in the future.
|
62
|
+
The fallback marker is '#'. You can still force a particular
|
63
|
+
marker using the --marker option.
|
64
|
+
|
65
|
+
Changes:
|
66
|
+
|
67
|
+
* Add support for automatic markers.
|
68
|
+
|
69
|
+
|
70
|
+
== 1.3.1 / 2010-06-11
|
71
|
+
|
72
|
+
This release fixes a simple bug. Some version of Ruby do not have
|
73
|
+
the Enumerable#group_by method. This release provides it if it is
|
74
|
+
missing.
|
75
|
+
|
76
|
+
Changes:
|
77
|
+
|
78
|
+
* Bug fix, provide #group_by when it is not present.
|
79
|
+
|
80
|
+
|
81
|
+
== 1.3.0 / 2010-06-04
|
82
|
+
|
83
|
+
This release adds support for alternate comment markers. Simply
|
84
|
+
supply the marker with the -m option.
|
85
|
+
|
86
|
+
Changes:
|
87
|
+
|
88
|
+
* Add support for languages other than Ruby.
|
89
|
+
|
90
|
+
|
91
|
+
== 1.2.0 / 2010-02-18
|
92
|
+
|
93
|
+
By request this release adds additional formats, allowing notes to be
|
94
|
+
sorted by filename as well a label. In addition, paths can now be
|
95
|
+
excluded from the search. To implement these changes it was necessary
|
96
|
+
to makes some significant under-the-hood adjustments, and this required
|
97
|
+
making some adjustments to the design of the templates and the
|
98
|
+
command-line interface.
|
99
|
+
|
100
|
+
If are using any of your own custom templates you will have to make
|
101
|
+
adjustments accordingly --which basically entails exchanging +notes.each+
|
102
|
+
for +notes.by_label_file.each+. Also, notice that the serialization formats
|
103
|
+
have changed accordingly to match the improved underlying model.
|
104
|
+
|
105
|
+
On the command-line, the format type itself is no longer used as the
|
106
|
+
option name, e.g. "--yaml", but instead use "-f", e.g. "-f yaml". This
|
107
|
+
opens DNote up to many more templates. Use "-T" to get a list of all
|
108
|
+
template format available.
|
109
|
+
|
110
|
+
Changes:
|
111
|
+
|
112
|
+
* Improve underlying model by adding a Note class.
|
113
|
+
* Add --exclude and --ignore options.
|
114
|
+
* Add new formats and rename "gnu" formats to "text".
|
115
|
+
* Use --format/-f to designate formats.
|
116
|
+
* Renamed --template/-t option to --custom/-c.
|
117
|
+
* Add --templates/-T to list all format templates.
|
118
|
+
|
119
|
+
|
120
|
+
== 1.1.0 / 2010-02-06
|
121
|
+
|
122
|
+
This relase primarily adjusts the way output it rendered
|
123
|
+
underthehood. Serialization formats are rendered as
|
124
|
+
before but markup formats now use Erb. In the process
|
125
|
+
two new serialization formats have been added: soap and xoxo.
|
126
|
+
|
127
|
+
Also, this release renames the lib/plugin directory to
|
128
|
+
lib/plugins (plural) per the new convention of the latest
|
129
|
+
Plugin gem. This only matters to Syckle users.
|
130
|
+
|
131
|
+
Changes:
|
132
|
+
|
133
|
+
* Add Soap and XOXO formats.
|
134
|
+
* Add actual --output option.
|
135
|
+
* Move lib/plugin to lib/plugins.
|
136
|
+
|
137
|
+
|
138
|
+
== 1.0.0 / 2009-10-25
|
139
|
+
|
140
|
+
This relase adds support for arbitrary note labels.
|
141
|
+
Any all-caps word followed by a colon will be
|
142
|
+
picked-up. Common labels like TODO and FIXME are
|
143
|
+
recognized without the trailing ':'.
|
144
|
+
|
145
|
+
Changes:
|
146
|
+
|
147
|
+
* Added support for arbitrary labels.
|
148
|
+
|
149
|
+
|
150
|
+
== 0.9.0 / 2009-10-10
|
151
|
+
|
152
|
+
This release adds a syckle plugin and improves output.
|
153
|
+
|
154
|
+
Changes:
|
155
|
+
|
156
|
+
* Add syckle plugin, based on old Notes plugin.
|
157
|
+
* Improved HTML output (</div> tag should have been </ol>).
|
158
|
+
* If output not specified, sends rdoc to stdout.
|
159
|
+
* If no paths specified, will scan '**/*.rb'
|
160
|
+
|
161
|
+
|
162
|
+
== 0.8.0 / 2009-10-09
|
163
|
+
|
164
|
+
This is the initial release of DNote. DNote is a spin-off
|
165
|
+
of a Syckle (formerlly Reap) plugin which scans source
|
166
|
+
code and compiles a list of developer notes.
|
167
|
+
|
168
|
+
Changes:
|
169
|
+
|
170
|
+
* Happy Birthday!
|
171
|
+
|
data/README.rdoc
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
= DNote
|
2
|
+
|
3
|
+
* {Homepage}[http://rubyworks.github.com/dnote]
|
4
|
+
* {Mailing List}[http://googlegroups.com/group/rubyworks-mailinglist]
|
5
|
+
* {Source Code}[http://github.com/rubyworks/dnote]
|
6
|
+
|
7
|
+
|
8
|
+
== DESCRIPTION
|
9
|
+
|
10
|
+
Extract development notes from source code and generate some nice
|
11
|
+
output formats for them.
|
12
|
+
|
13
|
+
|
14
|
+
== SYNOPSIS
|
15
|
+
|
16
|
+
=== Note Structure
|
17
|
+
|
18
|
+
DNote scans for the common note patterns used by developers of many languages in the form of an
|
19
|
+
all-caps labels followed by a colon. To be more specific, for DNote to recognize a note,
|
20
|
+
it needs to follow this simple set of rules:
|
21
|
+
|
22
|
+
1) Notes start with an all-caps label punctuated with a colon, followed by the note's text.
|
23
|
+
|
24
|
+
# LABEL: description ...
|
25
|
+
|
26
|
+
2) Any note that requires more than one line must remain flush to the left
|
27
|
+
margin (the margin is set by the first line). This is done because RDoc will mistake
|
28
|
+
the note for a <code>pre</code> block if it is indented.
|
29
|
+
|
30
|
+
# LABEL: description ...
|
31
|
+
# continue ...
|
32
|
+
|
33
|
+
3) An alternative to the previous limitation is to indent the whole note, making it
|
34
|
+
a <tt><pre></tt> block when rendered by RDoc. Then the text layout is free-form.
|
35
|
+
|
36
|
+
# This is a description of something...
|
37
|
+
#
|
38
|
+
# LABEL: description ...
|
39
|
+
# continue ...
|
40
|
+
|
41
|
+
That's all there is to it, if I can convince the developers of RDoc to recognize labels,
|
42
|
+
we may eventually be able to relax the flush rule too, which would be very nice.
|
43
|
+
|
44
|
+
There is also a command-line option, <code>--no-colon</code>, which deactives the need for
|
45
|
+
a colon after the note label. However this often produces false positives, so it's use is
|
46
|
+
discouraged.
|
47
|
+
|
48
|
+
|
49
|
+
=== Generating Notes
|
50
|
+
|
51
|
+
As you can see the commandline interface is pretty straight-forward.
|
52
|
+
|
53
|
+
USAGE:
|
54
|
+
|
55
|
+
dnote [OPTIONS] path1 [path2 ...]
|
56
|
+
|
57
|
+
OUTPUT FORMAT: (choose one)
|
58
|
+
-f, --format NAME select a format [text]
|
59
|
+
-c, --custom FILE use a custom ERB template
|
60
|
+
--file shortcut for text/file format
|
61
|
+
--list shortcut for text/list format
|
62
|
+
|
63
|
+
OTHER OPTIONS:
|
64
|
+
-l, --label LABEL labels to collect
|
65
|
+
--[no-]colon match labels with/without colon suffix
|
66
|
+
-m, --marker MARK alternative remark marker
|
67
|
+
-u --url TEMPLATE url template for line entries (for HTML)
|
68
|
+
-x, --exclude PATH exclude file or directory
|
69
|
+
-i, --ignore NAME ignore based on any part of the pathname
|
70
|
+
-t, --title TITLE title to use in header
|
71
|
+
-o, --output PATH name of file or directory
|
72
|
+
-n, --dryrun do not actually write to disk
|
73
|
+
--debug debug mode
|
74
|
+
|
75
|
+
COMMAND OPTIONS:
|
76
|
+
-T, --templates list available format templates
|
77
|
+
-h, --help show this help information
|
78
|
+
|
79
|
+
The default path is <tt>**/*.rb</tt> and the default format is <tt>-f rdoc</tt>.
|
80
|
+
Here is an example of DNote's current notes in RDoc format:
|
81
|
+
|
82
|
+
= Development Notes
|
83
|
+
|
84
|
+
== TODO
|
85
|
+
|
86
|
+
=== file://lib/dnote/notes.rb
|
87
|
+
|
88
|
+
* TODO: Add ability to read header notes. They often
|
89
|
+
have a outline format, rather then the single line. (19)
|
90
|
+
* TODO: Need good CSS file. (22)
|
91
|
+
* TODO: Need XSL? (24)
|
92
|
+
|
93
|
+
=== file://plug/syckle/services/dnote.rb
|
94
|
+
|
95
|
+
* TODO: Should this service be part of the +site+ cycle? (18)
|
96
|
+
|
97
|
+
(4 TODOs)
|
98
|
+
|
99
|
+
|
100
|
+
== INSTALLATION
|
101
|
+
|
102
|
+
The usual RubyGem's command will do the trick.
|
103
|
+
|
104
|
+
$ sudo gem install dnote
|
105
|
+
|
106
|
+
|
107
|
+
== COPYRIGHT
|
108
|
+
|
109
|
+
Copyright (c) 2006 Thomas Sawyer, Rubyworks
|
110
|
+
|
111
|
+
DNote is distributable in accordance with the terms of the *FreeBSD* license.
|
112
|
+
|
113
|
+
See COPYING.rdoc for details.
|
data/bin/dnote
ADDED
data/lib/dnote.rb
ADDED
data/lib/dnote.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
lib/../.ruby
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Enumerable
|
2
|
+
|
3
|
+
# Taken from Ruby Facets.
|
4
|
+
def group_by #:yield:
|
5
|
+
#h = k = e = nil
|
6
|
+
r = Hash.new
|
7
|
+
each{ |e| (r[yield(e)] ||= []) << e }
|
8
|
+
r
|
9
|
+
end unless method_defined?(:group_by)
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
module DNote
|
14
|
+
|
15
|
+
# Extensions for String class.
|
16
|
+
# These methods are taken directly from Ruby Facets.
|
17
|
+
#
|
18
|
+
module String
|
19
|
+
|
20
|
+
# Provides a margin controlled string.
|
21
|
+
#
|
22
|
+
# x = %Q{
|
23
|
+
# | This
|
24
|
+
# | is
|
25
|
+
# | margin controlled!
|
26
|
+
# }.margin
|
27
|
+
#
|
28
|
+
#
|
29
|
+
# NOTE: This may still need a bit of tweaking.
|
30
|
+
#
|
31
|
+
# CREDIT: Trans
|
32
|
+
|
33
|
+
def margin(n=0)
|
34
|
+
#d = /\A.*\n\s*(.)/.match( self )[1]
|
35
|
+
#d = /\A\s*(.)/.match( self)[1] unless d
|
36
|
+
d = ((/\A.*\n\s*(.)/.match(self)) ||
|
37
|
+
(/\A\s*(.)/.match(self)))[1]
|
38
|
+
return '' unless d
|
39
|
+
if n == 0
|
40
|
+
gsub(/\n\s*\Z/,'').gsub(/^\s*[#{d}]/, '')
|
41
|
+
else
|
42
|
+
gsub(/\n\s*\Z/,'').gsub(/^\s*[#{d}]/, ' ' * n)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Preserves relative tabbing.
|
47
|
+
# The first non-empty line ends up with n spaces before nonspace.
|
48
|
+
#
|
49
|
+
# CREDIT: Gavin Sinclair
|
50
|
+
|
51
|
+
def tabto(n)
|
52
|
+
if self =~ /^( *)\S/
|
53
|
+
indent(n - $1.length)
|
54
|
+
else
|
55
|
+
self
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Indent left or right by n spaces.
|
60
|
+
# (This used to be called #tab and aliased as #indent.)
|
61
|
+
#
|
62
|
+
# CREDIT: Gavin Sinclair
|
63
|
+
# CREDIT: Trans
|
64
|
+
|
65
|
+
def indent(n)
|
66
|
+
if n >= 0
|
67
|
+
gsub(/^/, ' ' * n)
|
68
|
+
else
|
69
|
+
gsub(/^ {0,#{-n}}/, "")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
#
|
75
|
+
def tabset(n)
|
76
|
+
i = lines.map do |line|
|
77
|
+
line.strip.empty? ? nil : line.index(/\S/)
|
78
|
+
end
|
79
|
+
x = i.compact.min
|
80
|
+
t = n - x.to_i
|
81
|
+
t = 0 if t < 0
|
82
|
+
indent(t)
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
class ::String #:nodoc:
|
88
|
+
include DNote::String
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
data/lib/dnote/format.rb
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
module DNote
|
2
|
+
|
3
|
+
# = Notes Formatter
|
4
|
+
#
|
5
|
+
#--
|
6
|
+
# TODO: Need good CSS file.
|
7
|
+
#
|
8
|
+
# TODO: Need XSL?
|
9
|
+
#++
|
10
|
+
class Format
|
11
|
+
|
12
|
+
require 'fileutils'
|
13
|
+
require 'erb'
|
14
|
+
require 'rexml/text'
|
15
|
+
require 'dnote/core_ext'
|
16
|
+
|
17
|
+
#DEFAULT_OUTPUT_DIR = "log/dnote"
|
18
|
+
|
19
|
+
EXTENSIONS = { 'text'=>'txt', 'soap'=>'xml', 'xoxo'=>'xml' }
|
20
|
+
|
21
|
+
#
|
22
|
+
attr :notes
|
23
|
+
|
24
|
+
#
|
25
|
+
attr_accessor :format
|
26
|
+
|
27
|
+
#
|
28
|
+
attr_accessor :subtype
|
29
|
+
|
30
|
+
#
|
31
|
+
attr_accessor :output
|
32
|
+
|
33
|
+
#
|
34
|
+
attr_accessor :template
|
35
|
+
|
36
|
+
#
|
37
|
+
attr_accessor :title
|
38
|
+
|
39
|
+
#
|
40
|
+
attr_accessor :dryrun
|
41
|
+
|
42
|
+
#
|
43
|
+
def initialize(notes, options={})
|
44
|
+
@notes = notes
|
45
|
+
@format = 'text'
|
46
|
+
@subtype = 'label'
|
47
|
+
@title = "Developer's Notes"
|
48
|
+
@dryrun = false
|
49
|
+
options.each{ |k,v| __send__("#{k}=", v) if v }
|
50
|
+
yield(self) if block_given?
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
def render
|
55
|
+
if notes.empty?
|
56
|
+
$stderr << "No #{notes.labels.join(', ')} notes.\n"
|
57
|
+
else
|
58
|
+
case format
|
59
|
+
when 'custom'
|
60
|
+
render_custom
|
61
|
+
else
|
62
|
+
render_template
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# C U S T O M
|
68
|
+
|
69
|
+
#
|
70
|
+
def render_custom
|
71
|
+
#raise ArgumentError unless File.exist?(template)
|
72
|
+
result = erb(template)
|
73
|
+
publish(result)
|
74
|
+
end
|
75
|
+
|
76
|
+
# T E M P L A T E
|
77
|
+
|
78
|
+
#
|
79
|
+
def render_template
|
80
|
+
template = File.join(File.dirname(__FILE__), 'templates', "#{format}.erb")
|
81
|
+
raise "No such format - #{format}" unless File.exist?(template)
|
82
|
+
result = erb(template)
|
83
|
+
publish(result)
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
#
|
89
|
+
def erb(file)
|
90
|
+
scope = ErbScope.new(:notes=>notes, :title=>title)
|
91
|
+
scope.render(file)
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
def publish(result, fname=nil)
|
96
|
+
if output
|
97
|
+
write(result, fname)
|
98
|
+
else
|
99
|
+
puts(result)
|
100
|
+
end
|
101
|
+
$stderr << "(" + notes.counts.map{|l,n| "#{n} #{l}s"}.join(', ') + ")\n"
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
def write(result, fname=nil)
|
106
|
+
if output.to_s[-1,1] == '/' || File.directory?(output)
|
107
|
+
fmt = format.split('/').first
|
108
|
+
ext = EXTENSIONS[fmt] || fmt
|
109
|
+
file = File.join(output, fname || "notes.#{ext}")
|
110
|
+
else
|
111
|
+
file = output
|
112
|
+
end
|
113
|
+
if dryrun?
|
114
|
+
puts "mkdir: #{File.dirname(file)}"
|
115
|
+
puts "write: #{file}"
|
116
|
+
else
|
117
|
+
dir = File.dirname(file)
|
118
|
+
fu.mkdir(dir) unless File.exist?(dir)
|
119
|
+
File.open(file, 'w'){ |f| f << result }
|
120
|
+
end
|
121
|
+
return file
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
def dryrun?
|
126
|
+
@dryrun
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
def debug?
|
131
|
+
$DEBUG
|
132
|
+
end
|
133
|
+
|
134
|
+
#
|
135
|
+
def fu
|
136
|
+
@fu ||= (
|
137
|
+
if dryrun? and debug?
|
138
|
+
FileUtils::DryRun
|
139
|
+
elsif dryrun?
|
140
|
+
FileUtils::Noop
|
141
|
+
elsif debug?
|
142
|
+
FileUtils::Verbose
|
143
|
+
else
|
144
|
+
FileUtils
|
145
|
+
end
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
class ErbScope
|
151
|
+
#
|
152
|
+
def initialize(data={})
|
153
|
+
@data = data
|
154
|
+
end
|
155
|
+
#
|
156
|
+
def render(file)
|
157
|
+
erb = ERB.new(File.read(file), nil, '<>')
|
158
|
+
erb.result(binding)
|
159
|
+
end
|
160
|
+
#
|
161
|
+
def h(string)
|
162
|
+
REXML::Text.normalize(string)
|
163
|
+
end
|
164
|
+
#
|
165
|
+
def method_missing(s, *a)
|
166
|
+
@data[s.to_sym]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|