review 1.0.0 → 1.1.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.
Files changed (100) hide show
  1. data/.travis.yml +1 -2
  2. data/ChangeLog +65 -0
  3. data/Gemfile +5 -0
  4. data/README.rdoc +6 -1
  5. data/Rakefile +14 -28
  6. data/bin/review-check +9 -21
  7. data/bin/review-compile +45 -12
  8. data/bin/review-epubmaker +477 -220
  9. data/bin/review-epubmaker-ng +5 -14
  10. data/bin/review-index +4 -2
  11. data/bin/review-init +94 -0
  12. data/bin/review-pdfmaker +70 -287
  13. data/bin/review-preproc +5 -2
  14. data/bin/review-vol +4 -11
  15. data/debian/changelog +3 -3
  16. data/debian/copyright +5 -3
  17. data/debian/docs +1 -0
  18. data/doc/format.rdoc +57 -11
  19. data/doc/quickstart.rdoc +4 -4
  20. data/doc/sample.yaml +11 -7
  21. data/lib/epubmaker.rb +1 -1
  22. data/lib/epubmaker/epubv2.rb +26 -27
  23. data/lib/epubmaker/epubv3.rb +13 -13
  24. data/lib/epubmaker/producer.rb +1 -1
  25. data/lib/review.rb +3 -4
  26. data/lib/review/book.rb +17 -581
  27. data/lib/review/book/base.rb +247 -0
  28. data/lib/review/book/chapter.rb +81 -0
  29. data/lib/review/book/compilable.rb +163 -0
  30. data/lib/review/book/index.rb +339 -0
  31. data/lib/review/book/page_metric.rb +38 -0
  32. data/lib/review/book/parameters.rb +97 -0
  33. data/lib/review/book/part.rb +44 -0
  34. data/lib/review/book/volume.rb +65 -0
  35. data/lib/review/builder.rb +34 -40
  36. data/lib/review/compiler.rb +32 -13
  37. data/lib/review/configure.rb +38 -0
  38. data/lib/review/ewbbuilder.rb +23 -21
  39. data/lib/review/extentions.rb +3 -0
  40. data/lib/review/extentions/object.rb +9 -0
  41. data/lib/review/{compat.rb → extentions/string.rb} +11 -0
  42. data/lib/review/htmlbuilder.rb +162 -74
  43. data/lib/review/htmlutils.rb +28 -1
  44. data/lib/review/i18n.yaml +11 -0
  45. data/lib/review/idgxmlbuilder.rb +119 -35
  46. data/lib/review/inaobuilder.rb +355 -0
  47. data/lib/review/latexbuilder.rb +133 -59
  48. data/lib/review/latexutils.rb +15 -6
  49. data/lib/review/makerhelper.rb +59 -0
  50. data/lib/review/markdownbuilder.rb +129 -0
  51. data/lib/review/preprocessor.rb +20 -7
  52. data/lib/review/review.tex.erb +250 -0
  53. data/lib/review/textutils.rb +28 -3
  54. data/lib/review/tocparser.rb +20 -12
  55. data/lib/review/tocprinter.rb +7 -3
  56. data/lib/review/topbuilder.rb +44 -27
  57. data/lib/review/version.rb +3 -0
  58. data/review.gemspec +20 -117
  59. data/test/book_test_helper.rb +35 -0
  60. data/test/sample-book/README.md +5 -0
  61. data/test/sample-book/src/CHAPS +2 -0
  62. data/test/sample-book/src/PREDEF +1 -0
  63. data/test/sample-book/src/Rakefile +26 -0
  64. data/test/sample-book/src/_cover.html +3 -0
  65. data/test/sample-book/src/ch01.re +71 -0
  66. data/test/sample-book/src/ch02.re +3 -0
  67. data/test/sample-book/src/config.yml +55 -0
  68. data/test/sample-book/src/images/ch01-imgsample.jpg +0 -0
  69. data/test/sample-book/src/images/cover.jpg +0 -0
  70. data/test/sample-book/src/main.css +251 -0
  71. data/test/sample-book/src/preface.re +15 -0
  72. data/test/sample-book/src/sty/jumoline.sty +310 -0
  73. data/test/sample-book/src/sty/samplemacro.sty +21 -0
  74. data/test/sample-book/src/vendor/jumoline/README +29 -0
  75. data/test/sample-book/src/vendor/jumoline/jumoline.dtx +2988 -0
  76. data/test/sample-book/src/vendor/jumoline/jumoline.ins +6 -0
  77. data/test/test_book.rb +26 -646
  78. data/test/test_book_chapter.rb +418 -0
  79. data/test/test_book_parameter.rb +42 -0
  80. data/test/test_book_part.rb +53 -0
  81. data/test/test_builder.rb +17 -10
  82. data/test/test_compiler.rb +46 -0
  83. data/test/test_epubmaker.rb +1 -1
  84. data/test/test_epubmaker_cmd.rb +36 -0
  85. data/test/test_helper.rb +17 -0
  86. data/test/test_htmlbuilder.rb +156 -24
  87. data/test/test_htmlutils.rb +4 -0
  88. data/test/test_i18n.rb +6 -2
  89. data/test/test_idgxmlbuilder.rb +33 -11
  90. data/test/test_inaobuilder.rb +247 -0
  91. data/test/test_index.rb +31 -0
  92. data/test/test_latexbuilder.rb +115 -35
  93. data/test/test_makerhelper.rb +50 -0
  94. data/test/test_pdfmaker_cmd.rb +36 -0
  95. data/test/test_preprocessor.rb +7 -7
  96. data/test/test_topbuilder.rb +6 -7
  97. data/test/test_uuid.rb +1 -0
  98. metadata +117 -12
  99. data/lib/review/index.rb +0 -323
  100. data/lib/review/volume.rb +0 -66
