review-retrovert 0.9.11 → 0.10.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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +1 -1
  3. data/.pinact.yaml +12 -0
  4. data/.ruby-version +1 -1
  5. data/Dockerfile +2 -1
  6. data/Dockerfile.local +13 -0
  7. data/Gemfile.lock +62 -35
  8. data/Rakefile +9 -0
  9. data/aqua.yaml +20 -0
  10. data/hooks/post_push +14 -1
  11. data/lib/review/retrovert/cli.rb +6 -0
  12. data/lib/review/retrovert/converter.rb +38 -0
  13. data/lib/review/retrovert/version.rb +1 -1
  14. data/lib/review/retrovert/yamlconfig.rb +38 -1
  15. data/review-retrovert.gemspec +18 -4
  16. data/zizmor.yml +5 -0
  17. metadata +53 -127
  18. data/.github/FUNDING.yml +0 -4
  19. data/.github/workflows/docker-build.yml +0 -26
  20. data/.github/workflows/release.yml +0 -26
  21. data/.github/workflows/retrovert.yml +0 -91
  22. data/testdata/mybook/.gitignore +0 -13
  23. data/testdata/mybook/.textlintrc +0 -11
  24. data/testdata/mybook/README.md +0 -43
  25. data/testdata/mybook/Rakefile +0 -24
  26. data/testdata/mybook/catalog.yml +0 -60
  27. data/testdata/mybook/config-noretrovert.yml +0 -404
  28. data/testdata/mybook/config-retrovert.yml +0 -16
  29. data/testdata/mybook/config-starter.yml +0 -264
  30. data/testdata/mybook/config.yml +0 -404
  31. data/testdata/mybook/contents/00-preface.re +0 -129
  32. data/testdata/mybook/contents/01-install.re +0 -305
  33. data/testdata/mybook/contents/02-tutorial.re +0 -1228
  34. data/testdata/mybook/contents/03-syntax.re +0 -4610
  35. data/testdata/mybook/contents/04-customize.re +0 -1064
  36. data/testdata/mybook/contents/05-faq.re +0 -606
  37. data/testdata/mybook/contents/06-bestpractice.re +0 -1343
  38. data/testdata/mybook/contents/91-compare.re +0 -418
  39. data/testdata/mybook/contents/92-filelist.re +0 -125
  40. data/testdata/mybook/contents/93-background.re +0 -267
  41. data/testdata/mybook/contents/99-postface.re +0 -39
  42. data/testdata/mybook/contents/r0-inner.re +0 -2
  43. data/testdata/mybook/contents/r0-root.re +0 -49
  44. data/testdata/mybook/contents/table.csv +0 -4
  45. data/testdata/mybook/contents/test.txt +0 -1
  46. data/testdata/mybook/contents/ut.re +0 -5
  47. data/testdata/mybook/css/normalize.css +0 -349
  48. data/testdata/mybook/css/webstyle.css +0 -692
  49. data/testdata/mybook/data/terms.txt +0 -3
  50. data/testdata/mybook/data/words.txt +0 -15
  51. data/testdata/mybook/images/03-syntax/favicon-16x16.png +0 -0
  52. data/testdata/mybook/images/03-syntax/figure_heretop.png +0 -0
  53. data/testdata/mybook/images/03-syntax/index-page.png +0 -0
  54. data/testdata/mybook/images/03-syntax/order-detail.png +0 -0
  55. data/testdata/mybook/images/03-syntax/tw-icon1.jpg +0 -0
  56. data/testdata/mybook/images/03-syntax/tw-icon2.jpg +0 -0
  57. data/testdata/mybook/images/03-syntax/tw-icon3.jpg +0 -0
  58. data/testdata/mybook/images/03-syntax/tw-icon4.jpg +0 -0
  59. data/testdata/mybook/images/04-customize/caption_pagebreak.png +0 -0
  60. data/testdata/mybook/images/04-customize/chaptitlepage_sample.png +0 -0
  61. data/testdata/mybook/images/04-customize/section_decoration_samples.png +0 -0
  62. data/testdata/mybook/images/05-faq/codeblock_rpadding1.png +0 -0
  63. data/testdata/mybook/images/05-faq/codeblock_rpadding2.png +0 -0
  64. data/testdata/mybook/images/05-faq/dummy-image.png +0 -0
  65. data/testdata/mybook/images/06-bestpractice/figure_heretop.png +0 -0
  66. data/testdata/mybook/images/06-bestpractice/font_beramono.png +0 -0
  67. data/testdata/mybook/images/06-bestpractice/heading_design1.png +0 -0
  68. data/testdata/mybook/images/06-bestpractice/heading_design2.png +0 -0
  69. data/testdata/mybook/images/06-bestpractice/margin_book.png +0 -0
  70. data/testdata/mybook/images/06-bestpractice/multiline-title.png +0 -0
  71. data/testdata/mybook/images/06-bestpractice/preface_numbered.png +0 -0
  72. data/testdata/mybook/images/06-bestpractice/program_border.png +0 -0
  73. data/testdata/mybook/images/06-bestpractice/sechead_design_4.png +0 -0
  74. data/testdata/mybook/images/06-bestpractice/section_title_wlines.png +0 -0
  75. data/testdata/mybook/images/06-bestpractice/titlepage-samples.png +0 -0
  76. data/testdata/mybook/images/93-background/bug913.png +0 -0
  77. data/testdata/mybook/images/93-background/slide2.png +0 -0
  78. data/testdata/mybook/images/avatar-b.png +0 -0
  79. data/testdata/mybook/images/avatar-g.png +0 -0
  80. data/testdata/mybook/images/avatar-r.png +0 -0
  81. data/testdata/mybook/images/caution-icon.png +0 -0
  82. data/testdata/mybook/images/cover_a5.pdf +0 -0
  83. data/testdata/mybook/images/cover_b5.pdf +0 -0
  84. data/testdata/mybook/images/info-icon.png +0 -0
  85. data/testdata/mybook/images/tw-icon.jpg +0 -0
  86. data/testdata/mybook/images/warning-icon.png +0 -0
  87. data/testdata/mybook/layouts/layout.epub.erb +0 -29
  88. data/testdata/mybook/layouts/layout.html5.erb +0 -108
  89. data/testdata/mybook/layouts/layout.tex.erb +0 -432
  90. data/testdata/mybook/layouts/layout.tex.erb.orig +0 -386
  91. data/testdata/mybook/lib/hooks/beforetexcompile.rb +0 -55
  92. data/testdata/mybook/lib/ruby/review-book.rb +0 -64
  93. data/testdata/mybook/lib/ruby/review-builder.rb +0 -1342
  94. data/testdata/mybook/lib/ruby/review-cli.rb +0 -58
  95. data/testdata/mybook/lib/ruby/review-compiler.rb +0 -1176
  96. data/testdata/mybook/lib/ruby/review-epubbuilder.rb +0 -33
  97. data/testdata/mybook/lib/ruby/review-epubmaker.rb +0 -609
  98. data/testdata/mybook/lib/ruby/review-htmlbuilder.rb +0 -949
  99. data/testdata/mybook/lib/ruby/review-latexbuilder.rb +0 -1065
  100. data/testdata/mybook/lib/ruby/review-maker.rb +0 -346
  101. data/testdata/mybook/lib/ruby/review-markdownbuilder.rb +0 -945
  102. data/testdata/mybook/lib/ruby/review-markdownmaker.rb +0 -91
  103. data/testdata/mybook/lib/ruby/review-monkeypatch.rb +0 -93
  104. data/testdata/mybook/lib/ruby/review-pdfmaker.rb +0 -546
  105. data/testdata/mybook/lib/ruby/review-textbuilder.rb +0 -36
  106. data/testdata/mybook/lib/ruby/review-tocparser.rb +0 -285
  107. data/testdata/mybook/lib/ruby/review-webmaker.rb +0 -448
  108. data/testdata/mybook/lib/tasks/mytasks.rake +0 -31
  109. data/testdata/mybook/lib/tasks/review.rake +0 -156
  110. data/testdata/mybook/lib/tasks/review.rake.orig +0 -72
  111. data/testdata/mybook/lib/tasks/starter.rake +0 -470
  112. data/testdata/mybook/locale.yml +0 -6
  113. data/testdata/mybook/review-ext.rb +0 -206
  114. data/testdata/mybook/sty/indexstyle.ist +0 -25
  115. data/testdata/mybook/sty/jumoline.sty +0 -310
  116. data/testdata/mybook/sty/mycolophon.sty +0 -81
  117. data/testdata/mybook/sty/mystyle.sty +0 -8
  118. data/testdata/mybook/sty/mytextsize.sty +0 -94
  119. data/testdata/mybook/sty/mytitlepage.sty +0 -126
  120. data/testdata/mybook/sty/review-base.sty +0 -276
  121. data/testdata/mybook/sty/reviewmacro.sty +0 -60
  122. data/testdata/mybook/sty/starter-codeblock.sty +0 -463
  123. data/testdata/mybook/sty/starter-color.sty +0 -134
  124. data/testdata/mybook/sty/starter-font.sty +0 -112
  125. data/testdata/mybook/sty/starter-heading.sty +0 -561
  126. data/testdata/mybook/sty/starter-misc.sty +0 -894
  127. data/testdata/mybook/sty/starter-note.sty +0 -180
  128. data/testdata/mybook/sty/starter-section.sty +0 -262
  129. data/testdata/mybook/sty/starter-talklist.sty +0 -105
  130. data/testdata/mybook/sty/starter-toc.sty +0 -72
  131. data/testdata/mybook/sty/starter-util.sty +0 -39
  132. data/testdata/mybook/sty/starter.sty +0 -36
  133. data/testdata/mybook/sty/ut.sty +0 -26
  134. data/testdata/mybook/style.css +0 -597
  135. data/testdata/mybook/ut-catalog.yml +0 -61
  136. data/testdata/mybook/ut-config-starter.yml +0 -3
  137. data/testdata/mybook/ut-config.yml +0 -404
