review 5.1.1 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-tex.yml +6 -2
  3. data/.github/workflows/ruby-win.yml +6 -2
  4. data/.github/workflows/ruby.yml +6 -2
  5. data/.rubocop.yml +5 -319
  6. data/NEWS.ja.md +149 -0
  7. data/NEWS.md +149 -1
  8. data/README.md +9 -8
  9. data/bin/review +1 -1
  10. data/bin/review-catalog-converter +15 -15
  11. data/bin/review-check +7 -7
  12. data/bin/review-compile +14 -23
  13. data/bin/review-index +1 -1
  14. data/bin/review-preproc +29 -35
  15. data/bin/review-validate +2 -2
  16. data/doc/config.yml.sample +9 -1
  17. data/doc/config.yml.sample-simple +1 -1
  18. data/doc/format.ja.md +29 -3
  19. data/doc/format.md +32 -3
  20. data/doc/writing_vertical.ja.md +6 -0
  21. data/lib/review/book/base.rb +3 -3
  22. data/lib/review/book/book_unit.rb +13 -3
  23. data/lib/review/book/chapter.rb +1 -1
  24. data/lib/review/book/index.rb +7 -4
  25. data/lib/review/book/part.rb +12 -13
  26. data/lib/review/book/volume.rb +1 -1
  27. data/lib/review/builder.rb +92 -65
  28. data/lib/review/catalog.rb +6 -5
  29. data/lib/review/compiler.rb +76 -57
  30. data/lib/review/configure.rb +5 -2
  31. data/lib/review/epub2html.rb +12 -12
  32. data/lib/review/epubmaker/content.rb +1 -1
  33. data/lib/review/epubmaker/epubcommon.rb +47 -45
  34. data/lib/review/epubmaker/epubv2.rb +2 -1
  35. data/lib/review/epubmaker/epubv3.rb +5 -4
  36. data/lib/review/epubmaker/producer.rb +6 -7
  37. data/lib/review/epubmaker/reviewheaderlistener.rb +1 -1
  38. data/lib/review/epubmaker.rb +56 -67
  39. data/lib/review/exception.rb +7 -0
  40. data/lib/review/extentions/string.rb +1 -1
  41. data/lib/review/htmlbuilder.rb +90 -34
  42. data/lib/review/htmlutils.rb +17 -17
  43. data/lib/review/i18n.rb +3 -3
  44. data/lib/review/i18n.yml +6 -0
  45. data/lib/review/idgxmlbuilder.rb +61 -39
  46. data/lib/review/idgxmlmaker.rb +27 -26
  47. data/lib/review/img_math.rb +12 -18
  48. data/lib/review/index_builder.rb +94 -53
  49. data/lib/review/init.rb +4 -4
  50. data/lib/review/latexbuilder.rb +84 -76
  51. data/lib/review/lineinput.rb +3 -3
  52. data/lib/review/location.rb +1 -1
  53. data/lib/review/loggable.rb +27 -0
  54. data/lib/review/logger.rb +69 -21
  55. data/lib/review/makerhelper.rb +8 -4
  56. data/lib/review/markdownbuilder.rb +21 -12
  57. data/lib/review/pdfmaker.rb +63 -42
  58. data/lib/review/plaintextbuilder.rb +16 -15
  59. data/lib/review/preprocessor/directive.rb +35 -0
  60. data/lib/review/preprocessor/line.rb +34 -0
  61. data/lib/review/preprocessor/repository.rb +177 -0
  62. data/lib/review/preprocessor.rb +94 -296
  63. data/lib/review/rstbuilder.rb +12 -3
  64. data/lib/review/template.rb +5 -1
  65. data/lib/review/textmaker.rb +32 -31
  66. data/lib/review/textutils.rb +5 -6
  67. data/lib/review/tocprinter.rb +12 -7
  68. data/lib/review/topbuilder.rb +96 -19
  69. data/lib/review/update.rb +16 -8
  70. data/lib/review/version.rb +1 -1
  71. data/lib/review/volumeprinter.rb +9 -9
  72. data/lib/review/webmaker.rb +45 -46
  73. data/lib/review/webtocprinter.rb +10 -10
  74. data/lib/review/yamlloader.rb +35 -2
  75. data/review.gemspec +2 -1
  76. data/samples/sample-book/src/config.yml +0 -1
  77. data/samples/sample-book/src/lib/tasks/review.rake +3 -1
  78. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +2 -1
  79. data/samples/syntax-book/ch02.re +9 -0
  80. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +2 -1
  81. data/templates/html/_titlepage.html.erb +9 -17
  82. data/templates/latex/config.erb +3 -0
  83. data/templates/latex/review-jlreq/review-base.sty +4 -5
  84. data/templates/latex/review-jlreq/review-jlreq.cls +39 -5
  85. data/templates/latex/review-jsbook/review-base.sty +9 -3
  86. data/templates/latex/review-jsbook/review-jsbook.cls +32 -5
  87. data/templates/opf/opf_manifest_epubv2.opf.erb +1 -1
  88. data/templates/opf/opf_manifest_epubv3.opf.erb +1 -1
  89. data/test/assets/syntax_book_index_detail.txt +10 -8
  90. data/test/assets/test_template.tex +4 -1
  91. data/test/assets/test_template_backmatter.tex +4 -1
  92. data/test/book_test_helper.rb +10 -10
  93. data/test/test_book_chapter.rb +25 -2
  94. data/test/test_builder.rb +10 -8
  95. data/test/test_epub3maker.rb +3 -3
  96. data/test/test_epubmaker.rb +27 -37
  97. data/test/test_epubmaker_cmd.rb +14 -3
  98. data/test/test_htmlbuilder.rb +111 -31
  99. data/test/test_idgxmlbuilder.rb +41 -33
  100. data/test/test_idgxmlmaker_cmd.rb +1 -1
  101. data/test/test_img_math.rb +11 -2
  102. data/test/test_index.rb +30 -4
  103. data/test/test_latexbuilder.rb +46 -25
  104. data/test/test_latexbuilder_v2.rb +18 -10
  105. data/test/test_markdownbuilder.rb +13 -0
  106. data/test/test_pdfmaker.rb +19 -0
  107. data/test/test_pdfmaker_cmd.rb +10 -10
  108. data/test/test_plaintextbuilder.rb +46 -22
  109. data/test/test_preprocessor.rb +188 -1
  110. data/test/test_rstbuilder.rb +13 -0
  111. data/test/test_textmaker_cmd.rb +1 -1
  112. data/test/test_topbuilder.rb +195 -29
  113. data/test/test_yamlloader.rb +28 -42
  114. metadata +11 -6
