review 3.2.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -4
  3. data/.travis.yml +1 -1
  4. data/NEWS.ja.md +97 -1
  5. data/NEWS.md +97 -1
  6. data/bin/review-catalog-converter +1 -1
  7. data/bin/review-check +5 -5
  8. data/bin/review-checkdep +1 -1
  9. data/bin/review-compile +5 -5
  10. data/bin/review-idgxmlmaker +16 -0
  11. data/bin/review-index +7 -7
  12. data/bin/review-preproc +9 -9
  13. data/bin/review-validate +2 -2
  14. data/bin/review-vol +5 -5
  15. data/doc/config.yml.sample +14 -6
  16. data/doc/config.yml.sample-simple +1 -1
  17. data/doc/format.ja.md +15 -5
  18. data/doc/format.md +30 -18
  19. data/doc/pdfmaker.ja.md +1 -1
  20. data/doc/pdfmaker.md +1 -1
  21. data/lib/review/book.rb +1 -1
  22. data/lib/review/book/base.rb +23 -63
  23. data/lib/review/book/chapter.rb +18 -3
  24. data/lib/review/book/compilable.rb +5 -0
  25. data/lib/review/book/index.rb +26 -65
  26. data/lib/review/book/index/item.rb +40 -0
  27. data/lib/review/book/part.rb +22 -2
  28. data/lib/review/builder.rb +60 -40
  29. data/lib/review/catalog.rb +12 -15
  30. data/lib/review/compiler.rb +68 -36
  31. data/lib/review/configure.rb +10 -7
  32. data/lib/review/epubmaker.rb +5 -2
  33. data/lib/review/htmlbuilder.rb +24 -71
  34. data/lib/review/htmlutils.rb +2 -3
  35. data/lib/review/i18n.rb +2 -2
  36. data/lib/review/idgxmlbuilder.rb +101 -55
  37. data/lib/review/idgxmlmaker.rb +184 -0
  38. data/lib/review/init-web/finish.html +10 -0
  39. data/lib/review/init-web/index.html +190 -0
  40. data/lib/review/init-web/review-layout-design.js +691 -0
  41. data/lib/review/init.rb +110 -26
  42. data/lib/review/latexbuilder.rb +76 -54
  43. data/lib/review/lineinput.rb +1 -1
  44. data/lib/review/logger.rb +4 -8
  45. data/lib/review/makerhelper.rb +6 -4
  46. data/lib/review/markdownbuilder.rb +25 -38
  47. data/lib/review/md2inaobuilder.rb +3 -5
  48. data/lib/review/pdfmaker.rb +15 -15
  49. data/lib/review/plaintextbuilder.rb +67 -76
  50. data/lib/review/preprocessor.rb +13 -13
  51. data/lib/review/rstbuilder.rb +31 -31
  52. data/lib/review/textmaker.rb +13 -3
  53. data/lib/review/textutils.rb +77 -2
  54. data/lib/review/tocparser.rb +17 -17
  55. data/lib/review/tocprinter.rb +8 -8
  56. data/lib/review/topbuilder.rb +76 -57
  57. data/lib/review/update.rb +16 -16
  58. data/lib/review/version.rb +1 -1
  59. data/lib/review/webmaker.rb +2 -2
  60. data/lib/review/yamlloader.rb +3 -0
  61. data/review.gemspec +4 -3
  62. data/samples/sample-book/README.md +7 -2
  63. data/samples/sample-book/src/.gitignore +153 -0
  64. data/samples/sample-book/src/config-jlreq.yml +6 -0
  65. data/samples/sample-book/src/lib/tasks/review.rake +20 -9
  66. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  67. data/samples/syntax-book/ch03.re +3 -6
  68. data/samples/syntax-book/config-jlreq.yml +5 -0
  69. data/samples/syntax-book/lib/tasks/review.rake +7 -7
  70. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  71. data/templates/latex/config.erb +6 -0
  72. data/templates/latex/layout.tex.erb +1 -0
  73. data/templates/latex/review-jlreq/review-base.sty +93 -31
  74. data/templates/latex/review-jlreq/review-jlreq.cls +6 -0
  75. data/templates/latex/review-jlreq/review-style.sty +3 -0
  76. data/templates/latex/review-jsbook/README.md +39 -0
  77. data/templates/latex/review-jsbook/review-base.sty +65 -10
  78. data/templates/latex/review-jsbook/review-jsbook.cls +4 -0
  79. data/templates/latex/review-jsbook/review-style.sty +4 -1
  80. data/test/assets/test_template.tex +11 -3
  81. data/test/assets/test_template_backmatter.tex +11 -3
  82. data/test/test_book.rb +65 -19
  83. data/test/test_catalog.rb +18 -42
  84. data/test/test_catalog_converter_cmd.rb +1 -1
  85. data/test/test_epubmaker_cmd.rb +2 -2
  86. data/test/test_helper.rb +1 -1
  87. data/test/test_htmlbuilder.rb +144 -55
  88. data/test/test_i18n.rb +25 -25
  89. data/test/test_idgxmlbuilder.rb +60 -18
  90. data/test/test_image_finder.rb +6 -6
  91. data/test/test_latexbuilder.rb +128 -24
  92. data/test/test_latexbuilder_v2.rb +23 -23
  93. data/test/test_logger.rb +14 -1
  94. data/test/test_makerhelper.rb +3 -3
  95. data/test/test_markdownbuilder.rb +45 -4
  96. data/test/test_md2inaobuilder.rb +12 -2
  97. data/test/test_pdfmaker.rb +1 -1
  98. data/test/test_pdfmaker_cmd.rb +1 -1
  99. data/test/test_plaintextbuilder.rb +31 -6
  100. data/test/test_rstbuilder.rb +33 -4
  101. data/test/test_textutils.rb +109 -2
  102. data/test/test_topbuilder.rb +35 -7
  103. data/test/test_update.rb +17 -8
  104. data/test/test_yamlloader.rb +13 -0
  105. metadata +26 -2
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (c) 2010-2017 Kenshi Muto
2
+ # Copyright (c) 2010-2019 Kenshi Muto
3
3
  #
