inochi 4.0.1 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/CREDITS CHANGED
@@ -1,21 +1,14 @@
1
- %#----------------------------------------------------------------------------
2
- ## AUTHORS
3
- %#----------------------------------------------------------------------------
1
+ == AUTHORS
4
2
 
5
3
  Suraj N. Kurapati
6
4
 
7
- %#----------------------------------------------------------------------------
8
- ## CREDITS
9
- %#----------------------------------------------------------------------------
5
+ === Credits
10
6
 
11
7
  Florian Gilcher,
12
8
  Peileppe Production
13
9
 
14
- %< "logo/README"
10
+ %< 'logo/README'
15
11
 
16
- %#----------------------------------------------------------------------------
17
- ## LICENSE
18
- %#----------------------------------------------------------------------------
12
+ === License
19
13
 
20
- %# See the file named "LICENSE".
21
- %< "LICENSE"
14
+ %< 'LICENSE'
data/bin/inochi CHANGED
@@ -3,16 +3,8 @@
3
3
  require 'inochi'
4
4
 
5
5
  if ARGV.delete('-h') or ARGV.delete('--help')
6
- # try to display UNIX version of help manual
7
- man_path = File.join(Inochi::INSTDIR, 'man')
8
- unless system 'man', '-M', man_path, '-a', 'inochi'
9
- # try to display HTML version of help manual
10
- man_html = man_path + '.html'
11
- unless %w[$BROWSER open start].any? {|b| system "#{b} #{man_html}" }
12
- # no luck; direct user to project website
13
- puts "See #{Inochi::WEBSITE}"
14
- end
15
- end
6
+ system 'man', '-M', File.join(Inochi::INSTDIR, 'man'), 'inochi' or
7
+ warn "Could not display the help manual.\nSee #{Inochi::WEBSITE} instead."
16
8
  exit
17
9
  elsif ARGV.delete('-v') or ARGV.delete('--version')
18
10
  puts Inochi::VERSION
data/lib/inochi/engine.rb CHANGED
@@ -11,7 +11,13 @@ module Inochi
11
11
  include Inochi::Generate
12
12
 
13
13
  def run
14
- register_rake_tasks
14
+ register_init_task
15
+
16
+ if has_project_config?
17
+ load_project_config
18
+ register_rake_tasks
19
+ end
20
+
15
21
  run_rake_tasks
16
22
  end
17
23
 
@@ -42,6 +48,74 @@ module Inochi
42
48
  end
43
49
  end
44
50
 
51
+ def register_init_task
52
+ desc 'Instill Inochi into current directory.'
53
+ task :init do
54
+ unless project_name = ENV['project']
55
+ raise ArgumentError, 'project name not specified'
56
+ end
57
+
58
+ library_name = Engine.calc_library_name(project_name)
59
+ package_name = ENV['package'] || Engine.calc_package_name(library_name)
60
+
61
+ project_version = '0.0.0'
62
+ project_release = Time.now.strftime('%F')
63
+
64
+ command_file = "bin/#{package_name}"
65
+ create_from_rbs binding, command_file, 'command'
66
+ chmod 0755, command_file
67
+
68
+ create_from_rbs binding, PROJECT_CONFIG_FILE
69
+
70
+ create_from_rbs binding, "lib/#{package_name}.rb", 'library'
71
+ create_from_rbs binding, "lib/#{package_name}/inochi.rb"
72
+
73
+ create_from_rbs binding, 'test/runner', 'test_runner'
74
+ chmod 0755, 'test/runner'
75
+ create_from_rbs binding, 'test/helper.rb', 'test_helper.rb'
76
+ create_from_rbs binding, "test/#{package_name}_test.rb", 'library_test.rb'
77
+
78
+ create_from_rbs binding, 'LICENSE'
79
+ create_from_rbs binding, 'MANUAL'
80
+ create_from_rbs binding, 'SYNOPSIS'
81
+ create_from_rbs binding, 'README'
82
+ create_from_rbs binding, 'INSTALL'
83
+ create_from_rbs binding, 'USAGE'
84
+ create_from_rbs binding, 'HACKING'
85
+ create_from_rbs binding, 'HISTORY'
86
+ create_from_rbs binding, 'CREDITS'
87
+ create_from_rbs binding, 'BEYOND'
88
+ end
89
+ end
90
+
91
+ PROJECT_CONFIG_FILE = 'inochi.conf'
92
+
93
+ def has_project_config?
94
+ File.exist? PROJECT_CONFIG_FILE
95
+ end
96
+
97
+ def load_project_config
98
+ @project_config = YAML.load_file(PROJECT_CONFIG_FILE).to_hash
99
+
100
+ # load the project module
101
+ library_file = Dir['lib/*/inochi.rb'].first
102
+ package_name = File.basename(File.dirname(library_file))
103
+ library_name = File.read(library_file)[/\b(module|class)\b\s+(\w+)/, 2]
104
+
105
+ $LOAD_PATH.unshift 'lib'
106
+ require "#{package_name}/inochi"
107
+
108
+ @project_module = Object.const_get(library_name)
109
+ @project_package_name = package_name
110
+ @project_library_name = library_name
111
+ @project_gem_file = "#{@project_package_name}-#{@project_module::VERSION}.gem"
112
+
113
+ rescue => error
114
+ error.message.insert 0,
115
+ "Could not load project configuration file #{PROJECT_CONFIG_FILE.inspect}: "
116
+ raise error
117
+ end
118
+
45
119
  TEMPLATE_DIR = File.join(File.dirname(__FILE__), 'templates')
