tmtms-review 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +9 -0
  3. data/COPYING +515 -0
  4. data/ChangeLog +2083 -0
  5. data/README.rdoc +50 -0
  6. data/Rakefile +56 -0
  7. data/VERSION +1 -0
  8. data/bin/review-check +178 -0
  9. data/bin/review-checkdep +63 -0
  10. data/bin/review-compile +205 -0
  11. data/bin/review-epubmaker +661 -0
  12. data/bin/review-epubmaker-ng +176 -0
  13. data/bin/review-index +118 -0
  14. data/bin/review-pdfmaker +208 -0
  15. data/bin/review-preproc +142 -0
  16. data/bin/review-validate +51 -0
  17. data/bin/review-vol +102 -0
  18. data/debian/README.Debian +12 -0
  19. data/debian/README.source +5 -0
  20. data/debian/changelog +5 -0
  21. data/debian/compat +1 -0
  22. data/debian/control +22 -0
  23. data/debian/copyright +62 -0
  24. data/debian/docs +6 -0
  25. data/debian/manpage.1.ex +59 -0
  26. data/debian/patches/path.diff +91 -0
  27. data/debian/patches/series +1 -0
  28. data/debian/review.install +13 -0
  29. data/debian/review.links +4 -0
  30. data/debian/rules +13 -0
  31. data/debian/source/format +1 -0
  32. data/doc/format.rdoc +582 -0
  33. data/doc/format_idg.rdoc +180 -0
  34. data/doc/libepubmaker/sample.yaml +90 -0
  35. data/doc/quickstart.rdoc +188 -0
  36. data/doc/ruby-uuid/README +11 -0
  37. data/doc/ruby-uuid/README.ja +34 -0
  38. data/doc/sample.css +108 -0
  39. data/doc/sample.yaml +62 -0
  40. data/lib/epubmaker.rb +28 -0
  41. data/lib/epubmaker/content.rb +82 -0
  42. data/lib/epubmaker/epubv2.rb +418 -0
  43. data/lib/epubmaker/epubv3.rb +249 -0
  44. data/lib/epubmaker/producer.rb +204 -0
  45. data/lib/epubmaker/resource.rb +66 -0
  46. data/lib/lineinput.rb +155 -0
  47. data/lib/review.rb +3 -0
  48. data/lib/review/book.rb +46 -0
  49. data/lib/review/book/base.rb +235 -0
  50. data/lib/review/book/chapter.rb +81 -0
  51. data/lib/review/book/compilable.rb +159 -0
  52. data/lib/review/book/index.rb +339 -0
  53. data/lib/review/book/page_metric.rb +38 -0
  54. data/lib/review/book/parameters.rb +97 -0
  55. data/lib/review/book/part.rb +44 -0
  56. data/lib/review/book/volume.rb +65 -0
  57. data/lib/review/builder.rb +444 -0
  58. data/lib/review/compiler.rb +550 -0
  59. data/lib/review/configure.rb +38 -0
  60. data/lib/review/epubbuilder.rb +18 -0
  61. data/lib/review/exception.rb +21 -0
  62. data/lib/review/extentions.rb +3 -0
  63. data/lib/review/extentions/object.rb +9 -0
  64. data/lib/review/extentions/string.rb +33 -0
  65. data/lib/review/htmlbuilder.rb +1097 -0
  66. data/lib/review/htmllayout.rb +19 -0
  67. data/lib/review/htmlutils.rb +36 -0
  68. data/lib/review/i18n.rb +30 -0
  69. data/lib/review/i18n.yaml +34 -0
  70. data/lib/review/idgxmlbuilder.rb +1145 -0
  71. data/lib/review/latexbuilder.rb +815 -0
  72. data/lib/review/latexindex.rb +35 -0
  73. data/lib/review/latexutils.rb +79 -0
  74. data/lib/review/preprocessor.rb +563 -0
  75. data/lib/review/review.tex.erb +232 -0
  76. data/lib/review/textbuilder.rb +17 -0
  77. data/lib/review/textutils.rb +66 -0
  78. data/lib/review/tocparser.rb +342 -0
  79. data/lib/review/tocprinter.rb +221 -0
  80. data/lib/review/topbuilder.rb +785 -0
  81. data/lib/review/unfold.rb +138 -0
  82. data/lib/uuid.rb +312 -0
  83. data/review.gemspec +141 -0
  84. data/test/CHAPS +2 -0
  85. data/test/bib.re +13 -0
  86. data/test/book_test_helper.rb +35 -0
  87. data/test/test.re +43 -0
  88. data/test/test_book.rb +598 -0
  89. data/test/test_book_chapter.rb +418 -0
  90. data/test/test_book_parameter.rb +42 -0
  91. data/test/test_book_part.rb +50 -0
  92. data/test/test_builder.rb +144 -0
  93. data/test/test_compiler.rb +44 -0
  94. data/test/test_epubmaker.rb +507 -0
  95. data/test/test_helper.rb +27 -0
  96. data/test/test_htmlbuilder.rb +554 -0
  97. data/test/test_htmlutils.rb +28 -0
  98. data/test/test_i18n.rb +64 -0
  99. data/test/test_idgxmlbuilder.rb +589 -0
  100. data/test/test_index.rb +31 -0
  101. data/test/test_latexbuilder.rb +656 -0
  102. data/test/test_lineinput.rb +198 -0
  103. data/test/test_preprocessor.rb +23 -0
  104. data/test/test_textutils.rb +68 -0
  105. data/test/test_topbuilder.rb +244 -0
  106. data/test/test_uuid.rb +156 -0
  107. metadata +161 -0