4
4
  # This program is free software
5
5
  # You can distribute or modify this program under the terms of
@@ -48,7 +48,7 @@ ARGF.each do |line|
48
48
  @logger.warn "#{ln}: found '*' without the head space. Is it correct?"
49
49
  end
50
50
  elsif line =~ /\A\s+(\d+\.)\s+/ && line =~ /\A\s+\*\s+/
51
- unless Tw[list emlist listnum emlistnum cmd image table].include?(block)
51
+ unless %w[list emlist listnum emlistnum cmd image table].include?(block)
52
52
  @logger.warn "#{ln}: found itemized list or numbered list in #{block}. Is it correct?"
53
53
  end
54
54
  elsif block == 'table'
@@ -69,23 +69,23 @@ def main
69
69
  end
70
70
  end
71
71
  puts '============================='
72
- print_volume book.volume # puts "Total #{book.volume}"
72
+ print_volume(book.volume) # puts "Total #{book.volume}"
73
73
  rescue ReVIEW::ApplicationError, Errno::ENOENT => e
74
74
  raise if $DEBUG
75
- @logger.error "#{File.basename($PROGRAM_NAME)}: #{e.message}"
75
+ @logger.error e.message
76
76
  exit 1
77
77
  end
78
78
 
79
79
  def print_chapter_volume(chap)
80
80
  vol = chap.volume
81
81
  title = chap.title
82
- printf "%s %3dKB %6dC %5dL %3dP %s %-s\n",
82
+ printf("%s %3dKB %6dC %5dL %3dP %s %-s\n",
83
83
  chapnumstr(chap.number), vol.kbytes, vol.chars, vol.lines, vol.page,
84
- "#{chap.name} ".ljust(25, '.'), title
84
+ "#{chap.name} ".ljust(25, '.'), title)
85
85
  end
86
86
 
87
87
  def print_volume(vol)
88
- printf " %3dKB %6dC %5dL %3dP\n", vol.kbytes, vol.chars, vol.lines, vol.page
88
+ printf(" %3dKB %6dC %5dL %3dP\n", vol.kbytes, vol.chars, vol.lines, vol.page)
89
89
  end
90
90
 
91
91
  def chapnumstr(n)
@@ -5,7 +5,7 @@
5
5
  # このファイルはUTF-8エンコーディングで記述してください。
6
6
 
7
7
  # この設定ファイルでサポートするRe:VIEWのバージョン番号。
