dnote 1.1.4 → 1.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/HISTORY +29 -0
- data/bin/dnote +2 -2
- data/lib/dnote.rb +2 -3
- data/lib/dnote/format.rb +26 -69
- data/lib/dnote/note.rb +57 -0
- data/lib/dnote/notes.rb +158 -97
- data/lib/dnote/session.rb +277 -0
- data/lib/dnote/templates/html.erb +4 -4
- data/lib/dnote/templates/html/file.erb +40 -0
- data/lib/dnote/templates/html/label.erb +41 -0
- data/lib/dnote/templates/html/list.erb +33 -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 +18 -0
- data/lib/dnote/templates/md/file.erb +13 -0
- data/lib/dnote/templates/md/label.erb +18 -0
- data/lib/dnote/templates/md/list.erb +9 -0
- data/lib/dnote/templates/rdoc.erb +3 -3
- data/lib/dnote/templates/rdoc/file.erb +9 -0
- data/lib/dnote/templates/rdoc/label.erb +11 -0
- data/lib/dnote/templates/rdoc/list.erb +6 -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 +11 -0
- data/lib/dnote/templates/text/file.erb +10 -0
- data/lib/dnote/templates/text/label.erb +11 -0
- data/lib/dnote/templates/text/list.erb +7 -0
- data/lib/dnote/templates/xml.erb +6 -6
- data/lib/dnote/templates/xml/file.erb +15 -0
- data/lib/dnote/templates/xml/label.erb +15 -0
- data/lib/dnote/templates/xml/list.erb +6 -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/plugins/syckle/dnote.rb +35 -8
- data/meta/version +1 -1
- data/test/cases/notes_case.rb +20 -31
- metadata +44 -14
- data/MANIFEST +0 -33
- data/lib/dnote/command.rb +0 -134
- data/lib/dnote/site.rb +0 -140
- data/lib/dnote/templates/gnu.erb +0 -8
- data/lib/dnote/templates/markdown.erb +0 -17
@@ -0,0 +1,277 @@
|
|
1
|
+
module DNote
|
2
|
+
|
3
|
+
require 'dnote/notes'
|
4
|
+
require 'dnote/format'
|
5
|
+
|
6
|
+
# User session which is used by commandline interface.
|
7
|
+
#
|
8
|
+
# By making this a class it makes it easy for external
|
9
|
+
# libraries to use this library just as if they were
|
10
|
+
# calling the commandline, but without the need to shellout.
|
11
|
+
#
|
12
|
+
class Session
|
13
|
+
|
14
|
+
# Directory relative to this script. This is used
|
15
|
+
# to lookup the available format templates.
|
16
|
+
DIR = File.dirname(__FILE__)
|
17
|
+
|
18
|
+
# Default format.
|
19
|
+
DEFAULT_FORMAT = "text"
|
20
|
+
|
21
|
+
# Default title.
|
22
|
+
DEFAULT_TITLE = "Developer's Notes"
|
23
|
+
|
24
|
+
# Paths to include.
|
25
|
+
attr_accessor :paths
|
26
|
+
|
27
|
+
# Paths to exclude (match by pathname).
|
28
|
+
attr_accessor :exclude
|
29
|
+
|
30
|
+
# Paths to ignore (match by basename).
|
31
|
+
attr_accessor :ignore
|
32
|
+
|
33
|
+
# Labels to lookup.
|
34
|
+
# By default these are TODO, FIXME and OPTIMIZE.
|
35
|
+
attr_accessor :labels
|
36
|
+
|
37
|
+
# Selected labels can optionally do without the colon.
|
38
|
+
attr_accessor :colon
|
39
|
+
|
40
|
+
# Output format.
|
41
|
+
attr_accessor :format
|
42
|
+
|
43
|
+
# If custom format, specify template file.
|
44
|
+
attr_accessor :template
|
45
|
+
|
46
|
+
# Some format put a title at the top of the output.
|
47
|
+
# The default is "Developer's Notes".
|
48
|
+
attr_accessor :title
|
49
|
+
|
50
|
+
# Output to a file instead of STDOUT.
|
51
|
+
attr_accessor :output
|
52
|
+
|
53
|
+
# If output path given, don't actually write to disk.
|
54
|
+
attr_accessor :dryrun
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# New Session.
|
59
|
+
def initialize(options={})
|
60
|
+
options ||= {}
|
61
|
+
initialize_defaults
|
62
|
+
options.each{ |k,v| __send__("#{k}=", v) }
|
63
|
+
yield(self) if block_given?
|
64
|
+
end
|
65
|
+
|
66
|
+
# Set default values for attributes.
|
67
|
+
def initialize_defaults
|
68
|
+
@paths = []
|
69
|
+
@labels = []
|
70
|
+
@exclude = []
|
71
|
+
@ignore = []
|
72
|
+
@format = DEFAULT_FORMAT
|
73
|
+
@title = DEFAULT_TITLE
|
74
|
+
@dryrun = false
|
75
|
+
end
|
76
|
+
|
77
|
+
public
|
78
|
+
|
79
|
+
# Set exclude list ensuring that the value is an array.
|
80
|
+
def exclude=(list)
|
81
|
+
@exclude = [list].flatten.compact
|
82
|
+
end
|
83
|
+
|
84
|
+
# Set ignore list ensuring that the value is an array.
|
85
|
+
def ignore=(list)
|
86
|
+
@ignore = [list].flatten.compact
|
87
|
+
end
|
88
|
+
|
89
|
+
# Run session.
|
90
|
+
def run
|
91
|
+
notes = Notes.new(files, :labels=>labels, :colon=>colon)
|
92
|
+
formatter = Format.new(notes) do |f|
|
93
|
+
f.format = format
|
94
|
+
f.template = template
|
95
|
+
f.title = title
|
96
|
+
f.output = output
|
97
|
+
end
|
98
|
+
formatter.render
|
99
|
+
end
|
100
|
+
|
101
|
+
# Collect path globs and remove exclusions.
|
102
|
+
# This method uses #paths, #exclude and #ignore to
|
103
|
+
# compile the list of files.
|
104
|
+
def files
|
105
|
+
list = [paths].flatten.compact
|
106
|
+
list = ['**/*.rb'] if list.empty?
|
107
|
+
list = glob(list)
|
108
|
+
list = list - glob(exclude)
|
109
|
+
list.reject do |path|
|
110
|
+
path.split('/').any?{ |part| ignore.any?{ |ig| File.fnmatch?(ig, part) } }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Collect the file glob of each path given. If
|
115
|
+
# a path is a directory, inclue all content.
|
116
|
+
def glob(paths)
|
117
|
+
paths.map do |path|
|
118
|
+
if File.directory?(path)
|
119
|
+
Dir.glob(File.join(path, '**/*'))
|
120
|
+
else
|
121
|
+
Dir.glob(path)
|
122
|
+
end
|
123
|
+
end.flatten.uniq
|
124
|
+
end
|
125
|
+
|
126
|
+
# Set special labels.
|
127
|
+
#def labels=(labels)
|
128
|
+
# @labels = (
|
129
|
+
# case labels
|
130
|
+
# when String
|
131
|
+
# labels.split(/[:;,]/)
|
132
|
+
# else
|
133
|
+
# labels = [labels].flatten.compact.uniq.map{ |s| s.to_s }
|
134
|
+
# end
|
135
|
+
# )
|
136
|
+
#end
|
137
|
+
|
138
|
+
# Commandline interface.
|
139
|
+
def self.main(*argv)
|
140
|
+
require 'optparse'
|
141
|
+
|
142
|
+
session = Session.new
|
143
|
+
|
144
|
+
opts = OptionParser.new do |opt|
|
145
|
+
|
146
|
+
opt.banner = "DNote v#{DNote::VERSION}"
|
147
|
+
|
148
|
+
opt.separator(" ")
|
149
|
+
opt.separator("USAGE:\n dnote [OPTIONS] path1 [path2 ...]")
|
150
|
+
|
151
|
+
opt.separator(" ")
|
152
|
+
opt.separator("OUTPUT FORMAT: (choose one)")
|
153
|
+
|
154
|
+
#opt.on("--default", "Plain text format (default)") do
|
155
|
+
# session.format = 'label'
|
156
|
+
#end
|
157
|
+
|
158
|
+
#opt.on("--yaml", "YAML serialization format") do
|
159
|
+
# session.format = 'yaml'
|
160
|
+
#end
|
161
|
+
|
162
|
+
#opt.on("--json", "JSON serialization format") do
|
163
|
+
# session.format = 'json'
|
164
|
+
#end
|
165
|
+
|
166
|
+
#opt.on("--soap", "SOAP XML envelope format") do
|
167
|
+
# session.format = 'soap'
|
168
|
+
#end
|
169
|
+
|
170
|
+
#opt.on("--xoxo", "XOXO microformat format") do
|
171
|
+
# session.format = 'xoxo'
|
172
|
+
#end
|
173
|
+
|
174
|
+
#opt.on("--xml", "XML markup format") do
|
175
|
+
# session.format = 'xml'
|
176
|
+
#end
|
177
|
+
|
178
|
+
#opt.on("--html", "HTML markup format") do
|
179
|
+
# session.format = 'html'
|
180
|
+
#end
|
181
|
+
|
182
|
+
#opt.on("--rdoc", "rdoc comment format") do
|
183
|
+
# session.format = 'rdoc'
|
184
|
+
#end
|
185
|
+
|
186
|
+
#opt.on("--markdown", "markdown wiki format") do
|
187
|
+
# session.format = 'md'
|
188
|
+
#end
|
189
|
+
|
190
|
+
opt.on("--format", "-f NAME", "select a format [text]") do |format|
|
191
|
+
session.format = format
|
192
|
+
end
|
193
|
+
|
194
|
+
opt.on("--custom", "-c FILE", "use a custom ERB template") do |file|
|
195
|
+
session.format = 'custom'
|
196
|
+
session.template = file
|
197
|
+
end
|
198
|
+
|
199
|
+
opt.on("--file", "shortcut for text/file format") do
|
200
|
+
session.format = 'text/file'
|
201
|
+
end
|
202
|
+
|
203
|
+
opt.on("--list", "shortcut for text/list format") do
|
204
|
+
session.format = 'text/list'
|
205
|
+
end
|
206
|
+
|
207
|
+
opt.separator(" ")
|
208
|
+
opt.separator("OTHER OPTIONS:")
|
209
|
+
|
210
|
+
opt.on("--label", "-l LABEL", "labels to collect") do |lbl|
|
211
|
+
session.labels.concat(lbl.split(':'))
|
212
|
+
end
|
213
|
+
|
214
|
+
opt.on("--[no-]colon", "match labels with/without colon suffix") do |val|
|
215
|
+
session.colon = val
|
216
|
+
end
|
217
|
+
|
218
|
+
opt.on("--exclude", "-x PATH", "exclude file or directory") do |path|
|
219
|
+
session.exclude << path
|
220
|
+
end
|
221
|
+
|
222
|
+
opt.on("--ignore", "-i NAME", "ignore based on any part of the pathname") do |name|
|
223
|
+
session.ignore << name
|
224
|
+
end
|
225
|
+
|
226
|
+
opt.on("--title", "-t TITLE", "title to use in header") do |title|
|
227
|
+
session.title = title
|
228
|
+
end
|
229
|
+
|
230
|
+
opt.on("--output", "-o PATH", "name of file or directory") do |path|
|
231
|
+
session.output = path
|
232
|
+
end
|
233
|
+
|
234
|
+
opt.on("--dryrun", "-n", "do not actually write to disk") do
|
235
|
+
session.dryrun = true
|
236
|
+
end
|
237
|
+
|
238
|
+
opt.on("--debug", "debug mode") do
|
239
|
+
$DEBUG = true
|
240
|
+
$VERBOSE = true
|
241
|
+
end
|
242
|
+
|
243
|
+
opt.separator(" ")
|
244
|
+
opt.separator("COMMAND OPTIONS:")
|
245
|
+
|
246
|
+
opt.on_tail('--templates', "-T", "list available format templates") do
|
247
|
+
tdir = File.join(DIR, 'templates')
|
248
|
+
tfiles = Dir[File.join(tdir, '**/*.erb')]
|
249
|
+
tnames = tfiles.map{ |tname| tname.sub(tdir+'/', '').chomp('.erb') }
|
250
|
+
groups = tnames.group_by{ |tname| tname.split('/').first }
|
251
|
+
groups.sort.each do |(type, names)|
|
252
|
+
puts ("%-18s " * names.size) % names.sort
|
253
|
+
end
|
254
|
+
exit
|
255
|
+
end
|
256
|
+
|
257
|
+
opt.on_tail('--help', '-h', "show this help information") do
|
258
|
+
puts opt
|
259
|
+
exit
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
begin
|
264
|
+
opts.parse!(argv)
|
265
|
+
session.paths.replace(argv)
|
266
|
+
session.run
|
267
|
+
rescue => err
|
268
|
+
raise err if $DEBUG
|
269
|
+
puts err
|
270
|
+
exit 1
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
end
|
275
|
+
|
276
|
+
end
|
277
|
+
|
@@ -22,14 +22,14 @@
|
|
22
22
|
<div class="main">
|
23
23
|
<h1><%= title %></h1>
|
24
24
|
<div class="notes">
|
25
|
-
<% notes.each do |label, per_file| %>
|
25
|
+
<% notes.by_label_file.each do |label, per_file| %>
|
26
26
|
<h2><%= label %></h2>
|
27
27
|
<ol class="set <%= label.downcase %>">
|
28
28
|
<% per_file.each do |file, line_notes| %>
|
29
29
|
<li><h3><a href="<%= file %>"><%= file %></a></h3><ol class="file" href="<%= file %>">
|
30
|
-
<% line_notes.sort!{ |a,b| a
|
31
|
-
<% line_notes.each do |
|
32
|
-
<li class="note <%= label.downcase %>" ref="<%= line %>"><%= h note %> <sup><%= line %></sup></li>
|
30
|
+
<% line_notes.sort!{ |a,b| a.line <=> b.line } %>
|
31
|
+
<% line_notes.each do |note| %>
|
32
|
+
<li class="note <%= label.downcase %>" ref="<%= note.line %>"><%= h note.text %> <sup><%= note.line %></sup></li>
|
33
33
|
<% end %>
|
34
34
|
</ol></li>
|
35
35
|
<% end %>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title><%= title %></title>
|
4
|
+
<style>
|
5
|
+
body { margin: 0; padding: 0; }
|
6
|
+
.main {
|
7
|
+
width: 800px;
|
8
|
+
margin: 0 auto;
|
9
|
+
border: 1px solid #ccc;
|
10
|
+
padding: 0 20px 20px 20px;
|
11
|
+
}
|
12
|
+
h1 { margin: 25px 0; }
|
13
|
+
h2,h3,h4 { margin: 5px 0; padding: 0; color: 880044; }
|
14
|
+
h3 { color: 004488; }
|
15
|
+
h4 { color: 888844; }
|
16
|
+
ul { margin: 0; padding: 0; text-align: left; }
|
17
|
+
li { margin: 0; padding: 0; text-align: left; }
|
18
|
+
</style>
|
19
|
+
<link rel="stylesheet" href="notes.css" type="text/css">
|
20
|
+
</head>
|
21
|
+
<body>
|
22
|
+
<div class="main">
|
23
|
+
<h1><%= title %></h1>
|
24
|
+
<div class="notes">
|
25
|
+
<% notes.by_file_label.each do |file, per_label| %>
|
26
|
+
<h2><a href="<%= file %>"><%= file %></a></h2>
|
27
|
+
<ol class="file">
|
28
|
+
<% per_label.each do |label, lnotes| %>
|
29
|
+
<li><h3><%= label %></h3><ol class="label">
|
30
|
+
<% lnotes.each do |note| %>
|
31
|
+
<li class="note <%= label.downcase %>" ref="<%= note.line %>"><%= h note.textline %> <sup><%= note.line %></sup></li>
|
32
|
+
<% end %>
|
33
|
+
</ol></li>
|
34
|
+
<% end %>
|
35
|
+
</ol>
|
36
|
+
<% end %>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</body>
|
40
|
+
</html>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title><%= title %></title>
|
4
|
+
<style>
|
5
|
+
body { margin: 0; padding: 0; }
|
6
|
+
.main {
|
7
|
+
width: 800px;
|
8
|
+
margin: 0 auto;
|
9
|
+
border: 1px solid #ccc;
|
10
|
+
padding: 0 20px 20px 20px;
|
11
|
+
}
|
12
|
+
h1 { margin: 25px 0; }
|
13
|
+
h2,h3,h4 { margin: 5px 0; padding: 0; color: 880044; }
|
14
|
+
h3 { color: 004488; }
|
15
|
+
h4 { color: 888844; }
|
16
|
+
ul { margin: 0; padding: 0; text-align: left; }
|
17
|
+
li { margin: 0; padding: 0; text-align: left; }
|
18
|
+
</style>
|
19
|
+
<link rel="stylesheet" href="notes.css" type="text/css">
|
20
|
+
</head>
|
21
|
+
<body>
|
22
|
+
<div class="main">
|
23
|
+
<h1><%= title %></h1>
|
24
|
+
<div class="notes">
|
25
|
+
<% notes.by_label_file.each do |label, per_file| %>
|
26
|
+
<h2><%= label %></h2>
|
27
|
+
<ol class="set <%= label.downcase %>">
|
28
|
+
<% per_file.each do |file, line_notes| %>
|
29
|
+
<li><h3><a href="<%= file %>"><%= file %></a></h3><ol class="file" href="<%= file %>">
|
30
|
+
<% line_notes.sort!{ |a,b| a.line <=> b.line } %>
|
31
|
+
<% line_notes.each do |note| %>
|
32
|
+
<li class="note <%= label.downcase %>" ref="<%= note.line %>"><%= h note.text %> <sup><%= note.line %></sup></li>
|
33
|
+
<% end %>
|
34
|
+
</ol></li>
|
35
|
+
<% end %>
|
36
|
+
</ol>
|
37
|
+
<% end %>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</body>
|
41
|
+
</html>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title><%= title %></title>
|
4
|
+
<style>
|
5
|
+
body { margin: 0; padding: 0; }
|
6
|
+
.main {
|
7
|
+
width: 800px;
|
8
|
+
margin: 0 auto;
|
9
|
+
border: 1px solid #ccc;
|
10
|
+
padding: 0 20px 20px 20px;
|
11
|
+
}
|
12
|
+
h1 { margin: 25px 0; }
|
13
|
+
h2,h3,h4 { margin: 5px 0; padding: 0; color: 880044; }
|
14
|
+
h3 { color: 004488; }
|
15
|
+
h4 { color: 888844; }
|
16
|
+
ul { margin: 0; padding: 0; text-align: left; }
|
17
|
+
li { margin: 0; padding: 0; text-align: left; }
|
18
|
+
</style>
|
19
|
+
<link rel="stylesheet" href="notes.css" type="text/css">
|
20
|
+
</head>
|
21
|
+
<body>
|
22
|
+
<div class="main">
|
23
|
+
<h1><%= title %></h1>
|
24
|
+
<div class="notes">
|
25
|
+
<ol>
|
26
|
+
<% notes.each do |note| %>
|
27
|
+
<li class="note <%= note.label.downcase %>" ref="<%= note.line %>"><%= note.label %>: <%= h note.text %> <sup><%= note.file %>: <%= note.line %></sup></li>
|
28
|
+
<% end %>
|
29
|
+
</ol>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</body>
|
33
|
+
</html>
|