46
120
 
47
121
  ##
data/lib/inochi/inochi.rb CHANGED
@@ -18,12 +18,12 @@ module Inochi
18
18
  ##
19
19
  # Number of this release of this project.
20
20
  #
21
- VERSION = '4.0.1'
21
+ VERSION = '5.0.0'
22
22
 
23
23
  ##
24
24
  # Date of this release of this project.
25
25
  #
26
- RELDATE = '2010-07-28'
26
+ RELDATE = '2010-08-07'
27
27
 
28
28
  ##
29
29
  # Description of this release of this project.
@@ -44,14 +44,14 @@ module Inochi
44
44
  #
45
45
  # RUNTIME = {
46
46
  # # this project needs exactly version 1.2.3 of the "an_example" gem
47
- # "an_example" => [ "1.2.3" ],
47
+ # 'an_example' => [ '1.2.3' ],
48
48
  #
49
49
  # # this project needs at least version 1.2 (but not
50
50
  # # version 1.2.4 or newer) of the "another_example" gem
51
- # "another_example" => [ ">= 1.2" , "< 1.2.4" ],
51
+ # 'another_example' => [ '>= 1.2' , '< 1.2.4' ],
52
52
  #
53
53
  # # this project needs any version of the "yet_another_example" gem
54
- # "yet_another_example" => [],
54
+ # 'yet_another_example' => [],
55
55
  # }
56
56
  #
57
57
  RUNTIME = {
@@ -60,7 +60,6 @@ module Inochi
60
60
  'mechanize' => [ '~> 1' , '< 2' ], # for publishing announcements
61
61
  'nokogiri' => [ '>= 1.4' , '< 2' ], # for parsing HTML and XML
62
62
  'rake' => [ '>= 0.8.4' , '< 1' ], # for Inochi::Engine
63
- 'ronn' => [ '>= 0.7.0' , '< 1' ], # for making UNIX man pages
64
63
  'yard' => [ '>= 0.5.8' , '< 1' ], # for making API documentation
65
64
  }
66
65
 
@@ -71,11 +70,11 @@ module Inochi
71
70
  #
72
71
  # DEVTIME = {
73
72
  # # this project needs exactly version 1.2.3 of the "an_example" gem
74
- # "an_example" => [ "1.2.3" ],
73
+ # 'an_example' => [ '1.2.3' ],
75
74
  #
76
75
  # # this project needs at least version 1.2 (but not
77
76
  # # version 1.2.4 or newer) of the "another_example" gem
78
- # "another_example" => [ ">= 1.2" , "< 1.2.4" ],
77
+ # 'another_example' => [ '>= 1.2' , '< 1.2.4' ],
79
78
  #
80
79
  # # this project needs any version of the "yet_another_example" gem
81
80
  # "yet_another_example" => [],
@@ -12,10 +12,7 @@ file @api_dst => FileList['lib/**/*.rb'].include('LICENSE') do
12
12
  YARD::Rake::YardocTask.new(inner_task_name) do |yardoc|
13
13
  yardoc.options = [
14
14
  '--output-dir', @api_dir,
15
- '--title', (
16
- Rake::Task[:@project].invoke
17
- @project_module.inspect
18
- ),
15
+ '--title', @project_module.inspect,
19
16
  '--readme', 'LICENSE',
20
17
  '--no-private'
21
18
  ]
@@ -1,70 +1,72 @@
1
- @man_src = FileList['MANUAL', '[A-Z]*[A-Z]']
1
+ @man_asciidoc_src = FileList['MANUAL', '[A-Z]*[A-Z]']
2
+ @man_asciidoc_dst = 'man.txt'
3
+
2
4
  @man_html_dst = 'man.html'