8
- review_version: 3.0
8
+ review_version: 4.0
9
9
 
10
10
  # ほかの設定ファイルの継承を指定できる。同じパラメータに異なる値がある場合は、
11
11
  # 呼び出し元の値が優先される。
@@ -111,7 +111,7 @@ toclevel: 3
111
111
  secnolevel: 2
112
112
 
113
113
  # 本文中に目次ページを作成するか。省略した場合はnull (作成しない)
114
- # toc: true
114
+ toc: true
115
115
 
116
116
  # EPUB2標準の目次(NCX)以外に物理目次ファイルを作成するか。省略した場合はnull (作成しない)
117
117
  # ePUB3においてはこの設定によらず必ず作成される
@@ -184,7 +184,7 @@ secnolevel: 2
184
184
  # 各数字の意味は、順にリストの行数、リストの1行字数、テキストの行数、テキストの1行字数、1kバイトごとのページ数
185
185
  # page_metric: [40,80,40,80,2]
186
186
 
187
- # EPUBおよびWeb生成における数式の画像化指定
187
+ # EPUBWeb、およびテキスト生成時における数式の画像化指定
188
188
  # TeXの数式を画像化するか。省略した場合はnull (作成しない)
189
189
  # imgmath: true
190
190
 
@@ -211,14 +211,20 @@ secnolevel: 2
211
211
  # pdfcrop_cmd: "pdfcrop --hires %i %o"
212
212
  # PDFから画像化するコマンドのコマンドライン。プレースホルダは
213
213
  # %i: 入力ファイル、%o: 出力ファイル、%O: 出力ファイルから拡張子を除いたもの
214
- # %p: 対象ページ番号
215
- # pdfcrop_pixelize_cmd: "pdftocairo -png -r 90 -f %p -l %p -singlefile %i %O"
214
+ # %p: 対象ページ番号、%t: フォーマット
215
+ # pdfcrop_pixelize_cmd: "pdftocairo -%t -r 90 -f %p -l %p -singlefile %i %O"
216
216
  # pdfcrop_pixelize_cmdが複数ページの処理に対応していない場合に単ページ化するか
217
217
  # extract_singlepage: null
218
218
  # extract_singlepageがtrueの場合に単ページ化するコマンドのコマンドライン
219
219
  # pdfextract_cmd: "pdfjam -q --outfile %o %i %p"
220
220
  # converterにdvipngを指定したときのdvipngコマンドのコマンドライン
221
221
  # dvipng_cmd: "dvipng -T tight -z 9 -p %p -l %p -o %o %i"
222
+ #
223
+ # PDFで保存したいときにはたとえば以下のようにする
224
+ # format: pdf
225
+ # extract_singlepage: true
226
+ # pdfextract_cmd: "pdftk A=%i cat A%p output %o"
227
+ # pdfcrop_pixelize_cmd: "mv %i %o"
222
228
 
223
229
  # EPUBにおけるページ送りの送り方向、page-progression-directionの値("ltr"|"rtl"|"default")
224
230
  # direction: "ltr"
@@ -322,7 +328,7 @@ epubmaker:
322
328
  # texcommand: "uplatex"
323
329
  #
324
330
  # LaTeXのコマンドに渡すオプションを指定する
325
- # texoptions: "-interaction=nonstopmode -file-line-error"
331
+ # texoptions: "-interaction=nonstopmode -file-line-error -halt-on-error"
326
332
  #
327
333
  # LaTeX用のdvi変換コマンドを指定する(dvipdfmx)
328
334
  # dvicommand: "dvipdfmx"
@@ -388,4 +394,6 @@ pdfmaker:
388
394
  # makeindex_mecab_opts: "-Oyomi"
389
395
  # 奥付を作成するか。trueを指定するとデフォルトの奥付、ファイル名を指定するとそれがcolophon.htmlとしてコピーされる
390
396
  colophon: true
397
+ # 表紙挿入時に表紙のページ番号名を「cover」とし、偶数ページ扱いにして大扉前に白ページが入るのを防ぐ。デフォルトはtrue
398
+ # use_cover_nombre: true
391
399
  # pdfmaker:階層を使うものはここまで
@@ -1,5 +1,5 @@
1
1
  # simple sample of config.yml
2
- review_version: 3.0
2
+ review_version: 4.0
3
3
 