@@ -0,0 +1,81 @@
1
+ #
2
+ # $Id: book.rb 4315 2009-09-02 04:15:24Z kmuto $
3
+ #
4
+ # Copyright (c) 2002-2008 Minero Aoki
5
+ # 2009 Minero Aoki, Kenshi Muto
6
+ #
7
+ # This program is free software.
8
+ # You can distribute or modify this program under the terms of
9
+ # the GNU LGPL, Lesser General Public License version 2.1.
10
+ # For details of the GNU LGPL, see the file "COPYING".
11
+ #
12
+ require 'review/book/compilable'
13
+ module ReVIEW
14
+ module Book
15
+ class Chapter
16
+ include Compilable
17
+
18
+ def Chapter.intern_pathes(pathes)
19
+ books = {}
20
+ pathes.map {|path|
21
+ basedir = File.dirname(path)
22
+ book = (books[File.expand_path(basedir)] ||= Book.load(basedir))
23
+ begin
24
+ book.chapter(File.basename(path, '.*'))
25
+ rescue KeyError => err
26
+ raise FileNotFound, "no such file: #{path}"
27
+ end
28
+ }
29
+ end
30
+
31
+ def Chapter.for_stdin
32
+ new(nil, nil, '-', nil, $stdin)
33
+ end
34
+
35
+ def Chapter.for_path(number, path)
36
+ new(nil, number, File.basename(path), path)
37
+ end
38
+
39
+ attr_reader :number
40
+
41
+ def initialize(book, number, name, path, io = nil)
42
+ @book = book
43
+ @number = number
44
+ @name = name
45
+ @path = path
46
+ @io = io
47
+ @title = nil
48
+ @content = nil
49
+ @list_index = nil
50
+ @table_index = nil
51
+ @footnote_index = nil
52
+ @image_index = nil
53
+ @icon_index = nil
54
+ @numberless_image_index = nil
55
+ @indepimage_index = nil
56
+ @headline_index = nil
57
+ end
58
+
59
+ def inspect
60
+ "\#<#{self.class} #{@number} #{@path}>"
61
+ end
62
+
63
+ def on_CHAPS?
64
+ on_FILE?(@book.read_CHAPS())
65
+ end
66
+
67
+ def on_PREDEF?
68
+ on_FILE?(@book.read_PREDEF())
69
+ end
70
+
71
+ def on_POSTDEF?
72
+ on_FILE?(@book.read_POSTDEF())
73
+ end
74
+
75
+ private
76
+ def on_FILE?(contents)
77
+ contents.lines.map(&:strip).include?(id() + @book.ext())
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,159 @@
1
+ #
2
+ # $Id: book.rb 4315 2009-09-02 04:15:24Z kmuto $
3
+ #
4
+ # Copyright (c) 2002-2008 Minero Aoki
5
+ # 2009 Minero Aoki, Kenshi Muto
6
+ #
7
+ # This program is free software.
8
+ # You can distribute or modify this program under the terms of
9
+ # the GNU LGPL, Lesser General Public License version 2.1.
10
+ # For details of the GNU LGPL, see the file "COPYING".
11
+ #
12
+ require 'review/textutils'
13
+ module ReVIEW
14
+ module Book
15
+ module Compilable
16
+ include TextUtils
17
+ attr_reader :book
18
+ attr_reader :path
19
+
20
+ def env
21
+ @book
22
+ end
23
+
24
+ def dirname
25
+ return nil unless @path
26
+ File.dirname(@path)
27
+ end
28
+
29
+ def basename
30
+ return nil unless @path
31
+ File.basename(@path)
32
+ end
33
+
34
+ def name
35
+ File.basename(@name, '.*')
36
+ end
37
+
38
+ alias id name
39
+
40
+ def title
41
+ @title = ""
42
+ open {|f|
43
+ f.each_line {|l|
44
+ l = convert_inencoding(l, ReVIEW.book.param["inencoding"])
45
+ if l =~ /\A=+/
46
+ @title = l.sub(/\A=+/, '').strip
47
+ break
48
+ end
49
+ }
50
+ }
51
+ @title
52
+ end
53
+
54
+ def size
55
+ File.size(path())
56
+ end
57
+
58
+ def volume
59
+ @volume ||= Volume.count_file(path())
60
+ end
61
+
62
+ def open(&block)
63
+ return (block_given?() ? yield(@io) : @io) if @io
64
+ File.open(path(), &block)
65
+ end
66
+
67
+ def content
68
+ @content = convert_inencoding(File.read(path()),
69
+ ReVIEW.book.param["inencoding"])
70
+ end
71
+
72
+ def lines
73
+ # FIXME: we cannot duplicate Enumerator on ruby 1.9 HEAD
74
+ (@lines ||= content().lines.to_a).dup
75
+ end
76
+
77
+ def list(id)
78
+ list_index()[id]
79
+ end
80
+
81
+ def list_index
82
+ @list_index ||= ListIndex.parse(lines())
83
+ @list_index
84
+ end
85
+
86
+ def table(id)
87
+ table_index()[id]
88
+ end
89
+
90
+ def table_index
91
+ @table_index ||= TableIndex.parse(lines())
92
+ @table_index
93
+ end
94
+
95
+ def footnote(id)
96
+ footnote_index()[id]
97
+ end
98
+
99
+ def footnote_index
100
+ @footnote_index ||= FootnoteIndex.parse(lines())
101
+ @footnote_index
102
+ end
103
+
104
+ def image(id)
105
+ return image_index()[id] if image_index().has_key?(id)
106
+ return icon_index()[id] if icon_index().has_key?(id)
107
+ return numberless_image_index()[id] if numberless_image_index().has_key?(id)
108
+ indepimage_index()[id]
109
+ end
110
+
111
+ def numberless_image_index
112
+ @numberless_image_index ||=
113
+ NumberlessImageIndex.parse(lines(), id(),
114
+ "#{book.basedir}#{@book.image_dir}",
115
+ @book.image_types)
116
+ end
117
+
118
+ def image_index
119
+ @image_index ||= ImageIndex.parse(lines(), id(),
120
+ "#{book.basedir}#{@book.image_dir}",
121
+ @book.image_types)
122
+ @image_index
123
+ end
124
+
125
+ def icon_index
126
+ @icon_index ||= IconIndex.parse(lines(), id(),
127
+ "#{book.basedir}#{@book.image_dir}",
128
+ @book.image_types)
129
+ @icon_index
130
+ end
131
+
132
+ def indepimage_index
133
+ @indepimage_index ||=
134
+ IndepImageIndex.parse(lines(), id(),
135
+ "#{book.basedir}#{@book.image_dir}",
136
+ @book.image_types)
137
+ end
138
+
139
+ def bibpaper(id)
140
+ bibpaper_index()[id]
141
+ end
142
+
143
+ def bibpaper_index
144
+ raise FileNotFound, "no such bib file: #{@book.bib_file}" unless @book.bib_exist?
145
+ @bibpaper_index ||= BibpaperIndex.parse(@book.read_bib.lines.to_a)
146
+ @bibpaper_index
147
+ end
148
+
149
+ def headline(caption)
150
+ headline_index()[caption]
151
+ end
152
+
153
+ def headline_index
154
+ @headline_index ||= HeadlineIndex.parse(lines(), self)
155
+ end
156
+ end
157
+ end
158
+ end
159
+
@@ -0,0 +1,339 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2002-2007 Minero Aoki
4
+ # 2008-2009 Minero Aoki, Kenshi Muto
5
+ #
6
+ # This program is free software.
7
+ # You can distribute or modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ # For details of LGPL, see the file "COPYING".
10
+ #
11
+
12
+ require 'review/extentions'
13
+ require 'review/exception'
14
+
15
+ module ReVIEW
16
+ module Book
17
+ class Index
18
+ def Index.parse(src, *args)
19
+ items = []
20
+ seq = 1
21
+ src.grep(%r<^//#{item_type()}>) do |line|
22
+ if id = line.slice(/\[(.*?)\]/, 1)
23
+ items.push item_class().new(id, seq)
24
+ seq += 1
25
+ if id == ""
26
+ warn "warning: no ID of #{item_type()} in #{line}"
27
+ end
28
+ end
29
+ end
30
+ new(items, *args)
31
+ end
32
+
33
+ Item = Struct.new(:id, :number)
34
+
35
+ def Index.item_class
36
+ self::Item
37
+ end
38
+
39
+ include Enumerable
40
+
41
+ def item_type
42
+ self.class.item_type
43
+ end
44
+
45
+ def initialize(items)
46
+ @items = items
47
+ @index = {}
48
+ items.each do |i|
49
+ warn "warning: duplicate ID: #{i.id} (#{i})" unless @index[i.id].nil?
50
+ @index[i.id] = i
51
+ end
52
+ end
53
+
54
+ def [](id)
55
+ @index.fetch(id)
56
+ rescue
57
+ raise KeyError
58
+ end
59
+
60
+ def number(id)
61
+ @index.fetch(id).number.to_s
62
+ end
63
+
64
+ def each(&block)
65
+ @items.each(&block)
66
+ end
67
+
68
+ def has_key?(id)
69
+ return @index.has_key?(id)
70
+ end
71
+ end
72
+
73
+
74
+ class ChapterIndex < Index
75
+ def item_type
76
+ 'chapter'
77
+ end
78
+
79
+ def number(id)
80
+ chapter = @index.fetch(id)
81
+ if chapter.on_CHAPS?
82
+ "#{I18n.t("chapter", chapter.number)}"
83
+ elsif chapter.on_PREDEF?
84
+ "#{chapter.number}"
85
+ elsif chapter.on_POSTDEF?
86
+ "#{I18n.t("appendix", chapter.number)}"
87
+ end
88
+ end
89
+
90
+ def title(id)
91
+ @index.fetch(id).title
92
+ end
93
+
94
+ def display_string(id)
95
+ "#{number(id)}「#{title(id)}」"
96
+ end
97
+ end
98
+
99
+
100
+ class ListIndex < Index
101
+ def ListIndex.item_type
102
+ '(list|listnum)'
103
+ end
104
+ end
105
+
106
+
107
+ class TableIndex < Index
108
+ def TableIndex.item_type
109
+ 'table'
110
+ end
111
+ end
112
+
113
+
114
+ class FootnoteIndex < Index
115
+ Item = Struct.new(:id, :number, :content)
116
+
117
+ def FootnoteIndex.parse(src)
118
+ items = []
119
+ seq = 1
120
+ src.grep(%r<^//footnote>) do |line|
121
+ if m = /\[(.*?)\]\[(.*)\]/.match(line)
122
+ m1 = m[1].gsub(/\\(\])/){$1}
123
+ m2 = m[2].gsub(/\\(\])/){$1}
124
+ items.push Item.new(m1, seq, m2)
125
+ end
126
+ seq += 1
127
+ end
128
+ new(items)
129
+ end
130
+ end
131
+
132
+
133
+ class ImageIndex < Index
134
+ class Item
135
+ def initialize(id, number)
136
+ @id = id
137
+ @number = number
138
+ @pathes = nil
139
+ end
140
+
141
+ attr_reader :id
142
+ attr_reader :number
143
+ attr_writer :index # internal use only
144
+
145
+ def bound?
146
+ not pathes().empty?
147
+ end
148
+
149
+ def path
150
+ pathes().first
151
+ end
152
+
153
+ def pathes
154
+ @pathes ||= @index.find_pathes(id)
155
+ end
156
+ end
157
+
158
+ def ImageIndex.item_type
159
+ '(image|graph)'
160
+ end
161
+
162
+ def initialize(items, chapid, basedir, types)
163
+ super items
164
+ items.each do |i|
165
+ i.index = self
166
+ end
167
+ @chapid = chapid
168
+ @basedir = basedir
169
+ @types = types
170
+ end
171
+
172
+ # internal use only
173
+ def find_pathes(id)
174
+ if ReVIEW.book.param["subdirmode"]
175
+ re = /\A#{id}(?i:#{@types.join('|')})\z/x
176
+ entries().select {|ent| re =~ ent }\
177
+ .sort_by {|ent| @types.index(File.extname(ent).downcase) }\
178
+ .map {|ent| "#{@basedir}/#{@chapid}/#{ent}" }
179
+ elsif ReVIEW.book.param["singledirmode"]
180
+ re = /\A#{id}(?i:#{@types.join('|')})\z/x
181
+ entries().select {|ent| re =~ ent }\
182
+ .sort_by {|ent| @types.index(File.extname(ent).downcase) }\
183
+ .map {|ent| "#{@basedir}/#{ent}" }
184
+ else
185
+ re = /\A#{@chapid.gsub('+', '\\\+').gsub('-', '\\\-')}-#{id}(?i:#{@types.join('|')})\z/x
186
+ entries().select {|ent| re =~ ent }\
187
+ .sort_by {|ent| @types.index(File.extname(ent).downcase) }\
188
+ .map {|ent| "#{@basedir}/#{ent}" }
189
+ end
190
+ end
191
+
192
+ private
193
+
194
+ def entries
195
+ # @entries: do not cache for graph
196
+ if ReVIEW.book.param["subdirmode"]
197
+ @entries = Dir.entries(File.join(@basedir, @chapid))
198
+ else
199
+ @entries = Dir.entries(@basedir)
200
+ end
201
+ rescue Errno::ENOENT
202
+ @entries = []
203
+ end
204
+ end
205
+
206
+ class IconIndex < ImageIndex
207
+ def IconIndex.parse(src, *args)
208
+ items = []
209
+ seq = 1
210
+ src.grep(%r!@<icon>!) do |line|
211
+ line.gsub(/@<icon>\{(.+?)\}/) do |m|
212
+ items.push item_class().new($1, seq)
213
+ seq += 1
214
+ end
215
+ end
216
+ new(items, *args)
217
+ end
218
+ end
219
+
220
+ class FormatRef
221
+ def initialize(locale, index)
222
+ @locale = locale
223
+ @index = index
224
+ end
225
+
226
+ def title(id)
227
+ sprintf(@locale["#{@index.item_type}_caption_format".intern],
228
+ @index.title(id))
229
+ end
230
+
231
+ def number(id)
232
+ sprintf(@locale["#{@index.item_type}_number_format".intern],
233
+ @index.number(id))
234
+ end
235
+
236
+ def method_missing(mid, *args, &block)
237
+ super unless @index.respond_to?(mid)
238
+ @index.__send__(mid, *args, &block)
239
+ end
240
+ end
241
+
242
+ class BibpaperIndex < Index
243
+ Item = Struct.new(:id, :number, :caption)
244
+
245
+ def BibpaperIndex.parse(src)
246
+ items = []
247
+ seq = 1
248
+ src.grep(%r<^//bibpaper>) do |line|
249
+ if m = /\[(.*?)\]\[(.*)\]/.match(line)
250
+ m1 = m[1].gsub(/\\(.)/){$1}
251
+ m2 = m[2].gsub(/\\(.)/){$1}
252
+ items.push Item.new(m1, seq, m2)
253
+ end
254
+ seq += 1
255
+ end
256
+ new(items)
257
+ end
258
+ end
259
+
260
+ class NumberlessImageIndex < ImageIndex
261
+ class Item < ImageIndex::Item
262
+ def initialize(id, number)
263
+ @id = id
264
+ @number = ""
265
+ @pathes = nil
266
+ end
267
+ end
268
+
269
+ def NumberlessImageIndex.item_type
270
+ 'numberlessimage'
271
+ end
272
+
273
+ def number(id)
274
+ ""
275
+ end
276
+ end
277
+
278
+ class IndepImageIndex < ImageIndex
279
+ class Item < ImageIndex::Item
280
+ def initialize(id, number)
281
+ @id = id
282
+ @number = ""
283
+ @pathes = nil
284
+ end
285
+ end
286
+
287
+ def IndepImageIndex.item_type
288
+ 'indepimage'
289
+ end
290
+
291
+ def number(id)
292
+ ""
293
+ end
294
+ end
295
+
296
+ class HeadlineIndex < Index
297
+ Item = Struct.new(:id, :number, :caption)
298
+
299
+ def HeadlineIndex.parse(src, chap)
300
+ items = []
301
+ indexs = []
302
+ headlines = []
303
+ src.each do |line|
304
+ if m = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/.match(line)
305
+ next if m[2] == 'column'
306
+ index = m[1].size - 2
307
+ if index >= 0
308
+ if indexs.size > (index + 1)
309
+ indexs = indexs.take(index + 1)
310
+ headlines = headlines.take(index + 1)
311
+ end
312
+ if indexs[index].nil?
313
+ (0..index).each{|i| indexs[i] = 0 if indexs[i].nil?}
314
+ end
315
+ indexs[index] += 1
316
+ headlines[index] = m[4].strip
317
+ items.push Item.new(headlines.join("|"), indexs.dup, m[4].strip)
318
+ end
319
+ end
320
+ end
321
+ new(items, chap)
322
+ end
323
+
324
+ def initialize(items, chap)
325
+ @items = items
326
+ @chap = chap
327
+ @index = {}
328
+ items.each do |i|
329
+ warn "warning: duplicate ID: #{i.id}" unless @index[i.id].nil?
330
+ @index[i.id] = i
331
+ end
332
+ end
333
+
334
+ def number(id)
335
+ return ([@chap.number] + @index.fetch(id).number).join(".")
336
+ end
337
+ end
338
+ end
339
+ end