review 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +43 -1
  3. data/.rubocop_todo.yml +0 -5
  4. data/.travis.yml +2 -1
  5. data/README.md +2 -1
  6. data/appveyor.yml +10 -1
  7. data/bin/review-init +12 -0
  8. data/bin/review-validate +5 -4
  9. data/doc/NEWS.ja.md +82 -0
  10. data/doc/NEWS.md +84 -0
  11. data/doc/config.yml.sample +1 -0
  12. data/doc/config.yml.sample-simple +77 -0
  13. data/doc/customize_epub.md +47 -0
  14. data/doc/preproc.ja.md +153 -0
  15. data/doc/preproc.md +160 -0
  16. data/lib/epubmaker/producer.rb +6 -3
  17. data/lib/lineinput.rb +4 -4
  18. data/lib/review/book/base.rb +4 -0
  19. data/lib/review/book/compilable.rb +3 -3
  20. data/lib/review/book/index.rb +3 -24
  21. data/lib/review/book/part.rb +6 -2
  22. data/lib/review/configure.rb +4 -2
  23. data/lib/review/htmlbuilder.rb +17 -10
  24. data/lib/review/htmlutils.rb +4 -5
  25. data/lib/review/i18n.rb +17 -11
  26. data/lib/review/i18n.yml +6 -0
  27. data/lib/review/idgxmlbuilder.rb +2 -2
  28. data/lib/review/makerhelper.rb +1 -1
  29. data/lib/review/markdownbuilder.rb +12 -1
  30. data/lib/review/md2inaobuilder.rb +66 -0
  31. data/lib/review/pdfmaker.rb +20 -7
  32. data/lib/review/preprocessor.rb +2 -2
  33. data/lib/review/topbuilder.rb +18 -0
  34. data/lib/review/version.rb +1 -1
  35. data/lib/review/webtocprinter.rb +9 -2
  36. data/templates/LICENSE +20 -0
  37. data/templates/README.md +8 -0
  38. data/templates/latex/layout.tex.erb +58 -36
  39. data/templates/web/html/layout-html5.html.erb +1 -1
  40. data/test/assets/test_template.tex +44 -8
  41. data/test/book_test_helper.rb +10 -7
  42. data/test/sample-book/src/Rakefile +7 -0
  43. data/test/test_book.rb +1 -4
  44. data/test/test_epub3maker.rb +1 -3
  45. data/test/test_htmlbuilder.rb +30 -8
  46. data/test/test_i18n.rb +28 -0
  47. data/test/test_idgxmlbuilder.rb +2 -2
  48. data/test/test_index.rb +10 -0
  49. data/test/test_location.rb +30 -0
  50. data/test/test_markdownbuilder.rb +6 -0
  51. data/test/test_md2inaobuilder.rb +75 -0
  52. data/test/test_pdfmaker.rb +1 -0
  53. data/test/test_review_ext.rb +3 -2
  54. data/test/test_topbuilder.rb +11 -0
  55. data/test/test_webtocprinter.rb +164 -0
  56. data/test/test_yamlloader.rb +6 -7
  57. metadata +14 -1
@@ -79,9 +79,10 @@ module ReVIEW
79
79
  @items.each(&block)
80
80
  end
81
81
 
82
- def has_key?(id)
83
- return @index.has_key?(id)
82
+ def key?(id)
83
+ return @index.key?(id)
84
84
  end
85
+ alias_method :has_key?, :key?
85
86
  end
86
87
 
87
88
 
@@ -238,28 +239,6 @@ module ReVIEW
238
239
  end
239
240
  end
240
241
 
241
- class FormatRef
242
- def initialize(locale, index)
243
- @locale = locale
244
- @index = index
245
- end
246
-
247
- def title(id)
248
- sprintf(@locale["#{@index.item_type}_caption_format".to_sym],
249
- @index.title(id))
250
- end
251
-
252
- def number(id)
253
- sprintf(@locale["#{@index.item_type}_number_format".to_sym],
254
- @index.number(id))
255
- end
256
-
257
- def method_missing(mid, *args, &block)
258
- super unless @index.respond_to?(mid)
259
- @index.__send__(mid, *args, &block)
260
- end
261
- end
262
-
263
242
  class BibpaperIndex < Index