4
4
  # debug: true
5
5
 
@@ -505,14 +505,13 @@ complexmatrixという識別子に基づく画像ファイルが貼り込まれ
505
505
 
506
506
  本文中のインライン命令「`@<fn>{site}`」は脚注番号に置換され、「本書のサポートサイト……」という文は実際の脚注に変換されます。
507
507
 
508
- 注意: TeX PDF において、コラムや表など平文でないところで「`@<fn>{~}`」を使うには、`footnotetext` オプションを使う必要があります。
508
+ 注意: TeX PDF において、コラムの中で脚注を利用する場合、`//footnote` 行はコラムの終わり(`==[/column]` など)の後ろに記述することをお勧めします。Re:VIEW の標準提供のコラム表現では問題ありませんが、サードパーティのコラムの実装によってはおかしな採番表現になることがあります。
509
509
 
510
510
  ### footnotetext オプション
511
+ TeX PDF において、コラム以外の `//note` などの囲み記事の中で「`@<fn>{~}`」を使うには、`footnotetext` オプションを使う必要があります。
511
512
 
512
513
  `footnotetext` オプションを使うには、`config.yml` ファイルに`footnotetext: true` を追加します。
513
514
 
514
- これで PDF のコラムや表のなかでも脚注が使えるようになります。
515
-
516
515
  ただし、通常の脚注(footnote)ではなく、footnotemark と footnotetext を使うため、本文と脚注が別ページに分かれる可能性があるなど、いろいろな制約があります。また、採番が別々になるため、footnote と footnotemark/footnotetext を両立させることはできません。
517
516
 
518
517
  ## 参考文献の定義
@@ -638,8 +637,8 @@ imgmath_options:
638
637
  pdfcrop_cmd: "pdfcrop --hires %i %o"
639
638
  # PDFから画像化するコマンドのコマンドライン。プレースホルダは
640
639
  # %i: 入力ファイル、%o: 出力ファイル、%O: 出力ファイルから拡張子を除いたもの
641
- # %p: 対象ページ番号
642
- pdfcrop_pixelize_cmd: "pdftocairo -png -r 90 -f %p -l %p -singlefile %i %O"
640
+ # %p: 対象ページ番号、%t: フォーマット
641
+ pdfcrop_pixelize_cmd: "pdftocairo -%t -r 90 -f %p -l %p -singlefile %i %O"
643
642
  # pdfcrop_pixelize_cmdが複数ページの処理に対応していない場合に単ページ化するか
644
643
  extract_singlepage: null
645
644
  # 単ページ化するコマンドのコマンドライン
@@ -673,6 +672,17 @@ imgmath_options:
673
672
  pdfcrop_pixelize_cmd: "sips -s format png --out %o %i"
674
673
  ```
675
674
 
675
+ textmaker 向けに PDF 形式の数式ファイルを作成したいときには、たとえば以下のように設定します(ページの抽出には pdftk を利用)。
676
+
677
+ ```
678
+ imgmath: true
679
+ imgmath_options:
680
+ format: pdf
681
+ extract_singlepage: true
682
+ pdfextract_cmd: "pdftk A=%i cat A%p output %o"
683
+ pdfcrop_pixelize_cmd: "mv %i %o"
684
+ ```
685
+
676
686
  Re:VIEW 2 以前の dvipng の設定に合わせるには、次のようにします。
677
687
 
678
688
  ```
@@ -98,11 +98,11 @@ Nested itemize is like ` **`, ` ***`.
98
98
  Usage:
99
99
 
100
100
  ```
101
- * 1st item
102
- ** nested 1st item
103
- * 2nd item
104
- ** nested 2nd item
105
- * 3rd item
101
+ * 1st item
102
+ ** nested 1st item
103
+ * 2nd item
104
+ ** nested 2nd item
105
+ * 3rd item
106
106
  ```
107
107
 
108
108
  In itemize, you must write one more space character at line head.
@@ -118,34 +118,34 @@ They aren't nested.
118
118
  Usage:
119
119
 
120
120
  ```
121
- 1. 1st condition
122
- 2. 2nd condition
123
- 3. 3rd condition
121
+ 1. 1st condition
122
+ 2. 2nd condition
123
+ 3. 3rd condition
124
124
  ```
125
125
 