3
- @man_ronn_dst = 'man.ronn'
4
- @man_roff_dst_glob = 'man/man*/*.?{,.gz}'
5
+ @man_roff_dst = "man/man1/#{@project_package_name}.1"
5
6
 
6
7
  desc 'Build the help manual.'
7
- task :man => @man_html_dst
8
+ task :man => [@man_html_dst, @man_roff_dst]
8
9
 
9
- file @man_html_dst => @man_src do
10
- Rake::Task[:@man_doc].invoke
10
+ #-----------------------------------------------------------------------------
11
11
 
12
- # write ronn version
12
+ # Run manual through Ember to produce a single input file for AsciiDoc.
13
+ file @man_asciidoc_dst => @man_asciidoc_src do
13
14
 
14
- # write roff version
15
- roff_file = "man/man#{@man_doc.section}/#{@man_doc.basename}"
16
- mkdir_p File.dirname(roff_file)
15
+ input = [
16
+ ":revdate: #{@project_module::RELDATE}",
17
+ ":revnumber: #{@project_module::VERSION}",
18
+ "= #{@project_package_name}(1)",
19
+ '== NAME',
20
+ "#{@project_package_name} - #{@project_module::TAGLINE}",
21
+ "%+ #{@man_asciidoc_src.first.inspect}",
22
+ ].join("\n\n")
17
23
 
18
- require 'zlib'
19
- Zlib::GzipWriter.open(roff_file + '.gz') do |gz|
20
- gz.write @man_doc.to_roff
21
- end
24
+ options = {
25
+ :shorthand => true,
26
+ :unindent => true,
27
+ :infer_end => true
28
+ }
22
29
 
23
- # write html version
24
- File.write @man_html_dst, @man_doc.to_html
30
+ require 'ember'
31
+ output = Ember::Template.new(input, options).render
32
+
33
+ File.write @man_asciidoc_dst, output
25
34
  end
26
35
 
27
- CLOBBER.include @man_html_dst, @man_ronn_dst, @man_roff_dst_glob
28
-
29
- # loads the manual as a Ronn document
30
- task :@man_doc => @man_src do
31
- unless @man_doc
32
- Rake::Task[:@project].invoke
33
-
34
- # render eRuby template
35
- ember_input =
36
- "# #{@project_package_name}(1) - #{@project_module::TAGLINE}\n\n"\
37
- "%+ #{@man_src.first.inspect}"
38
-
39
- ember_opts = {
40
- :source_file => :@man_doc,
41
- :shorthand => true,
42
- :unindent => true,
43
- :infer_end => true,
44
- }
45
-
46
- require 'ember'
47
- ronn_input = Ember::Template.new(ember_input, ember_opts).render
48
- File.write @man_ronn_dst, ronn_input # for debugging / sanity check
49
-
50
- # build Ronn document
51
- require 'date'
52
- ronn_opts = {
53
- :date => Date.parse(@project_module::RELDATE),
54
- :manual => "Version #{@project_module::VERSION}",
55
- :styles => %w[ man toc 80c ]
56
- }
57
- ronn_file = "#{@project_package_name}.1.ronn"
58
-
59
- require 'ronn'
60
- @man_doc = Ronn::Document.new(ronn_file, ronn_opts) { ronn_input }
61
- end
36
+ CLEAN.include @man_asciidoc_dst
37
+
38
+ #-----------------------------------------------------------------------------
39
+
40
+ build_asciidoc_args = lambda do
41
+ [('-v' if Rake.application.options.trace), @man_asciidoc_dst].compact
42
+ end
43
+
44
+ file @man_html_dst => @man_asciidoc_dst do
45
+ atts = %W[data-uri toc stylesheet=#{__FILE__}.css] +
46
+ Array(@project_config[:man_asciidoc_attributes])
47
+
48
+ opts = atts.map {|a| ['-a', a] }.flatten
49
+ args = opts + build_asciidoc_args.call
50
+
51
+ sh 'asciidoc', '-o', @man_html_dst, *args
52
+ end
53
+
54
+ CLOBBER.include @man_html_dst
55
+
56
+ file @man_roff_dst => @man_asciidoc_dst do
57
+ args = build_asciidoc_args.call
58
+ mkdir_p dir = File.dirname(@man_roff_dst)
59
+ sh 'a2x', '-f', 'manpage', '-D', dir, *args
62
60
  end
63
61
 
62
+ CLOBBER.include @man_roff_dst
63
+
64
+ #-----------------------------------------------------------------------------
65
+
64
66
  task :@man_html do
65
67
  unless @man_html
66
- Rake::Task[:@man_doc].invoke
67
- @man_html = @man_doc.to_html
68
+ Rake::Task[@man_html_dst].invoke
69
+ @man_html = File.read(@man_html_dst)
68
70
  end
69
71
  end
70
72
 
@@ -76,4 +78,3 @@ task :@man_html_dom do
76
78
  @man_html_dom = Nokogiri::HTML(@man_html)
77
79
  end
78
80
  end
79
-
@@ -0,0 +1,49 @@
1
+ div.sectionbody, body {
2
+ font-family: sans-serif;
3
+ }
4
+
5
+ div.sectionbody {
6
+ line-height: 1.5em;
7
+ }
8
+
9
+ a {
10
+ text-decoration: none;
11
+ }
12
+
13
+ a:hover {
14
+ text-decoration: underline;
15
+ }
16
+
17
+ a:visited {
18
+ color: #800080;
19
+ }
20
+
21
+ body {
22
+ max-width: 48em; /* approximately 80 characters wide */
23
+ margin-left: 15em;
24
+ }
25
+
26
+ #toc {
27
+ position: fixed;
28
+ top: 0;
29
+ left: 0;
30
+ bottom: 0;
31
+ width: 13em;
32
+ padding: 0.5em;
33
+ padding-bottom: 1.5em;
34
+ margin: 0 !important;
35
+ overflow: auto;
36
+ }
37
+
38
+ #toc a {
39
+ color: #083194 !important;
40
+ }
41
+
42
+ #toc .toclevel1 {
43
+ margin-top: 1.25em;
44
+ }
45
+
46
+ #toc .toclevel2 {
47
+ margin-top: 0.25em;
48
+ display: list-item;
49
+ }
@@ -7,7 +7,6 @@ task :ann => %w[ ann:html ann:text ann:feed ]
7
7
 