264
243
  Item = Struct.new(:id, :number, :caption)
265
244
 
@@ -21,8 +21,8 @@ module ReVIEW
21
21
  @book = book
22
22
  @number = number
23
23
  @chapters = chapters
24
+ @name = name ? File.basename(name, '.re') : nil
24
25
  @path = name
25
- @title = nil
26
26
  if io
27
27
  @content = io.read
28
28
  elsif @path && File.exist?(@path)
@@ -30,7 +30,11 @@ module ReVIEW
30
30
  else
31
31
  @content = nil
32
32
  end
33
- @name = name ? File.basename(name, '.re') : nil
33
+ if file?
34
+ @title = nil
35
+ else
36
+ @title = name
37
+ end
34
38
  @volume = nil
35
39
  end
36
40
 
@@ -1,4 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
+ require 'securerandom'
3
+
2
4
  module ReVIEW
3
5
  class Configure < Hash
4
6
 
@@ -23,7 +25,7 @@ module ReVIEW
23
25
  "date" => nil, # publishing date
24
26
  "rights" => nil, # Copyright messages
25
27
  "description" => nil, # Description
26
- "urnid" => nil, # Identifier (nil makes random uuid)
28
+ "urnid" => "urn:uid:#{SecureRandom.uuid}", # Identifier
27
29
  "stylesheet" => "stylesheet.css", # stylesheet file
28
30
  "coverfile" => nil, # content file of body of cover page
29
31
  "mytoc" => nil, # whether make own table of contents or not
@@ -52,7 +54,7 @@ module ReVIEW
52
54
  "page_metric" => ReVIEW::Book::PageMetric::A5,
53
55
  "ext" => '.re',
54
56
  "image_dir" => 'images',
55
- "image_types" => %w( .ai .psd .eps .pdf .tif .tiff .png .bmp .jpg .jpeg .gif .svg ),
57
+ "image_types" => %w(.ai .psd .eps .pdf .tif .tiff .png .bmp .jpg .jpeg .gif .svg),
56
58
  "image_scale2width" => true, # for LaTeX
57
59
  "bib_file" => "bib.re",
58
60
  "colophon_order" => %w(aut csl trl dsr ill cov edt pbl contact prt),
@@ -50,7 +50,7 @@ module ReVIEW
50
50
  def builder_init_file
51
51
  @warns = []
52
52
  @errors = []
53
- @chapter.book.image_types = %w( .png .jpg .jpeg .gif .svg )
53
+ @chapter.book.image_types = %w(.png .jpg .jpeg .gif .svg)
54
54
  @column = 0
55
55
  @sec_counter = SecCounter.new(5, @chapter)
56
56
  @nonum_counter = 0
@@ -444,9 +444,11 @@ module ReVIEW
444
444
 
445
445
  def list_body(id, lines, lang)
446
446
  id ||= ''
447
- print %Q[<pre class="list">]
448
- body = lines.inject(''){|i, j| i + detab(j) + "\n"}
447
+ class_names = ["list"]
449
448
  lexer = lang || File.extname(id).gsub(/\./, '')
449
+ class_names.push("language-#{lexer}") unless lexer.blank?
450
+ print %Q[<pre class="#{class_names.join(" ")}">]
451
+ body = lines.inject(''){|i, j| i + detab(j) + "\n"}
450
452
  puts highlight(:body => body, :lexer => lexer, :format => 'html')
451
453
  puts '</pre>'
452
454
  end
@@ -491,7 +493,9 @@ module ReVIEW
491
493
  puts highlight(:body => body, :lexer => lexer, :format => 'html',
492
494
  :options => {:linenos => 'inline', :nowrap => false})
493
495
  else
494
- print '<pre class="list">'
496
+ class_names = ["list"]
497
+ class_names.push("language-#{lang}") unless lang.blank?
498
+ print %Q[<pre class="#{class_names.join(" ")}">]
495
499
  lines.each_with_index do |line, i|
496
500
  puts detab((i+1).to_s.rjust(2) + ": " + line)
497
501
  end
@@ -504,7 +508,9 @@ module ReVIEW
504
508
  if caption.present?
505
509
  puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
506
510
  end