126
126
  The value of Number is ignored.
127
127
 
128
128
  ```
129
- 1. 1st condition
130
- 1. 2nd condition
131
- 1. 3rd condition
129
+ 1. 1st condition
130
+ 1. 2nd condition
131
+ 1. 3rd condition
132
132
  ```
133
133
 
134
134
  You must write one more space character at line head like itemize.
135
135
 
136
136
  ## Definition List
137
137
 
138
- Definition list (dl in HTML) use `:` and indented lines.
138
+ Definition list (dl in HTML) uses ` : ` and indented lines.
139
139
 
140
140
  Usage:
141
141
 
142
142
  ```review
143
- : Alpha
143
+ : Alpha
144
144
  RISC CPU made by DEC.
145
- : POWER
145
+ : POWER
146
146
  RSIC CPU made by IBM and Motolora.
147
147
  POWER PC is delivered from this.
148
- : SPARC
148
+ : SPARC
149
149
  RISC CPU made by SUN.
150
150
  ```
151
151
 
@@ -546,9 +546,10 @@ You should get and install it before reading the book.
546
546
  `@<fn>{site}` in source are replaced by footnote marks, and the phrase "support site of .."
547
547
  is in footnotes.
548
548
 
549
- Note that In LATEXBuilder, you should use `footnotetext` option to use `@<fn>{...}` in columns and tables.
549
+ Note that in LATEXBuilder, it is highly recommended to place `//footnote` after the end line of column (`==[/column]`) to avoid problems when using third party's style file.
550
550
 
551
551
  ### `footnotetext` option
552
+ Note that in LATEXBuilder, you should use `footnotetext` option to use `@<fn>{...}` in `//note` or other short column blocks.
552
553
 
553
554
  By adding `footnotetext:true` in config.yml, you can use footnote in tables and short notes.
554
555
 
@@ -682,8 +683,8 @@ imgmath_options:
682
683
  pdfcrop_cmd: "pdfcrop --hires %i %o"
683
684
  # imaging command.
684
685
  # %i: filename for input %o: filename for output %O: filename for output without the extension
685
- # %p: page number
686
- pdfcrop_pixelize_cmd: "pdftocairo -png -r 90 -f %p -l %p -singlefile %i %O"
686
+ # %p: page number, %t: format
687
+ pdfcrop_pixelize_cmd: "pdftocairo -%t -r 90 -f %p -l %p -singlefile %i %O"
687
688
  # whether to generate a single PDF page for pdfcrop_pixelize_cmd.
688
689
  extract_singlepage: null
689
690
  # command line to generate a single PDF page file.
@@ -717,6 +718,17 @@ imgmath_options:
717
718
  pdfcrop_pixelize_cmd: "sips -s format png --out %o %i"
718
719
  ```
719
720
 
721
+ To create PDF math images:
722
+
723
+ ```
724
+ imgmath: true
725
+ imgmath_options:
726
+ format: pdf
727
+ extract_singlepage: true
728
+ pdfextract_cmd: "pdftk A=%i cat A%p output %o"
729
+ pdfcrop_pixelize_cmd: "mv %i %o"
730
+ ```
731
+
720
732
  To set the same setting as Re:VIEW 2:
721
733
 
722
734
  ```
@@ -121,7 +121,7 @@ LaTeX コンパイラコマンドおよびオプションについて、Re:VIEW
121
121
 
122
122
  ```yaml
123
123
  texcommand: uplatex
124
- texoptions: "-interaction=nonstopmode -file-line-error"
124
+ texoptions: "-interaction=nonstopmode -file-line-error -halt-on-error"
125
125
  texdocumentclass: ["jsbook", "uplatex,oneside"]
126
126
  dvicommand: dvipdfmx
127
127
  dvioptions: "-d 5"
@@ -100,7 +100,7 @@ Default settings of Re:VIEW is below:
100
100
 
101
101
  ```yaml
102
102
  texcommand: uplatex
103
- texoptions: "-interaction=nonstopmode -file-line-error"
103
+ texoptions: "-interaction=nonstopmode -file-line-error -halt-on-error"
104
104
  texdocumentclass: ["review-jsbook", "uplatex,twoside"]
105
105
  dvicommand: dvipdfmx
106
106
  dvioptions: "-d 5"