8
8
  task :@ann_subject do
9
9
  unless @ann_subject
10
- Rake::Task[:@project].invoke
11
10
  @ann_subject = @ann_subject_prefix +
12
11
  @project_module::PROJECT + ' ' + @project_module::VERSION
13
12
  end
@@ -17,10 +16,12 @@ end
17
16
  task :@ann_nfo_html_nodes do
18
17
  unless @ann_nfo_html_nodes
19
18
  begin
20
- head, body = fetch_nodes_between('h2#NAME ~ p', 'h1,h2,h3,h4,h5,h6')
19
+ head, body = fetch_nodes_between(
20
+ 'h2#_description + div', 'h1,h2,h3,h4,h5,h6'
21
+ )
21
22
  rescue => error
22
23
  error.message.insert 0,
23
- "The manual lacks a <H2> ABOUT heading.\n"
24
+ "The manual lacks a <h2> DESCRIPTION heading.\n"
24
25
  raise error
25
26
  end
26
27
 
@@ -39,10 +40,12 @@ end
39
40
  task :@ann_rel_html_body_nodes do
40
41
  unless @ann_rel_html_body_nodes
41
42
  begin
42
- head, body = fetch_nodes_between('h2#HISTORY ~ h3', 'h1,h2,h3')
43
+ head, body = fetch_nodes_between(
44
+ 'h2#_history + div > h3', 'h1,h2,h3'
45
+ )
43
46
  rescue => error
44
47
  error.message.insert 0,
45
- "The manual lacks a <H3> heading under a <H2> HISTORY heading.\n"
48
+ "The manual lacks a <h3> heading beneath the <h2> HISTORY heading.\n"
46
49
  raise error
47
50
  end
48
51
 
@@ -55,10 +58,12 @@ end
55
58
  task :@project_authors_html_nodes do
56
59
  unless @project_authors_html_nodes
57
60
  begin
58
- head, body = fetch_nodes_between('h2#AUTHORS', 'h1,h2,h3,h4,h5,h6')
61
+ head, body = fetch_nodes_between(
62
+ 'h2#_authors + div', 'h1,h2,h3,h4,h5,h6'
63
+ )
59
64
  rescue => error
60
65
  error.message.insert 0,
61
- "The manual lacks content under a <H2> AUTHORS heading.\n"
66
+ "The manual lacks content under a <h2> AUTHORS heading.\n"
62
67
  raise error
63
68
  end
64
69
 
@@ -87,10 +92,13 @@ task :@ann_html do
87
92
  </center>
88
93
  #{@ann_nfo_html_nodes.join}
89
94
  #{@ann_rel_html_title_node}