@@ -24,8 +24,10 @@ require 'fileutils'
24
24
  require 'optparse'
25
25
 
26
26
  def sigmain
27
- Signal.trap(:PIPE, 'IGNORE')
28
27
  Signal.trap(:INT) { exit 1 }
28
+ if RUBY_PLATFORM !~ /mswin(?!ce)|mingw|cygwin|bccwin/
29
+ Signal.trap(:PIPE, 'IGNORE')
30
+ end
29
31
  main
30
32
  rescue Errno::EPIPE
31
33
  exit 0
@@ -65,6 +67,7 @@ SJIS)') {|enc|
65
67
  parser.on('--final', 'Unfold text and strip preprocessor tags. (deprecated)') {
66
68
  mode = :final
67
69
  }
70
+ parser.on('--tabwidth=WIDTH', "Replace tabs with space characters. (0: don't replace)") {|width| param["tabwidth"] = width.to_i }
68
71
  parser.on('--help', 'Print this message and quit.') {
69
72
  puts parser.help
70
73
  exit 0
@@ -77,7 +80,7 @@ SJIS)') {|enc|
77
80
  exit 1
78
81
  end
79
82
 
80
- pp = ReVIEW::Preprocessor.new(ReVIEW::Repository.new, param)
83
+ pp = ReVIEW::Preprocessor.new(ReVIEW::Repository.new(param), param)
81
84
  current_file = nil
82
85
  ARGV.each do |path|
83
86
  current_file = path
@@ -15,10 +15,10 @@ require 'pathname'
15
15
  bindir = Pathname.new(__FILE__).realpath.dirname
16
16
  $LOAD_PATH.unshift((bindir + '../lib').realpath)
17
17
 
18
- require 'review/book'
19
- require 'review/exception'
18
+ require 'review'
20
19
  require 'optparse'
21
- require 'nkf'
20
+
21
+ include ReVIEW::TextUtils
22
22
 
23
23
  def main
24
24
  $KCODE = 'UTF-8' unless defined?(Encoding)
@@ -85,14 +85,7 @@ end
85
85
 
86
86
  def print_chapter_volume(chap)
87
87
  vol = chap.volume