@@ -19,7 +19,7 @@ require 'review/book/index'
19
19
  module ReVIEW
20
20
  module Book
21
21
  def self.load(dir)
22
- Base.load dir
22
+ Base.load(dir)
23
23
  end
24
24
  end
25
25
  end
@@ -29,7 +29,6 @@ module ReVIEW
29
29
  @chapter_index = nil
30
30
  @config = ReVIEW::Configure.values
31
31
  @catalog = nil
32
- @read_part = nil
33
32
  @warn_old_files = {} # XXX for checking CHAPS, PREDEF, POSTDEF
34
33
  @basedir_seen = {}
35
34
  update_rubyenv
@@ -189,8 +188,8 @@ module ReVIEW
189
188
  return @catalog if @catalog.present?
190
189
 
191
190
  catalogfile_path = filename_join(@basedir, config['catalogfile'])
192
- if File.file? catalogfile_path
193
- @catalog = File.open(catalogfile_path, 'r:BOM|utf-8') { |f| Catalog.new(f) }
191
+ if File.file?(catalogfile_path)
192
+ @catalog = File.open(catalogfile_path, 'rt:BOM|utf-8') { |f| Catalog.new(f) }
194
193
  end
195
194
  if @catalog
196
195
  @catalog.validate!(@config, basedir)
@@ -202,7 +201,7 @@ module ReVIEW
202
201
  if catalog
203
202
  catalog.chaps
204
203
  else
205
- read_file(config['chapter_file'])
204
+ read_file(config['chapter_file']).split("\n")
206
205
  end
207
206
  end
208
207
 
@@ -210,7 +209,7 @@ module ReVIEW
210
209
  if catalog
211
210
  catalog.predef
212
211
  else
213
- read_file(config['predef_file'])
212
+ read_file(config['predef_file']).split("\n")
214
213
  end
215
214
  end
216
215
 
@@ -218,7 +217,7 @@ module ReVIEW
218
217
  if catalog
219
218
  catalog.appendix
220
219
  else
221
- read_file(config['postdef_file']) # for backward compatibility
220
+ read_file(config['postdef_file']).split("\n") # for backward compatibility
222
221
  end
223
222
  end
224
223
 
@@ -226,17 +225,15 @@ module ReVIEW
226
225
  if catalog
227
226
  catalog.postdef
228
227
  else
229
- ''
228
+ []
230
229
  end
231
230
  end
232
231
 
233
232
  def read_part
234
- return @read_part if @read_part
235
-
236
233
  if catalog
237
- @read_part = catalog.parts
234
+ catalog.parts
238
235
  else
239
- @read_part = File.read(File.join(@basedir, config['part_file']))
236
+ File.read(File.join(@basedir, config['part_file'])).split("\n")
240
237
  end
241
238
  end
242
239
 
@@ -258,13 +255,13 @@ module ReVIEW
258
255
 
259
256
  def prefaces
260
257
  if catalog
261
- return mkpart_from_namelist(catalog.predef.split("\n"))
258
+ return Part.mkpart_from_namelist(self, catalog.predef)
262
259
  end
263
260
 
264
261
  begin
265
262
  predef_file = filename_join(@basedir, config['predef_file'])
266
263
  if File.file?(predef_file)
267
- mkpart_from_namelistfile(predef_file)
264
+ Part.mkpart_from_namelistfile(self, predef_file)
268
265
  end
269
266
  rescue FileNotFound => e
270
267
  raise FileNotFound, "preface #{e.message}"
@@ -273,15 +270,15 @@ module ReVIEW
273
270
 
274
271
  def appendix
275
272
  if catalog
276
- names = catalog.appendix.split("\n")
277
- chaps = names.each_with_index.map { |n, idx| mkchap_ifexist(n, idx) }.compact
278
- return mkpart(chaps)
273
+ names = catalog.appendix
274
+ chaps = names.each_with_index.map { |name, number| Chapter.mkchap_ifexist(self, name, number + 1) }.compact
275
+ return Part.mkpart(chaps)
279
276
  end
280
277
 
281
278
  begin
282
279
  postdef_file = filename_join(@basedir, config['postdef_file'])
283
280
  if File.file?(postdef_file)
284
- mkpart_from_namelistfile(postdef_file)
281
+ Part.mkpart_from_namelistfile(self, postdef_file)
285
282
  end
