review 5.6.0 → 5.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop.yml +31 -0
  3. data/.github/workflows/ruby-tex.yml +5 -1
  4. data/.github/workflows/ruby-win.yml +1 -1
  5. data/.github/workflows/ruby.yml +2 -2
  6. data/.rubocop.yml +13 -2
  7. data/NEWS.ja.md +39 -0
  8. data/NEWS.md +38 -0
  9. data/README.md +1 -1
  10. data/doc/config.yml.sample +11 -0
  11. data/doc/format.ja.md +50 -2
  12. data/doc/format.md +50 -2
  13. data/lib/review/book/base.rb +2 -2
  14. data/lib/review/book/image_finder.rb +29 -14
  15. data/lib/review/book/index.rb +1 -8
  16. data/lib/review/builder.rb +18 -9
  17. data/lib/review/configure.rb +7 -0
  18. data/lib/review/epubmaker/epubcommon.rb +13 -7
  19. data/lib/review/epubmaker/epubv2.rb +0 -5
  20. data/lib/review/epubmaker/epubv3.rb +9 -1
  21. data/lib/review/epubmaker/producer.rb +2 -3
  22. data/lib/review/epubmaker.rb +14 -5
  23. data/lib/review/htmlbuilder.rb +3 -3
  24. data/lib/review/idgxmlbuilder.rb +4 -3
  25. data/lib/review/idgxmlmaker.rb +13 -2
  26. data/lib/review/img_graph.rb +79 -0
  27. data/lib/review/img_math.rb +9 -2
  28. data/lib/review/init.rb +3 -3
  29. data/lib/review/latexbuilder.rb +1 -1
  30. data/lib/review/lineinput.rb +2 -2
  31. data/lib/review/makerhelper.rb +2 -2
  32. data/lib/review/pdfmaker.rb +14 -6
  33. data/lib/review/plaintextbuilder.rb +13 -1
  34. data/lib/review/textmaker.rb +14 -3
  35. data/lib/review/update.rb +3 -7
  36. data/lib/review/version.rb +1 -1
  37. data/lib/review/yamlloader.rb +0 -3
  38. data/review.gemspec +3 -3
  39. data/samples/syntax-book/Gemfile +1 -1
  40. data/samples/syntax-book/ch02.re +6 -0
  41. data/templates/latex/review-jlreq/review-jlreq.cls +14 -0
  42. data/templates/latex/review-jsbook/review-jsbook.cls +14 -0
  43. data/templates/opf/epubv2.opf.erb +2 -0
  44. data/templates/opf/epubv3.opf.erb +2 -0
  45. data/templates/opf/opf_manifest_epubv2.opf.erb +2 -0
  46. data/templates/opf/opf_manifest_epubv3.opf.erb +2 -0
  47. data/templates/opf/opf_tocx_epubv3.opf.erb +2 -0
  48. metadata +22 -136
  49. data/test/assets/black.eps +0 -280
  50. data/test/assets/fit.png +0 -0
  51. data/test/assets/header_listener.html +0 -35
  52. data/test/assets/img_math/img1.png +0 -0
  53. data/test/assets/img_math/img2.png +0 -0
  54. data/test/assets/img_math/img3.png +0 -0
  55. data/test/assets/large.gif +0 -0
  56. data/test/assets/large.jpg +0 -0
  57. data/test/assets/large.png +0 -0
  58. data/test/assets/large.svg +0 -65
  59. data/test/assets/syntax_book_index_detail.txt +0 -60
  60. data/test/assets/test.xml.erb +0 -3
  61. data/test/assets/test_template.tex +0 -189
  62. data/test/assets/test_template_backmatter.tex +0 -200
  63. data/test/book_test_helper.rb +0 -44
  64. data/test/run_test.rb +0 -12
  65. data/test/test_book.rb +0 -588
  66. data/test/test_book_chapter.rb +0 -329
  67. data/test/test_book_part.rb +0 -53
  68. data/test/test_builder.rb +0 -128
  69. data/test/test_catalog.rb +0 -174
  70. data/test/test_catalog_converter_cmd.rb +0 -73
  71. data/test/test_compiler.rb +0 -52
  72. data/test/test_configure.rb +0 -91
  73. data/test/test_converter.rb +0 -21
  74. data/test/test_epub3maker.rb +0 -733
  75. data/test/test_epubmaker.rb +0 -931
  76. data/test/test_epubmaker_cmd.rb +0 -56
  77. data/test/test_extentions_hash.rb +0 -66
  78. data/test/test_helper.rb +0 -62
  79. data/test/test_htmlbuilder.rb +0 -3315
  80. data/test/test_htmltoc.rb +0 -29
  81. data/test/test_htmlutils.rb +0 -43
  82. data/test/test_i18n.rb +0 -300
  83. data/test/test_idgxmlbuilder.rb +0 -1529
  84. data/test/test_idgxmlmaker_cmd.rb +0 -50
  85. data/test/test_image_finder.rb +0 -81
  86. data/test/test_img_math.rb +0 -120
  87. data/test/test_index.rb +0 -287
  88. data/test/test_indexbuilder.rb +0 -52
  89. data/test/test_latexbuilder.rb +0 -2972
  90. data/test/test_latexbuilder_v2.rb +0 -1654
  91. data/test/test_lineinput.rb +0 -104
  92. data/test/test_location.rb +0 -30
  93. data/test/test_logger.rb +0 -33
  94. data/test/test_makerhelper.rb +0 -44
  95. data/test/test_markdownbuilder.rb +0 -371
  96. data/test/test_md2inaobuilder.rb +0 -90
  97. data/test/test_pdfmaker.rb +0 -354
  98. data/test/test_pdfmaker_cmd.rb +0 -130
  99. data/test/test_plaintextbuilder.rb +0 -1214
  100. data/test/test_preprocessor.rb +0 -196
  101. data/test/test_review_ext.rb +0 -30
  102. data/test/test_reviewheaderlistener.rb +0 -49
  103. data/test/test_rstbuilder.rb +0 -619
  104. data/test/test_sec_counter.rb +0 -156
  105. data/test/test_template.rb +0 -33
  106. data/test/test_textmaker_cmd.rb +0 -58
  107. data/test/test_textutils.rb +0 -187
  108. data/test/test_tocprinter.rb +0 -46
  109. data/test/test_topbuilder.rb +0 -1301
  110. data/test/test_update.rb +0 -473
  111. data/test/test_webtocprinter.rb +0 -195
  112. data/test/test_yamlloader.rb +0 -186
  113. data/test/test_zip_exporter.rb +0 -106
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 644d242fdcddb452c2cfd780a13a165ee89f49b11f349b682ad87c47255f8758
4
- data.tar.gz: 77636486441ca626f068bec8f1cabae980bb4832946d98ef6c5bc329bee30b56
3
+ metadata.gz: 368cf93a0b3ae0f5aaecebdef459f759ab45998b9236cfa983294711a4f135b6
4
+ data.tar.gz: 9990d2ed06a889cc951c3db58b47431e8ad414842fb4e6868082e2c33dd73139
5
5
  SHA512:
6
- metadata.gz: 96d2d70825a306d384e832312527e956f23b81832a71fe766b102e6705b5b3dfad50c3cde19b767eaa124e79a6d5096a5cf9ee882ef1335cb96864d3dd4de992
7
- data.tar.gz: 06336e0ca7578002aa195d1a08d4f354da2842fe0eb0812d38825be48c68130d6a78da8df9ae064ba24d138f6f5bb11c9383bf8a3eb9d4ea06f8458c8813be44
6
+ metadata.gz: a78a8e4f75a856c15c492a9ef466efd72cad538a6c3378023b6c0dd83ec268e7a99126b16cb3d2ec158035b9f620380a50b759319131227c403b09b27bd8e8b6
7
+ data.tar.gz: 7f14b429a757435416de52eb8bed9d05925c1694e647c2165b68c46c835fcea9f0f1e4ea7d908219ceceb3edb179bf130ffe2ef811fe58416d00aba6f0d4e068
@@ -0,0 +1,31 @@
1
+ name: Lint by RuboCop
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ build:
11
+
12
+ runs-on: ${{ matrix.os }}
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ ruby: ['2.7', '3.0', '3.1', '3.2']
17
+ os: [ubuntu-latest]
18
+ steps:
19
+ - uses: actions/checkout@v2
20
+ - name: Set up Ruby
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ - name: fix ImageMagick policy.xml on Linux
25
+ if: runner.os == 'Linux'
26
+ run: sudo sed -i 's/none/read|write/g' /etc/ImageMagick-6/policy.xml
27
+ - name: Build and test with Rake
28
+ run: |
29
+ gem install bundler --no-document
30
+ bundle install --retry 3
31
+ bundle exec rubocop -P
@@ -13,7 +13,7 @@ jobs:
13
13
  strategy:
14
14
  fail-fast: false
15
15
  matrix:
16
- ruby: ['2.5', '3.0', '3.1']
16
+ ruby: ['2.7', '3.2']
17
17
  os: [ubuntu-20.04]
18
18
  steps:
19
19
  - uses: actions/checkout@v2
@@ -28,6 +28,10 @@ jobs:
28
28
  - name: fix ImageMagick policy.xml on Linux
29
29
  if: runner.os == 'Linux'
30
30
  run: sudo sed -i 's/none/read|write/g' /etc/ImageMagick-6/policy.xml
31
+ - name: use Node.js 18.x
32
+ uses: actions/setup-node@v3
33
+ with:
34
+ node-version: 18
31
35
  - name: Build and test with Rake