@@ -28,6 +28,7 @@ module ReVIEW
28
28
  end
29
29
 
30
30
  def builder_init_file
31
+ super
31
32
  @chapter.book.image_types = %w[.ai .eps .pdf .tif .tiff .png .bmp .jpg .jpeg .gif]
32
33
  @blank_needed = false
33
34
  @latex_tsize = nil
@@ -35,7 +36,6 @@ module ReVIEW
35
36
  @cellwidth = nil
36
37
  @ol_num = nil
37
38
  @first_line_num = nil
38
- @sec_counter = SecCounter.new(5, @chapter)
39
39
  @foottext = {}
40
40
  setup_index
41
41
  initialize_metachars(@book.config['texcommand'])
@@ -61,7 +61,7 @@ module ReVIEW
61
61
  require 'nkf'
62
62
  @index_mecab = MeCab::Tagger.new(@book.config['pdfmaker']['makeindex_mecab_opts'])
63
63
  rescue LoadError
64
- warn 'not found MeCab'
64
+ warn 'not found MeCab', location: location
65
65
  end
66
66
  end
67
67
 
@@ -98,6 +98,8 @@ module ReVIEW
98
98
  private :puts
99
99
 
100
100
  def result
101
+ check_printendnotes
102
+
101
103
  if @chapter.is_a?(ReVIEW::Book::Part) && !@book.config.check_version('2', exception: false)
102
104
  puts '\end{reviewpart}'
103
105
  end
@@ -155,8 +157,8 @@ module ReVIEW
155
157
  puts macro('label', sec_label(anchor))
