review 2.3.0 → 2.4.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +90 -66
- data/.travis.yml +1 -1
- data/Gemfile +0 -1
- data/NEWS.ja.md +82 -0
- data/NEWS.md +83 -0
- data/README.md +5 -3
- data/Rakefile +8 -8
- data/bin/review +1 -5
- data/bin/review-catalog-converter +22 -27
- data/bin/review-check +36 -43
- data/bin/review-checkdep +10 -15
- data/bin/review-compile +37 -55
- data/bin/review-epubmaker +4 -5
- data/bin/review-index +21 -29
- data/bin/review-init +26 -37
- data/bin/review-pdfmaker +0 -2
- data/bin/review-preproc +25 -45
- data/bin/review-validate +19 -18
- data/bin/review-vol +15 -27
- data/doc/config.yml.sample +5 -2
- data/doc/format.ja.md +20 -1
- data/doc/format.md +21 -5
- data/doc/images/review-generate.png +0 -0
- data/lib/epubmaker.rb +1 -3
- data/lib/epubmaker/content.rb +24 -27
- data/lib/epubmaker/epubcommon.rb +135 -148
- data/lib/epubmaker/epubv2.rb +39 -46
- data/lib/epubmaker/epubv3.rb +93 -103
- data/lib/epubmaker/producer.rb +138 -151
- data/lib/epubmaker/zip_exporter.rb +21 -26
- data/lib/review/book.rb +3 -6
- data/lib/review/book/base.rb +78 -103
- data/lib/review/book/chapter.rb +36 -40
- data/lib/review/book/compilable.rb +28 -31
- data/lib/review/book/image_finder.rb +6 -13
- data/lib/review/book/index.rb +100 -121
- data/lib/review/book/page_metric.rb +2 -7
- data/lib/review/book/part.rb +18 -20
- data/lib/review/book/volume.rb +9 -13
- data/lib/review/builder.rb +81 -116
- data/lib/review/catalog.rb +15 -19
- data/lib/review/compiler.rb +64 -83
- data/lib/review/configure.rb +87 -97
- data/lib/review/converter.rb +2 -7
- data/lib/review/epubbuilder.rb +1 -3
- data/lib/review/epubmaker.rb +213 -205
- data/lib/review/exception.rb +2 -4
- data/lib/review/extentions.rb +0 -1
- data/lib/review/extentions/hash.rb +2 -2
- data/lib/review/extentions/string.rb +5 -30
- data/lib/review/htmlbuilder.rb +320 -375
- data/lib/review/htmltoc.rb +4 -7
- data/lib/review/htmlutils.rb +29 -32
- data/lib/review/i18n.rb +33 -44
- data/lib/review/i18n.yml +3 -3
- data/lib/review/idgxmlbuilder.rb +309 -345
- data/lib/review/latexbuilder.rb +175 -212
- data/lib/review/latexindex.rb +2 -8
- data/lib/review/latexutils.rb +33 -43
- data/lib/review/lineinput.rb +1 -1
- data/lib/review/logger.rb +21 -0
- data/lib/review/makerhelper.rb +1 -4
- data/lib/review/markdownbuilder.rb +44 -53
- data/lib/review/md2inaobuilder.rb +6 -12
- data/lib/review/pdfmaker.rb +143 -173
- data/lib/review/preprocessor.rb +64 -101
- data/lib/review/rstbuilder.rb +126 -158
- data/lib/review/sec_counter.rb +18 -34
- data/lib/review/template.rb +4 -5
- data/lib/review/textbuilder.rb +2 -3
- data/lib/review/textutils.rb +7 -13
- data/lib/review/tocparser.rb +31 -56
- data/lib/review/tocprinter.rb +26 -52
- data/lib/review/topbuilder.rb +219 -247
- data/lib/review/unfold.rb +15 -24
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +75 -99
- data/lib/review/webtocprinter.rb +15 -20
- data/lib/review/yamlloader.rb +13 -15
- data/review.gemspec +20 -22
- data/templates/latex/layout.tex.erb +2 -2
- data/templates/opf/epubv2.opf.erb +7 -7
- data/templates/opf/epubv3.opf.erb +7 -7
- data/templates/web/html/layout-html5.html.erb +2 -2
- data/test/assets/black.eps +280 -0
- data/test/assets/fit.png +0 -0
- data/test/assets/large.gif +0 -0
- data/test/assets/large.jpg +0 -0
- data/test/assets/large.png +0 -0
- data/test/assets/large.svg +65 -0
- data/test/assets/test_template.tex +1 -1
- data/test/book_test_helper.rb +2 -2
- data/test/run_test.rb +4 -4
- data/test/sample-book/src/Rakefile +21 -22
- data/test/syntax-book/Gemfile +4 -0
- data/test/syntax-book/Rakefile +72 -0
- data/test/syntax-book/appA.re +22 -0
- data/test/syntax-book/bib.re +6 -0
- data/test/syntax-book/catalog.yml +15 -0
- data/test/syntax-book/ch01.re +136 -0
- data/test/syntax-book/ch02.re +351 -0
- data/test/syntax-book/ch03.re +82 -0
- data/test/syntax-book/config.yml +35 -0
- data/test/syntax-book/images/ball.png +0 -0
- data/test/syntax-book/images/cover.jpg +0 -0
- data/test/syntax-book/images/fractal.png +0 -0
- data/test/syntax-book/images/img3-1.png +0 -0
- data/test/syntax-book/images/inlineicon.jpg +0 -0
- data/test/syntax-book/images/logic.png +0 -0
- data/test/syntax-book/images/logic2.png +0 -0
- data/test/syntax-book/images/puzzle.jpg +0 -0
- data/test/syntax-book/images/table.jpg +0 -0
- data/test/syntax-book/part2.re +6 -0
- data/test/syntax-book/pre01.re +26 -0
- data/test/syntax-book/review-ext.rb +14 -0
- data/test/syntax-book/sty/jumoline.sty +310 -0
- data/test/syntax-book/sty/reviewmacro.sty +39 -0
- data/test/syntax-book/style.css +494 -0
- data/test/syntax-book/syntax.dic +2 -0
- data/test/test_book.rb +106 -111
- data/test/test_book_chapter.rb +21 -22
- data/test/test_book_part.rb +3 -5
- data/test/test_builder.rb +11 -22
- data/test/test_catalog.rb +17 -18
- data/test/test_catalog_converter_cmd.rb +5 -5
- data/test/test_compiler.rb +18 -16
- data/test/test_configure.rb +35 -38
- data/test/test_converter.rb +3 -4
- data/test/test_epub3maker.rb +136 -117
- data/test/test_epubmaker.rb +107 -114
- data/test/test_epubmaker_cmd.rb +2 -4
- data/test/test_extentions_hash.rb +32 -33
- data/test/test_helper.rb +9 -11
- data/test/test_htmlbuilder.rb +454 -420
- data/test/test_htmltoc.rb +8 -12
- data/test/test_htmlutils.rb +0 -2
- data/test/test_i18n.rb +159 -150
- data/test/test_idgxmlbuilder.rb +190 -197
- data/test/test_image_finder.rb +21 -22
- data/test/test_index.rb +24 -29
- data/test/test_latexbuilder.rb +274 -264
- data/test/test_lineinput.rb +7 -10
- data/test/test_location.rb +7 -7
- data/test/test_makerhelper.rb +13 -25
- data/test/test_markdownbuilder.rb +23 -26
- data/test/test_md2inaobuilder.rb +8 -11
- data/test/test_pdfmaker.rb +114 -123
- data/test/test_pdfmaker_cmd.rb +1 -3
- data/test/test_review_ext.rb +3 -5
- data/test/test_rstbuilder.rb +92 -97
- data/test/test_template.rb +3 -7
- data/test/test_textutils.rb +27 -27
- data/test/test_tocparser.rb +2 -2
- data/test/test_topbuilder.rb +98 -103
- data/test/test_webtocprinter.rb +5 -6
- data/test/test_yamlloader.rb +42 -42
- data/test/test_zip_exporter.rb +12 -18
- metadata +86 -9
- data/lib/review/ewbbuilder.rb +0 -382
data/lib/review/ewbbuilder.rb
DELETED
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
# $Id: ewbbuilder.rb 2195 2005-11-13 21:52:18Z aamine $
|
|
4
|
-
|
|
5
|
-
require 'review/builder'
|
|
6
|
-
require 'review/textutils'
|
|
7
|
-
require 'review/exception'
|
|
8
|
-
|
|
9
|
-
module ReVIEW
|
|
10
|
-
class EWBBuilder < Builder
|
|
11
|
-
include TextUtils
|
|
12
|
-
|
|
13
|
-
def initialize(chap)
|
|
14
|
-
super
|
|
15
|
-
@footnote_buf = []
|
|
16
|
-
@index_buffer = []
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def generate_index
|
|
20
|
-
@index_buffer.each_with_index do |str, n|
|
|
21
|
-
printf "%d\t%s\n", index_number(n + 1), str
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def headline(level, caption)
|
|
26
|
-
puts unless level == 1
|
|
27
|
-
puts "//#{'i' * level} #{caption}"
|
|
28
|
-
puts
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Compiler.defsyntax(:emlist, :block, 0..1) {|args|
|
|
32
|
-
# if args[0] and not args[0] == 'noescape'
|
|
33
|
-
# raise SyntaxError, "unknown //emlist option: #{args[0]}"
|
|
34
|
-
# end
|
|
35
|
-
# }
|
|
36
|
-
|
|
37
|
-
def emlist(lines, caption = nil)
|
|
38
|
-
# firstline = f.lineno
|
|
39
|
-
puts
|
|
40
|
-
puts caption
|
|
41
|
-
puts '//lst1'
|
|
42
|
-
lines.each do |line|
|
|
43
|
-
if noescape
|
|
44
|
-
puts detab(line)
|
|
45
|
-
else
|
|
46
|
-
puts escape(detab(line))
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
puts '//}'
|
|
50
|
-
puts
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Compiler.defsyntax(:cmd, :block, 0..1) {|args|
|
|
54
|
-
# if args[0] and not args[0] == 'noescape'
|
|
55
|
-
# raise SyntaxError, "unknown //cmd option: #{args[0]}"
|
|
56
|
-
# end
|
|
57
|
-
# }
|
|
58
|
-
|
|
59
|
-
def cmd(lines, caption = nil)
|
|
60
|
-
puts
|
|
61
|
-
puts caption
|
|
62
|
-
puts '//sc1{'
|
|
63
|
-
lines.each do |line|
|
|
64
|
-
if noescape
|
|
65
|
-
puts detab(line)
|
|
66
|
-
elsif /\AC:.*?>(.+)/ =~ line # DOS prompt hack
|
|
67
|
-
prompt, cmd = *line.split('>', 2)
|
|
68
|
-
puts "#{escape(prompt)}>//command{#{escape(cmd)}}//}"
|
|
69
|
-
else
|
|
70
|
-
puts escape(detab(line))
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
puts '//}'
|
|
74
|
-
puts
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# Compiler.defsyntax(:list, :block, 0..1) {|args|
|
|
78
|
-
# if args[0] and not args[0] == 'noescape'
|
|
79
|
-
# raise SyntaxError, "unknown //list option: #{args[0]}"
|
|
80
|
-
# end
|
|
81
|
-
# }
|
|
82
|
-
|
|
83
|
-
def list(lines, id, caption)
|
|
84
|
-
puts
|
|
85
|
-
puts "//l#{list_number(id)} " + caption
|
|
86
|
-
puts '//lst2{'
|
|
87
|
-
lines.each do |line|
|
|
88
|
-
puts escape(detab(line))
|
|
89
|
-
end
|
|
90
|
-
puts '//}'
|
|
91
|
-
puts
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def image_header(file, caption)
|
|
95
|
-
if /\.png\z/ =~ file and !FileTest.exist?('images/' + file)
|
|
96
|
-
warn "image file not exist: #{file}"
|
|
97
|
-
end
|
|
98
|
-
id = file.sub(/\.\w+\z/, '')
|
|
99
|
-
puts "//f#{figure_number(id)} #{text(caption)} file=#{file}" if id
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def image_dummy
|
|
103
|
-
puts '//lst1{'
|
|
104
|
-
puts '---- dummy figure ----'
|
|
105
|
-
print dummy
|
|
106
|
-
puts '//}'
|
|
107
|
-
puts
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def table
|
|
111
|
-
# %r<\A//table\[(\w+)\]>
|
|
112
|
-
spec = $1
|
|
113
|
-
buf = []
|
|
114
|
-
while line = f.gets
|
|
115
|
-
break if %r[\A//\}] === line
|
|
116
|
-
buf.push(line.strip.split(/\t+/).map {|s| s == '.' ? '' : s })
|
|
117
|
-
end
|
|
118
|
-
table_type = 'tabm'
|
|
119
|
-
output.puts "//#{table_type}[" + spec + ']{'
|
|
120
|
-
buf.each_with_index do |col, idx|
|
|
121
|
-
if /----/ === col[0]
|
|
122
|
-
output.puts '//kb'
|
|
123
|
-
else
|
|
124
|
-
output.puts col.map {|s| text(s) }.join("\t")
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
output.puts '//}'
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
LI = '●'
|
|
131
|
-
|
|
132
|
-
def ul_begin
|
|
133
|
-
puts
|
|
134
|
-
puts '//k1{'
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def ul_item(lines)
|
|
138
|
-
puts "#{LI}//|" + lines.join('')
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def ul_end
|
|
142
|
-
puts '//}'
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def ol_begin
|
|
146
|
-
output.puts
|
|
147
|
-
output.puts '//k2{'
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
def ol_item(num, lines)
|
|
151
|
-
print "#{num}//|" + lines.join('')
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def ol_end
|
|
155
|
-
puts '//}'
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def quote(lines)
|
|
159
|
-
puts '//c1{'
|
|
160
|
-
lines.each do |line|
|
|
161
|
-
puts text(line)
|
|
162
|
-
end
|
|
163
|
-
puts '//}'
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def vspace
|
|
167
|
-
print %Q(
|
|
168
|
-
//h)
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
def noindent
|
|
172
|
-
@noindent = true
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
def refer(f)
|
|
176
|
-
puts
|
|
177
|
-
puts '//refer{'
|
|
178
|
-
cascade f
|
|
179
|
-
puts '//}'
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def point(f)
|
|
183
|
-
puts
|
|
184
|
-
puts '//point{'
|
|
185
|
-
cascade f
|
|
186
|
-
puts '//}'
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
def note(f, caption)
|
|
190
|
-
puts
|
|
191
|
-
puts '//note{'
|
|
192
|
-
puts "//cg{#{caption}//}"
|
|
193
|
-
puts '//h'
|
|
194
|
-
cascade f
|
|
195
|
-
puts '//}'
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def cascade(f)
|
|
199
|
-
# FIXME
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
Z_SPACE = "\241\241" # zen-kaku space in EUC-JP
|
|
203
|
-
|
|
204
|
-
def paragraph(lines)
|
|
205
|
-
if @noindent
|
|
206
|
-
@noindent = false
|
|
207
|
-
else
|
|
208
|
-
print Z_SPACE
|
|
209
|
-
end
|
|
210
|
-
prev = ''
|
|
211
|
-
lines.each do |line|
|
|
212
|
-
if /[a-zA-Z0-9]\z/ =~ prev and /\A[a-zA-Z0-9]/ =~ line
|
|
213
|
-
print ' '
|
|
214
|
-
end
|
|
215
|
-
print line
|
|
216
|
-
end
|
|
217
|
-
puts
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
def figure_filename(key)
|
|
221
|
-
if ext = key.slice(/\.\w+\z/)
|
|
222
|
-
base = key.sub(/\.\w+\z/, '')
|
|
223
|
-
else
|
|
224
|
-
base = key
|
|
225
|
-
ext = '.eps'
|
|
226
|
-
end
|
|
227
|
-
currname = "images/ch_#{chapter_id}_#{base}#{ext}"
|
|
228
|
-
destname = "images/fig#{figure_number(base)}#{ext}"
|
|
229
|
-
unless File.exist? currname
|
|
230
|
-
# error "image file not exist: #{currname}"
|
|
231
|
-
end
|
|
232
|
-
destname
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
def image_label(str)
|
|
236
|
-
"#{chapter_id}:#{str}"
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
def text(str)
|
|
240
|
-
str = str.gsub(/\t/, ' ')
|
|
241
|
-
str.gsub(/([^@^]+)|\^(.*?)\^|@<(\w+)>\{(.*?)\}|@\{(.*?)\}|([@^])/) do
|
|
242
|
-
if normal = $1
|
|
243
|
-
escape(normal)
|
|
244
|
-
elsif tt = $2
|
|
245
|
-
'//tt{' + escape(tt) + '//}'
|
|
246
|
-
elsif inline = $3
|
|
247
|
-
compile_inline(inline, $4)
|
|
248
|
-
elsif index = $5
|
|
249
|
-
error 'index not implemented'
|
|
250
|
-
text(index) + index_command(index)
|
|
251
|
-
elsif char = $6
|
|
252
|
-
escape(char)
|
|
253
|
-
else
|
|
254
|
-
error "unknown inline: #{str.inspect}"
|
|
255
|
-
end
|
|
256
|
-
end
|
|
257
|
-
rescue DocumentError => e
|
|
258
|
-
error e.message
|
|
259
|
-
return 'ERROR'
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
def inline_kw(arg)
|
|
263
|
-
word, eng, abbr = arg.split(/,/).map {|s| s.strip }
|
|
264
|
-
if abbr
|
|
265
|
-
add_index(word) + "//g{#{word}//}" +
|
|
266
|
-
add_index(abbr) + "(#{abbr}, " +
|
|
267
|
-
add_index(eng) + "#{eng})"
|
|
268
|
-
elsif eng
|
|
269
|
-
add_index(word) + "//g{#{word}//}" +
|
|
270
|
-
add_index(eng) + "(#{eng})"
|
|
271
|
-
else
|
|
272
|
-
add_index(word) + "//g{#{word}//}"
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
def inline_keytop(arg)
|
|
277
|
-
"//keytop{#{arg}//}"
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
def inline_chap(id)
|
|
281
|
-
chapter_number(arg)
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
def inline_chapref(id)
|
|
285
|
-
chapter_number(arg) + chapter_name(arg)
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
def inline_chapname(id)
|
|
289
|
-
chapter_name(arg)
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
def inline_list(arg)
|
|
293
|
-
'//l' + list_number(arg)
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
def inline_img(arg)
|
|
297
|
-
error "wrong image label: #{arg}" if /[^a-zA-Z\d\-]/ =~ arg
|
|
298
|
-
'//f' + figure_number(arg)
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
def inline_footnote(id)
|
|
302
|
-
'//ky' + footnote_number(id)
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
def inline_ruby(arg)
|
|
306
|
-
error 'wrong number of arg: @<ruby>' unless arg.count(',') == 1
|
|
307
|
-
"//ruby{#{arg}//}"
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
NAKAGURO = '・'
|
|
311
|
-
|
|
312
|
-
def inline_bou(str)
|
|
313
|
-
"//ruby{#{escape(str)},#{NAKAGURO * char_length(str)}//}"
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
def char_length(str)
|
|
317
|
-
str.gsub(/./, '.').length
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
def inline_em(str)
|
|
321
|
-
"//g{#{arg}//}"
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
def inline_math(arg)
|
|
325
|
-
"//LaTeX{ $#{arg}$ //}"
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
def chapter_id
|
|
329
|
-
File.basename(@filename, '.rd')
|
|
330
|
-
end
|
|
331
|
-
|
|
332
|
-
def chapter_prefix
|
|
333
|
-
sprintf('%02d', @chapter_table.number(chapter_id))
|
|
334
|
-
end
|
|
335
|
-
|
|
336
|
-
def chapter_number(key)
|
|
337
|
-
curr = @chapter_table.number(chapter_id)
|
|
338
|
-
dest = @chapter_table.number(key)
|
|
339
|
-
|
|
340
|
-
case chapter_id
|
|
341
|
-
when /\.ewb\z/, 'tmp', 'temp'
|
|
342
|
-
return '第' + dest + '章'
|
|
343
|
-
end
|
|
344
|
-
if dest == curr + 1
|
|
345
|
-
'次章'
|
|
346
|
-
elsif dest == curr - 1
|
|
347
|
-
'前章'
|
|
348
|
-
else
|
|
349
|
-
"第#{dest}章"
|
|
350
|
-
end
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
def chapter_name(key)
|
|
354
|
-
'『' + text(@chapter_table.title(key)) + '』'
|
|
355
|
-
end
|
|
356
|
-
|
|
357
|
-
def list_number(key)
|
|
358
|
-
sprintf(chapter_prefix + '%02d0', @list_table.number(key))
|
|
359
|
-
end
|
|
360
|
-
|
|
361
|
-
def figure_number(key)
|
|
362
|
-
sprintf(chapter_prefix + '%02d0', @figure_table.number(key))
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
def footnote_number(key)
|
|
366
|
-
sprintf('%02d', @footnote_index.number(key) * 5)
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
def add_index(str)
|
|
370
|
-
@index_buffer.push str
|
|
371
|
-
"//in#{index_number(@index_buffer.size)}"
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
def index_number(n)
|
|
375
|
-
900_000 + @chapter_index.number(chapter_id) * 1000 + n
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
def escape(str)
|
|
379
|
-
str.gsub(%r{//}, '////')
|
|
380
|
-
end
|
|
381
|
-
end
|
|
382
|
-
end
|