90
- #{@ann_rel_html_body_nodes.map(&:to_xml).join}
91
- }.strip
92
-
93
- @ann_html = resolve_html_links(@ann_html)
95
+ #{@ann_rel_html_body_nodes.map(&:to_html).join}
96
+ }.
97
+ strip.
98
+ #
99
+ # resolve internal hyperlinks to the project website
100
+ #
101
+ gsub(/<a href=['"]?(?=#)/) { $& + @project_module::WEBSITE }
94
102
  end
95
103
  end
96
104
 
@@ -110,7 +118,7 @@ end
110
118
  desc 'Build HTML announcement.'
111
119
  task 'ann:html' => @ann_html_dst
112
120
 
113
- file @ann_html_dst => @man_src do
121
+ file @ann_html_dst => @man_asciidoc_src do
114
122
  Rake::Task[:@ann_html].invoke
115
123
  File.write @ann_html_dst, @ann_html
116
124
  end
@@ -126,7 +134,7 @@ CLOBBER.include @ann_html_dst
126
134
  desc 'Build plain text announcement.'
127
135
  task 'ann:text' => @ann_text_dst
128
136
 
129
- file @ann_text_dst => @man_src do
137
+ file @ann_text_dst => @man_asciidoc_src do
130
138
  Rake::Task[:@ann_text].invoke
131
139
  File.write @ann_text_dst, @ann_text
132
140
  end
@@ -142,8 +150,7 @@ CLOBBER.include @ann_text_dst
142
150
  desc 'Build RSS feed announcement.'
143
151
  task 'ann:feed' => @ann_feed_dst
144
152
 
145
- file @ann_feed_dst => @man_src do
146
- Rake::Task[:@project].invoke
153
+ file @ann_feed_dst => @man_asciidoc_src do
147
154
  Rake::Task[:@ann_nfo_html_nodes].invoke
148
155
  Rake::Task[:@ann_rel_html_body_nodes].invoke
149
156
 
@@ -158,7 +165,7 @@ file @ann_feed_dst => @man_src do
158
165
  require 'time'
159
166
  item.date = Time.parse(@project_module::RELDATE)
160
167
  item.title = @ann_rel_html_title_node.inner_text
161
- item.description = @ann_rel_html_body_nodes.join
168
+ item.description = @ann_rel_html_body_nodes.map(&:to_html).join
162
169
  end
163
170
 
164
171
  File.write @ann_feed_dst, rss
@@ -180,13 +187,13 @@ end
180
187
  def fetch_nodes_between head_selector, tail_selector
181
188
  Rake::Task[:@man_html_dom].invoke
182
189
 
183
- head = @man_html_dom.at(head_selector)
190
+ head = @man_html_dom.at(head_selector) or raise head_selector
184
191
  body = []
185
192
 
186
193
  tail = head
187
- while tail = tail.next_sibling and not tail.matches? tail_selector
188
- body << tail
189
- end
194
+ body << tail while
195
+ tail = tail.next_sibling and
196
+ not tail.matches? tail_selector
190
197
 
191
198
  [head, body, tail]
192
199
  end
@@ -197,34 +204,19 @@ end
197
204
  # in the HTML document and (2) it runs on all major platforms
198
205
  #
199
206
  def convert_html_to_text html
200
- # lynx's -dump option requires a .html file
207
+ # lynx's -dump option requires a *.html file
201
208
  require 'tempfile'
202
209
  tmp_file = Tempfile.new('inochi').path + '.html'
203
210
 
204
211
  begin
205
- File.write tmp_file, html
206
-
207
- `lynx -dump #{tmp_file} -width 70`.
212
+ File.write tmp_file, html.to_s.
208
213
  #
209
- # improve readability of list items
210
- # by adding a blank line between them
214
+ # add space between subsections and list items to improve readability
211
215
  #
212
- gsub(/(\r?\n)( +\* \S)/, '\1\1\2')
216
+ gsub(/(?=<div class="title">|<li>)/, '<p>&nbsp;</p>')
217
+
218
+ `lynx -dump #{tmp_file} -width 70`
213
219
  ensure
214
220
  File.delete tmp_file
215
221
  end
216
222
  end
217
-
218
- ##
219
- # Converts relative URLs in the given HTML into
220
- # absolute URLs bound to the given base URL.
221
- #
222
- # http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax
223
- #
224
- def resolve_html_links html, base_url = nil
225
- Rake::Task[:@project].invoke
226
- base_url ||= @project_module::WEBSITE
227
-
228
- require 'cgi'
229
- "<base href='#{CGI.escapeHTML base_url}'/> #{html}"
230
- end