286
283
  rescue FileNotFound => e
287
284
  raise FileNotFound, "postscript #{e.message}"
@@ -290,7 +287,7 @@ module ReVIEW
290
287
 
291
288
  def postscripts
292
289
  if catalog
293
- mkpart_from_namelist(catalog.postdef.split("\n"))
290
+ Part.mkpart_from_namelist(self, catalog.postdef)
294
291
  end
295
292
  end
296
293
 
@@ -300,13 +297,13 @@ module ReVIEW
300
297
  list = parse_chapters
301
298
  # NOTE: keep this = style to work this logic.
302
299
  if pre = prefaces
303
- list.unshift pre
300
+ list.unshift(pre)
304
301
  end
305
302
  if app = appendix
306
- list.push app
303
+ list.push(app)
307
304
  end
308
305
  if post = postscripts
309
- list.push post
306
+ list.push(post)
310
307
  end
311
308
  list
312
309
  end
@@ -324,7 +321,7 @@ module ReVIEW
324
321
  chap = Chapter.new(self, num += 1, chap, File.join(contentdir, chap))
325
322
  chap
326
323
  end
327
- Part.new(self, part += 1, chaps, read_part.split("\n")[part - 1])
324
+ Part.new(self, part += 1, chaps, read_part[part - 1])
328
325
  else
329
326
  chap = Chapter.new(self, num += 1, entry, File.join(contentdir, entry))
330
327
  if chap.number
@@ -337,12 +334,11 @@ module ReVIEW
337
334
  end
338
335
  end
339
336
 
340
- chap = read_chaps.
341
- strip.lines.map(&:strip).join("\n").split(/\n{2,}/).
337
+ chap = read_chaps.map(&:strip).join("\n").split(/\n{2,}/).
342
338
  map do |part_chunk|
343
339
  chaps = part_chunk.split.map { |chapid| Chapter.new(self, num += 1, chapid, File.join(contentdir, chapid)) }
344
- if part_exist? && read_part.split("\n").size > part
345
- Part.new(self, part += 1, chaps, read_part.split("\n")[part - 1])
340
+ if part_exist? && read_part.size > part
341
+ Part.new(self, part += 1, chaps, read_part[part - 1])
346
342
  else
347
343
  Part.new(self, nil, chaps)
348
344
  end
@@ -350,42 +346,6 @@ module ReVIEW
350
346
  chap
351
347
  end
352
348
 
353
- def mkpart_from_namelistfile(path)
354
- chaps = []
355
- File.read(path, mode: 'r:BOM|utf-8').split.each_with_index do |name, idx|
356
- if path =~ /PREDEF/
357
- chaps << mkchap(name)
358
- else
359
- chaps << mkchap(name, idx + 1)
360
- end
361
- end
362
- mkpart(chaps)
363
- end
364
-
365
- def mkpart_from_namelist(names)
366
- mkpart(names.map { |n| mkchap_ifexist(n) }.compact)
367
- end
368
-
369
- def mkpart(chaps)
370
- chaps.empty? ? nil : Part.new(self, nil, chaps)
371
- end
372
-
373
- def mkchap(name, number = nil)
374
- name += ext if File.extname(name).empty?
375
- path = File.join(contentdir, name)
376
- raise FileNotFound, "file not exist: #{path}" unless File.file?(path)
377
- Chapter.new(self, number, name, path)
378
- end
379
-
380
- def mkchap_ifexist(name, idx = nil)
381
- name += ext if File.extname(name).empty?
382
- path = File.join(contentdir, name)
383
- if File.file?(path)
384
- idx += 1 if idx
385
- Chapter.new(self, idx, name, path)
386
- end
387
- end
388
-
389
349
  def read_file(filename)
390
350
  unless @warn_old_files[filename]
391
351
  @warn_old_files[filename] = true
@@ -394,7 +354,7 @@ module ReVIEW
394
354
  end
395
355
  end
396
356
  res = ''
397
- File.open(filename_join(@basedir, filename), 'r:BOM|utf-8') do |f|
357
+ File.open(filename_join(@basedir, filename), 'rt:BOM|utf-8') do |f|
398
358
  f.each_line do |line|
399
359
  next if /\A#/ =~ line
400
360
  line.gsub!(/#.*\Z/, '')