32
36
  run: |
33
37
  gem install bundler --no-document
@@ -13,7 +13,7 @@ jobs:
13
13
  strategy:
14
14
  fail-fast: false
15
15
  matrix:
16
- ruby: [ '3.0', '2.7', '2.6', '2.5', '2.4' ]
16
+ ruby: [ '3.2', '3.1', '3.0', '2.7' ]
17
17
 
18
18
  steps:
19
19
  - uses: actions/checkout@v2
@@ -13,7 +13,7 @@ jobs:
13
13
  strategy:
14
14
  fail-fast: false
15
15
  matrix:
16
- ruby: ['2.4', '2.5', '2.6', '2.7', '3.0', '3.1']
16
+ ruby: ['2.7', '3.0', '3.1', '3.2']
17
17
  os: [ubuntu-latest, macOS-latest]
18
18
  steps:
19
19
  - uses: actions/checkout@v2
@@ -28,4 +28,4 @@ jobs:
28
28
  run: |
29
29
  gem install bundler --no-document
30
30
  bundle install --retry 3
31
- bundle exec rake
31
+ bundle exec rake test
data/.rubocop.yml CHANGED
@@ -5,7 +5,7 @@ AllCops:
5
5
  - tmp/*
6
6
  DisplayCopNames: true
7
7
  NewCops: enable
8
- TargetRubyVersion: 2.5
8
+ TargetRubyVersion: 2.7
9
9
 
10
10
  require:
11
11
  - rubocop-performance
@@ -38,6 +38,9 @@ Performance/StringInclude:
38
38
  Performance/CollectionLiteralInLoop:
39
39
  Enabled: false
40
40
 
41
+ Performance/MapCompact:
42
+ Enabled: false
43
+
41
44
  #### Style
42
45
 
43
46
  Style/AsciiComments:
@@ -109,7 +112,7 @@ Style/LineEndConcatenation:
109
112
  Enabled: false
110
113
 
111
114
  Style/MethodCallWithArgsParentheses:
112
- IgnoredMethods:
115
+ AllowedMethods:
113
116
  - 'require'
114
117
  - 'include'
115
118
  - 'file'
@@ -194,6 +197,9 @@ Style/OptionalBooleanParameter:
194
197
  Style/CombinableLoops:
195
198
  Enabled: false
196
199
 
200
+ Style/FetchEnvVar:
201
+ Enabled: false
202
+
197
203
  ### Layout
198
204
 
199
205
  Layout/BlockAlignment:
@@ -296,3 +302,8 @@ Naming/VariableNumber:
296
302
 
297
303
  Gemspec/RequiredRubyVersion:
298
304
  Enabled: false
305
+
306
+ Gemspec/DevelopmentDependencies:
307
+ EnforcedStyle: gemspec
308
+ Exclude:
309
+ - samples/syntax-book/Gemfile
data/NEWS.ja.md CHANGED
@@ -1,3 +1,42 @@
1
+ # Version 5.8.0
2
+ ## 新機能
3
+ * `//graph` 命令でMermaid記法によるグラフ記述ができるようになりました。外部ツールの用意や設定については`doc/format.ja.md`を参照してください ([#1885])
4
+
5
+ ## バグ修正
6
+ * EPUBMaker: 自動生成される部の内容に`<title>`が入らないのを修正しました ([#1898])
7
+
8
+ ## 機能強化
9
+ * PDFMaker: `@<href>`命令で長いURLを記述したときに、ページをはみ出さずに折り返すようにしました ([#1890])
10
+
11
+ ## コントリビューターのみなさん
12
+ * [@munepi](https://github.com/munepi)
13
+
14
+ [#1885]: https://github.com/kmuto/review/pull/1885
15
+ [#1890]: https://github.com/kmuto/review/issues/1890
16
+ [#1898]: https://github.com/kmuto/review/pull/1898
17
+
18
+ # Version 5.7.0
19
+ ## バグ修正
20
+ * Windows において、`review-init -w` の実行時にバインドアドレスを省略したときにエラーが発生するのを修正しました ([#1824])
21
+ * PDFMaker: `//blankline` でページをまたいだときに、ページの先頭に空行が入るのを抑制しました ([#1872])
22
+ * EPUBMaker: MathJax で数式を表現する際に、`<`, `>`, `&` を変換し、HTML のエラーが出ないようにしました ([#1876], [#1877])
23
+
24
+ ## 非互換の変更
25
+ * 動作検証済みバージョンを Ruby 2.7 以降としました ([#1871])
26
+ * EPUMaker: EPUB の検証ルールに従い、EPUB の目次に表紙へのリンクを含めました ([#1874])
27
+
28
+ ## その他
29
+ * Ruby 3.2 を動作検証テスト対象に含めました ([#1871])
30
+ * RuboCop 1.45.1 の指摘を反映しました ([#1878])
31
+
32
+ [#1824]: https://github.com/kmuto/review/issues/1824
33
+ [#1871]: https://github.com/kmuto/review/pull/1871
34
+ [#1872]: https://github.com/kmuto/review/issues/1872
35
+ [#1874]: https://github.com/kmuto/review/issues/1874
36
+ [#1876]: https://github.com/kmuto/review/pull/1876
37
+ [#1877]: https://github.com/kmuto/review/pull/1877
38
+ [#1878]: https://github.com/kmuto/review/pull/1878
39
+
1
40
  # Version 5.6.0
2
41
  ## 新機能
3
42
  * IDGXMLBuilder: `//texequation` と `@<m>` で `imgmath` math_formatに対応しました ([#1829])
data/NEWS.md CHANGED
@@ -1,3 +1,41 @@
1
+ # Version 5.8.0
2
+ ## New Features
3
+ * The `//graph` operator allows graphical description in Mermaid notation. See `doc/format.md` for details on prepairing and setting up external tools ([#1885])
4
+
5
+ ## Bug Fixes
6
+ * EPUBMaker: fix `<title>` not being included in the auto-generated part content ([#1898])
7
+
8
+ ## Enhancements
9
+ * PDFMaker: fix to wrap long URLs with `@<href>` operator ([#1890])
10
+
11
+ ## Contributors
12
+ * [@munepi](https://github.com/munepi)
13
+
14
+ [#1885]: https://github.com/kmuto/review/pull/1885
15
+ [#1890]: https://github.com/kmuto/review/issues/1890
16
+ [#1898]: https://github.com/kmuto/review/pull/1898
17
+
18
+ # Version 5.7.0
19
+ ## Bug Fixes
20
+ * Fixed error when omitting a bind address of `review-init -w` on Windows ([#1824])
21
+ * EPUBMaker: escape `<`, `>`, and `&` when converting to MathJax to avoid HTML errors ([#1876], [#1877])
22
+
23
+ ## Breaking Changes
24
+ * Ruby 2.6 or earlier was excluded from the operation verification ([#1871])
25
+ * EPUMaker: included a link to the cover in the table of contents according to EPUB validation rules ([#1874])
26
+
27
+ ## Others
28
+ * Ruby 3.2 is now included in the testing target ([#1871])
29
+ * refactor code with RuboCop 1.45.1 ([#1878])
30
+
31
+ [#1824]: https://github.com/kmuto/review/issues/1824
32
+ [#1871]: https://github.com/kmuto/review/pull/1871
33
+ [#1872]: https://github.com/kmuto/review/issues/1872
34
+ [#1874]: https://github.com/kmuto/review/issues/1874
35
+ [#1876]: https://github.com/kmuto/review/pull/1876
36
+ [#1877]: https://github.com/kmuto/review/pull/1877
37
+ [#1878]: https://github.com/kmuto/review/pull/1878
38
+
1
39
  # Version 5.6.0
2
40
  ## New Features
3
41
  * IDGXMLBuilder: support `imgmath` math_format in `//texequation` and `@<m>` ([#1829])
data/README.md CHANGED
@@ -117,4 +117,4 @@ Exception:
117
117
 
118
118
  ## Copyright
119
119
 
120
- Copyright (c) 2006-2022 Minero Aoki, Kenshi Muto, Masayoshi Takahashi, Masanori Kado.
120
+ Copyright (c) 2006-2023 Minero Aoki, Kenshi Muto, Masayoshi Takahashi, Masanori Kado.
@@ -262,6 +262,17 @@ toc: true
262
262
  # 追加する<meta>要素のプロパティとその値
263
263
  # opf_meta: {"ebpaj:guide-version": "1.1.3"}
264
264
 
265
+ # Playwrightの利用オプション
266
+ # playwright_options:
267
+ # playwrightコマンドのパス
268
+ # playwright_path: "./node_modules/.bin/playwright"
269
+ # playwright-runnerの切り取りを使う。pdfcropを使う場合はfalseにする
270
+ # selfcrop: true
271
+ # pdfcropコマンドのパス
272
+ # pdfcrop_path: "pdfcrop"
273
+ # pdftocairoコマンドのパス
274
+ # pdftocairo_path: "pdftocairo"
275
+
265
276
  # 以下のパラメータを有効にするときには、
266
277
  # epubmaker:
267
278
  # パラメータ: 値
data/doc/format.ja.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Re:VIEW フォーマットの文法について解説します。Re:VIEW フォーマットはアスキー社(現カドカワ)の EWB を基本としながら、一部に RD や各種 Wiki の文法を取り入れて簡素化しています。
4
4
 
5
- このドキュメントは、Re:VIEW 5.5 に基づいています。
5
+ このドキュメントは、Re:VIEW 5.8 に基づいています。
6
6
 
7
7
  ## 段落
8
8
 
@@ -407,13 +407,61 @@ plot sin(x)
407
407
  //}
408
408
  ```
409
409
 
410
- コマンド名には、「`graphviz`」「`gnuplot`」「`blockdiag`」「`aafigure`」「`plantuml`」のいずれかを指定できます。ツールはそれぞれ別途インストールし、インストール先のフォルダ名を指定することなく実行できる (パスを通す) 必要があります。
410
+ コマンド名には、「`graphviz`」「`gnuplot`」「`blockdiag`」「`aafigure`」「`plantuml`」「`mermaid`」のいずれかを指定できます。ツールはそれぞれ別途インストールし、インストール先のフォルダ名を指定することなく実行できる (パスを通す) 必要があります。
411
411
 
412
412
  * Graphviz ( https://www.graphviz.org/ ) : `dot` コマンドへのパスを OS に設定すること
413
413
  * Gnuplot ( http://www.gnuplot.info/ ) : `gnuplot` コマンドへのパスを OS に設定すること
414
414
  * Blockdiag ( http://blockdiag.com/ ) : `blockdiag` コマンドへのパスを OS に設定すること。PDF を生成する場合は ReportLab もインストールすること
415
415
  * aafigure ( https://launchpad.net/aafigure ) : `aafigure` コマンドへのパスを OS に設定すること
416
416
  * PlantUML ( http://plantuml.com/ ) : `java` コマンドへのパスを OS に設定し、`plantuml.jar` が作業フォルダ、または `/usr/share/plantuml` あるいは `/usr/share/java` フォルダにあること
417
+ * Mermaid ( https://mermaid.js.org/ ) : 以下を参照
418
+
419
+ ### Mermaid の利用
420
+
421
+ Mermaid は Web ブラウザ上で動作する JavaScript ベースの図形描画ツールです。EPUB や LaTeX 経由の PDF で利用するには、Web ブラウザを内部的に呼び出して画像化する必要があります。現時点で、Linux 以外の動作は確認していません。
422
+
423
+ 1. プロジェクトに次のように `package.json` を作成します(既存のファイルがあるときには、`dependencies` に `"playwright"〜` の行を追加します)。
424
+ ```
425
+ {
426
+ "name": "book",
427
+ "dependencies": {
428
+ "playwright": "^1.32.2"
429
+ }
430
+ }
431
+ ```
432
+ 2. Playwright ライブラリをインストールします。`npm` がない場合は、[Node.js](https://nodejs.org/) の環境をセットアップしてください。
433
+ ```
434
+ npm install
435
+ ```
436
+ 3. Playwright ライブラリを Ruby から呼び出すモジュールである [playwright-runner](https://github.com/kmuto/playwright-runner) をインストールします。
437
+ ```
438
+ gem install playwright-runner
439
+ ```
440
+ 4. (オプション) EPUB には SVG 形式を作成する必要がありますが、SVG に変換するには、[poppler](https://gitlab.freedesktop.org/poppler/poppler) に含まれる `pdftocairo` コマンドが必要です。Debian およびその派生物では以下のようにしてインストールできます。
441
+ ```
442
+ apt install poppler-utils
443
+ ```
444
+ 5. (オプション) デフォルトでは図の周囲に大きめの余白ができてしまいます。これを詰めるには、TeXLive に含まれる `pdfcrop` コマンドが必要です。Debian およびその派生物では以下のようにしてインストールできます。
445
+ ```
446
+ apt install texlive-extra-utils
447
+ ```
448
+
449
+ プロジェクトの `config.yml` を適宜調整します。デフォルト値は以下のとおりです。
450
+
451
+ ```
452
+ playwright_options:
453
+ playwright_path: "./node_modules/.bin/playwright"
454
+ selfcrop: true
455
+ pdfcrop_path: "pdfcrop"
456
+ pdftocairo_path: "pdftocairo"
457
+ ```
458
+
459
+ - `playwright_path`: `playwright` コマンドのパスを相対パスまたは絶対パスで指定する
460
+ - `selfcrop`: `playwright-runner` の画像切り出しを使う。`pdfcrop` が不要になるが、周囲に余白が生じる。`pdfcrop` を使うときには `false` に設定する
461
+ - `pdfcrop_path`: `pdfcrop` コマンドのパス。`selfcrop` が `true` のときには無視される
462
+ - `pdftocairo_path`: `pdftocairo` コマンドのパス
463
+
464
+ Re:VIEW 側の記法としては `//graph[ID][mermaid][キャプション]` または `//graph[ID][mermaid]` となりますが、この ID に基づき、`images/html/ID.svg`(EPUB の場合)や `images/latex/ID.pdf`(LaTeX PDF の場合)が生成されます。
417
465
 
418
466
  ## 表
419
467
 
data/doc/format.md CHANGED
@@ -4,7 +4,7 @@ The document is a brief guide for Re:VIEW markup syntax.
4
4
 
5
5
  Re:VIEW is based on EWB of ASCII (now KADOKAWA), influenced RD and other Wiki system's syntax.
6
6
 
7
- This document explains about the format of Re:VIEW 5.5.
7
+ This document explains about the format of Re:VIEW 5.8.
8
8
 
9
9
  ## Paragraph
10
10
 
@@ -425,7 +425,7 @@ plot sin(x)
425
425
  //}
426
426
  ```
427
427
 
428
- You can use `graphviz`, `gnuplot`, `blockdiag`, `aafigure`, and `plantuml` as the command name.
428
+ You can use `graphviz`, `gnuplot`, `blockdiag`, `aafigure`, `plantuml`, and `mermaid` as the command name.
429
429
  Before using these tools, you should installed them and configured path appropriately.
430
430
 
431
431
  * Graphviz ( https://www.graphviz.org/ ) : set path to `dot` command
@@ -433,6 +433,54 @@ Before using these tools, you should installed them and configured path appropri
433
433
  * Blockdiag ( http://blockdiag.com/ ) : set path to `blockdiag` command. Install ReportLab also to make a PDF
434
434
  * aafigure ( https://launchpad.net/aafigure ) : set path to `aafigure` command
435
435
  * PlantUML ( http://plantuml.com/ ) : set path to `java` command. place `plantuml.jar` on working folder, `/usr/share/plantuml` or `/usr/share/java`.
436
+ * Mermaid ( https://mermaid.js.org/ ) : see below
437
+
438
+ ### using Mermaid
439
+
440
+ Mermaid is a JavaScript-based diagram tool that runs in a Web browser. For use with EPUB or LaTeX PDF, Re:VIEW calls the Web browser internally to create images. At this time, we have not confirmed that Mermaid works on any platforms other than Linux.
441
+
442
+ 1. Create `package.json` in your project (if you have an existing file, add the line `"playwright"...` to the `dependencies`).
443
+ ```
444
+ {
445
+ "name": "book",
446
+ "dependencies": {
447
+ "playwright": "^1.32.2"
448
+ }
449
+ }
450
+ ```
451
+ 2. Install Playwright library. If you don't have `npm`, set up [Node.js](https://nodejs.org/) first.
452
+ ```
453
+ npm install
454
+ ```
455
+ 3. Install [playwright-runner](https://github.com/kmuto/playwright-runner), a module that calls the Playwright library from Ruby.
456
+ ```
457
+ gem install playwright-runner
458
+ ```
459
+ 4. (Optional) Since EPUB cannot handle PDF, the images must be in SVG format; to convert them to SVG, you need the `pdftocairo` command included in [poppler](https://gitlab.freedesktop.org/poppler/poppler). It can be installed in Debian and its derivatives as follows:
460
+ ```
461
+ apt install poppler-utils
462
+ ```
463
+ 5. (Optional )By default, there will be white margins around the figure. To crop them, you need the `pdfcrop` command included in TeXLive, which can be installed in Debian and its derivatives as follows:
464
+ ```
465
+ apt install texlive-extra-utils
466
+ ```
467
+
468
+ Adjust `config.yml`. The default values are as follows:
469
+
470
+ ```
471
+ playwright_options:
472
+ playwright_path: "./node_modules/.bin/playwright"
473
+ selfcrop: true
474
+ pdfcrop_path: "pdfcrop"
475
+ pdftocairo_path: "pdftocairo"
476
+ ```
477
+
478
+ - `playwright_path`: path of the `playwright` command.
479
+ - `selfcrop`: use the default cropper of `playwright-runner`. The `pdfcrop` will not be needed, but there will be margins around it. Set to `false` if you can use `pdfcrop`.
480
+ - `pdfcrop_path`: path of the `pdfcrop` command. Ignored if `selfcrop` is `true`.
481
+ - `pdftocairo_path`: path of the `pdftocairo` command.
482
+
483
+ The notation in Re:VIEW is `//graph[ID][mermaid][caption]` or `//graph[ID][mermaid]`. Based on this ID, `images/html/ID.svg` (for EPUB) or `images/latex/ID.pdf` (for LaTeX PDF) will be generated.
436
484
 
437
485
  ## Tables
438
486
 
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2009-2022 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
2
+ # Copyright (c) 2009-2023 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
3
3
  # 2002-2008 Minero Aoki
4
4
  #
5
5
  # This program is free software.
@@ -73,7 +73,7 @@ module ReVIEW
73
73
  end
74
74
 
75
75
  def imagedir
76
- File.join(@basedir, config['imagedir'])
76
+ config['imagedir']
77
77
  end
78
78
 
79
79
  def image_types
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2014-2018 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
2
+ # Copyright (c) 2014-2023 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
3
3
  #
4
4
  # This program is free software.
5
5
  # You can distribute or modify this program under the terms of
@@ -13,35 +13,50 @@ require 'review/exception'
13
13
  module ReVIEW
14
14
  module Book
15
15
  class ImageFinder
16
- def initialize(basedir, chapid, builder, exts)
17
- @basedir = basedir
18
- @chapid = chapid
19
- @builder = builder
20
- @exts = exts
21
- @entries = dir_entries
16
+ def initialize(chapter)
17
+ @book = chapter.book
18
+ @basedir = @book.imagedir
19
+ @chapid = chapter.id
20
+ @builder = @book.config['builder']
21
+ @entries = dir_entries.map { |path| entry_object(path) }
22
+ end
23
+
24
+ def entry_object(path)
25
+ { path: path, basename: path.sub(/\.[^.]+$/, ''), downcase: path.sub(/\.[^.]+$/, $&.downcase) }
22
26
  end
23
27
 
24
28
  def dir_entries
25
- Dir.glob(File.join(@basedir, '**{,/*/**}/*.*')).uniq.sort
29
+ Dir.glob(File.join(@basedir, '**{,/*/**}/*.*')).uniq.sort.map { |entry| entry.sub(%r{^\./}, '') }
26
30
  end
27
31
 
28
32
  def add_entry(path)
29
- @entries << path unless @entries.include?(path)
33
+ path.sub!(%r{^\./}, '')
34
+ unless @entries.find { |entry| entry[:path] == path }
35
+ @entries << entry_object(path)
36
+ end
30
37
  @entries
31
38
  end
32
39
 
33
40
  def find_path(id)
34
41
  targets = target_list(id)
35
42
  targets.each do |target|
36
- @exts.each do |ext|
37
- @entries.find do |entry|
38
- downname = entry.sub(/\.[^.]+$/, File.extname(entry).downcase)
39
- if downname == "#{target}#{ext}"
40
- return entry
43
+ @book.image_types.each do |ext|
44
+ entries = @entries.select do |entry|
45
+ entry[:basename] == target
46
+ end
47
+
48
+ unless entries
49
+ break
50
+ end
51
+
52
+ entries.find do |entry|
53
+ if entry[:downcase] == "#{target}#{ext}"
54
+ return entry[:path]
41
55
  end
42
56
  end
43
57
  end
44
58
  end
59
+
45
60
  nil
46
61
  end
47
62
 
@@ -138,14 +138,7 @@ module ReVIEW
138
138
  def initialize(chapter)
139
139
  super()
140
140
  @chapter = chapter
141
- book = @chapter.book
142
-
143
- chapid = chapter.id
144
- basedir = book.imagedir
145
- builder = book.config['builder']
146
- types = book.image_types
147
-
148
- @image_finder = ReVIEW::Book::ImageFinder.new(basedir, chapid, builder, types)
141
+ @image_finder = ReVIEW::Book::ImageFinder.new(@chapter)
149
142
  end
150
143
 
151
144
  def find_path(id)
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2002-2022 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2002-2023 Minero Aoki, Kenshi Muto
2
2
  #
3
3
  # This program is free software.
4
4
  # You can distribute or modify this program under the terms of
@@ -11,6 +11,7 @@ require 'review/textutils'
11
11
  require 'review/compiler'
12
12
  require 'review/sec_counter'
13
13
  require 'review/img_math'
14
+ require 'review/img_graph'
14
15
  require 'review/loggable'
15
16
  require 'stringio'
16
17
  require 'fileutils'
@@ -35,13 +36,14 @@ module ReVIEW
35
36
  attr_accessor :doc_status
36
37
  attr_reader :location
37
38
 
38
- def initialize(strict = false, *_args, img_math: nil)
39
+ def initialize(strict = false, *_args, img_math: nil, img_graph: nil)
39
40
  @strict = strict
40
41
  @output = nil
41
42
  @logger = ReVIEW.logger
42
43
  @doc_status = {}
43
44
  @dictionary = {}
44
45
  @img_math = img_math
46
+ @img_graph = img_graph
45
47
  @shown_endnotes = true
46
48
  end
47
49
 
@@ -61,6 +63,7 @@ module ReVIEW
61
63
  @tsize = nil
62
64
  if @book && @book.config
63
65
  @img_math ||= ReVIEW::ImgMath.new(@book.config)
66
+ @img_graph ||= ReVIEW::ImgGraph.new(@book.config, target_name)
64
67
  if words_file_path = @book.config['words_file']
65
68
  words_files = if words_file_path.is_a?(String)
66
69
  [words_file_path]
@@ -234,7 +237,8 @@ module ReVIEW
234
237
  sepidx = nil
235
238
  rows = []
236
239
  lines.each_with_index do |line, idx|
237
- if /\A[=\-]{12}/ =~ line || /\A[={\-}]{12}/ =~ line
240
+ # {} is for LaTeX
241
+ if /\A[=-]{12}/ =~ line || /\A[={}-]{12}/ =~ line
238
242
  sepidx ||= idx
239
243
  next
240
244
  end
@@ -512,12 +516,7 @@ module ReVIEW
512
516
  end
513
517
 
514
518
  def inline_wb(s)
515
- translated = @dictionary[s]
516
- if translated
517
- inline_b(translated)
518
- else
519
- inline_b("[missing word: #{s}]")
520
- end
519
+ inline_b(@dictionary[s] || "[missing word: #{s}]")
521
520
  end
522
521
 
523
522
  def raw(str)
@@ -703,6 +702,16 @@ EOTGNUPLOT
703
702
  file_path
704
703
  end
705
704
 
705
+ def graph_mermaid(id, _file_path, _line, tf_path)
706
+ begin
707
+ require 'playwrightrunner'
708
+ rescue LoadError
709
+ app_error "#{@location}: could not handle Mermaid of //graph in this builder."
710
+ end
711
+
712
+ @img_graph.defer_mermaid_image(File.read(tf_path), id)
713
+ end
714
+
706
715
  def image_ext
707
716
  raise NotImplementedError
708
717
  end
@@ -68,6 +68,13 @@ module ReVIEW
68
68
  'externallink' => true,
69
69
  'join_lines_by_lang' => nil, # experimental. default should be nil
70
70
  'table_row_separator' => 'tabs',
71
+ # for Playwright
72
+ 'playwright_options' => {
73
+ 'playwright_path' => './node_modules/.bin/playwright',
74
+ 'selfcrop' => true,
75
+ 'pdfcrop_path' => 'pdfcrop',
76
+ 'pdftocairo_path' => 'pdftocairo'
77
+ },
71
78
  # for IDGXML
72
79
  'tableopt' => nil,
73
80
  'listinfo' => nil,
@@ -1,6 +1,6 @@
1
1
  # = epubcommon.rb -- super class for EPUBv2 and EPUBv3
2
2
  #
3
- # Copyright (c) 2010-2022 Kenshi Muto and Masayoshi Takahashi
3
+ # Copyright (c) 2010-2023 Kenshi Muto and Masayoshi Takahashi
4
4
  #
5
5
  # This program is free software.
6
6
  # You can distribute or modify this program under the terms of
@@ -231,6 +231,10 @@ module ReVIEW
231
231
  ReVIEW::Template.generate(path: template_name, binding: binding)
232
232
  end
233
233
 
234
+ def coveritem
235
+ []
236
+ end
237
+
234
238
  def hierarchy_ncx(type)
235
239
  require 'rexml/document'
236
240
  level = 1
@@ -264,7 +268,7 @@ module ReVIEW
264
268
  doc.context[:attribute_quote] = :quote
265
269
 
266
270
  e = doc.root.elements[1] # first <li/>
267
- contents.each do |item|
271
+ (coveritem + contents).each do |item|
268
272
  next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > toclevel
269
273
 
270
274
  if item.level == level
@@ -304,7 +308,7 @@ module ReVIEW
304
308
 
305
309
  def flat_ncx(type, indent = nil)
306
310
  s = %Q(<#{type} class="toc-h1">\n)
307
- contents.each do |item|
311
+ (coveritem + contents).each do |item|
308
312
  next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > config['toclevel'].to_i
309
313
 
310
314
  is = indent == true ? ' ' * item.level : ''
@@ -324,10 +328,12 @@ module ReVIEW
324
328
  FileUtils.mkdir_p("#{tmpdir}/OEBPS")
325
329
  File.write(File.join(tmpdir, opf_path), opf)
326
330
 
327
- if File.exist?("#{basedir}/#{config['cover']}")
328
- FileUtils.cp("#{basedir}/#{config['cover']}", "#{tmpdir}/OEBPS")
329
- else
330
- File.write("#{tmpdir}/OEBPS/#{config['cover']}", cover)
331
+ if config['cover']
332
+ if File.exist?("#{basedir}/#{config['cover']}")
333
+ FileUtils.cp("#{basedir}/#{config['cover']}", "#{tmpdir}/OEBPS")
334
+ else
335
+ File.write("#{tmpdir}/OEBPS/#{config['cover']}", cover)
336
+ end
331
337
  end
332
338
 
333
339
  if config['colophon'] && !config['colophon'].is_a?(String)
@@ -22,11 +22,6 @@ module ReVIEW
22
22
  CREATOR_ATTRIBUTES = %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]
23
23
  CONTRIBUTER_ATTRIBUTES = %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]
24
24
 
25
- # Construct object with parameter hash +config+ and message resource hash +res+.
26
- def initialize(producer) # rubocop:disable Lint/UselessMethodDefinition
27
- super
28
- end
29
-
30
25
  # Return opf file content.
31
26
  def opf
32
27
  @opf_metainfo = opf_metainfo