156
158
  puts macro('label', label) if label
157
159
  end
158
- rescue
159
- error "unknown level: #{level}"
160
+ rescue StandardError
161
+ app_error "unknown level: #{level}"
160
162
  end
161
163
 
162
164
  def nonum_begin(level, _label, caption)
@@ -197,12 +199,11 @@ module ReVIEW
197
199
  blank
198
200
  @doc_status[:column] = true
199
201
 
200
- target = nil
201
- if label
202
- target = "\\hypertarget{#{column_label(label)}}{}"
203
- else
204
- target = "\\hypertarget{#{column_label(caption)}}{}"
205
- end
202
+ target = if label
203
+ "\\hypertarget{#{column_label(label)}}{}"
204
+ else
205
+ "\\hypertarget{#{column_label(caption)}}{}"
206
+ end
206
207
 
207
208
  @doc_status[:caption] = true
208
209
  if @book.config.check_version('2', exception: false)
@@ -474,13 +475,13 @@ module ReVIEW
474
475
  captionstr = macro(command + 'caption', compile_inline(caption))
475
476
  else
476
477
  begin
477
- if get_chap.nil?
478
- captionstr = macro('reviewlistcaption', "#{I18n.t('list')}#{I18n.t('format_number_header_without_chapter', [@chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
479
- else
480
- captionstr = macro('reviewlistcaption', "#{I18n.t('list')}#{I18n.t('format_number_header', [get_chap, @chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
481
- end
478
+ captionstr = if get_chap.nil?
479
+ macro('reviewlistcaption', "#{I18n.t('list')}#{I18n.t('format_number_header_without_chapter', [@chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
480
+ else
481
+ macro('reviewlistcaption', "#{I18n.t('list')}#{I18n.t('format_number_header', [get_chap, @chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
482
+ end
482
483
  rescue KeyError
483
- error "no such list: #{id}"
484
+ app_error "no such list: #{id}"
484
485
  end
485
486
  end
486
487
  end
@@ -576,13 +577,12 @@ module ReVIEW
576
577
  end
577
578
 
578
579
  def image_image(id, caption = '', metric = nil)
579
- captionstr = nil
580
580
  @doc_status[:caption] = true
581
- if @book.config.check_version('2', exception: false)
582
- captionstr = macro('caption', compile_inline(caption)) + "\n"
583
- else
584
- captionstr = macro('reviewimagecaption', compile_inline(caption)) + "\n"
585
- end
581
+ captionstr = if @book.config.check_version('2', exception: false)
582
+ macro('caption', compile_inline(caption)) + "\n"
583
+ else
584
+ macro('reviewimagecaption', compile_inline(caption)) + "\n"
585
+ end
586
586
  captionstr << macro('label', image_label(id))
587
587
  @doc_status[:caption] = nil
588
588
 
@@ -613,19 +613,19 @@ module ReVIEW
613
613
  end
614
614
 
615
615
  def image_dummy(id, caption, lines)
616
- warn "image not bound: #{id}"
616
+ warn "image not bound: #{id}", location: location
617
617
  puts '\begin{reviewdummyimage}'
618
- # path = @chapter.image(id).path
619
- puts "--[[path = #{id} (#{existence(id)})]]--"
618
+ puts escape("--[[path = #{id} (#{existence(id)})]]--")
620
619
  lines.each do |line|
620
+ puts "\n"
621
621
  puts detab(line.rstrip)
622
622
  end
623
623
  puts macro('label', image_label(id))
624
624
  @doc_status[:caption] = true
625
625
  if @book.config.check_version('2', exception: false)
626
626
  puts macro('caption', compile_inline(caption)) if caption.present?
627
- else
628
- puts macro('reviewimagecaption', compile_inline(caption)) if caption.present?
627
+ elsif caption.present?
628
+ puts macro('reviewimagecaption', compile_inline(caption))
629
629
  end
630
630
  @doc_status[:caption] = nil
631
631
  puts '\end{reviewdummyimage}'
@@ -700,10 +700,11 @@ module ReVIEW
700
700
  puts "\\#{command}[width=\\maxwidth]{#{@chapter.image(id).path}}"
701
701
  end
702
702
  else
703
- warn "image not bound: #{id}"
703
+ warn "image not bound: #{id}", location: location
704
704
  puts '\begin{reviewdummyimage}'
705
- puts "--[[path = #{escape(id)} (#{existence(id)})]]--"
705
+ puts escape("--[[path = #{escape(id)} (#{existence(id)})]]--")
706
706
  lines.each do |line|
707
+ puts "\n"
707
708
  puts detab(line.rstrip)
708
709
  end
709
710
  end
@@ -736,7 +737,7 @@ module ReVIEW
736
737
  table_header(id, caption)
737
738
  end
738
739
  rescue KeyError
739
- error "no such table: #{id}"
740
+ app_error "no such table: #{id}"
740
741
  end
741
742
  table_begin(rows.first.size)
742
743
  table_rows(sepidx, rows)
@@ -802,7 +803,7 @@ module ReVIEW
802
803
  end
803
804
 
804
805
  if @tsize
805
- if @tsize =~ /\A[\d., ]+\Z/
806
+ if /\A[\d., ]+\Z/.match?(@tsize)
806
807
  @cellwidth = @tsize.split(/\s*,\s*/)
807
808
  @cellwidth.collect! { |i| "p{#{i}mm}" }
808
809
  puts macro('begin', 'reviewtable', '|' + @cellwidth.join('|') + '|')
@@ -821,7 +822,7 @@ module ReVIEW
821
822
  ret = []
822
823
  s = ''
823
824
  brace = nil
824
- size.split('').each do |ch|
825
+ size.chars.each do |ch|
825
826
  case ch
826
827
  when '|'
827
828
  next
@@ -834,15 +835,11 @@ module ReVIEW
834
835
  ret << s
835
836
  s = ''
836
837
  else
837
- if brace
838
+ if brace || s.empty?
838
839
  s << ch
839
840
  else
840
- if s.empty?
841
- s << ch
842
- else
843
- ret << s
844
- s = ch
845
- end
841
+ ret << s
842
+ s = ch
846
843
  end
847
844
  end
848
845
  end
@@ -859,7 +856,7 @@ module ReVIEW
859
856
  end
860
857
 
861
858
  def th(s, cellwidth = 'l')
862
- if /\\\\/ =~ s
859
+ if /\\\\/.match?(s)
863
860
  if !@book.config.check_version('2', exception: false) && cellwidth =~ /\{/
864
861
  macro('reviewth', s.gsub("\\\\\n", '\\newline{}'))
865
862
  else
@@ -872,7 +869,7 @@ module ReVIEW
872
869
  end
873
870
 
874
871
  def td(s, cellwidth = 'l')
875
- if /\\\\/ =~ s
872
+ if /\\\\/.match?(s)
876
873
  if !@book.config.check_version('2', exception: false) && cellwidth =~ /\{/
877
874
  s.gsub("\\\\\n", '\\newline{}')
878
875
  else
@@ -902,7 +899,7 @@ module ReVIEW
902
899
 
903
900
  def imgtable(lines, id, caption = nil, metric = nil)
904
901
  unless @chapter.image_bound?(id)
905
- warn "image not bound: #{id}"
902
+ warn "image not bound: #{id}", location: location
906
903
  image_dummy(id, caption, lines)
907
904
  return
908
905
  end
@@ -920,7 +917,7 @@ module ReVIEW
920
917
  end
921
918
  puts macro('label', table_label(id))
922
919
  rescue ReVIEW::KeyError
923
- error "no such table: #{id}"
920
+ app_error "no such table: #{id}"
924
921
  end
925
922
  imgtable_image(id, caption, metric)
926
923
 
@@ -971,11 +968,11 @@ module ReVIEW
971
968
 
972
969
  if id
973
970
  puts macro('begin', 'reviewequationblock')
974
- if get_chap.nil?
975
- captionstr = macro('reviewequationcaption', "#{I18n.t('equation')}#{I18n.t('format_number_header_without_chapter', [@chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
976
- else
977
- captionstr = macro('reviewequationcaption', "#{I18n.t('equation')}#{I18n.t('format_number_header', [get_chap, @chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
978
- end
971
+ captionstr = if get_chap.nil?
972
+ macro('reviewequationcaption', "#{I18n.t('equation')}#{I18n.t('format_number_header_without_chapter', [@chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
973
+ else
974
+ macro('reviewequationcaption', "#{I18n.t('equation')}#{I18n.t('format_number_header', [get_chap, @chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}")
975
+ end
979
976
  end
980
977
 
981
978
  if caption_top?('equation') && captionstr
@@ -1056,7 +1053,7 @@ module ReVIEW
1056
1053
  title
1057
1054
  end
1058
1055
  rescue KeyError
1059
- error "unknown chapter: #{id}"
1056
+ app_error "unknown chapter: #{id}"
1060
1057
  nofunc_text("[UnknownChapter:#{id}]")
1061
1058
  end
1062
1059
 
@@ -1067,7 +1064,7 @@ module ReVIEW
1067
1064
  @book.chapter_index.number(id)
1068
1065
  end
1069
1066
  rescue KeyError
1070
- error "unknown chapter: #{id}"
1067
+ app_error "unknown chapter: #{id}"
1071
1068
  nofunc_text("[UnknownChapter:#{id}]")
1072
1069
  end
1073
1070
 
@@ -1079,7 +1076,7 @@ module ReVIEW
1079
1076
  title
1080
1077
  end
1081
1078
  rescue KeyError
1082
- error "unknown chapter: #{id}"
1079
+ app_error "unknown chapter: #{id}"
1083
1080
  nofunc_text("[UnknownChapter:#{id}]")
1084
1081
  end
1085
1082
 
@@ -1096,7 +1093,7 @@ module ReVIEW
1096
1093
  macro('reviewlistref', I18n.t('format_number', [get_chap(chapter), chapter.list(id).number]))
1097
1094
  end
1098
1095
  rescue KeyError
1099
- error "unknown list: #{id}"
1096
+ app_error "unknown list: #{id}"
1100
1097
  end
1101
1098
 
1102
1099
  def inline_table(id)
@@ -1107,7 +1104,7 @@ module ReVIEW
1107
1104
  macro('reviewtableref', I18n.t('format_number', [get_chap(chapter), chapter.table(id).number]), table_label(id, chapter))
1108
1105
  end
1109
1106
  rescue KeyError
1110
- error "unknown table: #{id}"
1107
+ app_error "unknown table: #{id}"
1111
1108
  end
1112
1109
 
1113
1110
  def inline_img(id)
@@ -1118,7 +1115,7 @@ module ReVIEW
1118
1115
  macro('reviewimageref', I18n.t('format_number', [get_chap(chapter), chapter.image(id).number]), image_label(id, chapter))
1119
1116
  end
1120
1117
  rescue KeyError
1121
- error "unknown image: #{id}"
1118
+ app_error "unknown image: #{id}"
1122
1119
  end
1123
1120
 
1124
1121
  def inline_eq(id)
@@ -1129,13 +1126,13 @@ module ReVIEW
1129
1126
  macro('reviewequationref', I18n.t('format_number', [get_chap(chapter), chapter.equation(id).number]))
1130
1127
  end
1131
1128
  rescue KeyError
1132
- error "unknown equation: #{id}"
1129
+ app_error "unknown equation: #{id}"
1133
1130
  end
1134
1131
 
1135
1132
  def footnote(id, content)
1136
1133
  if @book.config['footnotetext'] || @foottext[id]
1137
1134
  if @doc_status[:column]
1138
- warn "//footnote[#{id}] is in the column block. It is recommended to move out of the column block."
1135
+ warn "//footnote[#{id}] is in the column block. It is recommended to move out of the column block.", location: location
1139
1136
  end
1140
1137
  puts macro("footnotetext[#{@chapter.footnote(id).number}]", compile_inline(content.strip))
1141
1138
  end
@@ -1151,7 +1148,20 @@ module ReVIEW
1151
1148
  macro('footnote', compile_inline(@chapter.footnote(id).content.strip))
1152
1149
  end
1153
1150
  rescue KeyError
1154
- error "unknown footnote: #{id}"
1151
+ app_error "unknown footnote: #{id}"
1152
+ end
1153
+
1154
+ def inline_endnote(id)
1155
+ macro('endnote', compile_inline(@chapter.endnote(id).content.strip))
1156
+ rescue KeyError
1157
+ app_error "unknown footnote: #{id}"
1158
+ end
1159
+
1160
+ def printendnotes
1161
+ @shown_endnotes = true
1162
+ blank
1163
+ puts '\theendnotes'
1164
+ blank
1155
1165
  end
1156
1166
 
1157
1167
  BOUTEN = '・'.freeze
@@ -1267,11 +1277,11 @@ module ReVIEW
1267
1277
 
1268
1278
  def inline_hd_chap(chap, id)
1269
1279
  n = chap.headline_index.number(id)
1270
- if n.present? && chap.number && over_secnolevel?(n)
1271
- str = I18n.t('hd_quote', [chap.headline_index.number(id), compile_inline(chap.headline(id).caption)])
1272
- else
1273
- str = I18n.t('hd_quote_without_number', compile_inline(chap.headline(id).caption))
1274
- end
1280
+ str = if n.present? && chap.number && over_secnolevel?(n)
1281
+ I18n.t('hd_quote', [chap.headline_index.number(id), compile_inline(chap.headline(id).caption)])
1282
+ else
1283
+ I18n.t('hd_quote_without_number', compile_inline(chap.headline(id).caption))
1284
+ end
1275
1285
  if @book.config['chapterlink']
1276
1286
  anchor = n.tr('.', '-')
1277
1287
  macro('reviewsecref', str, sec_label(anchor))
@@ -1285,7 +1295,7 @@ module ReVIEW
1285
1295
  I18n.t('column', compile_inline(chapter.column(id).caption)),
1286
1296
  column_label(id, chapter))
1287
1297
  rescue KeyError
1288
- error "unknown column: #{id}"
1298
+ app_error "unknown column: #{id}"
1289
1299
  end
1290
1300
 
1291
1301
  def inline_raw(str) # rubocop:disable Lint/UselessMethodDefinition
@@ -1324,7 +1334,7 @@ module ReVIEW
1324
1334
  end
1325
1335
  macro(command, @chapter.image(id).path)
1326
1336
  else
1327
- warn "image not bound: #{id}"
1337
+ warn "image not bound: #{id}", location: location
1328
1338
  "\\verb|--[[path = #{id} (#{existence(id)})]]--|"
1329
1339
  end
1330
1340
  end
@@ -1348,7 +1358,7 @@ module ReVIEW
1348
1358
  end
1349
1359
 
1350
1360
  def inline_tcy(str)
1351
- macro('rensuji', escape(str))
1361
+ macro('reviewtcy', escape(str))
1352
1362
  end
1353
1363
 
1354
1364
  def inline_balloon(str)
@@ -1377,18 +1387,16 @@ module ReVIEW
1377
1387
  sa.map! do |item|
1378
1388
  if @index_db[item]
1379
1389
  escape_mendex_key(escape_index(@index_db[item])) + '@' + escape_mendex_display(escape_index(escape(item)))
1380
- else
1381
- if item =~ /\A[[:ascii:]]+\Z/ || @index_mecab.nil?
1382
- esc_item = escape_mendex_display(escape_index(escape(item)))
1383
- if esc_item == item
1384
- esc_item
1385
- else
1386
- "#{escape_mendex_key(escape_index(item))}@#{esc_item}"
1387
- end
1390
+ elsif item =~ /\A[[:ascii:]]+\Z/ || @index_mecab.nil?
1391
+ esc_item = escape_mendex_display(escape_index(escape(item)))
1392
+ if esc_item == item
1393
+ esc_item
1388
1394
  else
1389
- yomi = NKF.nkf('-w --hiragana', @index_mecab.parse(item).force_encoding('UTF-8').chomp)
1390
- escape_mendex_key(escape_index(yomi)) + '@' + escape_mendex_display(escape_index(escape(item)))
1395
+ "#{escape_mendex_key(escape_index(item))}@#{esc_item}"
1391
1396
  end
1397
+ else
1398
+ yomi = NKF.nkf('-w --hiragana', @index_mecab.parse(item).force_encoding('UTF-8').chomp)
1399
+ escape_mendex_key(escape_index(yomi)) + '@' + escape_mendex_display(escape_index(escape(item)))
1392
1400
  end
1393
1401
  end
1394
1402
 
@@ -1404,7 +1412,7 @@ module ReVIEW
1404
1412
  end
1405
1413
 
1406
1414
  def compile_href(url, label)
1407
- if /\A[a-z]+:/ =~ url
1415
+ if /\A[a-z]+:/.match?(url)
1408
1416
  if label
1409
1417
  macro('href', escape_url(url), escape(label))
1410
1418
  else
@@ -31,7 +31,7 @@ module ReVIEW
31
31
  def skip_comment_lines
32
32
  n = 0
33
33
  while line = gets
34
- unless line.strip =~ /\A\#@/
34
+ unless /\A\#@/.match?(line.strip)
35
35
  ungets(line)
36
36
  return n
37
37
  end
@@ -88,7 +88,7 @@ module ReVIEW
88
88
 
89
89
  def while_match(re)
90
90
  while line = gets
91
- unless re =~ line
91
+ unless re&.match?(line)
92
92
  ungets(line)
93
93
  return
94
94
  end
@@ -99,7 +99,7 @@ module ReVIEW
99
99
 
100
100
  def until_match(re)
101
101
  while line = gets
102
- if re =~ line
102
+ if re&.match?(line)
103
103
  ungets(line)
104
104
  return
105
105
  end
@@ -22,7 +22,7 @@ module ReVIEW
22
22
  def string
23
23
  begin
24
24
  "#{@filename}:#{@f.lineno}"
25
- rescue
25
+ rescue StandardError
26
26
  "#{@filename}:nil"
27
27
  end
28
28
  end
@@ -0,0 +1,27 @@
1
+ module ReVIEW
2
+ module Loggable
3
+ attr_reader :logger
4
+
5
+ def error(msg, location: nil)
6
+ logger.error(msg, location: location)
7
+ end
8
+
9
+ def app_error(msg)
10
+ raise ApplicationError, msg
11
+ end
12
+
13
+ def error!(msg, location: nil)
14
+ logger.error(msg, location: location)
15
+
16
+ exit 1
17
+ end
18
+
19
+ def warn(msg, location: nil)
20
+ logger.warn(msg, location: location)
21
+ end
22
+
23
+ def debug(msg, location: nil)
24
+ logger.debug(msg, location: location)
25
+ end
26
+ end
27
+ end
data/lib/review/logger.rb CHANGED
@@ -7,6 +7,30 @@ module ReVIEW
7
7
  self.formatter = ->(severity, _datetime, name, msg) { "#{severity} #{name}: #{msg}\n" }
8
8
  end
9
9
 
10
+ def warn(msg, location: nil)
11
+ if location
12
+ super("#{location}: #{msg}")
13
+ else
14
+ super(msg)
15
+ end
16
+ end
17
+
18
+ def error(msg, location: nil)
19
+ if location
20
+ super("#{location}: #{msg}")
21
+ else
22
+ super(msg)
23
+ end
24
+ end
25
+
26
+ def debug(msg, location: nil)
27
+ if location
28
+ super("#{location}: #{msg}")
29
+ else
30
+ super(msg)
31
+ end
32
+ end
33
+
10
34
  def ttylogger?
11
35
  nil
12
36
  end
@@ -19,6 +43,30 @@ module ReVIEW
19
43
  begin
20
44
  require 'tty-logger'
21
45
  class TTYLogger < ::TTY::Logger
46
+ def warn(msg, location: nil)
47
+ if location
48
+ super("#{location}: #{msg}")
49
+ else
50
+ super(msg)
51
+ end
52
+ end
53
+
54
+ def error(msg, location: nil)
55
+ if location
56
+ super("#{location}: #{msg}")
57
+ else
58
+ super(msg)
59
+ end
60
+ end
61
+
62
+ def debug(msg, location: nil)
63
+ if location
64
+ super("#{location}: #{msg}")
65
+ else
66
+ super(msg)
67
+ end
68
+ end
69
+
22
70
  def ttylogger?
23
71
  true
24
72
  end
@@ -28,27 +76,27 @@ module ReVIEW
28
76
  end
29
77
 
30
78
  def self.logger(level: 'info')
31
- if const_defined?(:TTYLogger)
32
- @logger ||= TTYLogger.new do |config|
33
- config.level = level.to_sym
34
- config.handlers = [
35
- [:console,
36
- {
37
- styles: {
38
- debug: { label: 'DEBUG' },
39
- info: { label: 'INFO', color: :magenta },
40
- success: { label: 'SUCCESS' },
41
- wait: { label: 'WAIT' },
42
- warn: { label: 'WARN' },
43
- error: { label: 'ERROR' },
44
- fatal: { label: 'FATAL' }
45
- }
46
- }]
47
- ]
48
- end
49
- else
50
- @logger ||= ReVIEW::Logger.new($stderr, progname: File.basename($PROGRAM_NAME, '.*'))
51
- end
79
+ @logger ||= if const_defined?(:TTYLogger)
80
+ TTYLogger.new do |config|
81
+ config.level = level.to_sym
82
+ config.handlers = [
83
+ [:console,
84
+ {
85
+ styles: {
86
+ debug: { label: 'DEBUG' },
87
+ info: { label: 'INFO', color: :magenta },
88
+ success: { label: 'SUCCESS' },
89
+ wait: { label: 'WAIT' },
90
+ warn: { label: 'WARN' },
91
+ error: { label: 'ERROR' },
92
+ fatal: { label: 'FATAL' }
93
+ }
94
+ }]
95
+ ]
96
+ end
97
+ else
98
+ ReVIEW::Logger.new($stderr, progname: File.basename($PROGRAM_NAME, '.*'))
99
+ end
52
100
  end
53
101
 
54
102
  def self.logger=(logger)
@@ -11,7 +11,7 @@ require 'yaml'
11
11
 
12
12
  begin
13
13
  require 'cgi/escape'
14
- rescue
14
+ rescue StandardError
15
15
  require 'cgi/util'
16
16
  end
17
17
 
@@ -43,7 +43,7 @@ module ReVIEW
43
43
 
44
44
  Dir.open(from_dir) do |dir|
45
45
  dir.each do |fname|
46
- next if fname =~ /^\./
46
+ next if /^\./.match?(fname)
47
47
 
48
48
  if FileTest.directory?("#{from_dir}/#{fname}")
49
49
  image_files += copy_images_to_dir("#{from_dir}/#{fname}", "#{to_dir}/#{fname}", options)
@@ -52,7 +52,7 @@ module ReVIEW
52
52
 
53
53
  is_converted = false
54
54
  (options[:convert] || {}).each do |orig_type, conv_type|
55
- next unless /\.#{orig_type}$/ =~ fname
55
+ next unless /\.#{orig_type}$/.match?(fname)
56
56
 
57
57
  is_converted = system("convert #{from_dir}/#{fname} #{to_dir}/#{fname}.#{conv_type}")
58
58
  image_files << "#{from_dir}/#{fname}.#{conv_type}"
@@ -61,7 +61,11 @@ module ReVIEW
61
61
  exts = options[:exts] || %w[png gif jpg jpeg svg pdf eps ai tif psd]
62
62
  exts_str = exts.join('|')
63
63
  if !is_converted && fname =~ /\.(#{exts_str})$/i
64
- FileUtils.cp("#{from_dir}/#{fname}", to_dir)
64
+ if options[:use_symlink]
65
+ FileUtils.ln_s(File.realpath("#{from_dir}/#{fname}"), to_dir)
66
+ else
67
+ FileUtils.cp("#{from_dir}/#{fname}", to_dir)
68
+ end
65
69
  image_files << "#{from_dir}/#{fname}"
66
70
  end
67
71
  end