507
- print %Q[<pre class="emlist">]
511
+ class_names = ["emlist"]
512
+ class_names.push("language-#{lang}") unless lang.blank?
513
+ print %Q[<pre class="#{class_names.join(" ")}">]
508
514
  body = lines.inject(''){|i, j| i + detab(j) + "\n"}
509
515
  lexer = lang
510
516
  puts highlight(:body => body, :lexer => lexer, :format => 'html')
@@ -524,7 +530,9 @@ module ReVIEW
524
530
  puts highlight(:body => body, :lexer => lexer, :format => 'html',
525
531
  :options => {:linenos => 'inline', :nowrap => false})
526
532
  else
527
- print '<pre class="emlist">'
533
+ class_names = ["emlist"]
534
+ class_names.push("language-#{lang}") unless lang.blank?
535
+ print %Q[<pre class="#{class_names.join(" ")}">]
528
536
  lines.each_with_index do |line, i|
529
537
  puts detab((i+1).to_s.rjust(2) + ": " + line)
530
538
  end
@@ -622,7 +630,7 @@ module ReVIEW
622
630
  end
623
631
 
624
632
  def image_dummy(id, caption, lines)
625
- puts %Q[<div class="image">]
633
+ puts %Q[<div id="#{normalize_id(id)}" class="image">]
626
634
  puts %Q[<pre class="dummyimage">]
627
635
  lines.each do |line|
628
636
  puts detab(line)
@@ -761,7 +769,7 @@ module ReVIEW
761
769
  def indepimage(id, caption="", metric=nil)
762
770
  metrics = parse_metric("html", metric)
763
771
  caption = "" if caption.nil?
764
- puts %Q[<div class="image">]
772
+ puts %Q[<div id="#{normalize_id(id)}" class="image">]
765
773
  begin