@@ -1,346 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- ##
4
- ## ReVIEW::PDFMaker から他のMakerでも使える機能を分離する
5
- ##
6
-
7
- require 'pathname'
8
- require 'open3'
9
-
10
- require 'review/logger'
11
- require 'review/version'
12
- require 'review/configure'
13
- require 'review/yamlloader'
14
- require 'review/i18n'
15
- require 'review/book'
16
- require 'review/template'
17
-
18
- require_relative './review-cli'
19
-
20
-
21
- module ReVIEW
22
-
23
-
24
- class Maker
25
-
26
- attr_accessor :config, :basedir
27
- attr_reader :maker_name
28
-
29
- def initialize(config_filename, optional_values={})
30
- @basedir = File.dirname(config_filename)
31
- @basehookdir = File.absolute_path(@basedir)
32
- @logger = ReVIEW.logger
33
- @maker_name = self.class.name.split('::')[-1].downcase()
34
- @config = load_config(config_filename, optional_values)
35
- @config.maker = @maker_name
36
- @config.check_version(ReVIEW::VERSION) # may raise ReVIEW::ConfigError
37
- #
38
- #yamlfile = File.join(@basedir, 'config-starter.yml')
39
- #yamldata = File.open(yamlfile) {|f| YAML.safe_load(f) }
40
- #@starter_config = yamldata['starter']
41
- @starter_config = @config['starter']
42
- end
43
-
44
- def self.execute(*args)
45
- script_name = self.const_get(:SCRIPT_NAME)
46
- cli = CLI.new(script_name)
47
- begin
48
- cmdopts, config_filename = cli.parse_opts(args)
49
- rescue OptionParser::InvalidOption => ex
50
- $stderr.puts "Error: #{ex.message}"
51
- $stderr.puts cli.help_message()
52
- return 1
53
- end
54
- if cmdopts['help']
55
- puts cli.help_message()
56
- return 0
57
- end
58
- #
59
- maker = nil
60
- begin
61
- maker = self.new(config_filename, cmdopts)
62
- return maker.generate()
63
- rescue ApplicationError, ReVIEW::ConfigError => ex
64
- raise if maker && maker.config['debug']
65
- error(ex.message)
66
- end
67
- end
68
-
69
- def generate()
70
- raise NotImplementedError.new("#{self.class.name}#generate(): not implemented yet.")
71
- end
72
-
73
- def debug?
74
- return @config['debug']
75
- end
76
-
77
- protected
78
-
79
- def load_config(config_filename, additionals={})
80
- begin
81
- config_data = ReVIEW::YAMLLoader.new.load_file(config_filename)
82
- rescue => ex
83
- error "yaml error #{ex.message}"
84
- end
85
- #
86
- config = ReVIEW::Configure.values
87
- config.deep_merge!(config_data)
88
- # YAML configs will be overridden by command line options.
89
- config.deep_merge!(additionals)
90
- I18n.setup(config['language'])
91
- #
92
- validate_config(config)
93
- #
94
- if ENV['STARTER_CHAPTER'].present?
95
- modify_config(config)
96
- end
97
- #
98
- return config
99
- end
100
-
101
- def modify_config(config)
102
- config.deep_merge!({
103
- 'toc' => false,
104
- 'cover' => false,
105
- 'coverimage' => nil,
106
- 'titlepage' => false,
107
- 'titlefile' => nil,
108
- 'colophon' => nil,
109
- 'pdfmaker' => {
110
- 'colophon' => nil,
111
- 'titlepage' => nil,
112
- 'coverimage' => nil,
113
- },
114
- })
115
- end
116
-
117
- def load_book()
118
- book = ReVIEW::Book.load(@basedir) # also loads 'review-ext.rb'
119
- book.config = @config
120
- return book
121
- end
122
-
123
- def validate_config(config)
124
- _validate_obsoletes(config)
125
- _validate_pdffiles(config)
126
- end
127
-
128
- private
129
-
130
- def _validate_obsoletes(config)
131
- d = config['pdfmaker']
132
- return unless d
133
- obsolete_keys = ['coverpdf_files', 'backcoverpdf_files', 'coverpdf_option']
134
- if obsolete_keys.any? {|key| d.key?(key) }
135
- errmsg = CONFIG_PDFFILES_ERRMSG
136
- $stderr.puts "\033[0;31m\n#{errmsg}\033[0m"
137
- error "obsolete config entry exists."
138
- end
139
- end
140
-
141
- CONFIG_PDFFILES_ERRMSG = <<END
142
- ***** ERROR *****
143
- 'config.yml' contains old entries.
144
-
145
- Please move the followings from 'config.yml' ...
146
-
147
- * coverpdf_files:
148
- * backcoverpdf_files:
149
- * coverpdf_option:
150
-
151
- into 'config-starter.yml' with renaming to ...
152
-
153
- * frontcover_pdffile:
154
- * backcover_pdffile:
155
- * includepdf_option:
156
- END
157
-
158
- def _validate_pdffiles(config)
159
- d = config['starter']
160
- return unless d
161
- imagedir = config['imagedir']
162
- pdffile_keys = ['frontcover_pdffile', 'backcover_pdffile', 'titlepage_pdffile', 'colophon_pdffile']
163
- pdffile_keys.each do |key|
164
- [d[key]].flatten.compact.each do |pdffile|
165
- pdffile = pdffile.gsub(/(<.*?>)?\*?\z/, '')
166
- errmsg = _validate_pdffile(File.join(imagedir, pdffile))
167
- error "(config-starter.yml) '#{key}: #{pdffile}': #{errmsg}" if errmsg
168
- end
169
- end
170
- #
171
- key = 'includepdf_option'; val = d[key]
172
- if val.present?
173
- val =~ /\Aoffset=/ or
174
- error "(config-starter.yml) '#{key}: #{val}': unexpected value. only 'offset=...' available here."
175
- end
176
- end
177
-
178
- def _validate_pdffile(filepath)
179
- filepath =~ /\.pdf\z/i or
180
- return "expected pdf file ('*.pdf'), but not."
181
- return _validate_file(filepath)
182
- end
183
-
184
- def _validate_file(filepath)
185
- File.exist?(filepath) or return "file not found."
186
- File.file?(filepath) or return "not a file."
187
- File.readable?(filepath) or return "cannot read (permission denied?)."
188
- return nil
189
- end
190
-
191
- protected
192
-
193
- def system_or_raise(*args)
194
- Kernel.system(*args) or raise("failed to run command: #{args.join(' ')}")
195
- end
196
-
197
- def self.error(msg)
198
- $stderr.puts "ERROR: #{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
199
- exit 1
200
- end
201
-
202
- def error(msg)
203
- @logger.error "#{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
204
- exit 1
205
- end
206
-
207
- def self.warn(msg)
208
- $stderr.puts "Waring: #{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
209
- end
210
-
211
- def warn(msg)
212
- @logger.warn "#{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
213
- end
214
-
215
- def empty_dir(path)
216
- if File.directory?(path)
217
- Pathname.new(path).children.each {|x| x.rmtree() }
218
- end
219
- path
220
- end
221
-
222
- def echoback(cmd)
223
- puts ""
224
- puts "[#{@maker_name}]$ #{cmd}"
225
- end
226
-
227
- def run_cmd(cmd)
228
- time = @_usr_bin_time ? "time " : ""
229
- echoback("#{time}#{cmd}")
230
- return Kernel::system(cmd)
231
- end
232
-
233
- def run_cmd!(cmd)
234
- run_cmd(cmd) or raise("failed to run command: #{cmd}")
235
- end
236
-
237
- def run_cmd_capturing_output(cmd, append=nil)
238
- time = @_usr_bin_time ? "time " : ""
239
- echoback("#{time}#{cmd}#{append}")
240
- output, status = Open3.capture2(cmd)
241
- return output, status.success?
242
- end
243
-
244
- def usr_bin_time(&b)
245
- result = nil
246
- @_usr_bin_time = true
247
- start_t = Time.now
248
- ptime1 = Process.times
249
- result = yield
250
- end_t = Time.now
251
- ptime2 = Process.times
252
- @_usr_bin_time = false
253
- #
254
- real_time = end_t - start_t
255
- user_time = ptime2.cutime - ptime1.cutime
256
- sys_time = ptime2.cstime - ptime1.cstime
257
- format = "%12.2f real %12.2f user %12.2f sys"
258
- $stderr.puts format % [real_time, user_time, sys_time]
259
- #
260
- return result
261
- end
262
- protected :usr_bin_time
263
-
264
- def call_hook(hookname)
265
- d = @config[@maker_name]
266
- return unless d.is_a?(Hash)
267
- return unless d[hookname]
268
- if ENV['REVIEW_SAFE_MODE'].to_i & 1 > 0
269
- warn 'hook configuration is prohibited in safe mode. ignored.'
270
- return
271
- end
272
- ## hookname が文字列の配列なら、それらを全部実行する
273
- basehookdir = @basehookdir
274
- [d[hookname]].flatten.each do |hook|
275
- script = File.absolute_path(hook, basehookdir)
276
- ## 拡張子が .rb なら、rubyコマンドで実行する(ファイルに実行属性がなくてもよい)
277
- if script.end_with?('.rb')
278
- ruby = ruby_fullpath()
279
- ruby = "ruby" unless File.exist?(ruby)
280
- run_cmd!("#{ruby} #{script} #{Dir.pwd} #{basehookdir}")
281
- else
282
- run_cmd!("#{script} #{Dir.pwd} #{basehookdir}")
283
- end
284
- end
285
- end
286
-
287
- def ruby_fullpath
288
- c = RbConfig::CONFIG
289
- return File.join(c['bindir'], c['ruby_install_name']) + c['EXEEXT'].to_s
290
- end
291
-
292
- def colored_errmsg(msg)
293
- #return msg unless $stderr.tty?
294
- return "\033[0;31m#{msg}\033[0m"
295
- end
296
-
297
- end
298
-
299
-
300
- class BaseRenderer
301
- include ERB::Util
302
-
303
- def initialize(config, book, basedir, starter_config)
304
- @config = config
305
- @book = book
306
- @basedir = basedir
307
- @starter_config = starter_config
308
- end
309
-
310
- def render(context={})
311
- context.each {|k, v| instance_variable_set("@#{k}", v) }
312
- tmpl_filename ||= layout_template_name()
313
- tmpl_filepath = find_layout_template(tmpl_filename)
314
- return render_template(tmpl_filepath)
315
- end
316
-
317
- def generate_file(filepath, context={})
318
- content = render(context)
319
- File.open(filepath, 'wb') {|f| f.write(content) }
320
- return content
321
- end
322
-
323
- protected
324
-
325
- def layout_template_name()
326
- raise NotImplementedError.new("#{self.class.name}#template_name(): not implemented yet.")
327
- end
328
-
329
- def find_layout_template(filename)
330
- filepath = File.join(@basedir, 'layouts', File.basename(filename))
331
- return filepath if File.exist?(filepath)
332
- return File.expand_path(filename, ReVIEW::Template::TEMPLATE_DIR)
333
- end
334
-
335
- def render_template(filepath)
336
- return ReVIEW::Template.load(filepath, '-').result(binding())
337
- end
338
-
339
- def i18n(*args)
340
- ReVIEW::I18n.t(*args)
341
- end
342
-
343
- end
344
-
345
-
346
- end