mizuho 0.9.8 → 0.9.9

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/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008 Hongli Lai
1
+ Copyright (c) 2008-2012 Hongli Lai
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.markdown CHANGED
@@ -4,29 +4,23 @@ Mizuho is a documentation formatting tool, best suited for small to
4
4
  medium-sized documentation. One writes documentation in plain text
5
5
  files, which Mizuho then converts to nicely formatted HTML.
6
6
 
7
- Mizuho supports input files in [Asciidoc](http://www.methods.co.nz/asciidoc/)
8
- format. Asciidoc is a text formatting tool, used by e.g. Git for its
9
- documentation. Thanks to Asciidoc, Mizuho supports a large number of formatting
10
- options.
7
+ Mizuho wraps [Asciidoc](http://www.methods.co.nz/asciidoc/), the text
8
+ formatting tool used by e.g. Git and Phusion Passenger for its manuals.
9
+ Mizuho adds the following functionality on top of Asciidoc:
11
10
 
12
- ### Under the hood
11
+ * Commenting via [Juvia](https://github.com/FooBarWidget/juvia).
13
12
 
14
- Mizuho is actually a wrapper around Asciidoc. Asciidoc itself can only
15
- generate single-page XHTML output. Mizuho extends Asciidoc by providing
16
- multi-page XHTML output support and support for multiple templates.
17
-
18
- ## Features and highlights
19
-
20
- * You can output the documentation in a single XHTML file, or in multiple
21
- XHTML files (one per chapter).
22
- * Output is fully customizable via ERB templates.
23
- * Based on Asciidoc and supports all Asciidoc formatting commands.
24
- * Comes bundled with Asciidoc so you don't have to install it yourself. Mizuho
25
- Just Works(tm) out-of-the-box.
13
+ Mizuho bundles Asciidoc so you don't have to install it yourself. Mizuho
14
+ should Just Work(tm) out-of-the-box. Asciidoc uses GNU source-highlight
15
+ for highlighting source code. GNU source-highlight depends on Boost and
16
+ so is notorious for being difficult to install on systems without a
17
+ decent package manager (e.g. OS X). Mizuho comes prebundled with an OS
18
+ X binary for GNU source-highlight so that you don't have to worry about
19
+ that.
26
20
 
27
21
  ## Requirements
28
22
 
29
- * hpricot (`gem install hpricot`)
23
+ * Nokogiri (`gem install nokogiri`)
30
24
  * Python (because Asciidoc is written in Python)
31
25
  * [GNU Source-highlight](http://www.gnu.org/software/src-highlite/), if you
32
26
  want syntax highlighting support. If you're on OS X then it's not necessary
@@ -46,17 +40,12 @@ http://www.methods.co.nz/asciidoc/userguide.html
46
40
 
47
41
  Next, write an input file and save it in a .txt file.
48
42
 
49
- Finally, convert the .txt file to a single XHTML file with Mizuho, with the
43
+ Finally, convert the .txt file to a single HTML file with Mizuho, with the
50
44
  default template:
51
45
 
52
46
  mizuho input.txt
53
47
 
54
- This will generate 'input.html'. Or, you can convert it to multiple XHTML files
55
- that also have a different look:
56
-
57
- mizuho input.txt --template manualsonrails --multi-page
58
-
59
- Take a look at the 'templates' directory for available templates.
48
+ This will generate 'input.html'.
60
49
 
61
50
  ## Credits
62
51
 
@@ -1,13 +1,3 @@
1
- /*
2
- * AsciiDoc 'flask' theme for xhtml11 and html5 backends. A shameless knock-off
3
- * of the Flask website styling (http://flask.pocoo.org/docs/).
4
- *
5
- * The implementation is straight-forward, consisting of the asciidoc.css file
6
- * followed by theme specific overrides.
7
- *
8
- * */
9
-
10
-
11
1
  /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
12
2
 
13
3
  /* Default font. */
@@ -92,6 +82,7 @@ ul > li > * { color: black; }
92
82
  pre {
93
83
  padding: 0;
94
84
  margin: 0;
85
+ overflow: auto;
95
86
  }
96
87
 
97
88
  #author {
@@ -518,6 +509,29 @@ th.tableblock.valign-bottom, td.tableblock.valign-bottom {
518
509
  }
519
510
 
520
511
 
512
+ /*
513
+ * manpage specific
514
+ *
515
+ * */
516
+
517
+ body.manpage h1 {
518
+ padding-top: 0.5em;
519
+ padding-bottom: 0.5em;
520
+ border-top: 2px solid silver;
521
+ border-bottom: 2px solid silver;
522
+ }
523
+ body.manpage h2 {
524
+ border-style: none;
525
+ }
526
+ body.manpage div.sectionbody {
527
+ margin-left: 3em;
528
+ }
529
+
530
+ @media print {
531
+ body.manpage div#toc { display: none; }
532
+ }
533
+
534
+
521
535
  /*
522
536
  * Theme specific overrides of the preceding (asciidoc.css) CSS.
523
537
  *
@@ -544,7 +558,7 @@ h1 { font-size: 240%; }
544
558
  h2 { font-size: 180%; }
545
559
  h3 { font-size: 150%; }
546
560
  h4 { font-size: 130%; }
547
- h5 { font-size: 100%; }
561
+ h5 { font-size: 115%; }
548
562
  h6 { font-size: 100%; }
549
563
  #header h1 { margin-top: 0; }
550
564
  #toc {
data/bin/mizuho CHANGED
@@ -1,24 +1,40 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.expand_path(File.dirname(__FILE__) + "/../lib/mizuho")
3
3
  require 'optparse'
4
+ require 'rubygems'
4
5
  require 'mizuho/generator'
5
6
 
6
7
  $KCODE = 'UTF-8'
7
- options = {}
8
+ options = { :topbar => true }
8
9
  parser = OptionParser.new do |opts|
10
+ nl = "\n" + ' ' * 37
9
11
  opts.banner = "Usage: mizuho [options] INPUT"
10
12
  opts.separator ""
11
13
 
12
14
  opts.separator "Options:"
13
- opts.on("-t", "--template FILE", String, "Specify a template file to use.") do |value|
14
- options[:template] = value
15
+ opts.on("-c", "--comments SYSTEM",
16
+ "Use a commenting system. The only#{nl}" +
17
+ "supported commenting system right now is#{nl}" +
18
+ "'juvia'.") do |value|
19
+ if value != 'juvia'
20
+ abort "The only supported commenting system right now is 'juvia'."
21
+ end
22
+ options[:commenting_system] = value
15
23
  end
16
- opts.on("-m", "--multi-page", "Generate one file per chapter.") do |value|
17
- options[:multi_page] = value
24
+ opts.on("--juvia-url URL", "When using Juvia as the commenting system,#{nl}" +
25
+ "specify the Juvia base URL here.") do |value|
26
+ options[:juvia_url] = value
18
27
  end
19
- opts.on("--icons-dir DIR", "Specify the directory in which icons\n" <<
20
- "#{' ' * 37}should be searched. Defaults to\n" <<
21
- "#{' ' * 37}'images/icons'.") do |value|
28
+ opts.on("--juvia-site-key KEY", "When using Juvia as the commenting system,#{nl}" +
29
+ "specify the Juvia site key here.") do |value|
30
+ options[:juvia_site_key] = value
31
+ end
32
+ #opts.on("-m", "--multi-page", "Generate one file per chapter.") do |value|
33
+ # options[:multi_page] = value
34
+ #end
35
+ opts.on("--icons-dir DIR", "Specify the directory in which icons#{nl}" <<
36
+ "should be searched. Defaults to#{nl}" <<
37
+ "'images/icons'.") do |value|
22
38
  options[:icons_dir] = value
23
39
  end
24
40
  opts.on("-o", "--output FILE", String, "Specify the output filename.") do |value|
@@ -28,9 +44,9 @@ end
28
44
  begin
29
45
  parser.parse!
30
46
  rescue OptionParser::ParseError => e
31
- puts e
32
- puts
33
- puts "Please see '--help' for valid options."
47
+ STDERR.puts e
48
+ STDERR.puts
49
+ STDERR.puts "Please see '--help' for valid options."
34
50
  exit 1
35
51
  end
36
52
 
data/lib/mizuho.rb CHANGED
@@ -1,9 +1,30 @@
1
+ # Copyright (c) 2008-2012 Hongli Lai
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
1
21
  module Mizuho
2
- SOURCE_ROOT = File.expand_path(File.dirname(__FILE__) + "/..")
3
- LIBDIR = "#{SOURCE_ROOT}/lib"
4
- ASCIIDOC = "#{SOURCE_ROOT}/asciidoc/asciidoc.py"
22
+ SOURCE_ROOT = File.expand_path(File.dirname(__FILE__) + "/..")
23
+ LIBDIR = "#{SOURCE_ROOT}/lib"
24
+ TEMPLATES_DIR = "#{SOURCE_ROOT}/templates"
25
+ ASCIIDOC = "#{SOURCE_ROOT}/asciidoc/asciidoc.py"
5
26
 
6
- VERSION_STRING = "0.9.8"
27
+ VERSION_STRING = "0.9.9"
7
28
 
8
29
  if $LOAD_PATH.first != LIBDIR
9
30
  $LOAD_PATH.unshift(LIBDIR)
@@ -0,0 +1,100 @@
1
+ # Extracted from https://github.com/kiyoka/fuzzy-string-match
2
+
3
+ #
4
+ # Fuzzy String Match
5
+ #
6
+ # Copyright 2010 Kiyoka Nishiyama
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ module Mizuho
22
+ class JaroWinklerPure
23
+ THRESHOLD = 0.7
24
+
25
+ def getDistance( s1, s2 )
26
+ a1 = s1.split( // )
27
+ a2 = s2.split( // )
28
+
29
+ if s1.size > s2.size
30
+ (max,min) = a1,a2
31
+ else
32
+ (max,min) = a2,a1
33
+ end
34
+
35
+ range = [ (max.size / 2 - 1), 0 ].max
36
+ indexes = Array.new( min.size, -1 )
37
+ flags = Array.new( max.size, false )
38
+
39
+ matches = 0;
40
+ (0 ... min.size).each { |mi|
41
+ c1 = min[mi]
42
+ xi = [mi - range, 0].max
43
+ xn = [mi + range + 1, max.size].min
44
+
45
+ (xi ... xn).each { |i|
46
+ if (not flags[i]) && ( c1 == max[i] )
47
+ indexes[mi] = i
48
+ flags[i] = true
49
+ matches += 1
50
+ break
51
+ end
52
+ }
53
+ }
54
+
55
+ ms1 = Array.new( matches, nil )
56
+ ms2 = Array.new( matches, nil )
57
+
58
+ si = 0
59
+ (0 ... min.size).each { |i|
60
+ if (indexes[i] != -1)
61
+ ms1[si] = min[i]
62
+ si += 1
63
+ end
64
+ }
65
+
66
+ si = 0
67
+ (0 ... max.size).each { |i|
68
+ if flags[i]
69
+ ms2[si] = max[i]
70
+ si += 1
71
+ end
72
+ }
73
+
74
+ transpositions = 0
75
+ (0 ... ms1.size).each { |mi|
76
+ if ms1[mi] != ms2[mi]
77
+ transpositions += 1
78
+ end
79
+ }
80
+
81
+ prefix = 0
82
+ (0 ... min.size).each { |mi|
83
+ if s1[mi] == s2[mi]
84
+ prefix += 1
85
+ else
86
+ break
87
+ end
88
+ }
89
+
90
+ if 0 == matches
91
+ 0.0
92
+ else
93
+ m = matches.to_f
94
+ t = (transpositions/ 2)
95
+ j = ((m / s1.size) + (m / s2.size) + ((m - t) / m)) / 3.0;
96
+ return j < THRESHOLD ? j : j + [0.1, 1.0 / max.size].min * prefix * (1 - j)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -1,9 +1,27 @@
1
- require 'optparse'
2
- require 'digest/sha1'
1
+ # Copyright (c) 2008-2012 Hongli Lai
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'nokogiri'
3
22
  require 'mizuho'
4
- require 'mizuho/parser'
5
- require 'mizuho/template'
6
23
  require 'mizuho/source_highlight'
24
+ require 'mizuho/id_map'
7
25
 
8
26
  module Mizuho
9
27
 
@@ -12,24 +30,52 @@ end
12
30
 
13
31
  class Generator
14
32
  def initialize(input, options = {})
15
- @input_file = input
16
- @output_name = options[:output]
17
- @template = locate_template_file(options[:template])
18
- @multi_page = options[:multi_page]
19
- @icons_dir = options[:icons_dir]
20
- @conf_file = options[:conf_file]
33
+ @options = options
34
+ @input_file = input
35
+ @output_file = options[:output] || default_output_filename(input)
36
+ @id_map_file = options[:id_map] || default_id_map_filename(input)
37
+ @icons_dir = options[:icons_dir]
38
+ @conf_file = options[:conf_file]
39
+ @enable_topbar = options[:topbar]
40
+ @commenting_system = options[:commenting_system]
41
+ if @commenting_system == 'juvia'
42
+ require_options(options, :juvia_url, :juvia_site_key)
43
+ end
21
44
  end
22
45
 
23
46
  def start
24
- output_filename = determine_output_filename(@input_file, @output_name)
25
- self.class.run_asciidoc(@input_file, output_filename, @icons_dir, @conf_file)
26
- if @template
27
- apply_template(output_filename, @input_file, @output_name, @template, @multi_page)
47
+ if @commenting_system
48
+ @id_map = IdMap.new
49
+ if File.exist?(@id_map_file)
50
+ @id_map.load(@id_map_file)
51
+ else
52
+ warn "No ID map file, generating one (#{@id_map_file})..."
53
+ end
54
+ end
55
+ self.class.run_asciidoc(@input_file, @output_file, @icons_dir, @conf_file)
56
+ transform(@output_file)
57
+ if @commenting_system
58
+ @id_map.save(@id_map_file)
59
+ stats = @id_map.stats
60
+ if stats[:fuzzy] > 0
61
+ warn "Warning: #{stats[:fuzzy]} fuzzy ID(s)"
62
+ end
63
+ if stats[:orphaned] > 0
64
+ warn "Warning: #{stats[:orphaned]} unused ID(s)"
65
+ end
28
66
  end
29
67
  end
30
68
 
31
69
  def self.run_asciidoc(input, output, icons_dir = nil, conf_file = nil)
32
- args = ["python", ASCIIDOC, "-a", "toc", "-a", "icons"]
70
+ args = [
71
+ "python", ASCIIDOC,
72
+ "-b", "html5",
73
+ "-a", "toc",
74
+ "-a", "theme=flask",
75
+ "-a", "toclevels=3",
76
+ "-a", "icons",
77
+ "-n"
78
+ ]
33
79
  if icons_dir
34
80
  args << "-a"
35
81
  args << "iconsdir=#{icons_dir}"
@@ -41,93 +87,149 @@ class Generator
41
87
  args << cf
42
88
  end
43
89
  end
44
- args += ["-n", "-o", output, input]
90
+ args += ["-o", output, input]
45
91
  if !system(*args)
46
92
  raise GenerationError, "Asciidoc failed."
47
93
  end
48
94
  end
49
95
 
50
96
  private
51
- def locate_template_file(template_name)
52
- if template_name.nil?
53
- return "#{SOURCE_ROOT}/templates/asciidoc.html.erb"
54
- elsif template_name =~ %r{[/.]}
55
- # Looks like a filename.
56
- return template_name
57
- else
58
- return "#{SOURCE_ROOT}/templates/#{template_name}.html.erb"
59
- end
97
+ def default_output_filename(input)
98
+ return File.dirname(input) +
99
+ "/" +
100
+ File.basename(input, File.extname(input)) +
101
+ ".html"
60
102
  end
61
103
 
62
- def determine_output_filename(input, output = nil, chapter_id = nil)
63
- if chapter_id
64
- if output
65
- dirname = File.dirname(output)
66
- extname = File.extname(output)
67
- basename = File.basename(output, extname)
68
- filename = File.join(dirname, "#{basename}-#{chapter_id}#{extname}")
69
- else
70
- dirname = File.dirname(input)
71
- basename = File.basename(input, File.extname(input))
72
- filename = File.join(dirname, "#{basename}-#{chapter_id}.html")
104
+ def default_id_map_filename(input)
105
+ return File.dirname(input) +
106
+ "/" +
107
+ File.basename(input, File.extname(input)) +
108
+ ".idmap.txt"
109
+ end
110
+
111
+ def warn(message)
112
+ STDERR.puts(message)
113
+ end
114
+
115
+ def transform(filename)
116
+ File.open(filename, 'r+') do |f|
117
+ doc = Nokogiri.HTML(f)
118
+ head = (doc / "head")[0]
119
+ body = (doc / "body")[0]
120
+ title = (doc / "title")[0].text
121
+ preamble = (doc / "#preamble")[0]
122
+ toctitle = (doc / "#toctitle")[0]
123
+
124
+ head.add_child(stylesheet_tag)
125
+
126
+ if @commenting_system
127
+ headers = (doc / "#content h2, #content h3, #content h4")
128
+ headers.each do |header|
129
+ header['data-comment-topic'] = @id_map.associate(header.text)
130
+ header.add_previous_sibling(create_comment_balloon)
131
+ end
73
132
  end
74
- else
75
- if output
76
- filename = output
77
- else
78
- dirname = File.dirname(input)
79
- basename = File.basename(input, File.extname(input))
80
- filename = File.join(dirname, "#{basename}.html")
133
+
134
+ if @enable_topbar
135
+ body.children.first.add_previous_sibling(topbar(title))
136
+ end
137
+ body.add_child(javascript_tag)
138
+
139
+ if preamble
140
+ preamble.remove
141
+ preamble_copy = (doc / "#header > h1")[0].add_next_sibling(preamble.to_s)[0]
142
+ preamble_copy['id'] = 'preamble'
81
143
  end
144
+
145
+ toctitle.add_previous_sibling(create_comment_balloon)
146
+
147
+ f.rewind
148
+ f.truncate(0)
149
+ f.puts(doc.to_html)
82
150
  end
83
- return File.expand_path(filename)
84
151
  end
85
152
 
86
- def apply_template(asciidoc_file, input_file, output_name, template_file, multi_page)
87
- parser = Parser.new(asciidoc_file)
88
- if multi_page
89
- File.unlink(asciidoc_file)
90
- assign_chapter_filenames_and_heading_basenames(parser.chapters, input_file, output_name)
91
- parser.chapters.each_with_index do |chapter, i|
92
- template = Template.new(template_file,
93
- :multi_page? => true,
94
- :title => parser.title,
95
- :table_of_contents => parser.table_of_contents,
96
- :contents => chapter.contents,
97
- :is_preamble? => chapter.heading.nil?,
98
- :chapters => parser.chapters,
99
- :prev_chapter => (i <= 1) ? nil : parser.chapters[i - 1],
100
- :current_chapter => chapter,
101
- :next_chapter => parser.chapters[i + 1])
102
- template.save(chapter.filename)
153
+ def stylesheet_tag
154
+ content = %Q{<style type="text/css">\n}
155
+
156
+ css = File.read("#{TEMPLATES_DIR}/mizuho.css")
157
+ css.gsub!(/url\('(.*?)\.png'\)/) do
158
+ data = File.open("#{TEMPLATES_DIR}/#{$1}.png", "rb") do |f|
159
+ f.read
103
160
  end
104
- else
105
- template = Template.new(template_file,
106
- :multi_page? => false,
107
- :title => parser.title,
108
- :table_of_contents => parser.table_of_contents,
109
- :contents => parser.contents)
110
- template.save(asciidoc_file)
161
+ data = [data].pack('m')
162
+ data.gsub!("\n", "")
163
+ "url('data:image/png;base64,#{data}')"
111
164
  end
112
- rescue Template::Error => e
113
- STDERR.puts("*** #{template_file}:\n#{e}")
114
- exit 1
165
+ content << css << "\n"
166
+
167
+ if @enable_topbar
168
+ content << File.read("#{TEMPLATES_DIR}/topbar.css") << "\n"
169
+ end
170
+
171
+ if @commenting_system == 'disqus'
172
+ content << File.read("#{TEMPLATES_DIR}/disqus.css") << "\n"
173
+ elsif @commenting_system == 'intensedebate'
174
+ content << File.read("#{TEMPLATES_DIR}/intensedebate.css") << "\n"
175
+ end
176
+
177
+ content << %Q{</style>\n}
178
+ return content
115
179
  end
116
180
 
117
- def assign_chapter_filenames_and_heading_basenames(chapters, input_file, output_name)
118
- chapters.each_with_index do |chapter, i|
119
- if chapter.is_preamble?
120
- chapter.filename = determine_output_filename(input_file, output_name)
121
- else
122
- title_sha1 = Digest::SHA1.hexdigest(chapter.title_without_numbers)
123
- chapter.filename = determine_output_filename(input_file,
124
- output_name, title_sha1.slice(0..7))
125
- chapter.heading.basename = File.basename(chapter.filename)
126
- chapter.heading.each_descendant do |h|
127
- h.basename = File.basename(chapter.filename)
128
- end
181
+ def topbar(title)
182
+ content = render_template("topbar.html")
183
+ content.gsub!(/\{TITLE\}/, title)
184
+ return content
185
+ end
186
+
187
+ def javascript_tag
188
+ content = %Q{<script>}
189
+ content << File.read("#{TEMPLATES_DIR}/jquery-1.7.1.min.js") << "\n"
190
+ content << File.read("#{TEMPLATES_DIR}/jquery.hashchange-1.0.0.js") << "\n"
191
+ content << File.read("#{TEMPLATES_DIR}/mizuho.js") << "\n"
192
+ if @enable_topbar
193
+ content << File.read("#{TEMPLATES_DIR}/topbar.js") << "\n"
194
+ end
195
+ if @commenting_system == 'juvia'
196
+ content << %Q{
197
+ var JUVIA_URL = '#{@options[:juvia_url]}';
198
+ var JUVIA_SITE_KEY = '#{@options[:juvia_site_key]}';
199
+ }
200
+ content << File.read("#{TEMPLATES_DIR}/juvia.js") << "\n"
201
+ end
202
+ content << %Q{</script>}
203
+ return content
204
+ end
205
+
206
+ def create_comment_balloon
207
+ return %Q{<a href="javascript:void(0)" class="comments empty" title="Add a comment"><span class="count"></span></a>}
208
+ end
209
+
210
+ def render_template(name)
211
+ content = File.read("#{TEMPLATES_DIR}/#{name}")
212
+ content.gsub!(/\{INLINE_IMAGE:(.*?)\.png\}/) do
213
+ data = File.open("#{TEMPLATES_DIR}/#{$1}.png", "rb") do |f|
214
+ f.read
215
+ end
216
+ data = [data].pack('m')
217
+ data.gsub!("\n", "")
218
+ "data:image/png;base64,#{data}"
219
+ end
220
+ return content
221
+ end
222
+
223
+ def require_options(options, *required_keys)
224
+ fail = false
225
+ required_keys.each do |key|
226
+ if !options.has_key?(key)
227
+ fail = true
228
+ argument_name = '--' + key.to_s.gsub('_', '-')
229
+ STDERR.puts "You must also specify #{argument_name}!"
129
230
  end
130
231
  end
232
+ exit 1 if fail
131
233
  end
132
234
  end
133
235