88
- title = chap.title
89
- if @param["outencoding"] =~ /^EUC$/i
90
- title = NKF.nkf("-W -e", title)
91
- elsif @param["outencoding"] =~ /^SJIS$/i
92
- title = NKF.nkf("-W -s", title)
93
- elsif @param["outencoding"] =~ /^JIS$/i
94
- title = NKF.nkf("-W -j", title)
95
- end
88
+ title = convert_outencoding(chap.title, @param["outencoding"])
96
89
  printf "%s %3dKB %6dC %5dL %3dP %s %-s\n",
97
90
  chapnumstr(chap.number), vol.kbytes, vol.chars, vol.lines, vol.page,
98
91
  "#{chap.name} ".ljust(25, '.'), title
@@ -1,5 +1,5 @@
1
- review (0.6+20101123) unstable; urgency=low
1
+ review (1.0+20120212) unstable; urgency=low
2
2
 
3
- * Initial Release. (closes: #)
3
+ * Initial Release. (closes: #XXXX)
4
4
 
5
- -- Kenshi Muto <kmuto@debian.org> Tue, 23 Nov 2010 17:35:59 +0900
5
+ -- Kenshi Muto <kmuto@debian.org> Sun, 12 Feb 2012 15:38:55 +0900
@@ -8,12 +8,14 @@ It was downloaded from:
8
8
 
9
9
  Upstream Author(s):
10
10
 
11
- Minero Aoki <aamine@loveruby.net>, Kenshi Muto <kmuto@debian.org>,
12
- and Masayoshi Takahashi <takahashimm@gmail.com>.
11
+ Minero Aoki, Kenshi Muto,
12
+ Masayoshi Takahashi, and
13
+ Masanori KADO <kdmsnr@gmail.com>.
13
14
 
14
15
  Copyright:
15
16
 
16
- Copyright (C) 2006-2010 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
17
+ Copyright (C) 2006-2012 Minero Aoki, Kenshi Muto, Masayoshi Takahashi,
18
+ Masanori KADO.
17
19
 
18
20
  For lib/uuid.rb:
19
21
  Copyright(c) 2005 URABE, Shyouhei
@@ -1,5 +1,6 @@
1
1
  README.rdoc
2
2
  ChangeLog
3
3
  doc/format.rdoc
4
+ doc/quickstart.rdoc
4
5
  doc/sample.css
5
6
  doc/sample.yaml
@@ -259,9 +259,7 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
259
259
  表は //table[識別子][キャプション]{ 〜 //} です。ヘッダと内容を
260
260
  分ける罫線は「------」で書き込んであります。
261
261
 
262
- カラム間は任意個数のタブで区切ります。また、カラム先頭の「.」は削
263
- 除されるので、カラムの先頭文字が「.」の場合は「.」をもう一つ余計に
264
- 付けてください。例えば「.」という内容のカラムは「..」と書きます。
262
+ カラム間は任意個数のタブで区切ります。また、カラム先頭の「.」は削除されるので、カラムの先頭文字が「.」の場合は「.」をもう一つ余計に付けてください。例えば「.」という内容のカラムは「..」と書きます。
265
263
  また、空のカラムは「.」と書けます。
266
264
 
267
265
  例:
@@ -311,12 +309,22 @@ RD や各種 Wiki の文法をとりいれて簡素化しています。
311
309
  本文中の「@<fn>{site}」は脚注番号に置換され、「本書のサポート
312
310
  サイト……」という文は実際の脚注に変換されます。
313
311
 
312
+ 注意: PDFで、コラムや表など平文でないところで「@<fn>{~}」を使うには、footnotetextオプションを使う必要があります。
313
+
314
+ === footnotetextオプション
315
+
316
+ footnotetextオプションを使うには、YAMLファイルのparamsに「--footnotetext」を追加します。
317
+
318
+ これでPDFのコラムや表のなかでも脚注が使えるようになります。
319
+
320
+ ただし、通常の脚注(footnote)ではなく、footnotemarkとfootnotetextを使うため、本文と脚注が別ページに分かれる可能性があるなど、いろいろな制約があります。
321
+
314
322
  == 参考文献の定義
315
323
 
316
324
  参考文献は同一ディレクトリ内の bib.re に定義します。
317
- //bibpaper[site][キャプション]{..コメント..}
325
+ //bibpaper[cite][キャプション]{..コメント..}
318
326
  コメントが無い場合も定義可能です。
319
- //bibpaper[site][キャプション]
327
+ //bibpaper[cite][キャプション]
320
328
 
321
329
  例:
322
330
 
@@ -359,14 +367,12 @@ LaTeX の式を挿入するには、//texequation{ 〜 //} を使います。
359
367
 
360
368
  出力される空白を制御するタグとしては、//noindentがあります。
361
369
 
362
- //noindent:: その直後に来る段落冒頭のインデントをなくする(HTMLではnoindentクラスになる)
370
+ //noindent:: その直後に来る段落冒頭のインデントをなくす(HTMLではnoindentクラスになる)
363
371
 
364
372
  以前あった「//linebreak」(改行)、「//pagebreak」(改ページ)は廃止になります。
365
373
 
366
374
  == コメント
367
375
 
368
- 以前は「//comment」というタグがありましたが、廃止されます。
369
-
370
376
  最終結果に出力されないコメントを記述したい場合は「#@#」を使ってください。
371
377
 
372
378
  例:
@@ -379,6 +385,12 @@ LaTeX の式を挿入するには、//texequation{ 〜 //} を使います。
379
385
 
380
386
  #@warn(あとで書く)
381
387
 
388
+ 最終結果に出力するコメントを記述したい場合は、//commentまたは@<comment>を使った上で、review-compileコマンドに--draftオプションを追加してください。
389
+
390
+ 例:
391
+
392
+ @<comment>{あとで書く}
393
+
382
394
  == 生データ行
383
395
 
384
396
  ReVIEW のタグ範囲を越えて何か特別な行を挿入したい場合、//raw を使います。
@@ -413,7 +425,31 @@ ReVIEW は任意のブロックを追加可能なので、本によって専用
413
425
  //prototype:: 関数プロトタイプ。『ふつうのLinuxプログラミング』で使用。
414
426
  //type:: 関数の型宣言。『ふつうのHaskellプログラミング』で使用。
415
427
 
416
- 拡張文法はreview-ext.rbというファイルで指定できますが、ここでは詳しく触れません。
428
+ 拡張文法はreview-ext.rbというファイルで指定できます。
429
+ 例えば、
430
+
431
+ # review-ext.rb
432
+ ReVIEW::Compiler.defblock :foo, 0..1
433
+
434
+ class ReVIEW::HTMLBuilder
435
+ def foo(lines, caption = nil)
436
+ puts lines.join(",")
437
+ end
438
+ end
439
+
440
+ のようにすると、以下のような文法を追加できます。
441
+
442
+ //foo{
443
+ A
444
+ B
445
+ C
446
+ //}
447
+
448
+ # 出力結果
449
+ A,B,C
450
+
451
+ 詳しいことについては、ここでは触れません。
452
+
417
453
 
418
454
  == 段落中で使う文法 (インライン命令)
419
455
 
@@ -428,12 +464,14 @@ ReVIEW は任意のブロックを追加可能なので、本によって専用
428
464
  @<bou>{ふさわしい}:: 傍点。
429
465
  @<ruby>{直截, ちょくせつ}:: ルビ。
430
466
  @<ami>{重点ポイント}:: 文字に対するアミかけ。
431
- @<b>{どうしても}:: 太字。
432
- @<em>{どうしても}:: 太字(強調)。
467
+ @<b>{どうしても}:: 太字 (ボールド)。
433
468
  @<i>{どうしても}:: イタリック。
469
+ @<strong>{どうしても}:: 強調。
470
+ @<em>{どうしても}:: 強調。
434
471
  @<tt>{foo($bar)}:: テキストをテレタイプ文字(等幅フォント)で出力する。
435
472
  @<tti>{FooClass}:: テキストをテレタイプ文字(等幅フォント)のイタリックで出力する。
436
473
  @<ttb>{BarClass}:: テキストをテレタイプ文字(等幅フォント)の太字で出力する。
474
+ @<u>{下線}:: 下線。
437
475
  @<br>{}:: 段落中改行。
438
476
  @<m>{a + \alpha}:: TeXインライン式。
439
477
  @<icon>{samplephoto}:: インライン画像。
@@ -505,6 +543,14 @@ PART:
505
543
 
506
544
  @<hd>{preface|はじめに|まずわ}
507
545
 
546
+ 参照先にラベルが設定されている場合は、ラベルで参照します。
547
+
548
+ =={hajimeni} はじめに
549
+ :
550
+ === まずわ
551
+ :
552
+ @<hd>{hajimeni|まずわ}
553
+
508
554
  == リンク
509
555
 
510
556
  Web ハイパーリンクを記述するには、リンクに @<href>、アンカーに //label
@@ -140,7 +140,7 @@ sample.re を HTML に変換すると、次のようになります。
140
140
  </body>
141
141
  </html>
142
142
 
143
- ReVIEW フォーマットについての詳細は、format.rdoc (オンラインでは [[https://github.com/kmuto/review/blob/master/doc/format.rdoc]] ) を参照してください。
143
+ ReVIEW フォーマットについての詳細は、 {format.rdoc}[https://github.com/kmuto/review/blob/master/doc/format.rdoc] を参照してください。
144
144
 
145
145
  review-compile を含め、ほとんどのコマンドは --help オプションを付けるとオプションについてのヘルプが表示されます。review-compile には多数のオプションがあるので確認してください。
146
146
 
@@ -172,9 +172,9 @@ review-compile を含め、ほとんどのコマンドは --help オプション
172
172
 
173
173
  review-pdfmaker コマンドで PDF ブックの作成、review-epubmaker コマンドで EPUB ファイルの作成ができます。
174
174
 
175
- PDF を作成するには、pTeXLive2009 以上の環境が必要です。EPUB を作成するには、zip コマンドが必要です (MathML も使いたいときには、[[http://www.hinet.mydns.jp/?mathml.rb]] の MathML ライブラリも必要です)。
175
+ PDF を作成するには、pTeXLive2009 以上の環境が必要です。EPUB を作成するには、zip コマンドが必要です (MathML も使いたいときには、 {MathML ライブラリ}[http://www.hinet.mydns.jp/?mathml.rb]も必要です)。
176
176
 
177
- いずれのコマンドも、必要な設定情報を記した YAML ファイルを引数に指定して実行します。YAML ファイルのサンプルは、sample.yaml (オンラインでは[[https://github.com/kmuto/review/blob/master/doc/sample.yaml]]) としてこのドキュメントと同じディレクトリに収録しています。
177
+ いずれのコマンドも、必要な設定情報を記した YAML ファイルを引数に指定して実行します。YAML ファイルのサンプルは、 {sample.yaml}[https://github.com/kmuto/review/blob/master/doc/sample.yaml] としてこのドキュメントと同じディレクトリに収録しています。
178
178
 
179
179
  review-pdfmaker YAMLファイル ←PDFの作成
180
180
  review-epubmaker YAMLファイル ←EPUBの作成
@@ -184,5 +184,5 @@ PDF を作成するには、pTeXLive2009 以上の環境が必要です。EPUB
184
184
  ReVIEW は、青木峰郎によって最初に作成されました。武藤健志がこの開発・保守を引き継ぎ、2010年12月時点では、武藤健志、高橋征義、角征典が開発・保守を継続しています。
185
185
 
186
186
  バグ・パッチの報告、開発者用メーリングリストなどについての情報は、
187
- [[https://github.com/kmuto/review/wiki]]
187
+ https://github.com/kmuto/review/wiki
188
188
  を参照してください。
@@ -5,7 +5,7 @@
5
5
  # このファイルはUTF-8エンコーディングで記述してください。
6
6
 
7
7
  # ブック名(ファイル名になるもの。ASCII範囲の文字を使用)
8
- bookname: sample
8
+ bookname: review-sample
9
9
  # 書名
10
10
  booktitle: ReVIEW EPUBサンプル
11
11
  # 著者
@@ -44,15 +44,19 @@ secnolevel: 2
44
44
  epubversion: 2
45
45
  # HTMLのバージョン(現時点では4または5。デフォルトは4。epubversionを3にした場合は自動で5に設定される)
46
46
  htmlversion: 4
47
+ # 表紙を出力するか
48
+ titlepage: true
49
+ # 目次を出力するか
50
+ toc: true
47
51
  # EPUB標準の目次以外に目次を作成するか
48
- # mytoc: nil
52
+ mytoc: null
49
53
  # 奥付を作成するか。デフォルトでは作成されない。trueを指定するとデフォルトの奥付、ファイル名を指定するとそれがcolophon.htmlとしてコピーされる
50
- # colophon: true
54
+ colophon: null
51
55
  # XHTML生成後に実行するプログラム。$1:HTMLの生成されたディレクトリ $2:ReVIEWファイルのあるディレクトリ $3:起動時指定のyamlファイル名
52
56
  # posthook: hook.sh
53
- # EPUBで表紙をコンテンツに含めるか。デフォルト(no)では作成されない。yesにするとiBooks等でも最初に表紙が表示されるようになる
54
- # cover_linear: yes
57
+ # EPUBで表紙をコンテンツに含めるか。デフォルトでは作成されない。yesにするとiBooks等でも最初に表紙が表示されるようになる
58
+ cover_linear: null
55
59
  # review-compileに渡すパラメータ
56
60
  params: --stylesheet=sample.css
57
- # デバッグフラグ。nilでないときには一時ファイルをカレントディレクトリに作成し、削除もしない
58
- # debug: nil
61
+ # デバッグフラグ。nullでないときには一時ファイルをカレントディレクトリに作成し、削除もしない
62
+ debug: null
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = epubmaker.rb -- EPUB production set.
3
3
  #
4
- # Copyright (c) 2010 Kenshi Muto
4
+ # Copyright (c) 2010-2012 Kenshi Muto
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute or modify this program under the terms of
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = epubv2.rb -- EPUB version 2 producer.
3
3
  #
4
- # Copyright (c) 2010 Kenshi Muto and Masayoshi Takahashi
4
+ # Copyright (c) 2010-2012 Kenshi Muto and Masayoshi Takahashi
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute or modify this program under the terms of
@@ -10,6 +10,7 @@
10
10
  #
11
11
 
12
12
  require 'epubmaker/producer'
13
+ require 'cgi'
13
14
 
14
15
  module EPUBMaker
15
16
 
@@ -22,9 +23,7 @@ module EPUBMaker
22
23
 
23
24
  # Return mimetype content.
24
25
  def mimetype
25
- return <<EOT
26
- application/epub+zip
27
- EOT
26
+ return "application/epub+zip"
28
27
  end
29
28
 
30
29
  # Return opf file content.
@@ -37,9 +36,9 @@ EOT
37
36
  %w[title language date type format source description relation coverage subject rights].each do |item|
38
37
  next if @producer.params[item].nil?
39
38
  if @producer.params[item].instance_of?(Array)
40
- s << @producer.params[item].map {|i| %Q[ <dc:#{item}>#{i}</dc:#{item}>\n]}.join
39
+ s << @producer.params[item].map {|i| %Q[ <dc:#{item}>#{CGI.escapeHTML(i.to_s)}</dc:#{item}>\n]}.join
41
40
  else
42
- s << %Q[ <dc:#{item}>#{@producer.params[item]}</dc:#{item}>\n]
41
+ s << %Q[ <dc:#{item}>#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
43
42
  end
44
43
  end
45
44
 
@@ -54,14 +53,14 @@ EOT
54
53
  %w[aut a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-dsr a-edt a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl].each do |role|
55
54
  next if @producer.params[role].nil?
56
55
  @producer.params[role].each do |v|
57
- s << %Q[ <dc:creator opf:role="#{role.sub('a-', '')}">#{v}</dc:creator>\n]
56
+ s << %Q[ <dc:creator opf:role="#{role.sub('a-', '')}">#{CGI.escapeHTML(v)}</dc:creator>\n]
58
57
  end
59
58
  end
60
59
  # contributor
61
60
  %w[adp ann arr art asn aqt aft aui ant bkp clb cmm dsr edt ill lyr mdc mus nrt oth pht prt red rev spn ths trc trl].each do |role|
62
61
  next if @producer.params[role].nil?
63
62
  @producer.params[role].each do |v|
64
- s << %Q[ <dc:contributor opf:role="#{role}">#{v}</dc:contributor>\n]
63
+ s << %Q[ <dc:contributor opf:role="#{role}">#{CGI.escapeHTML(v)}</dc:contributor>\n]
65
64
  if role == "prt"
66
65
  s << %Q[ <dc:publisher>#{v}</dc:publisher>\n]
67
66
  end
@@ -135,15 +134,15 @@ EOT
135
134
  s << <<EOT
136
135
  </head>
137
136
  <docTitle>
138
- <text>#{@producer.params["title"]}</text>
137
+ <text>#{CGI.escapeHTML(@producer.params["title"])}</text>
139
138
  </docTitle>
140
139
  <docAuthor>
141
- <text>#{@producer.params["aut"].nil? ? "" : @producer.params["aut"].join(", ")}</text>
140
+ <text>#{@producer.params["aut"].nil? ? "" : CGI.escapeHTML(@producer.params["aut"].join(", "))}</text>
142
141
  </docAuthor>
143
142
  <navMap>
144
143
  <navPoint id="top" playOrder="1">
145
144
  <navLabel>
146
- <text>#{@producer.params["title"]}</text>
145
+ <text>#{CGI.escapeHTML(@producer.params["title"])}</text>
147
146
  </navLabel>
148
147
  <content src="#{@producer.params["cover"]}"/>
149
148
  </navPoint>
@@ -203,13 +202,13 @@ EOT
203
202
  def cover
204
203
  s = common_header
205
204
  s << <<EOT
206
- <title>#{@producer.params["title"]}</title>
205
+ <title>#{CGI.escapeHTML(@producer.params["title"])}</title>
207
206
  </head>
208
207
  <body>
209
208
  EOT
210
209
  if @producer.params["coverimage"].nil?
211
210
  s << <<EOT
212
- <h1 class="cover-title">#{@producer.params["title"]}</h1>
211
+ <h1 class="cover-title">#{CGI.escapeHTML(@producer.params["title"])}</h1>
213
212
  EOT
214
213
  else
215
214
  file = nil
@@ -222,7 +221,7 @@ EOT
222
221
  raise "coverimage #{@producer.params["coverimage"]} not found. Abort." if file.nil?
223
222
  s << <<EOT
224
223
  <div id="cover-image" class="cover-image">
225
- <img src="#{file}" alt="#{@producer.params["title"]}" class="max"/>
224
+ <img src="#{file}" alt="#{CGI.escapeHTML(@producer.params["title"])}" class="max"/>
226
225
  </div>
227
226
  EOT
228
227
  end
@@ -238,10 +237,10 @@ EOT
238
237
  def titlepage
239
238
  s = common_header
240
239
  s << <<EOT
241
- <title>#{@producer.params["title"]}</title>
240
+ <title>#{CGI.escapeHTML(@producer.params["title"])}</title>
242
241
  </head>
243
242
  <body>
244
- <h1 class="tp-title">#{@producer.params["title"]}</h1>
243
+ <h1 class="tp-title">#{CGI.escapeHTML(@producer.params["title"])}</h1>
245
244
  EOT
246
245
 
247
246
  if @producer.params["aut"]
@@ -250,7 +249,7 @@ EOT
250
249
  <br />
251
250
  <br />
252
251
  </p>
253
- <h2 class="tp-author">#{@producer.params["aut"]}</h2>
252
+ <h2 class="tp-author">#{CGI.escapeHTML(@producer.params["aut"])}</h2>
254
253
  EOT
255
254
  end
256
255
 
@@ -262,7 +261,7 @@ EOT
262
261
  <br />
263
262
  <br />
264
263
  </p>
265
- <h3 class="tp-publisher">#{@producer.params["prt"]}</h3>
264
+ <h3 class="tp-publisher">#{CGI.escapeHTML(@producer.params["prt"])}</h3>
266
265
  EOT
267
266
  end
268
267
 
@@ -281,7 +280,7 @@ EOT
281
280
  </head>
282
281
  <body>
283
282
  <div class="colophon">
284
- <p class="title">#{@producer.params["title"]}</p>
283
+ <p class="title">#{CGI.escapeHTML(@producer.params["title"])}</p>
285
284
  EOT
286
285
 
287
286
  if @producer.params["pubhistory"]
@@ -289,11 +288,11 @@ EOT
289
288
  end
290
289
 
291
290
  s << %Q[ <table class="colophon">\n]
292
- s << %Q[ <tr><th>#{@producer.res.v("c-aut")}</th><td>#{@producer.params["aut"]}</td></tr>\n] if @producer.params["aut"]
293
- s << %Q[ <tr><th>#{@producer.res.v("c-dsr")}</th><td>#{@producer.params["dsr"]}</td></tr>\n] if @producer.params["dsr"]
294
- s << %Q[ <tr><th>#{@producer.res.v("c-ill")}</th><td>#{@producer.params["ill"]}</td></tr>\n] if @producer.params["ill"]
295
- s << %Q[ <tr><th>#{@producer.res.v("c-edt")}</th><td>#{@producer.params["edt"]}</td></tr>\n] if @producer.params["edt"]
296
- s << %Q[ <tr><th>#{@producer.res.v("c-prt")}</th><td>#{@producer.params["prt"]}</td></tr>\n] if @producer.params["prt"]
291
+ s << %Q[ <tr><th>#{@producer.res.v("c-aut")}</th><td>#{CGI.escapeHTML(@producer.params["aut"])}</td></tr>\n] if @producer.params["aut"]
292
+ s << %Q[ <tr><th>#{@producer.res.v("c-dsr")}</th><td>#{CGI.escapeHTML(@producer.params["dsr"])}</td></tr>\n] if @producer.params["dsr"]
293
+ s << %Q[ <tr><th>#{@producer.res.v("c-ill")}</th><td>#{CGI.escapeHTML(@producer.params["ill"])}</td></tr>\n] if @producer.params["ill"]
294
+ s << %Q[ <tr><th>#{@producer.res.v("c-edt")}</th><td>#{CGI.escapeHTML(@producer.params["edt"])}</td></tr>\n] if @producer.params["edt"]
295
+ s << %Q[ <tr><th>#{@producer.res.v("c-prt")}</th><td>#{CGI.escapeHTML(@producer.params["prt"])}</td></tr>\n] if @producer.params["prt"]
297
296
  s << <<EOT
298
297
  </table>
299
298
  </div>
@@ -380,16 +379,16 @@ EOT
380
379
  FileUtils.mkdir_p(File.dirname("#{tmpdir}/OEBPS/#{item.file}")) unless File.exist?(File.dirname("#{tmpdir}/OEBPS/#{item.file}"))
381
380
  FileUtils.cp(fname, "#{tmpdir}/OEBPS/#{item.file}")
382
381
  end
383
-
382
+
384
383
  fork {
385
384
  Dir.chdir(tmpdir) {|d|
386
- exec("zip -0X #{epubfile} mimetype")
385
+ exec("zip", "-0X", "#{epubfile}", "mimetype")
387
386
  }
388
387
  }
389
388
  Process.waitall
390
389
  fork {
391
390
  Dir.chdir(tmpdir) {|d|
392
- exec("zip -Xr9D #{epubfile} META-INF OEBPS")
391
+ exec("zip", "-Xr9D", "#{epubfile}", "META-INF", "OEBPS")
393
392
  }
394
393
  }
395
394
  Process.waitall