766
774
  puts %Q[<img src="#{@chapter.image(id).path.sub(/\A\.\//, "")}" alt="#{escape_html(compile_inline(caption))}"#{metrics} />]
767
775
  rescue
@@ -932,8 +940,7 @@ module ReVIEW
932
940
  if @book.config["mathml"]
933
941
  require 'math_ml'
934
942
  require 'math_ml/symbol/character_reference'
935
- parser = MathML::LaTeX::Parser.new(
936
- :symbol => MathML::Symbol::CharacterReference)
943
+ parser = MathML::LaTeX::Parser.new(:symbol => MathML::Symbol::CharacterReference)
937
944
  %Q[<span class="equation">#{parser.parse(str, nil)}</span>]
938
945
  else
939
946
  %Q[<span class="equation">#{escape_html(str)}</span>]
@@ -69,11 +69,10 @@ module ReVIEW
69
69
  begin
70
70
  require 'pygments'
71
71
  begin
72
- Pygments.highlight(
73
- unescape_html(body),
74
- :options => options,
75
- :formatter => format,
76
- :lexer => lexer)
72
+ Pygments.highlight(unescape_html(body),
73
+ :options => options,
74
+ :formatter => format,
75
+ :lexer => lexer)
77
76
  rescue MentosError
78
77
  body
79
78
  end
@@ -119,41 +119,47 @@ module ReVIEW
119
119
  end
120
120
  end
121
121
 
122
- percents = frmt.scan(/%\w{1,3}/)
122
+ percents = frmt.scan(/%[A-Za-z]{1,3}/)
123
+ remove_args = []
123
124
  percents.each_with_index do |i, idx|
124
125
  case i
125
126
  when "%pA"
126
127
  frmt.sub!(i, ALPHA_U[args[idx]])
127
- args.delete idx
128
+ remove_args << idx
128
129
  when "%pa"
129
130
  frmt.sub!(i, ALPHA_L[args[idx]])
130
- args.delete idx
131
+ remove_args << idx
131
132
  when "%pAW"
132
133
  frmt.sub!(i, ALPHA_UW[args[idx]])
133
- args.delete idx
134
+ remove_args << idx
134
135
  when "%paW"
135
136
  frmt.sub!(i, ALPHA_LW[args[idx]])
136
- args.delete idx
137
+ remove_args << idx
137
138
  when "%pR"
138
139
  frmt.sub!(i, ROMAN_U[args[idx]])
139
- args.delete idx
140
+ remove_args << idx
140
141
  when "%pr"
141
142
  frmt.sub!(i, ROMAN_L[args[idx]])
142
- args.delete idx
143
+ remove_args << idx
143
144
  when "%pRW"
144
145
  frmt.sub!(i, ROMAN_UW[args[idx]])
145
- args.delete idx
146
+ remove_args << idx
146
147
  when "%pJ"
147
148
  frmt.sub!(i, JAPAN[args[idx]])
148
- args.delete idx
149
+ remove_args << idx
149
150
  when "%pdW"
150
151
  frmt.sub!(i, ARABIC_LW[args[idx]])
151
- args.delete idx
152
+ remove_args << idx
152
153
  when "%pDW"
153
154
  frmt.sub!(i, ARABIC_UW[args[idx]])
154
- args.delete idx
155
+ remove_args << idx
156
+ else
157
+ # noop
155
158
  end
156
159
  end
160
+ remove_args.reverse_each do |idx|
161
+ args.delete_at idx
162
+ end
157
163
  args_matched = (frmt.count("%") == args.size)
158
164
  frmt.gsub!('##', '%%')
159
165
  args_matched ? (frmt % args) : frmt
@@ -6,7 +6,9 @@ ja:
6
6
  columnname: "コラム"
7
7
  column_head: "■コラム"
8
8
  part: 第%d部
9
+ part_short: "%pR"
9
10
  chapter: 第%d章
11
+ chapter_short: "%d"
10
12
  chapter_postfix: " "
11
13
  chapter_quote: "「%s」"
12
14
  appendix: 付録%pA
@@ -66,7 +68,9 @@ en:
66
68
  columnname: "Column"
67
69
  column_head: "Column"
68
70
  part: "Part %s"
71
+ part_short: "%pR"
69
72
  chapter: Chapter %d
73
+ chapter_short: "%d"
70
74
  chapter_postfix: ". "
71
75
  chapter_quote: '"%s"'
72
76
  appendix: Appendix %s
@@ -123,7 +127,9 @@ zh-TW:
123
127
  table: 表
124
128
  list: List
125
129
  part: 第%d部份
130
+ part_short: "%pR"
126
131
  chapter: 第%d章
132
+ chapter_short: "%d"
127
133
  chapter_postfix: " "
128
134
  chapter_quote: "「%s」"
129
135
  appendix: 附錄%s
@@ -392,7 +392,7 @@ module ReVIEW
392
392
 
393
393
  def quotedlist(lines, css_class, caption)
394
394
  print %Q[<list type='#{css_class}'>]
395
- puts "<caption aid:pstyle='#{css_class}-title'>#{compile_inline(caption)}</caption>" unless caption.nil?
395
+ puts "<caption aid:pstyle='#{css_class}-title'>#{compile_inline(caption)}</caption>" if caption.present?
396
396
  print %Q[<pre>]
397
397
  no = 1
398
398
  lines.each do |line|
@@ -811,7 +811,7 @@ module ReVIEW
811
811
  @column += 1
812
812
  a_id = %Q[id="column-#{@column}"]
813
813
  print "<#{type}column #{a_id}>"
814
- puts %Q[<title aid:pstyle="#{type}column-title">#{compile_inline(caption)}</title>]
814
+ puts %Q[<title aid:pstyle="#{type}column-title">#{compile_inline(caption)}</title><?dtp level="9" section="#{escape_html(compile_inline(caption))}"?>]
815
815
  end
816
816
 
817
817
  def common_column_end(type)
@@ -53,7 +53,7 @@ module ReVIEW
53
53
  image_files << "#{from_dir}/#{fname}.#{conv_type}"
54
54
  end
55
55
 
56
- exts = options[:exts] || %w(png gif jpg jpeg svg pdf eps)
56
+ exts = options[:exts] || %w(png gif jpg jpeg svg pdf eps ai tif)
57
57
  exts_str = exts.join('|')
58
58
  if !is_converted && fname =~ /\.(#{exts_str})$/i
59
59
  FileUtils.cp "#{from_dir}/#{fname}", to_dir
@@ -5,11 +5,13 @@
5
5
 
6
6
  require 'review/builder'
7
7
  require 'review/textutils'
8
+ require 'review/htmlutils'
8
9
 
9
10
  module ReVIEW
10
11
 
11
12
  class MARKDOWNBuilder < Builder
12
13
  include TextUtils
14
+ include HTMLUtils
13
15
 
14
16
  def extname
15
17
  '.md'
@@ -18,7 +20,7 @@ module ReVIEW
18
20
  def builder_init_file
19
21
  @blank_seen = nil
20
22
  @ul_indent = 0
21
- @chapter.book.image_types = %w( .png .jpg .jpeg .gif .svg )
23
+ @chapter.book.image_types = %w(.png .jpg .jpeg .gif .svg)
22
24
  end
23
25
  private :builder_init_file
24
26
 
@@ -290,6 +292,15 @@ module ReVIEW
290
292
  def nofunc_text(str)
291
293
  str
292
294
  end
295
+
296
+ def compile_ruby(base, ruby)
297
+ if @book.htmlversion == 5
298
+ %Q[<ruby>#{escape_html(base)}<rp>#{I18n.t("ruby_prefix")}</rp><rt>#{escape_html(ruby)}</rt><rp>#{I18n.t("ruby_postfix")}</rp></ruby>]
299
+ else
300
+ %Q[<ruby><rb>#{escape_html(base)}</rb><rp>#{I18n.t("ruby_prefix")}</rp><rt>#{ruby}</rt><rp>#{I18n.t("ruby_postfix")}</rp></ruby>]
301
+ end
302
+ end
303
+
293
304
  end
294
305
 
295
306
  end # module ReVIEW
@@ -0,0 +1,66 @@
1
+ # -*- coding: utf-8 -*-
2
+ # This program is free software.
3
+ # You can distribute or modify this program under the terms of
4
+ # the GNU LGPL, Lesser General Public License version 2.1.
5
+
6
+ require 'review/markdownbuilder'
7
+
8
+ module ReVIEW
9
+
10
+ class MD2INAOBuilder < MARKDOWNBuilder
11
+ def paragraph(lines)
12
+ puts " " + lines.join
13
+ puts "\n"
14
+ end
15
+
16
+ def list_header(id, caption, lang)
17
+ lang ||= ""
18
+ puts "```#{lang}"
19
+ print %Q[●リスト#{@chapter.list(id).number}::#{compile_inline(caption)}\n\n]
20
+ end
21
+
22
+ def cmd(lines)
23
+ # WEB+DB では使っていないらしいけど
24
+ puts "!!! cmd"
25
+ lines.each do |line|
26
+ puts detab(line)
27
+ end
28
+ puts ""
29
+ end
30
+
31
+ def dl_begin
32
+ puts '<dl>'
33
+ end
34
+
35
+ def dt(line)
36
+ puts "<dt>#{line}</dt>"
37
+ end
38
+
39
+ def dd(lines)
40
+ puts "<dd>#{lines.join}</dd>"
41
+ end
42
+
43
+ def dl_end
44
+ puts '</dl>'
45
+ end
46
+
47
+ def comment(lines, comment = nil)
48
+ lines ||= []
49
+ lines.unshift comment unless comment.blank?
50
+ str = lines.join("\n")
51
+ puts '<span class="red">'
52
+ puts str
53
+ puts '</span>'
54
+ end
55
+
56
+ def compile_ruby(base, ruby)
57
+ if base.length == 1
58
+ %Q[<span class='monoruby'>#{escape_html(base)}(#{escape_html(ruby)})</span>]
59
+ else
60
+ %Q[<span class='groupruby'>#{escape_html(base)}(#{escape_html(ruby)})</span>]
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ end # module ReVIEW
@@ -30,10 +30,11 @@ module ReVIEW
30
30
  include FileUtils
31
31
  include ReVIEW::LaTeXUtils
32
32
 
33
- attr_accessor :config, :basedir
33
+ attr_accessor :config, :basedir, :basehookdir
34
34
 
35
35
  def initialize
36
36
  @basedir = nil
37
+ @basehookdir = nil
37
38
  @input_files = Hash.new{|h, key| h[key] = ""}
38
39
  end
39
40
 
@@ -121,6 +122,7 @@ module ReVIEW
121
122
  @config.merge!(cmd_config)
122
123
  I18n.setup(@config["language"])
123
124
  @basedir = File.dirname(yamlfile)
125
+ @basehookdir = File.absolute_path(File.dirname(yamlfile))
124
126
 
125
127
  begin
126
128
  @config.check_version(ReVIEW::VERSION)
@@ -226,7 +228,7 @@ module ReVIEW
226
228
  ReVIEW::MakerHelper.copy_images_to_dir(from, to)
227
229
  Dir.chdir(to) do
228
230
  images = Dir.glob("**/*").find_all{|f|
229
- File.file?(f) and f =~ /\.(jpg|jpeg|png|pdf)\z/
231
+ File.file?(f) and f =~ /\.(jpg|jpeg|png|pdf|ai|eps|tif)\z/
230
232
  }
231
233
  break if images.empty?
232
234
  system("extractbb", *images)
@@ -274,15 +276,15 @@ module ReVIEW
274
276
  def make_authors
275
277
  authors = ""
276
278
  if @config["aut"].present?
277
- author_names = join_with_separator(@config.names_of("aut"), ReVIEW::I18n.t("names_splitter"))
279
+ author_names = join_with_separator(@config.names_of("aut").map{|s| escape_latex(s)}, ReVIEW::I18n.t("names_splitter"))
278
280
  authors = ReVIEW::I18n.t("author_with_label", author_names)
279
281
  end
280
282
  if @config["csl"].present?
281
- csl_names = join_with_separator(@config.names_of("csl"), ReVIEW::I18n.t("names_splitter"))
283
+ csl_names = join_with_separator(@config.names_of("csl").map{|s| escape_latex(s)}, ReVIEW::I18n.t("names_splitter"))
282
284
  authors += " \\\\\n"+ ReVIEW::I18n.t("supervisor_with_label", csl_names)
283
285
  end
284
286
  if @config["trl"].present?
285
- trl_names = join_with_separator(@config.names_of("trl"), ReVIEW::I18n.t("names_splitter"))
287
+ trl_names = join_with_separator(@config.names_of("trl").map{|s| escape_latex(s)}, ReVIEW::I18n.t("names_splitter"))
286
288
  authors += " \\\\\n"+ ReVIEW::I18n.t("translator_with_label", trl_names)
287
289
  end
288
290
  authors
@@ -348,6 +350,17 @@ module ReVIEW
348
350
  @coverimageoption = "width=\\textwidth,height=\\textheight,keepaspectratio"
349
351
  end
350
352
 
353
+ @locale_latex = Hash.new
354
+ part_tuple = I18n.get("part").split(/\%[A-Za-z]{1,3}/, 2)
355
+ chapter_tuple = I18n.get("chapter").split(/\%[A-Za-z]{1,3}/, 2)
356
+ appendix_tuple = I18n.get("appendix").split(/\%[A-Za-z]{1,3}/, 2)
357
+ @locale_latex["prepartname"] = part_tuple[0]
358
+ @locale_latex["postpartname"] = part_tuple[1]
359
+ @locale_latex["prechaptername"] = chapter_tuple[0]
360
+ @locale_latex["postchaptername"] = chapter_tuple[1]
361
+ @locale_latex["preappendixname"] = appendix_tuple[0]
362
+ @locale_latex["postappendixname"] = appendix_tuple[1]
363
+
351
364
  template = File.expand_path('./latex/layout.tex.erb', ReVIEW::Template::TEMPLATE_DIR)
352
365
  layout_file = File.join(@basedir, "layouts", "layout.tex.erb")
353
366
  if File.exist?(layout_file)
@@ -378,11 +391,11 @@ module ReVIEW
378
391
 
379
392
  def call_hook(hookname)
380
393
  if @config["pdfmaker"].instance_of?(Hash) && @config["pdfmaker"][hookname]
381
- hook = File.absolute_path(@config["pdfmaker"][hookname], @basedir)
394
+ hook = File.absolute_path(@config["pdfmaker"][hookname], @basehookdir)
382
395
  if ENV["REVIEW_SAFE_MODE"].to_i & 1 > 0
383
396
  warn "hook configuration is prohibited in safe mode. ignored."
384
397
  else
385
- system_or_raise("#{hook} #{Dir.pwd} #{@basedir}")
398
+ system_or_raise("#{hook} #{Dir.pwd} #{@basehookdir}")
386
399
  end
387
400
  end
388
401
  end