aozora2html 0.7.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/bin/aozora2html +3 -50
  3. data/lib/aozora2html.rb +0 -4
  4. data/lib/aozora2html/accent_parser.rb +91 -0
  5. data/lib/aozora2html/error.rb +16 -0
  6. data/lib/aozora2html/header.rb +139 -0
  7. data/lib/aozora2html/i18n.rb +17 -0
  8. data/lib/aozora2html/ruby_buffer.rb +81 -0
  9. data/lib/aozora2html/style_stack.rb +27 -0
  10. data/lib/aozora2html/tag.rb +55 -0
  11. data/lib/aozora2html/tag/accent.rb +39 -0
  12. data/lib/aozora2html/tag/block.rb +19 -0
  13. data/lib/aozora2html/tag/chitsuki.rb +15 -0
  14. data/lib/aozora2html/tag/dakuten_katakana.rb +23 -0
  15. data/lib/aozora2html/tag/decorate.rb +18 -0
  16. data/lib/aozora2html/tag/dir.rb +15 -0
  17. data/lib/aozora2html/tag/editor_note.rb +16 -0
  18. data/lib/aozora2html/tag/embed_gaiji.rb +48 -0
  19. data/lib/aozora2html/tag/font_size.rb +17 -0
  20. data/lib/aozora2html/tag/gaiji.rb +11 -0
  21. data/lib/aozora2html/tag/img.rb +21 -0
  22. data/lib/aozora2html/tag/indent.rb +8 -0
  23. data/lib/aozora2html/tag/inline.rb +13 -0
  24. data/lib/aozora2html/tag/inline_caption.rb +15 -0
  25. data/lib/aozora2html/tag/inline_font_size.rb +18 -0
  26. data/lib/aozora2html/tag/inline_keigakomi.rb +15 -0
  27. data/lib/aozora2html/tag/inline_yokogumi.rb +16 -0
  28. data/lib/aozora2html/tag/jisage.rb +15 -0
  29. data/lib/aozora2html/tag/jizume.rb +16 -0
  30. data/lib/aozora2html/tag/kaeriten.rb +15 -0
  31. data/lib/aozora2html/tag/keigakomi.rb +13 -0
  32. data/lib/aozora2html/tag/kunten.rb +12 -0
  33. data/lib/aozora2html/tag/midashi.rb +18 -0
  34. data/lib/aozora2html/tag/multiline.rb +6 -0
  35. data/lib/aozora2html/tag/multiline_caption.rb +15 -0
  36. data/lib/aozora2html/tag/multiline_chitsuki.rb +8 -0
  37. data/lib/aozora2html/tag/multiline_jisage.rb +8 -0
  38. data/lib/aozora2html/tag/multiline_midashi.rb +22 -0
  39. data/lib/aozora2html/tag/multiline_style.rb +17 -0
  40. data/lib/aozora2html/tag/multiline_yokogumi.rb +17 -0
  41. data/lib/aozora2html/tag/okurigana.rb +15 -0
  42. data/lib/aozora2html/tag/oneline_chitsuki.rb +9 -0
  43. data/lib/aozora2html/tag/oneline_indent.rb +2 -0
  44. data/lib/aozora2html/tag/oneline_jisage.rb +7 -0
  45. data/lib/aozora2html/tag/reference_mentioned.rb +46 -0
  46. data/lib/aozora2html/tag/ruby.rb +98 -0
  47. data/lib/aozora2html/tag/un_embed_gaiji.rb +24 -0
  48. data/lib/aozora2html/tag_parser.rb +53 -0
  49. data/lib/aozora2html/utils.rb +82 -0
  50. data/lib/aozora2html/version.rb +1 -1
  51. data/lib/aozora2html/yaml_loader.rb +31 -0
  52. data/lib/extensions.rb +31 -0
  53. data/lib/jstream.rb +68 -0
  54. data/lib/t2hs.rb +485 -1490
  55. data/test/test_aozora2html.rb +161 -57
  56. data/test/test_aozora_accent_parser.rb +13 -2
  57. data/test/test_command_parse.rb +213 -0
  58. data/test/test_dakuten_katakana_tag.rb +5 -4
  59. data/test/test_decorate_tag.rb +5 -4
  60. data/test/test_dir_tag.rb +5 -4
  61. data/test/test_editor_note_tag.rb +4 -4
  62. data/test/test_exception.rb +4 -4
  63. data/test/test_font_size_tag.rb +8 -7
  64. data/test/test_gaiji_tag.rb +14 -7
  65. data/test/test_header.rb +60 -0
  66. data/test/test_img_tag.rb +5 -4
  67. data/test/test_inline_caption_tag.rb +5 -4
  68. data/test/test_inline_font_size_tag.rb +7 -6
  69. data/test/test_inline_keigakomi_tag.rb +5 -4
  70. data/test/test_inline_yokogumi_tag.rb +5 -4
  71. data/test/test_jizume_tag.rb +7 -6
  72. data/test/test_jstream.rb +5 -5
  73. data/test/test_kaeriten_tag.rb +5 -4
  74. data/test/test_keigakomi_tag.rb +8 -7
  75. data/test/test_midashi_tag.rb +38 -0
  76. data/test/test_multiline_caption_tag.rb +7 -6
  77. data/test/test_multiline_midashi_tag.rb +12 -11
  78. data/test/test_multiline_style_tag.rb +7 -6
  79. data/test/test_multiline_yokogumi_tag.rb +7 -6
  80. data/test/test_okurigana_tag.rb +5 -4
  81. data/test/test_ruby_parse.rb +116 -0
  82. data/test/test_ruby_tag.rb +5 -4
  83. data/test/test_tag_parser.rb +10 -10
  84. data/yml/accent_table.yml +240 -0
  85. data/yml/command_table.yml +61 -0
  86. data/yml/jis2ucs.yml +11234 -0
  87. metadata +63 -6
  88. data/lib/accent_tag.rb +0 -23
  89. data/lib/aozora2html/jis2ucs.rb +0 -11237
  90. data/lib/embed_gaiji_tag.rb +0 -34
@@ -1,3 +1,3 @@
1
1
  class Aozora2Html
2
- VERSION = "0.7.1"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -0,0 +1,31 @@
1
+ require 'yaml'
2
+ class Aozora2Html
3
+ class YamlLoader
4
+ def initialize(base_dir)
5
+ @base_dir = base_dir
6
+ end
7
+
8
+ def load(path)
9
+ tmp_data = YAML.load_file(File.join(@base_dir, path))
10
+ normalize_data(tmp_data)
11
+ end
12
+
13
+ def normalize_data(data)
14
+ case data
15
+ when String
16
+ data.encode("shift_jis")
17
+ when Hash
18
+ new_data = {}
19
+ data.each do |k, v|
20
+ new_data[normalize_data(k)] = normalize_data(v)
21
+ end
22
+ new_data
23
+ when Array
24
+ data.map{|item| normalize_data(item)}
25
+ else
26
+ # noop
27
+ data
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ # 1.8 like to_s method to Array
3
+ class Array
4
+ def to_s
5
+ self.join
6
+ end
7
+ end
8
+
9
+ class String
10
+
11
+ # used in Aozora2Html#char_type
12
+ def char_type
13
+ ch = self
14
+ if ch.match(Regexp.new("[ぁ-んゝゞ]".encode("shift_jis")))
15
+ :hiragana
16
+ elsif ch.match(Regexp.new("[ァ-ンーヽヾヴ]".encode("shift_jis")))
17
+ :katakana
18
+ elsif ch.match(Regexp.new("[0-9A-Za-zΑ-Ωα-ωА-Яа-я−&’,.]".encode("shift_jis")))
19
+ :zenkaku
20
+ elsif ch.match(Regexp.new("[A-Za-z0-9#\\-\\&'\\,]".encode("shift_jis")))
21
+ :hankaku
22
+ elsif ch.match(Regexp.new("[亜-熙々※仝〆〇ヶ]".encode("shift_jis")))
23
+ :kanji
24
+ elsif ch.match(/[\.\;\"\?\!\)]/)
25
+ :hankaku_terminate
26
+ else
27
+ :else
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,68 @@
1
+ require "aozora2html/error"
2
+ require "aozora2html/i18n"
3
+
4
+ ##
5
+ # Stream class for reading a file.
6
+ #
7
+ # It's just a wrapper class of IO to read characters.
8
+ # when finished to read IO, return a symbol :eof.
9
+ # when found line terminator except CR+LF, exit.
10
+ #
11
+ class Jstream
12
+
13
+ attr_accessor :line
14
+
15
+ def initialize(file_io)
16
+ @line = 0
17
+ @entry = false
18
+ @file = file_io
19
+ begin
20
+ store_to_buffer
21
+ rescue Aozora2Html::Error => e
22
+ puts e.message(1)
23
+ if e.is_a?(Aozora2Html::Error)
24
+ exit(2)
25
+ end
26
+ end
27
+ end
28
+
29
+ def inspect
30
+ "#<jcode-stream input " + @file.inspect + ">"
31
+ end
32
+
33
+ def read_char
34
+ found = @buffer.shift
35
+ if @entry
36
+ @line += 1
37
+ @entry = false
38
+ end
39
+ if found
40
+ return found
41
+ end
42
+
43
+ begin
44
+ store_to_buffer
45
+ rescue EOFError
46
+ @buffer = [:eof]
47
+ end
48
+ "\r\n"
49
+ end
50
+
51
+ def peek_char(pos)
52
+ @buffer[pos] || "\r\n"
53
+ end
54
+
55
+ def close
56
+ @file.close
57
+ end
58
+
59
+ private
60
+ def store_to_buffer
61
+ if tmp = @file.readline.chomp!("\r\n")
62
+ @buffer = tmp.each_char.to_a
63
+ else
64
+ raise Aozora2Html::Error, Aozora2Html::I18n.t(:use_crlf)
65
+ end
66
+ @entry = true
67
+ end
68
+ end
@@ -1,958 +1,206 @@
1
1
  # -*- coding:shift_jis -*-
2
2
  # �‹󕶌Ɍ`���̃e�L�X�g�t�@�C���� html �ɐ��`���� ruby �X�N���v�g
3
3
  require "cgi"
4
+ require "extensions"
5
+ require "aozora2html/error"
6
+ require "jstream"
7
+ require "aozora2html/tag"
8
+ require "aozora2html/tag_parser"
9
+ require "aozora2html/accent_parser"
10
+ require "aozora2html/style_stack"
11
+ require "aozora2html/header"
12
+ require "aozora2html/ruby_buffer"
13
+ require "aozora2html/yaml_loader"
14
+ require "aozora2html/zip"
15
+ require "aozora2html/utils"
4
16
 
5
17
  $gaiji_dir = "../../../gaiji/"
6
18
 
7
19
  $css_files = Array["../../aozora.css"]
8
20
 
9
- # 1.8 like to_s method to Array
10
- class Array
11
- def to_s
12
- self.join
13
- end
14
- end
15
-
16
- # ��Oclass
17
- class Aozora_Exception < Exception
18
- def initialize (message)
19
- @message=message
20
- end
21
- end
22
-
23
- class Aozora_Error < Aozora_Exception
24
- def message (line)
25
- "�G���[(#{line}�s��):#{@message}. \r\n�������~���܂�"
26
- end
27
- end
28
-
29
- class Jstream
30
- attr_accessor :line
31
- def store_to_buffer
32
- if tmp = @file.readline.chomp!("\r\n")
33
- @buffer = tmp.each_char.to_a
34
- else
35
- raise Aozora_Error.new("���s�R�[�h���A�uCR+LF�v�ɂ��炽�߂Ă�������")
36
- end
37
- @entry = true
38
- end
39
- def initialize (file_io)
40
- @line = 0
41
- @entry = false
42
- @file = file_io
43
- begin
44
- store_to_buffer
45
- rescue Aozora_Exception => e
46
- puts e.message(1)
47
- if e.is_a?(Aozora_Error)
48
- exit(2)
49
- end
50
- end
51
- end
52
- def inspect
53
- "#<jcode-stream input " + @file.inspect + ">"
54
- end
55
- def read_char
56
- found = @buffer.shift
57
- if @entry
58
- @line = @line + 1
59
- @entry = false
60
- end
61
- if found
62
- found
63
- else
64
- begin
65
- store_to_buffer
66
- "\r\n"
67
- rescue EOFError
68
- @buffer = [:eof]
69
- "\r\n"
70
- end
71
- end
72
- end
73
- def peek_char (pos)
74
- found = @buffer[pos]
75
- if found
76
- found
77
- else
78
- "\r\n"
79
- end
80
- end
81
- def close
82
- @file.close
83
- end
84
- end
85
-
86
- # �ϊ������‹�L�@class
87
- class Aozora_tag
88
- # debug�p
89
- def inspect
90
- to_s
91
- end
92
-
93
- def syntax_error
94
- raise Aozora_Error.new("���L���d�˂�ۂ̌����A�u�����͈͂��ɁA�L���͈͂���Ɂv������Ă��܂���B�����N��̎w�j���Q�l�ɁA�����������炽�߂Ă�������")
95
- end
96
- end
97
-
98
- # �S�Ă̐‹�L�@��HTML element�ɕϊ������
99
- # ���������āAblock/inline�̋�ʂ�����
100
- # �S�Ă̖��[�‹�class�͂ǂ��炩��module��include����K�v������
101
- module Inline_tag
102
- def initialize (*args)
103
- true
104
- end
105
- end
106
-
107
- module Block_tag
108
- # �K�v�Ɋ�Â�method override����
109
- def close_tag
110
- "</div>"
111
- end
112
- def initialize (parser, *args)
113
- if parser.block_allowed_context?
114
- nil
115
- else
116
- syntax_error
117
- end
118
- end
119
- end
120
-
121
- class Accent_tag < Aozora_tag
122
- include Inline_tag
123
- def initialize (parser, code, name)
124
- @code = code
125
- @name = name
126
- super
127
- end
128
- def to_s
129
- "<img src=\"#{$gaiji_dir}#{@code}.png\" alt=\"��(#{@name})\" class=\"gaiji\" />"
130
- end
131
- end
132
-
133
- class Gaiji_tag < Aozora_tag
134
- include Inline_tag
135
- end
136
-
137
- class Embed_Gaiji_tag < Gaiji_tag
138
- def initialize (parser, folder, code, name)
139
- @folder = folder
140
- @code = code
141
- @name = name
142
- super
143
- end
144
- def to_s
145
- "<img src=\"#{$gaiji_dir}#{@folder}/#{@code}.png\" alt=\"��(#{@name})\" class=\"gaiji\" />"
146
- end
147
- end
148
-
149
- class UnEmbed_Gaiji_tag < Gaiji_tag
150
- def initialize (parser, desc)
151
- @desc = desc; @escaped = false
152
- super
153
- end
154
- def to_s
155
- '<span class="notes">�m' + @desc + '�n</span>'
156
- end
157
- def escaped?
158
- @escaped
159
- end
160
- def escape!
161
- @escaped = true
162
- end
163
- end
164
-
165
- class Editor_note_tag < Aozora_tag
166
- include Inline_tag
167
- def initialize (parser, desc)
168
- @desc = desc
169
- super
170
- end
171
- def to_s
172
- '<span class="notes">�m��' + @desc + '�n</span>'
173
- end
174
- end
175
-
176
- class Indent_tag < Aozora_tag
177
- include Block_tag
178
- end
179
-
180
- module Oneline_Indent_tag
181
- end
182
-
183
- module Multiline_tag
184
- end
185
-
186
- class Multiline_style_tag < Aozora_tag
187
- include Block_tag, Multiline_tag
188
- def initialize (parser, style)
189
- @style = style
190
- super
191
- end
192
- def to_s
193
- "<div class=\"#{@style}\">"
194
- end
195
- end
196
-
197
- class Font_size_tag < Aozora_tag
198
- include Block_tag, Multiline_tag
199
- def initialize (parser, times, daisho)
200
- @class = daisho.to_s + times.to_s
201
- @style = case times
202
- when 1
203
- ""
204
- when 2
205
- "x-"
206
- else
207
- if times >= 3
208
- "xx-"
209
- else
210
- raise Aozora_Error.new("�����T�C�Y�̎w�肪�s���ł�")
211
- end
212
- end + case daisho
213
- when :dai
214
- "large"
215
- when :sho
216
- "small"
217
- end
218
- super
219
- end
220
- def to_s
221
- "<div class=\"#{@class}\" style=\"font-size: #{@style};\">"
222
- end
223
- end
224
-
225
- class Jizume_tag < Indent_tag
226
- include Multiline_tag
227
- def initialize (parser, width)
228
- @w = width
229
- super
230
- end
231
- def to_s
232
- "<div class=\"jizume_#{@w}\" style=\"width: #{@w}em\">"
233
- end
234
- end
235
-
236
- class Keigakomi_tag < Aozora_tag
237
- include Block_tag, Multiline_tag
238
- def initialize (parser, size = 1)
239
- @size = size
240
- super
241
- end
242
- def to_s
243
- "<div class=\"keigakomi\" style=\"border: solid #{@size}px\">"
244
- end
245
- end
246
-
247
- class Multiline_yokogumi_tag < Aozora_tag
248
- include Block_tag, Multiline_tag
249
- def initialize (parser)
250
- super
251
- end
252
- def to_s
253
- "<div class=\"yokogumi\">"
254
- end
255
- end
256
-
257
- class Multiline_caption_tag < Aozora_tag
258
- include Block_tag, Multiline_tag
259
- def initialize (parser)
260
- super
261
- end
262
- def to_s
263
- "<div class=\"caption\">"
264
- end
265
- end
266
-
267
- class Multiline_midashi_tag < Aozora_tag
268
- include Block_tag, Multiline_tag
269
- def initialize (parser,size,type)
270
- super
271
- @tag = if size.match("��")
272
- @id = parser.new_midashi_id(1)
273
- "h5"
274
- elsif size.match("��")
275
- @id = parser.new_midashi_id(10)
276
- "h4"
277
- elsif size.match("��")
278
- @id = parser.new_midashi_id(100)
279
- "h3"
280
- else
281
- raise Aozora_Error.new("����`�Ȍ��o���ł�")
282
- end
283
- @class = case type
284
- when :normal
285
- case @tag
286
- when "h5"
287
- "ko-midashi"
288
- when "h4"
289
- "naka-midashi"
290
- when "h3"
291
- "o-midashi"
292
- end
293
- when :dogyo
294
- case @tag
295
- when "h5"
296
- "dogyo-ko-midashi"
297
- when "h4"
298
- "dogyo-naka-midashi"
299
- when "h3"
300
- "dogyo-o-midashi"
301
- end
302
- when :mado
303
- case @tag
304
- when "h5"
305
- "mado-ko-midashi"
306
- when "h4"
307
- "mado-naka-midashi"
308
- when "h3"
309
- "mado-o-midashi"
310
- end
311
- else
312
- raise Aozora_Error.new("����`�Ȍ��o���ł�")
313
- end
314
- end
315
- def to_s
316
- "<#{@tag} class=\"#{@class}\"><a class=\"midashi_anchor\" id=\"midashi#{@id}\">"
317
- end
318
- def close_tag
319
- "</a></#{@tag}>"
320
- end
321
- end
322
-
323
- class Jisage_tag < Indent_tag
324
- def initialize (parser, width)
325
- @width = width
326
- super
327
- end
328
- def to_s
329
- "<div class=\"jisage_#{@width}\" style=\"margin-left: #{@width}em\">"
330
- end
331
- end
332
-
333
- class Oneline_Jisage_tag < Jisage_tag
334
- include Oneline_Indent_tag
335
- end
336
- class Multiline_Jisage_tag < Jisage_tag
337
- include Multiline_tag
338
- end
339
-
340
- class Chitsuki_tag < Indent_tag
341
- def initialize (parser, length)
342
- @length = length
343
- super
344
- end
345
- def to_s
346
- '<div class="chitsuki_' + @length + '" style="text-align:right; margin-right: ' + @length + 'em">'
347
- end
348
- end
349
-
350
- class Oneline_Chitsuki_tag < Chitsuki_tag
351
- include Oneline_Indent_tag
352
- end
353
-
354
-
355
- class Multiline_Chitsuki_tag < Chitsuki_tag
356
- include Multiline_tag
357
- end
21
+ # �ϊ���{��
22
+ class Aozora2Html
358
23
 
359
- # �O���Q�Ƃł����‚����͒��g���`�F�b�N����
360
- # �q�v�f������Inline_tag�͑S�Ă����‚̃T�u�N���X
361
- class Reference_mentioned_tag < Aozora_tag
362
- include Inline_tag
363
- attr_accessor :target
364
- def block_element? (elt)
365
- if elt.is_a?(Array)
366
- elt.each{|x|
367
- if block_element?(x)
368
- return true
369
- end
370
- }
371
- nil
372
- elsif elt.is_a?(String)
373
- elt.match(/<div/)
374
- else
375
- elt.is_a?(Block_tag)
376
- end
377
- end
378
- def initialize (*args)
379
- if block_element?(@target)
380
- syntax_error
381
- end
382
- end
383
- def target_string
384
- if @target.is_a?(Reference_mentioned_tag)
385
- @target.target_string
386
- elsif @target.is_a?(Array)
387
- @target.collect{|x|
388
- if x.is_a?(Reference_mentioned_tag)
389
- x.target_string
390
- else
391
- x
392
- end}.to_s
393
- else
394
- @target
395
- end
396
- end
397
- end
24
+ # �Sp�o�b�N�X���b�V�����o���Ȃ����璼�ł�
25
+ KU = ["18e5"].pack("h*").force_encoding("shift_jis")
26
+ NOJI = ["18f5"].pack("h*").force_encoding("shift_jis")
27
+ DAKUTEN = ["18d8"].pack("h*").force_encoding("shift_jis")
28
+ GAIJI_MARK = "��"
29
+ SIZE_SMALL = "��"
30
+ SIZE_MIDDLE = "��"
31
+ SIZE_LARGE = "��"
32
+ AOZORABUNKO = "�‹󕶌�"
33
+ #PAT_EDITOR = /[�Z��|��|�ҏW|�ҏW�Z��|�Z���ҏW]$/
34
+ PAT_EDITOR = /(�Z��|��|�ҏW|�ҏW�Z��|�Z���ҏW)$/
35
+ PAT_HENYAKU = /�Җ�$/
36
+ PAT_TRANSLATOR = /��$/
37
+ RUBY_PREFIX = "�b"
38
+
39
+ # KUNOJI = ["18e518f5"].pack("h*")
40
+ # utf8 ["fecbf8fecbcb"].pack("h*")
41
+ # DAKUTENKUNOJI = ["18e518d818f5"].pack("h*")
42
+ # utf8 ["fecbf82e083bfecbcb"].pack("h*")
398
43
 
399
- class Midashi_tag < Reference_mentioned_tag
400
- def initialize (parser,target,size,type)
401
- super
402
- @target = target
403
- @tag = if size.match("��")
404
- @id = parser.new_midashi_id(1)
405
- "h5"
406
- elsif size.match("��")
407
- @id = parser.new_midashi_id(10)
408
- "h4"
409
- elsif size.match("��")
410
- @id = parser.new_midashi_id(100)
411
- "h3"
412
- else
413
- raise Aozora_Error.new("����`�Ȍ��o���ł�")
414
- end
415
- @class = case type
416
- when :normal
417
- case @tag
418
- when "h5"
419
- "ko-midashi"
420
- when "h4"
421
- "naka-midashi"
422
- when "h3"
423
- "o-midashi"
424
- end
425
- when :dogyo
426
- case @tag
427
- when "h5"
428
- "dogyo-ko-midashi"
429
- when "h4"
430
- "dogyo-naka-midashi"
431
- when "h3"
432
- "dogyo-o-midashi"
433
- end
434
- when :mado
435
- case @tag
436
- when "h5"
437
- "mado-ko-midashi"
438
- when "h4"
439
- "mado-naka-midashi"
440
- when "h3"
441
- "mado-o-midashi"
442
- end
443
- else
444
- raise Aozora_Error.new("����`�Ȍ��o���ł�")
445
- end
446
- end
447
- def to_s
448
- "<#{@tag} class=\"#{@class}\"><a class=\"midashi_anchor\" id=\"midashi#{@id}\">#{@target}</a></#{@tag}>"
449
- end
450
- end
44
+ loader = Aozora2Html::YamlLoader.new(File.dirname(__FILE__))
45
+ ACCENT_TABLE = loader.load("../yml/accent_table.yml")
451
46
 
452
- # complex ruby markup
453
- # if css3 is major supported, please fix ruby position with property "ruby-position"
454
- # see also: http://www.w3.org/TR/2001/WD-css3-ruby-20010216/
455
- class Ruby_tag < Reference_mentioned_tag
456
- attr_accessor :ruby, :under_ruby
457
- def initialize (parser, string, ruby, under_ruby = "")
458
- @target = string; @ruby = ruby; @under_ruby = under_ruby
459
- super
460
- end
461
-
462
- def gen_rt (string)
463
- if string != ""
464
- "<rt class=\"real_ruby\">#{string}</rt>"
465
- else
466
- "<rt class=\"dummy_ruby\"></rt>"
467
- end
468
- end
47
+ # [class, tag]
48
+ COMMAND_TABLE = loader.load("../yml/command_table.yml")
49
+ JIS2UCS = loader.load("../yml/jis2ucs.yml")
50
+
51
+ INDENT_TYPE = {
52
+ :jisage => "������",
53
+ :chitsuki => "�n�t��",
54
+ :midashi => "���o��",
55
+ :jizume => "���l��",
56
+ :yokogumi => "���g��",
57
+ :keigakomi => "�r�͂�",
58
+ :caption => "�L���v�V����",
59
+ :futoji => "����",
60
+ :shatai => "�Α�",
61
+ :dai => "�傫�ȕ���",
62
+ :sho => "�����ȕ���",
63
+ }
469
64
 
470
- def to_s
471
- "<ruby><rb>#{@target.to_s}</rb><rp>�i</rp><rt>#{@ruby.to_s}</rt><rp>�j</rp></ruby>"
472
- end
65
+ DAKUTEN_KATAKANA_TABLE = {
66
+ "2" => "���J",
67
+ "3" => "���J",
68
+ "4" => "���J",
69
+ "5" => "���J",
70
+ }
473
71
 
474
- # complex ruby is waiting for IE support and CSS3 candidate
475
- =begin
476
- def to_s
477
- ans = "<ruby class=\"complex_ruby\"><rbc>" # indicator of new version of aozora ruby
478
- if @ruby.is_a?(Array) and @ruby.length > 0
479
- # cell is used
480
- @rbspan = @ruby.length
481
- end
482
- if @under_ruby.is_a?(Array) and @under_ruby.length > 0
483
- # cell is used, but two way cell is not supported
484
- if @rbspan
485
- raise Aozora_Error.new("�T�|�[�g����Ă��Ȃ����G�ȃ��r�t���ł�")
486
- else
487
- @rbspan = @under_ruby.length
488
- end
489
- end
490
-
491
- # target
492
- if @rbspan
493
- @target.each{|x|
494
- ans.concat("<rb>#{x.to_s}</rb>")
495
- }
72
+ def initialize(input, output)
73
+ if input.respond_to?(:read) ## readable IO?
74
+ @stream = Jstream.new(input)
496
75
  else
497
- ans.concat("<rb>#{@target.to_s}</rb>")
76
+ @stream = Jstream.new(File.open(input,"rb:Shift_JIS"))
498
77
  end
499
-
500
- ans.concat("</rbc><rtc>")
501
-
502
- # upper ruby
503
- if @ruby.is_a?(Array)
504
- @ruby.each{|x|
505
- ans.concat(gen_rt(x))
506
- }
507
- elsif @rbspan
508
- if @ruby != ""
509
- ans.concat("<rt class=\"real_ruby\" rbspan=\"#{@rbspan}\">#{@ruby}</rt>")
510
- else
511
- ans.concat("<rt class=\"dummy_ruby\" rbspan=\"#{@rbspan}\"></rt>")
512
- end
78
+ if output.respond_to?(:print) ## writable IO?
79
+ @out = output
513
80
  else
514
- ans.concat(gen_rt(@ruby))
515
- end
516
-
517
- ans.concat("</rtc>")
518
-
519
- # under_ruby (if exists)
520
- if @under_ruby.length > 0
521
- ans.concat("<rtc>")
522
- if @under_ruby.is_a?(Array)
523
- @under_ruby.each{|x|
524
- ans.concat(gen_rt(x))
525
- }
526
- elsif @rbspan
527
- ans.concat("<rt class=\"real_ruby\" rbspan=\"#{@rbspan}\">#{@under_ruby}</rt>")
528
- else
529
- ans.concat(gen_rt(@under_ruby))
530
- end
531
- ans.concat("</rtc>")
532
- end
533
-
534
- # finalize
535
- ans.concat("</ruby>")
536
-
537
- ans
538
- end
539
- =end
540
- end
541
-
542
- class Kunten_tag < Aozora_tag
543
- include Inline_tag
544
- end
545
-
546
- class Kaeriten_tag < Kunten_tag
547
- def initialize (parser, string)
548
- @string = string
549
- super
550
- end
551
- def to_s
552
- "<sub class=\"kaeriten\">#{@string.to_s}</sub>"
553
- end
554
- end
555
-
556
- class Okurigana_tag < Kunten_tag
557
- def initialize (parser, string)
558
- @string = string
559
- super
560
- end
561
- def to_s
562
- "<sup class=\"okurigana\">#{@string.to_s}</sup>"
563
- end
564
- end
565
-
566
- class Inline_keigakomi_tag < Reference_mentioned_tag
567
- def initialize (parser, target)
568
- @target = target
569
- super
570
- end
571
- def to_s
572
- "<span class=\"keigakomi\">#{@target.to_s}</span>"
573
- end
574
- end
575
-
576
- class Inline_yokogumi_tag < Reference_mentioned_tag
577
- def initialize (parser, target)
578
- @target = target
579
- super
580
- end
581
- def to_s
582
- "<span class=\"yokogumi\">#{@target.to_s}</span>"
583
- end
584
- end
585
-
586
- class Inline_caption_tag < Reference_mentioned_tag
587
- def initialize (parser, target)
588
- @target = target
589
- super
590
- end
591
- def to_s
592
- "<span class=\"caption\">#{@target.to_s}</span>"
593
- end
594
- end
595
-
596
- class Inline_font_size_tag < Reference_mentioned_tag
597
- def initialize (parser, target, times, daisho)
598
- @target = target
599
- @class = daisho.to_s + times.to_s
600
- @style = case times
601
- when 1
602
- ""
603
- when 2
604
- "x-"
605
- else
606
- if times >= 3
607
- "xx-"
608
- else
609
- raise Aozora_Error.new("�����T�C�Y�̎w�肪�s���ł�")
610
- end
611
- end + case daisho
612
- when :dai
613
- "large"
614
- when :sho
615
- "small"
616
- end
617
- super
618
- end
619
- def to_s
620
- "<span class=\"#{@class}\" style=\"font-size: #{@style};\">" + @target.to_s + "</span>"
621
- end
622
- end
623
-
624
- class Decorate_tag < Reference_mentioned_tag
625
- def initialize (parser, target, html_class, html_tag)
626
- @target = target; @close = "</#{html_tag}>"
627
- @open = "<#{html_tag} class=\"#{html_class}\">"
628
- super
629
- end
630
- def to_s
631
- @open+@target.to_s+@close
632
- end
633
- end
634
-
635
- class Dakuten_katakana_tag < Aozora_tag
636
- include Inline_tag
637
- def initialize (parser, n, katakana)
638
- @n = n; @katakana = katakana
639
- super
640
- end
641
- def to_s
642
- "<img src=\"#{$gaiji_dir}/1-07/1-07-8#{@n}.png\" alt=\"��(���_�t���Љ����u#{@katakana}�v�A1-07-8#{@n})\" class=\"gaiji\" />"
643
- end
644
- end
645
-
646
- class Dir_tag < Reference_mentioned_tag
647
- def initialize (parser, target)
648
- @target = target
649
- super
650
- end
651
- def to_s
652
- "<span dir=\"ltr\">#{@target.to_s}</span>"
653
- end
654
- end
655
-
656
- class Img_tag < Aozora_tag
657
- include Inline_tag
658
- def initialize (parser, filename, css_class, alt, width, height)
659
- @filename = filename; @css_class = css_class; @alt = alt; @width = width; @height = height
660
- super
661
- end
662
- def to_s
663
- "<img class=\"#{@css_class}\" width=\"#{@width}\" height=\"#{@height}\" src=\"#{@filename}\" alt=\"#{@alt}\" />"
664
- end
665
- end
666
-
667
- # tag��`�I���
668
-
669
- # �ϊ���{��
670
- class Aozora2Html
671
- # �S�p�o�b�N�X���b�V�����o���Ȃ����璼�ł�
672
- @@ku = ["18e5"].pack("h*").force_encoding("shift_jis")
673
- @@noji = ["18f5"].pack("h*").force_encoding("shift_jis")
674
- @@dakuten = ["18d8"].pack("h*").force_encoding("shift_jis")
675
- # @@kunoji = ["18e518f5"].pack("h*")
676
- # utf8 ["fecbf8fecbcb"].pack("h*")
677
- # @@dakutenkunoji = ["18e518d818f5"].pack("h*")
678
- # utf8 ["fecbf82e083bfecbcb"].pack("h*")
679
- @@accent_table = {
680
- "!"=>{
681
- "@"=>["1-09/1-09-03","�t���Q��"]
682
- },
683
- "?"=>{
684
- "@"=>["1-09/1-09-22","�t�^�╄"]
685
- },
686
- "A"=>{
687
- "`"=>["1-09/1-09-23","�O���[�u�A�N�Z���g�t��A"],
688
- "'"=>["1-09/1-09-24","�A�L���[�g�A�N�Z���g�t��A"],
689
- "^"=>["1-09/1-09-25","�T�[�J���t���b�N�X�A�N�Z���g�t��"],
690
- "~"=>["1-09/1-09-26","�`���h�t��A"],
691
- ":"=>["1-09/1-09-27","�_�C�G���V�X�t��A"],
692
- "&"=>["1-09/1-09-28","�ナ���O�t��A"],
693
- "_"=>["1-09/1-09-85","�}�N�����t��A"],
694
- "E"=>{"&"=>["1-09/1-09-29","���K�`��AE"]}
695
- },
696
- "C"=>{
697
- ","=>["1-09/1-09-30","�Z�f�B���t��C"]
698
- },
699
- "E"=>{
700
- "`"=>["1-09/1-09-31","�O���[�u�A�N�Z���g�t��E"],
701
- "'"=>["1-09/1-09-32","�A�L���[�g�A�N�Z���g�t��E"],
702
- "^"=>["1-09/1-09-33","�T�[�J���t���b�N�X�A�N�Z���g�t��E"],
703
- ":"=>["1-09/1-09-34","�_�C�G���V�X�t��E"],
704
- "_"=>["1-09/1-09-88","�}�N�����t��E"]
705
- },
706
- "I"=>{
707
- "`"=>["1-09/1-09-35","�O���[�u�A�N�Z���g�t��I"],
708
- "'"=>["1-09/1-09-36","�A�L���[�g�A�N�Z���g�t��I"],
709
- "^"=>["1-09/1-09-37","�T�[�J���t���b�N�X�A�N�Z���g�t��I"],
710
- ":"=>["1-09/1-09-38","�_�C�G���V�X�t��I"],
711
- "_"=>["1-09/1-09-86","�}�N�����t��I"]
712
- },
713
- "N"=>{
714
- "~"=>["1-09/1-09-40","�`���h�t��N"]
715
- },
716
- "O"=>{
717
- "`"=>["1-09/1-09-41","�O���[�u�A�N�Z���g�t��O"],
718
- "'"=>["1-09/1-09-42","�A�L���[�g�A�N�Z���g�t��O"],
719
- "^"=>["1-09/1-09-43","�T�[�J���t���b�N�X�A�N�Z���g�t��O"],
720
- "~"=>["1-09/1-09-44","�`���h�t��O"],
721
- ":"=>["1-09/1-09-45","�_�C�G���V�X�t��O"],
722
- "/"=>["1-09/1-09-46","�X�g���[�N�t��O"],
723
- "_"=>["1-09/1-09-89","�}�N�����t��O"],
724
- "E"=>{"&"=>["1-11/1-11-11","���K�`��OE�啶��"]}
725
- },
726
- "U"=>{
727
- "`"=>["1-09/1-09-47","�O���[�u�A�N�Z���g�t��U"],
728
- "'"=>["1-09/1-09-48","�A�L���[�g�A�N�Z���g�t��U"],
729
- "^"=>["1-09/1-09-49","�T�[�J���t���b�N�X�A�N�Z���g�t��U"],
730
- ":"=>["1-09/1-09-50","�_�C�G���V�X�t��U"],
731
- "_"=>["1-09/1-09-87","�}�N�����t��U"]
732
- },
733
- "Y"=>{
734
- "'"=>["1-09/1-09-51","�A�L���[�g�A�N�Z���g�t��Y"]
735
- },
736
- "s"=>{
737
- "&"=>["1-09/1-09-53","�h�C�c��G�X�c�F�b�g"]
738
- },
739
- "a"=>{
740
- "`"=>["1-09/1-09-54","�O���[�u�A�N�Z���g�t��A������"],
741
- "'"=>["1-09/1-09-55","�A�L���[�g�A�N�Z���g�t��A������"],
742
- "^"=>["1-09/1-09-56","�T�[�J���t���b�N�X�A�N�Z���g�t��A������"],
743
- "~"=>["1-09/1-09-57","�`���h�t��A������"],
744
- ":"=>["1-09/1-09-58","�_�C�G���V�X�t��A������"],
745
- "&"=>["1-09/1-09-59","�ナ���O�t��A������"],
746
- "_"=>["1-09/1-09-90","�}�N�����t��A������"],
747
- "e"=>{"&"=>["1-09/1-09-60","���K�`��AE������"]}
748
- },
749
- "c"=>{
750
- ","=>["1-09/1-09-61","�Z�f�B���t��C������"]
751
- },
752
- "e"=>{
753
- "`"=>["1-09/1-09-62","�O���[�u�A�N�Z���g�t��E������"],
754
- "'"=>["1-09/1-09-63","�A�L���[�g�A�N�Z���g�t��E������"],
755
- "^"=>["1-09/1-09-64","�T�[�J���t���b�N�X�A�N�Z���g�t��E������"],
756
- ":"=>["1-09/1-09-65","�_�C�G���V�X�t��E������"],
757
- "_"=>["1-09/1-09-93","�}�N�����t��E������"]
758
- },
759
- "i"=>{
760
- "`"=>["1-09/1-09-66","�O���[�u�A�N�Z���g�t��I������"],
761
- "'"=>["1-09/1-09-67","�A�L���[�g�A�N�Z���g�t��I������"],
762
- "^"=>["1-09/1-09-68","�T�[�J���t���b�N�X�A�N�Z���g�t��I������"],
763
- ":"=>["1-09/1-09-69","�_�C�G���V�X�t��I������"],
764
- "_"=>["1-09/1-09-91","�}�N�����t��I������"]
765
- },
766
- "n"=>{
767
- "~"=>["1-09/1-09-71","�`���h�t��N������"]
768
- },
769
- "o"=>{
770
- "`"=>["1-09/1-09-72","�O���[�u�A�N�Z���g�t��O������"],
771
- "'"=>["1-09/1-09-73","�A�L���[�g�A�N�Z���g�t��O������"],
772
- "^"=>["1-09/1-09-74","�T�[�J���t���b�N�X�A�N�Z���g�t��O������"],
773
- "~"=>["1-09/1-09-75","�`���h�t��O������"],
774
- ":"=>["1-09/1-09-76","�_�C�G���V�X�t��O������"],
775
- "_"=>["1-09/1-09-94","�}�N�����t��O������"],
776
- "/"=>["1-09/1-09-77","�X�g���[�N�t��O������"],
777
- "e"=>{"&"=>["1-11/1-11-10","���K�`��OE������"]}
778
- },
779
- "u"=>{
780
- "`"=>["1-09/1-09-78","�O���[�u�A�N�Z���g�t��U������"],
781
- "'"=>["1-09/1-09-79","�A�L���[�g�A�N�Z���g�t��U������"],
782
- "^"=>["1-09/1-09-80","�T�[�J���t���b�N�X�A�N�Z���g�t��U������"],
783
- "_"=>["1-09/1-09-92","�}�N�����t��U������"],
784
- ":"=>["1-09/1-09-81","�_�C�G���V�X�t��U������"]
785
- },
786
- "y"=>{
787
- "'"=>["1-09/1-09-82","�A�L���[�g�A�N�Z���g�t��Y������"],
788
- ":"=>["1-09/1-09-84","�_�C�G���V�X�t��Y������"]
789
- }
790
- }
791
- # [class, tag]
792
- @@command_table = {
793
- "�T�_" => ["sesame_dot","em"],
794
- "���S�}�T�_" => ["white_sesame_dot","em"],
795
- "�ۖT�_" => ["black_circle","em"],
796
- "���ۖT�_" => ["white_circle","em"],
797
- "���O�p�T�_" => ["black_up-pointing_triangle","em"],
798
- "���O�p�T�_" => ["white_up-pointing_triangle","em"],
799
- "��d�ۖT�_" => ["bullseye","em"],
800
- "�ւ̖ږT�_" => ["fisheye","em"],
801
- "�΂–T�_" => ["saltire", "em"],
802
- "�T��"=> ["underline_solid","em"],
803
- "��d�T��"=> ["underline_double","em"],
804
- "����"=> ["underline_dotted","em"],
805
- "�j��"=> ["underline_dashed","em"],
806
- "�g��"=> ["underline_wave","em"],
807
- "����"=> ["futoji","span"],
808
- "�Α�"=> ["shatai","span"],
809
- "���t��������"=>["subscript","sub"],
810
- "��t��������"=>["superscript","sup"],
811
- "�s�E������"=>["superscript","sup"],
812
- "�s��������"=>["subscript","sub"]
813
- }
814
- def initialize (input, output)
815
- @stream = Jstream.new(File.open(input,"rb:Shift_JIS"))
816
- @buffer = []; @ruby_buf = [""]; @ruby_char_type = nil
817
- @out = File.open(output,"w"); @section = :head; @header = []; @style_stack = []
818
- @chuuki_table = {}; @images = []; @indent_stack = []; @tag_stack = []
819
- @midashi_id = 0; @terprip = true
820
- @endchar = :eof
821
- end
822
-
823
- def scount
81
+ @out = File.open(output,"w")
82
+ end
83
+ @buffer = []
84
+ @ruby_buf = RubyBuffer.new
85
+ @section = :head ## ���ݏ������̃Z�N�V����(:head,:head_end,:chuuki,:chuuki_in,:body,:tail)
86
+ @header = Aozora2Html::Header.new() ## �w�b�_�s�̔z��
87
+ @style_stack = StyleStack.new ##�X�^�C���̃X�^�b�N
88
+ @chuuki_table = {} ## �Ō�ɂǂ̒��L���o������ێ����Ă���
89
+ @images = [] ## �g�p�����O���̉摜�ێ��p
90
+ @indent_stack = []
91
+ @tag_stack = []
92
+ @midashi_id = 0 ## ���o���̃J�E���^�A���o���̎�ނɂ���đ������قȂ�
93
+ @terprip = true ## ���s����p (terpri��Lisp�R��?)
94
+ @endchar = :eof ## ��͏I�������AAccentParser��TagParser�ł͈قȂ�
95
+ @noprint = nil
96
+ end
97
+
98
+ def line_number
824
99
  @stream.line
825
100
  end
826
101
 
827
102
  def block_allowed_context?
828
103
  # inline_tag���J���Ă��Ȃ����`�F�b�N����Ώ\��
829
- not(@style_stack.last)
104
+ @style_stack.empty?
830
105
  end
831
106
 
107
+ # �ꕶ���ǂݍ���
832
108
  def read_char
833
109
  @stream.read_char
834
110
  end
835
111
 
836
- def read_to (endchar)
837
- buf=""
838
- loop{
839
- char=@stream.read_char
840
- if char==endchar
112
+ # �w�肳�ꂽ�I�[����(1������String��CRLF)�܂œǂݍ���
113
+ #
114
+ # @param [String] endchar �I�[����
115
+ def read_to(endchar)
116
+ buf = ""
117
+ loop do
118
+ char = @stream.read_char
119
+ if char == endchar
841
120
  break
842
121
  else
843
122
  if char.kind_of?(Symbol)
844
123
  print endchar
845
124
  end
846
125
  buf.concat(char)
847
- end}
126
+ end
127
+ end
848
128
  buf
849
129
  end
850
130
 
851
131
  def read_accent
852
- Aozora_accent_parser.new(@stream,"�l",@chuuki_table,@images).process
132
+ Aozora2Html::AccentParser.new(@stream, "�l", @chuuki_table, @images).process
853
133
  end
854
134
 
855
- def read_to_nest (endchar)
856
- Aozora_tag_parser.new(@stream,endchar,@chuuki_table,@images).process
135
+ def read_to_nest(endchar)
136
+ Aozora2Html::TagParser.new(@stream, endchar, @chuuki_table, @images).process
857
137
  end
858
138
 
859
139
  def read_line
860
- tmp=read_to("\r\n")
861
- @buffer=[]
140
+ tmp = read_to("\r\n")
141
+ @buffer = []
862
142
  tmp
863
143
  end
864
144
 
865
- def process ()
866
- catch(:terminate){
867
- loop{
868
- begin
869
- parse
870
- rescue Aozora_Exception => e
871
- puts e.message(scount)
872
- if e.is_a?(Aozora_Error)
873
- exit(2)
145
+ # parse����
146
+ #
147
+ # �I�����i�I�[�܂ŗ����ꍇ�j�ɂ�throw :terminate�ŒE�o����
148
+ #
149
+ def process
150
+ begin
151
+ catch(:terminate) do
152
+ loop do
153
+ begin
154
+ parse
155
+ rescue Aozora2Html::Error => e
156
+ puts e.message(line_number)
157
+ if e.is_a?(Aozora2Html::Error)
158
+ exit(2)
159
+ end
874
160
  end
875
161
  end
876
- }
877
- }
878
- tail_output # final call
879
- finalize
880
- close
881
- end
882
-
883
- def char_type (char)
884
- if char.is_a?(Accent_tag)
885
- :hankaku
886
- elsif char.is_a?(Gaiji_tag)
887
- :kanji
888
- elsif char.is_a?(Kunten_tag) # just remove this line
889
- :else
890
- elsif char.is_a?(Dakuten_katakana_tag)
891
- :katakana
892
- elsif char.is_a?(Aozora_tag)
893
- :else
894
- elsif char.match(/[��-��T�U]/)
895
- :hiragana
896
- elsif char.match(/[�@-���[�R�S��]/)
897
- :katakana
898
- elsif char.match(/[�O-�X�`-�y��-����-����-�ք@-�`�p-���|���f�C�D]/)
899
- :zenkaku
900
- elsif char.match(/[A-Za-z0-9#\-\&'\,]/)
901
- :hankaku
902
- elsif char.match(/[��-꤁X���W�Y�Z��]/)
903
- :kanji
904
- elsif char.match(/[\.\;\"\?\!\)]/)
905
- :hankaku_terminate
906
- else
162
+ end
163
+ tail_output # final call
164
+ finalize
165
+ close
166
+ rescue => e
167
+ puts "ERROR: line: #{line_number}"
168
+ raise e
169
+ end
170
+ end
171
+
172
+ def char_type(char)
173
+ begin
174
+ char.char_type
175
+ rescue
907
176
  :else
908
177
  end
909
178
  end
910
-
911
- def finalize ()
179
+
180
+ def finalize
912
181
  hyoki
913
182
  dynamic_contents
914
183
  @out.print("</body>\r\n</html>\r\n")
915
184
  end
916
-
185
+
917
186
  def dynamic_contents
918
- @out.print("<div id=\"card\">\r\n<hr />\r\n<br />\r\n")
919
- @out.print("<a href=\"JavaScript:goLibCard();\" id=\"goAZLibCard\">���}���J�[�h</a>")
920
- @out.print("<script type=\"text/javascript\" src=\"../../contents.js\"></script>\r\n")
921
- @out.print("<script type=\"text/javascript\" src=\"../../golibcard.js\"></script>\r\n")
922
- @out.print("</div>")
187
+ @out.print "<div id=\"card\">\r\n<hr />\r\n<br />\r\n" +
188
+ "<a href=\"JavaScript:goLibCard();\" id=\"goAZLibCard\">���}���J�[�h</a>" +
189
+ "<script type=\"text/javascript\" src=\"../../contents.js\"></script>\r\n" +
190
+ "<script type=\"text/javascript\" src=\"../../golibcard.js\"></script>\r\n" +
191
+ "</div>"
923
192
  end
924
193
 
925
- def close ()
194
+ def close
926
195
  @stream.close
927
196
  @out.close
928
197
  end
929
-
930
- def convert_indent_type (type)
931
- case type
932
- when :jisage
933
- "������"
934
- when :chitsuki
935
- "�n�t��"
936
- when :keigakomi
937
- "�r�͂�"
938
- when :caption
939
- "�L���v�V����"
940
- when :jizume
941
- "���l��"
942
- when :futoji
943
- "����"
944
- when :shatai
945
- "�Α�"
946
- when :sho
947
- "�����ȕ���"
948
- when :dai
949
- "�傫�ȕ���"
950
- else
951
- type
952
- end
198
+
199
+ def convert_indent_type(type)
200
+ INDENT_TYPE[type] || type
953
201
  end
954
202
 
955
- def check_close_match (type)
203
+ def check_close_match(type)
956
204
  ind = if @indent_stack.last.is_a?(String)
957
205
  @noprint = true
958
206
  :jisage
@@ -966,9 +214,9 @@ class Aozora2Html
966
214
  end
967
215
  end
968
216
 
969
- def implicit_close (type)
217
+ def implicit_close(type)
970
218
  if @indent_stack.last
971
- if n = check_close_match(type)
219
+ if check_close_match(type)
972
220
  # ok, nested multiline tags, go ahead
973
221
  else
974
222
  # not nested, please close
@@ -982,19 +230,20 @@ class Aozora2Html
982
230
 
983
231
  def ensure_close
984
232
  if n = @indent_stack.last
985
- raise Aozora_Error.new("#{convert_indent_type(n)}���ɖ{�����I�����܂���")
233
+ raise Aozora2Html::Error, "#{convert_indent_type(n)}���ɖ{�����I�����܂���"
986
234
  end
987
- end
988
-
989
- def explicit_close (type)
990
- if n = check_close_match(type)
991
- raise Aozora_Error.new("#{n}��‚��悤�Ƃ��܂������A#{n}���ł͂���܂���")
235
+ end
236
+
237
+ def explicit_close(type)
238
+ n = check_close_match(type)
239
+ if n
240
+ raise Aozora2Html::Error, "#{n}��‚��悤�Ƃ��܂������A#{n}���ł͂���܂���"
992
241
  end
993
242
  if tag = @tag_stack.pop
994
243
  push_chars(tag)
995
244
  end
996
245
  end
997
-
246
+
998
247
  # main loop
999
248
  def parse
1000
249
  case @section
@@ -1009,175 +258,50 @@ class Aozora2Html
1009
258
  when :tail
1010
259
  parse_tail
1011
260
  else
1012
- Aozora_Error.new("encount undefined condition")
261
+ raise Aozora2Html::Error, "encount undefined condition"
1013
262
  end
1014
263
  end
1015
264
 
1016
265
  def judge_chuuki
1017
266
  # ���L�����邩�ǂ����`�F�b�N
1018
- i=0
1019
- loop{
267
+ i = 0
268
+ loop do
1020
269
  case @stream.peek_char(i)
1021
270
  when "-"
1022
- i=i+1
271
+ i += 1
1023
272
  when "\r\n"
1024
- @section = :chuuki
1025
- return
273
+ if i == 0 && @stream.peek_char(1) == "\r\n"
274
+ @section = :body
275
+ return
276
+ else
277
+ @section = :chuuki
278
+ return
279
+ end
1026
280
  else
1027
281
  @section = :body
1028
282
  @out.print("<br />\r\n")
1029
283
  return
1030
284
  end
1031
- }
285
+ end
1032
286
  end
1033
287
 
1034
288
  # header�͈�s���“ǂ�
1035
289
  def parse_header
1036
290
  string = read_line
1037
291
  # refine from Tomita 09/06/14
1038
- if (string == "") # ��s������΁A�����Ńw�b�_�[�I���Ƃ݂Ȃ�
292
+ if string == "" # ��s������΁A�����Ńw�b�_�[�I���Ƃ݂Ȃ�
1039
293
  @section = :head_end
1040
- process_header
294
+ @out.print @header.to_html
1041
295
  else
1042
- string.gsub!(/�b/,"")
296
+ string.gsub!(RUBY_PREFIX,"")
1043
297
  string.gsub!(/�s.*?�t/,"")
1044
298
  @header.push(string)
1045
299
  end
1046
300
  end
1047
-
1048
- def html_title_push (string, hash, attr)
1049
- found = hash[attr]
1050
- if found
1051
- if found != ""
1052
- string + " " + found
1053
- else
1054
- found
1055
- end
1056
- else
1057
- string
1058
- end
1059
- end
1060
-
1061
- def out_header_info (hash, attr, true_name = nil)
1062
- found = hash[attr]
1063
- if found
1064
- @out.print("<h2 class=\"#{true_name or attr}\">#{found}</h2>\r\n")
1065
- end
1066
- end
1067
-
1068
- def header_element_type (string)
1069
- original = true
1070
- string.each_char{|x|
1071
- code = x.unpack("H*")[0]
1072
- if ("00" <= code and code <= "7f") or # 1byte
1073
- ("8140" <= code and code <= "8258") or # 1-1, 3-25
1074
- ("839f" <= code and code <= "8491") # 6-1, 7-81
1075
- # continue
1076
- else
1077
- original = false
1078
- break
1079
- end
1080
- }
1081
- if original
1082
- :original
1083
- elsif string.match(/[�Z��|��|�ҏW|�ҏW�Z��|�Z���ҏW]$/)
1084
- :editor
1085
- elsif string.match(/�Җ�$/)
1086
- :henyaku
1087
- elsif string.match(/��$/)
1088
- :translator
1089
- end
1090
- end
1091
-
1092
- def process_person (string,header_info)
1093
- type = header_element_type(string)
1094
- case type
1095
- when :editor
1096
- header_info[:editor] = string
1097
- when :translator
1098
- header_info[:translator] = string
1099
- when :henyaku
1100
- header_info[:henyaku] = string
1101
- else
1102
- type = :author
1103
- header_info[:author] = string
1104
- end
1105
- type
1106
- end
1107
-
1108
- def process_header()
1109
- header_info = {:title=>@header[0]}
1110
- case @header.length
1111
- when 2
1112
- process_person(@header[1],header_info)
1113
- when 3
1114
- if header_element_type(@header[1]) == :original
1115
- header_info[:original_title] = @header[1]
1116
- process_person(@header[2],header_info)
1117
- elsif process_person(@header[2],header_info) == :author
1118
- header_info[:subtitle] = @header[1]
1119
- else
1120
- header_info[:author] = @header[1]
1121
- end
1122
- when 4
1123
- if header_element_type(@header[1]) == :original
1124
- header_info[:original_title] = @header[1]
1125
- else
1126
- header_info[:subtitle] = @header[1]
1127
- end
1128
- if process_person(@header[3],header_info) == :author
1129
- header_info[:subtitle] = @header[2]
1130
- else
1131
- header_info[:author] = @header[2]
1132
- end
1133
- when 5
1134
- header_info[:original_title] = @header[1]
1135
- header_info[:subtitle] = @header[2]
1136
- header_info[:author] = @header[3]
1137
- if process_person(@header[4],header_info) == :author
1138
- raise Aozora_Error.new("parser encounted author twice")
1139
- end
1140
- when 6
1141
- header_info[:original_title] = @header[1]
1142
- header_info[:subtitle] = @header[2]
1143
- header_info[:original_subtitle] = @header[3]
1144
- header_info[:author] = @header[4]
1145
- if process_person(@header[5],header_info) == :author
1146
- raise Aozora_Error.new("parser encounted author twice")
1147
- end
1148
- end
1149
-
1150
- # <title> �s���\�z
1151
- html_title = "<title>#{header_info[:author]}"
1152
- html_title = html_title_push(html_title, header_info, :translator)
1153
- html_title = html_title_push(html_title, header_info, :editor)
1154
- html_title = html_title_push(html_title, header_info, :henyaku)
1155
- html_title = html_title_push(html_title, header_info, :title)
1156
- html_title = html_title_push(html_title, header_info, :original_title)
1157
- html_title = html_title_push(html_title, header_info, :subtitle)
1158
- html_title = html_title_push(html_title, header_info, :original_subtitle)
1159
- html_title += "</title>"
1160
-
1161
- # �o��
1162
- @out.print("<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\r\n \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" >\r\n<head>\r\n <meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift_JIS\" />\r\n <meta http-equiv=\"content-style-type\" content=\"text/css\" />\r\n")
1163
- $css_files.each{|css|
1164
- @out.print("\t<link rel=\"stylesheet\" type=\"text/css\" href=\"" + css + "\" />\r\n")
1165
- }
1166
- @out.print("\t#{html_title}\r\n <script type=\"text/javascript\" src=\"../../jquery-1.4.2.min.js\"></script>\r\n <link rel=\"Schema.DC\" href=\"http://purl.org/dc/elements/1.1/\" />\r\n <meta name=\"DC.Title\" content=\"#{header_info[:title]}\" />\r\n <meta name=\"DC.Creator\" content=\"#{header_info[:author]}\" />\r\n <meta name=\"DC.Publisher\" content=\"�‹󕶌�\" />\r\n</head>\r\n<body>\r\n<div class=\"metadata\">\r\n")
1167
- @out.print("<h1 class=\"title\">#{header_info[:title]}</h1>\r\n")
1168
- out_header_info(header_info, :original_title)
1169
- out_header_info(header_info, :subtitle)
1170
- out_header_info(header_info, :original_subtitle)
1171
- out_header_info(header_info, :author)
1172
- out_header_info(header_info, :editor)
1173
- out_header_info(header_info, :translator)
1174
- out_header_info(header_info, :henyaku, "editor-translator")
1175
- @out.print("<br />\r\n<br />\r\n</div>\r\n<div id=\"contents\" style=\"display:none\"></div><div class=\"main_text\">")
1176
- end
1177
301
 
1178
302
  def parse_chuuki
1179
303
  string = read_line
1180
- if (string.match(/^\-+$/))
304
+ if string.match(/^\-+$/)
1181
305
  case @section
1182
306
  when :chuuki
1183
307
  @section = :chuuki_in
@@ -1187,39 +311,39 @@ class Aozora2Html
1187
311
  end
1188
312
  end
1189
313
 
1190
- def illegal_char_check (char)
314
+ def illegal_char_check(char, line)
1191
315
  if char.is_a?(String)
1192
316
  code = char.unpack("H*")[0]
1193
- if code == "21" or
317
+ if (code == "21" or
1194
318
  code == "23" or
1195
- ("a1" <= code and code <= "a5") or
1196
- ("28" <= code and code<= "29") or
319
+ ("a1" <= code and code <= "a5") or
320
+ ("28" <= code and code <= "29") or
1197
321
  code == "5b" or
1198
322
  code == "5d" or
1199
323
  code == "3d" or
1200
324
  code == "3f" or
1201
325
  code == "2b" or
1202
- ("7b" <= code and code <= "7d")
1203
- puts "�x��(#{scount}�s��):1�o�C�g�́u#{char}�v���g���Ă��܂�"
326
+ ("7b" <= code and code <= "7d"))
327
+ puts "�x��(#{line}�s��):1�o�C�g�́u#{char}�v���g���Ă��܂�"
1204
328
  end
1205
329
 
1206
330
  if code == "81f2"
1207
- puts "�x��(#{scount}�s��):���L�L���̌�p�̉”\��������A�u#{char}�v���g���Ă��܂�"
331
+ puts "�x��(#{line}�s��):���L�L���̌�p�̉”\��������A�u#{char}�v���g���Ă��܂�"
1208
332
  end
1209
-
1210
- if ("81ad" <= code and code <= "81b7") or
333
+
334
+ if (("81ad" <= code and code <= "81b7") or
1211
335
  ("81c0" <= code and code <= "81c7") or
1212
336
  ("81cf" <= code and code <= "81d9") or
1213
337
  ("81e9" <= code and code <= "81ef") or
1214
338
  ("81f8" <= code and code <= "81fb") or
1215
- ("8240" <= code and code <= "824e") or
1216
- ("8259" <= code and code <= "825f") or
1217
- ("827a" <= code and code <= "8280") or
339
+ ("8240" <= code and code <= "824e") or
340
+ ("8259" <= code and code <= "825f") or
341
+ ("827a" <= code and code <= "8280") or
1218
342
  ("829b" <= code and code <= "829e") or
1219
- ("82f2" <= code and code <= "82fc") or
1220
- ("8397" <= code and code <= "839e") or
1221
- ("83b7" <= code and code <= "83be") or
1222
- ("83d7" <= code and code <= "83fc") or
343
+ ("82f2" <= code and code <= "82fc") or
344
+ ("8397" <= code and code <= "839e") or
345
+ ("83b7" <= code and code <= "83be") or
346
+ ("83d7" <= code and code <= "83fc") or
1223
347
  ("8461" <= code and code <= "846f") or
1224
348
  ("8492" <= code and code <= "849e") or
1225
349
  ("84bf" <= code and code <= "84fc") or
@@ -1233,16 +357,17 @@ class Aozora2Html
1233
357
  ("ec40" <= code and code <= "ecfc") or
1234
358
  ("ed40" <= code and code <= "edfc") or
1235
359
  ("ee40" <= code and code <= "eefc") or
1236
- ("ef40" <= code and code <= "effc")
1237
- puts "�x��(#{scount}�s��):JIS�O���u#{char}�v���g���Ă��܂�"
360
+ ("ef40" <= code and code <= "effc"))
361
+ puts "�x��(#{line}�s��):JIS�O���u#{char}�v���g���Ă��܂�"
1238
362
  end
1239
363
  end
1240
364
  end
1241
365
 
1242
366
  # �{�̉�͕�
367
+ #
1243
368
  # 1�������“ǂݍ��݁Adispatch����@buffer,@ruby_buf�ւ��܂�
1244
369
  # ���s�R�[�h�ɓ��������痭�ߍ��񂾂��̂�general_output����
1245
-
370
+
1246
371
  def parse_body
1247
372
  char = read_char
1248
373
  check = true
@@ -1258,60 +383,52 @@ class Aozora2Html
1258
383
  char = dispatch_gaiji
1259
384
  when "�m"
1260
385
  char = dispatch_aozora_command
1261
- when @@ku
386
+ when KU
1262
387
  assign_kunoji
1263
388
  when "�s"
1264
389
  char = apply_ruby
1265
390
  end
1266
- if char == "\r\n"
391
+
392
+ case char
393
+ when "\r\n"
1267
394
  general_output
1268
- elsif char == "�b"
1269
- ruby_buf_dump
1270
- @ruby_buf_protected = true
1271
- elsif char == @endchar
395
+ when RUBY_PREFIX
396
+ @ruby_buf.dump(@buffer)
397
+ @ruby_buf.protected = true
398
+ when @endchar
1272
399
  # suddenly finished the file
1273
- puts "�x��(#{scount}�s��):�\�����ʃt�@�C���I�["
1274
- throw :terminate
1275
- elsif char != nil
400
+ puts "�x��(#{line_number}�s��):�\�����ʃt�@�C���I�["
401
+ throw :terminate
402
+ when nil
403
+ # noop
404
+ else
1276
405
  if check
1277
- illegal_char_check(char)
406
+ illegal_char_check(char, line_number)
1278
407
  end
1279
408
  push_chars(char)
1280
409
  end
1281
410
  end
1282
-
411
+
1283
412
  def ending_check
413
+ # `��{�F`�Ńt�b�^(:tail)�ɑJ��
1284
414
  if @stream.peek_char(0) == "�{" and @stream.peek_char(1) == "�F"
1285
415
  @section = :tail
1286
416
  ensure_close
1287
417
  @out.print "</div>\r\n<div class=\"bibliographical_information\">\r\n<hr />\r\n<br />\r\n"
1288
418
  end
1289
419
  end
1290
-
1291
- # buffer management
1292
- def ruby_buf_dump
1293
- if @ruby_buf_protected
1294
- @ruby_buf.unshift("�b")
1295
- @ruby_buf_protected = nil
1296
- end
1297
- top = @ruby_buf[0]
1298
- if top.is_a?(String) and @buffer.last.is_a?(String)
1299
- @buffer.last.concat(top)
1300
- @buffer = @buffer + @ruby_buf[1,@ruby_buf.length]
1301
- else
1302
- @buffer = @buffer + @ruby_buf
1303
- end
1304
- @ruby_buf = [""]
1305
- end
1306
420
 
1307
- def push_chars (obj)
421
+ # Original Aozora2Html#push_chars does not convert "'" into '&#39;'; it's old behaivor
422
+ # of CGI.escapeHTML().
423
+ #
424
+ def push_chars(obj)
1308
425
  if obj.is_a?(Array)
1309
426
  obj.each{|x|
1310
427
  push_chars(x)
1311
428
  }
1312
429
  elsif obj.is_a?(String)
1313
430
  if obj.length == 1
1314
- obj = CGI.escapeHTML(obj)
431
+ obj = obj.gsub(/[&\"<>]/, {'&' => '&amp;', '"' => '&quot;', '<' => '&lt;', '>' => '&gt;'})
1315
432
  end
1316
433
  obj.each_char{|x|
1317
434
  push_char(x)
@@ -1321,46 +438,48 @@ class Aozora2Html
1321
438
  end
1322
439
  end
1323
440
 
1324
- def push_char (char)
441
+ def push_char(char)
1325
442
  ctype = char_type(char)
1326
- if ctype == :hankaku_terminate and @ruby_buf_type == :hankaku
1327
- if @ruby_buf.last.is_a?(String)
1328
- @ruby_buf.last.concat(char)
443
+ if ctype == :hankaku_terminate and @ruby_buf.char_type == :hankaku
444
+ if @ruby_buf.last_is_string?
445
+ @ruby_buf.last_concat(char)
1329
446
  else
1330
447
  @ruby_buf.push(char)
1331
448
  end
1332
- @ruby_buf_type = :else
1333
- elsif @ruby_buf_protected or (ctype != :else and ctype == @ruby_buf_type)
1334
- if char.is_a?(String) and @ruby_buf.last.is_a?(String)
1335
- @ruby_buf.last.concat(char)
449
+ @ruby_buf.char_type = :else
450
+ elsif @ruby_buf.protected or (ctype != :else and ctype == @ruby_buf.char_type)
451
+ if char.is_a?(String) and @ruby_buf.last_is_string?
452
+ @ruby_buf.last_concat(char)
1336
453
  else
1337
454
  @ruby_buf.push(char)
1338
455
  @ruby_buf.push("")
1339
456
  end
1340
457
  else
1341
- ruby_buf_dump
1342
- @ruby_buf_type = ctype
1343
- @ruby_buf = [char]
458
+ @ruby_buf.dump(@buffer)
459
+ @ruby_buf.clear(char)
460
+ @ruby_buf.char_type = ctype
1344
461
  end
1345
462
  end
1346
-
1347
- def buf_is_blank? (buf)
463
+
464
+ def buf_is_blank?(buf)
1348
465
  buf.each{|token|
1349
466
  if token.is_a?(String) and not(token=="")
1350
467
  return false
1351
- elsif token.is_a?(Oneline_Indent_tag)
468
+ elsif token.is_a?(Aozora2Html::Tag::OnelineIndent)
1352
469
  return :inline
1353
470
  end
1354
471
  }
1355
472
  true
1356
473
  end
1357
-
1358
- def terpri? (buf)
474
+
475
+ # �s����<br />���o�͂���ׂ����ǂ����̔��ʗp
476
+ #
477
+ def terpri?(buf)
1359
478
  flag = true
1360
479
  buf.each{|x|
1361
- if x.is_a?(Multiline_tag)
480
+ if x.is_a?(Aozora2Html::Tag::Multiline)
1362
481
  flag = false
1363
- elsif (x.is_a?(String) and x == "")
482
+ elsif (x.is_a?(String) and x == "")
1364
483
  nil
1365
484
  else
1366
485
  return true
@@ -1369,18 +488,24 @@ class Aozora2Html
1369
488
  flag
1370
489
  end
1371
490
 
491
+ # �ǂݍ��񂾍s�̏o�͂��s��
492
+ #
493
+ # parser�����s������ǂݍ��񂾂�Ă΂��
494
+ # @ruby_buf��@buffer�͏���������
495
+ #
1372
496
  def general_output
1373
497
  if @style_stack.last
1374
- raise Aozora_Error.new("#{@style_stack.last[0]}���ɉ��s����܂����B���s���܂����v�f�ɂ̓u���b�N�\�L��p���Ă�������")
498
+ raise Aozora2Html::Error, "#{@style_stack.last_command}���ɉ��s����܂����B���s���܂����v�f�ɂ̓u���b�N�\�L��p���Ă�������"
1375
499
  end
1376
500
  # buffer�ɃC���f���g�^�O����������������s���Ȃ��I
1377
501
  if @noprint
1378
502
  @noprint = false
1379
503
  return
1380
504
  end
1381
- ruby_buf_dump
505
+ @ruby_buf.dump(@buffer)
1382
506
  buf = @buffer
1383
- @ruby_buf = [""]; @ruby_buf_mode = nil; @buffer = []
507
+ @ruby_buf.clear
508
+ @buffer = []
1384
509
  tail = []
1385
510
 
1386
511
  indent_type = buf_is_blank?(buf)
@@ -1390,26 +515,22 @@ class Aozora2Html
1390
515
  if @indent_stack.last.is_a?(String) and not(indent_type)
1391
516
  @out.print @indent_stack.last
1392
517
  end
1393
-
518
+
1394
519
  buf.each{|s|
1395
- if s.is_a?(Oneline_Indent_tag)
520
+ if s.is_a?(Aozora2Html::Tag::OnelineIndent)
1396
521
  tail.unshift(s.close_tag)
1397
- elsif s.is_a?(UnEmbed_Gaiji_tag) and not(s.escaped?)
522
+ elsif s.is_a?(Aozora2Html::Tag::UnEmbedGaiji) and !s.escaped?
1398
523
  # �����Ă��������𕜊�������
1399
524
  @out.print "��"
1400
- elsif s.is_a?(Multiline_Chitsuki_tag)
1401
- elsif s.is_a?(String) and s.match("</em")
1402
525
  end
1403
526
  @out.print s.to_s
1404
527
  }
528
+
529
+ # �Ō��CRLF���o�͂���
1405
530
  if @indent_stack.last.is_a?(String)
1406
531
  # �Ԃ牺��indent
1407
532
  # tail always active
1408
- if tail.last
1409
- tail.each{|s|
1410
- @out.print s.to_s
1411
- }
1412
- end
533
+ @out.print tail.map{|s| s.to_s}.join("")
1413
534
  if indent_type == :inline
1414
535
  @out.print "\r\n"
1415
536
  elsif indent_type and terprip
@@ -1417,25 +538,23 @@ class Aozora2Html
1417
538
  else
1418
539
  @out.print "</div>\r\n"
1419
540
  end
1420
- elsif tail.last
1421
- tail.each{|s|
1422
- @out.print s.to_s
1423
- }
1424
- @out.print "\r\n"
1425
- elsif terprip
541
+ elsif tail.empty? and terprip
1426
542
  @out.print "<br />\r\n"
1427
543
  else
544
+ @out.print tail.map{|s| s.to_s}.join("")
1428
545
  @out.print "\r\n"
1429
546
  end
1430
547
  end
1431
-
548
+
1432
549
  # �O���Q�Ƃ̔��� Ruby,style�d�˂������X�̂��߁A�v�f�̔z��ŕԂ�
1433
- def search_front_reference (string)
550
+ #
551
+ # �O���Q�Ƃ�`�����m���u�����v�ɖT�_�n`�A`�����m���u���v�Ɂu�}�}�v�̒��L�n`�Ƃ������\�L
552
+ def search_front_reference(string)
1434
553
  if string.length == 0
1435
554
  return false
1436
555
  end
1437
- searching_buf = if @ruby_buf.length != 0
1438
- @ruby_buf
556
+ searching_buf = if @ruby_buf.present?
557
+ @ruby_buf.to_a
1439
558
  else
1440
559
  @buffer
1441
560
  end
@@ -1444,7 +563,7 @@ class Aozora2Html
1444
563
  if last_string == ""
1445
564
  searching_buf.pop
1446
565
  search_front_reference(string.sub(Regexp.new(Regexp.quote(last_string)+"$"),""))
1447
- elsif match = last_string.match(Regexp.new(Regexp.quote(string)+"$"))
566
+ elsif last_string.match(Regexp.new(Regexp.quote(string)+"$"))
1448
567
  # ���S��v
1449
568
  # start = match.begin(0)
1450
569
  # tail = match.end(0)
@@ -1463,7 +582,7 @@ class Aozora2Html
1463
582
  false
1464
583
  end
1465
584
  end
1466
- elsif last_string.is_a?(Reference_mentioned_tag)
585
+ elsif last_string.is_a?(Aozora2Html::Tag::ReferenceMentioned)
1467
586
  inner = last_string.target_string
1468
587
  if inner == string
1469
588
  # ���S��v
@@ -1484,15 +603,15 @@ class Aozora2Html
1484
603
  false
1485
604
  end
1486
605
  end
1487
-
606
+
1488
607
  # ���������O���Q�Ƃ����ɖ߂�
1489
- def recovery_front_reference (reference)
608
+ def recovery_front_reference(reference)
1490
609
  reference.each{|elt|
1491
- # if @ruby_buf_protected
1492
- if @ruby_buf.length > 0
1493
- if @ruby_buf.last.is_a?(String)
610
+ # if @ruby_buf.protected
611
+ if @ruby_buf.present?
612
+ if @ruby_buf.last_is_string?
1494
613
  if elt.is_a?(String)
1495
- @ruby_buf.last.concat(elt)
614
+ @ruby_buf.last_concat(elt)
1496
615
  else
1497
616
  @ruby_buf.push(elt)
1498
617
  end
@@ -1512,8 +631,8 @@ class Aozora2Html
1512
631
  end
1513
632
  }
1514
633
  end
1515
-
1516
- def convert_japanese_number (command)
634
+
635
+ def convert_japanese_number(command)
1517
636
  tmp = command.tr("�O-�X", "0-9")
1518
637
  tmp.tr!("���O�l�ܘZ������Z","1234567890")
1519
638
  tmp.gsub!(/(\d)�\(\d)/){"#{$1}#{$2}"}
@@ -1523,29 +642,29 @@ class Aozora2Html
1523
642
  tmp
1524
643
  end
1525
644
 
1526
- def kuten2png (substring)
645
+ def kuten2png(substring)
1527
646
  desc = substring.gsub(/�u���v[��|��]/,"")
1528
647
  match = desc.match(/[12]\-\d{1,2}\-\d{1,2}/)
1529
648
  if (match and not(desc.match(/��0213�O��/)) and not(desc.match(/��.*��/)))
1530
649
  @chuuki_table[:newjis] = true
1531
650
  codes = match[0].split("-")
1532
- folder = sprintf("%1d-%02d",*codes)
651
+ folder = sprintf("%1d-%02d", codes[0], codes[1])
1533
652
  code = sprintf("%1d-%02d-%02d",*codes)
1534
- Embed_Gaiji_tag.new(self, folder,code,desc.gsub!("��",""))
1535
- else
1536
- substring
1537
- end
653
+ Aozora2Html::Tag::EmbedGaiji.new(self, folder, code, desc.gsub!("��",""))
654
+ else
655
+ substring
656
+ end
1538
657
  end
1539
658
 
1540
- def escape_gaiji (command)
1541
- whole, kanji, line = command.match(/(?:��)(.*)(?:�A)(.*)/).to_a
659
+ def escape_gaiji(command)
660
+ _whole, kanji, line = command.match(/(?:��)(.*)(?:�A)(.*)/).to_a
1542
661
  tmp = @images.assoc(kanji)
1543
662
  if tmp
1544
663
  tmp.push(line)
1545
664
  else
1546
- @images.push([kanji,line])
665
+ @images.push([kanji, line])
1547
666
  end
1548
- UnEmbed_Gaiji_tag.new(self, command)
667
+ Aozora2Html::Tag::UnEmbedGaiji.new(self, command)
1549
668
  end
1550
669
 
1551
670
  def dispatch_gaiji
@@ -1553,19 +672,22 @@ class Aozora2Html
1553
672
  if hook == "�m"
1554
673
  read_char
1555
674
  # embed?
1556
- command,raw = read_to_nest("�n")
675
+ command, _raw = read_to_nest("�n")
1557
676
  try_emb = kuten2png(command)
1558
- if try_emb == command
677
+ if try_emb != command
678
+ try_emb
679
+ elsif command.match(/U\+([0-9A-F]{4,5})/) && Aozora2Html::Tag::EmbedGaiji.use_unicode
680
+ unicode_num = $1
681
+ Aozora2Html::Tag::EmbedGaiji.new(self, nil, nil, command, unicode_num)
682
+ else
1559
683
  # Unemb
1560
684
  escape_gaiji(command)
1561
- else
1562
- try_emb
1563
685
  end
1564
686
  else
1565
687
  "��"
1566
688
  end
1567
689
  end
1568
-
690
+
1569
691
  def dispatch_aozora_command
1570
692
  if @stream.peek_char(0) != "��"
1571
693
  "�m"
@@ -1577,13 +699,13 @@ class Aozora2Html
1577
699
  apply_burasage(command)
1578
700
 
1579
701
  elsif command.match(/^��������/)
1580
- exec_block_start_command(command.sub(/^��������/,""))
702
+ exec_block_start_command(command)
1581
703
  elsif command.match(/^������/)
1582
- exec_block_end_command(command.sub(/^������/,""))
704
+ exec_block_end_command(command)
1583
705
 
1584
706
  elsif command.match(/���蒍/)
1585
707
  apply_warichu(command)
1586
- elsif command.match(/������/)
708
+ elsif command.match(/������/)
1587
709
  apply_jisage(command)
1588
710
  elsif command.match(/fig(\d)+_(\d)+\.png/)
1589
711
  exec_img_command(command,raw)
@@ -1598,9 +720,9 @@ class Aozora2Html
1598
720
  elsif command.match(/1-7-8[2345]/)
1599
721
  apply_dakuten_katakana(command)
1600
722
  elsif command.match(/^([���O�l�ܘZ������\���㒆���b�������V�n�l]+)$/)
1601
- Kaeriten_tag.new(self, command)
723
+ Aozora2Html::Tag::Kaeriten.new(self, command)
1602
724
  elsif command.match(/^�i(.+)�j$/)
1603
- Okurigana_tag.new(self, command.gsub!(/[�i�j]/,""))
725
+ Aozora2Html::Tag::Okurigana.new(self, command.gsub!(/[�i�j]/,""))
1604
726
  elsif command.match(/(�n�t��|���グ)(�I���)*$/)
1605
727
  apply_chitsuki(command)
1606
728
  elsif exec_inline_start_command(command)
@@ -1611,7 +733,7 @@ class Aozora2Html
1611
733
  end
1612
734
  end
1613
735
 
1614
- def apply_burasage (command)
736
+ def apply_burasage(command)
1615
737
  tag = nil
1616
738
  if implicit_close(:jisage)
1617
739
  @terprip = false
@@ -1632,21 +754,21 @@ class Aozora2Html
1632
754
  @tag_stack.push("") # dummy
1633
755
  nil
1634
756
  end
1635
-
1636
- def jisage_width (command)
757
+
758
+ def jisage_width(command)
1637
759
  convert_japanese_number(command).match(/(\d*)(?:������)/)[1]
1638
760
  end
1639
-
1640
- def apply_jisage (command)
761
+
762
+ def apply_jisage(command)
1641
763
  if command.match(/�܂�/) or command.match(/�I���/)
1642
764
  # �������I���
1643
- explicit_close(:jisage)
765
+ explicit_close(:jisage)
1644
766
  @indent_stack.pop
1645
767
  nil
1646
768
  else
1647
769
  if command.match(/���̍s/)
1648
770
  # 1�s����
1649
- @buffer.unshift(Oneline_Jisage_tag.new(self, jisage_width(command)))
771
+ @buffer.unshift(Aozora2Html::Tag::OnelineJisage.new(self, jisage_width(command)))
1650
772
  nil
1651
773
  else
1652
774
  if @buffer.length == 0 and @stream.peek_char(0) == "\r\n"
@@ -1656,28 +778,25 @@ class Aozora2Html
1656
778
  # adhook hack
1657
779
  @noprint = false
1658
780
  @indent_stack.push(:jisage)
1659
- Multiline_Jisage_tag.new(self, jisage_width(command))
781
+ Aozora2Html::Tag::MultilineJisage.new(self, jisage_width(command))
1660
782
  else
1661
- @buffer.unshift(Oneline_Jisage_tag.new(self, jisage_width(command)))
783
+ @buffer.unshift(Aozora2Html::Tag::OnelineJisage.new(self, jisage_width(command)))
1662
784
  nil
1663
785
  end
1664
786
  end
1665
787
  end
1666
788
  end
1667
789
 
1668
- def apply_warichu (command)
790
+ def apply_warichu(command)
1669
791
  if command.match(/�I���/)
1670
- check = @stream.peek_char(0)
1671
- if check == "�j"
1672
- push_chars('</span>')
1673
- else
792
+ if @stream.peek_char(0) != "�j"
1674
793
  push_chars('�j')
1675
- push_chars('</span>')
1676
794
  end
795
+ push_chars('</span>')
1677
796
  else
1678
- check = @ruby_buf.last
1679
- if check.is_a?(String) and check.match(/�i$/)
1680
- push_chars('<span class="warichu">')
797
+ check = @ruby_buf.last
798
+ if check.is_a?(String) and check.match(/�i$/)
799
+ push_chars('<span class="warichu">')
1681
800
  else
1682
801
  push_chars('<span class="warichu">')
1683
802
  push_chars('�i')
@@ -1686,7 +805,7 @@ class Aozora2Html
1686
805
  nil
1687
806
  end
1688
807
 
1689
- def chitsuki_length (command)
808
+ def chitsuki_length(command)
1690
809
  command = convert_japanese_number(command)
1691
810
  if match = command.match(/([0-9]+)��/)
1692
811
  match[1]
@@ -1694,8 +813,8 @@ class Aozora2Html
1694
813
  "0"
1695
814
  end
1696
815
  end
1697
-
1698
- def apply_chitsuki (string, multiline = false)
816
+
817
+ def apply_chitsuki(string, multiline = false)
1699
818
  if string.match(/�����Œn�t���I���/) or
1700
819
  string.match(/�����Ŏ��グ�I���/)
1701
820
  explicit_close(:chitsuki)
@@ -1707,15 +826,29 @@ class Aozora2Html
1707
826
  # �����s�w��
1708
827
  implicit_close(:chitsuki)
1709
828
  @indent_stack.push(:chitsuki)
1710
- Multiline_Chitsuki_tag.new(self, l)
829
+ Aozora2Html::Tag::MultilineChitsuki.new(self, l)
1711
830
  else
1712
831
  # 1�s�̂�
1713
- Oneline_Chitsuki_tag.new(self, l)
832
+ Aozora2Html::Tag::OnelineChitsuki.new(self, l)
1714
833
  end
1715
834
  end
1716
835
  end
1717
836
 
1718
- def new_midashi_id(inc)
837
+ def new_midashi_id(size)
838
+ inc = 1
839
+ if size.kind_of?(String)
840
+ if size.match(SIZE_SMALL)
841
+ inc = 1
842
+ elsif size.match(SIZE_MIDDLE)
843
+ inc = 10
844
+ elsif size.match(SIZE_LARGE)
845
+ inc = 100
846
+ else
847
+ raise Aozora2Html::Error, I18n.t(:undefined_header)
848
+ end
849
+ else
850
+ inc = size
851
+ end
1719
852
  @midashi_id += inc
1720
853
  end
1721
854
 
@@ -1724,41 +857,41 @@ class Aozora2Html
1724
857
  midashi_type = :normal
1725
858
  if command.match(/���s/)
1726
859
  midashi_type = :dogyo
1727
- elsif command.match (/��/)
860
+ elsif command.match(/��/)
1728
861
  midashi_type = :mado
1729
862
  else
1730
863
  @terprip = false
1731
864
  end
1732
- Multiline_midashi_tag.new(self,command,midashi_type)
865
+ Aozora2Html::Tag::MultilineMidashi.new(self,command,midashi_type)
1733
866
  end
1734
867
 
1735
868
  def apply_yokogumi(command)
1736
869
  @indent_stack.push(:yokogumi)
1737
- Multiline_yokogumi_tag.new(self)
870
+ Aozora2Html::Tag::MultilineYokogumi.new(self)
1738
871
  end
1739
872
 
1740
873
  def apply_keigakomi(command)
1741
874
  @indent_stack.push(:keigakomi)
1742
- Keigakomi_tag.new(self)
875
+ Aozora2Html::Tag::Keigakomi.new(self)
1743
876
  end
1744
877
 
1745
878
  def apply_caption(command)
1746
879
  @indent_stack.push(:caption)
1747
- Multiline_caption_tag.new(self)
880
+ Aozora2Html::Tag::MultilineCaption.new(self)
1748
881
  end
1749
882
 
1750
883
  def apply_jizume(command)
1751
884
  w = convert_japanese_number(command).match(/(\d*)(?:���l��)/)[1]
1752
885
  @indent_stack.push(:jizume)
1753
- Jizume_tag.new(self, w)
886
+ Aozora2Html::Tag::Jizume.new(self, w)
1754
887
  end
1755
-
1756
- def push_block_tag (tag,closing)
888
+
889
+ def push_block_tag(tag,closing)
1757
890
  push_chars(tag)
1758
891
  closing.concat(tag.close_tag)
1759
892
  end
1760
893
 
1761
- def exec_inline_start_command (command)
894
+ def exec_inline_start_command(command)
1762
895
  case command
1763
896
  when "���L�t��"
1764
897
  @style_stack.push([command,'</ruby>'])
@@ -1775,6 +908,9 @@ class Aozora2Html
1775
908
  when "�L���v�V����"
1776
909
  @style_stack.push([command,'</span>'])
1777
910
  push_chars('<span class="caption">')
911
+ when "����"
912
+ @style_stack.push([command,'</span>'])
913
+ push_chars('<span class="warigaki">')
1778
914
  when "�匩�o��"
1779
915
  @style_stack.push([command,'</a></h3>'])
1780
916
  @terprip = false
@@ -1808,7 +944,7 @@ class Aozora2Html
1808
944
  else
1809
945
  if command.match(/(.*)�i�K(..)�ȕ���/)
1810
946
  @style_stack.push([command,'</span>'])
1811
- whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
947
+ _whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
1812
948
  times = convert_japanese_number(nest).to_i
1813
949
  daisho = if style.match("��")
1814
950
  :sho
@@ -1816,30 +952,14 @@ class Aozora2Html
1816
952
  :dai
1817
953
  end
1818
954
  html_class = daisho.to_s + times.to_s
1819
- size = case times
1820
- when 1
1821
- ""
1822
- when 2
1823
- "x-"
1824
- else
1825
- if times >= 3
1826
- "xx-"
1827
- else
1828
- raise Aozora_Error.new("�����T�C�Y�̎w�肪�s���ł�")
1829
- end
1830
- end + case daisho
1831
- when :dai
1832
- "large"
1833
- when :sho
1834
- "small"
1835
- end
955
+ size = Utils.create_font_size(times, daisho)
1836
956
  push_chars("<span class=\"#{html_class}\" style=\"font-size: #{size};\">")
1837
957
  else
1838
958
  ## Decoration ##
1839
959
  key = command
1840
960
  filter = lambda{|x| x}
1841
961
  if command.match(/(�E|��|��|��)��(.*)/)
1842
- whole, dir, com = command.match(/(�E|��|��|��)��(.*)/).to_a
962
+ _whole, dir, com = command.match(/(�E|��|��|��)��(.*)/).to_a
1843
963
  # renew command
1844
964
  key = com
1845
965
  if command.match(/�_/)
@@ -1854,23 +974,23 @@ class Aozora2Html
1854
974
  end
1855
975
  end
1856
976
  end
1857
-
1858
- found = @@command_table[key]
977
+
978
+ found = COMMAND_TABLE[key]
1859
979
  # found = [class, tag]
1860
980
  if found
1861
981
  @style_stack.push([command,"</#{found[1]}>"])
1862
- if found[1] == "em" # or found[1] == "strong"
1863
- @chuuki_table[:em] = true
1864
- end
1865
982
  push_chars("<#{found[1]} class=\"#{filter.call(found[0])}\">")
1866
983
  else
984
+ if $DEBUG
985
+ puts "�x��(#{line_number}�s��):�u#{key}�v�͖��Ή��̃R�}���h�̂��ߖ������܂�"
986
+ end
1867
987
  nil
1868
988
  end
1869
989
  end
1870
990
  end
1871
991
  end
1872
992
 
1873
- def exec_inline_end_command (command)
993
+ def exec_inline_end_command(command)
1874
994
  encount = command.sub("�I���","")
1875
995
  if encount == "�{��"
1876
996
  # force to finish main_text
@@ -1878,19 +998,21 @@ class Aozora2Html
1878
998
  ensure_close
1879
999
  @noprint = true
1880
1000
  @out.print "</div>\r\n<div class=\"after_text\">\r\n<hr />\r\n"
1881
- elsif encount.match("���L�t��") and @style_stack.last[0] == "���L�t��"
1001
+ elsif encount.match("���L�t��") and @style_stack.last_command == "���L�t��"
1882
1002
  # special inline ruby
1883
1003
  @style_stack.pop
1884
- whole, ruby = encount.match("�u(.*)�v�̒��L�t��").to_a
1004
+ _whole, ruby = encount.match("�u(.*)�v�̒��L�t��").to_a
1885
1005
  push_char("</rb><rp>�i</rp><rt>#{ruby}</rt><rp>�j</rp></ruby>")
1886
- elsif @style_stack.last[0].match(encount)
1006
+ elsif @style_stack.last_command.match(encount)
1887
1007
  push_chars(@style_stack.pop[1])
1888
1008
  else
1889
- raise Aozora_Error.new("#{encount}���I�����悤�Ƃ��܂������A#{@style_stack.last[0]}���ł�")
1009
+ raise Aozora2Html::Error, "#{encount}���I�����悤�Ƃ��܂������A#{@style_stack.last_command}���ł�"
1890
1010
  end
1891
1011
  end
1892
1012
 
1893
- def exec_block_start_command (command)
1013
+ def exec_block_start_command(command)
1014
+ original_command = command.dup
1015
+ command.sub!(/^��������/, "")
1894
1016
  match = ""
1895
1017
  if command.match(/������/)
1896
1018
  push_block_tag(apply_jisage(command),match)
@@ -1929,24 +1051,24 @@ class Aozora2Html
1929
1051
  end
1930
1052
  push_block_tag(apply_caption(command),match)
1931
1053
  end
1932
-
1054
+
1933
1055
  if command.match(/����/)
1934
1056
  if match != ""
1935
1057
  @indent_stack.pop
1936
1058
  end
1937
- push_block_tag(Multiline_style_tag.new(self, "futoji"),match)
1059
+ push_block_tag(Aozora2Html::Tag::MultilineStyle.new(self, "futoji"),match)
1938
1060
  @indent_stack.push(:futoji)
1939
1061
  end
1940
1062
  if command.match(/�Α�/)
1941
1063
  if match != ""
1942
1064
  @indent_stack.pop
1943
1065
  end
1944
- push_block_tag(Multiline_style_tag.new(self, "shatai"),match)
1066
+ push_block_tag(Aozora2Html::Tag::MultilineStyle.new(self, "shatai"),match)
1945
1067
  @indent_stack.push(:shatai)
1946
- end
1068
+ end
1947
1069
 
1948
1070
  if command.match(/(.*)�i�K(..)�ȕ���/)
1949
- whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
1071
+ _whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
1950
1072
  if match != ""
1951
1073
  @indent_stack.pop
1952
1074
  end
@@ -1955,76 +1077,86 @@ class Aozora2Html
1955
1077
  else
1956
1078
  :dai
1957
1079
  end
1958
- push_block_tag(Font_size_tag.new(self,
1959
- convert_japanese_number(nest).to_i,
1960
- daisho),match)
1080
+ push_block_tag(Aozora2Html::Tag::FontSize.new(self,
1081
+ convert_japanese_number(nest).to_i,
1082
+ daisho),
1083
+ match)
1961
1084
  @indent_stack.push(daisho)
1962
1085
  end
1963
1086
 
1964
1087
  if match == ""
1965
- apply_rest_notes("��������" + command)
1088
+ apply_rest_notes(original_command)
1966
1089
  else
1967
1090
  @tag_stack.push(match)
1968
1091
  nil
1969
1092
  end
1970
1093
  end
1971
1094
 
1972
- def exec_block_end_command (command)
1095
+ def detect_command_mode(command)
1096
+ if command.match(/������/)
1097
+ :jisage
1098
+ elsif command.match(/(�n�t��|���グ)�I���$/)
1099
+ :chitsuki
1100
+ elsif command.match(/���o��/)
1101
+ :midashi
1102
+ elsif command.match(/���l��/)
1103
+ :jizume
1104
+ elsif command.match(/���g��/)
1105
+ :yokogumi
1106
+ elsif command.match(/�r�͂�/)
1107
+ :keigakomi
1108
+ elsif command.match(/�L���v�V����/)
1109
+ :caption
1110
+ elsif command.match(/����/)
1111
+ :futoji
1112
+ elsif command.match(/�Α�/)
1113
+ :shatai
1114
+ elsif command.match(/�傫�ȕ���/)
1115
+ :dai
1116
+ elsif command.match(/�����ȕ���/)
1117
+ :sho
1118
+ else
1119
+ nil
1120
+ end
1121
+ end
1122
+
1123
+ def exec_block_end_command(command)
1124
+ original_command = command.dup
1125
+ command.sub!(/^������/, "")
1973
1126
  match = false
1974
- if mode = if command.match(/������/)
1975
- :jisage
1976
- elsif command.match(/(�n�t��|���グ)�I���$/)
1977
- :chitsuki
1978
- elsif command.match(/���o��/)
1979
- :midashi
1980
- elsif command.match(/���l��/)
1981
- :jizume
1982
- elsif command.match(/���g��/)
1983
- :yokogumi
1984
- elsif command.match(/�r�͂�/)
1985
- :keigakomi
1986
- elsif command.match(/�L���v�V����/)
1987
- :caption
1988
- elsif command.match(/����/)
1989
- :futoji
1990
- elsif command.match(/�Α�/)
1991
- :shatai
1992
- elsif command.match(/�傫�ȕ���/)
1993
- :dai
1994
- elsif command.match(/�����ȕ���/)
1995
- :sho
1996
- end
1127
+ mode = detect_command_mode(command)
1128
+ if mode
1997
1129
  explicit_close(mode)
1998
1130
  match = @indent_stack.pop
1999
1131
  end
2000
-
1132
+
2001
1133
  if match
2002
- if not(match.is_a?(String))
1134
+ if !match.is_a?(String)
2003
1135
  @terprip = false
2004
1136
  end
2005
1137
  nil
2006
1138
  else
2007
- apply_rest_notes("������" + command)
1139
+ apply_rest_notes(original_command)
2008
1140
  end
2009
1141
  end
2010
-
2011
- def exec_img_command (command,raw)
1142
+
1143
+ def exec_img_command(command,raw)
2012
1144
  match = raw.match(/(.*)�i(fig.+\.png)(�A��([0-9]+)�~�c([0-9]+))*�j����/)
2013
1145
  if match
2014
- whole, alt, src, wh, width, height = match.to_a
1146
+ _whole, alt, src, _wh, width, height = match.to_a
2015
1147
  css_class = if alt.match(/�ʐ^/)
2016
1148
  "photo"
2017
1149
  else
2018
1150
  "illustration"
2019
1151
  end
2020
- Img_tag.new(self, src, css_class, alt, width, height)
1152
+ Aozora2Html::Tag::Img.new(self, src, css_class, alt, width, height)
2021
1153
  else
2022
1154
  apply_rest_notes(command)
2023
1155
  end
2024
1156
  end
2025
1157
 
2026
- def exec_frontref_command (command)
2027
- whole, reference, spec1, spec2 = command.match(/�u([^�u�v]*(?:�u.+�v)*[^�u�v]*)�v[��|��|��](�u.+�v��)*(.+)/).to_a
1158
+ def exec_frontref_command(command)
1159
+ _whole, reference, spec1, spec2 = command.match(/�u([^�u�v]*(?:�u.+�v)*[^�u�v]*)�v[�ɂ͂�](�u.+�v��)*(.+)/).to_a
2028
1160
  spec = if spec1
2029
1161
  spec1 + spec2
2030
1162
  else
@@ -2042,37 +1174,37 @@ class Aozora2Html
2042
1174
  apply_rest_notes(command)
2043
1175
  end
2044
1176
 
2045
- def multiply (bouki, times)
1177
+ def multiply(bouki, times)
2046
1178
  s = ""
2047
1179
  (times-1).times{
2048
1180
  s += bouki
2049
- s += "<!>"
1181
+ s += "&nbsp;"
2050
1182
  }
2051
1183
  s + bouki
2052
1184
  end
2053
1185
 
2054
- def include_ruby? (array)
1186
+ def include_ruby?(array)
2055
1187
  array.index{|elt|
2056
- if elt.is_a?(Ruby_tag)
1188
+ if elt.is_a?(Aozora2Html::Tag::Ruby)
2057
1189
  true
2058
- elsif elt.is_a?(Reference_mentioned_tag)
1190
+ elsif elt.is_a?(Aozora2Html::Tag::ReferenceMentioned)
2059
1191
  if elt.target.is_a?(Array)
2060
1192
  include_ruby?(elt.target)
2061
1193
  else
2062
- elt.target.is_a?(Ruby_tag)
1194
+ elt.target.is_a?(Aozora2Html::Tag::Ruby)
2063
1195
  end
2064
1196
  end
2065
1197
  }
2066
1198
  end
2067
-
1199
+
2068
1200
  # complex ruby wrap up utilities -- don't erase! we will use soon ...
2069
- def rearrange_ruby_tag (targets, upper_ruby, under_ruby = "")
1201
+ def rearrange_ruby_tag(targets, upper_ruby, under_ruby = "")
2070
1202
  target,upper,under = rearrange_ruby(targets, upper_ruby, under_ruby)
2071
- Ruby_tag.new(self, target,upper,under)
1203
+ Aozora2Html::Tag::Ruby.new(self, target,upper,under)
2072
1204
  end
2073
-
1205
+
2074
1206
  # ruby�^�O�̍Ċ��蓖��
2075
- def rearrange_ruby (targets, upper_ruby, under_ruby = "")
1207
+ def rearrange_ruby(targets, upper_ruby, under_ruby = "")
2076
1208
  if include_ruby?(targets)
2077
1209
  new_targets = []
2078
1210
  new_upper = if upper_ruby != ""
@@ -2086,31 +1218,31 @@ class Aozora2Html
2086
1218
  []
2087
1219
  end
2088
1220
  if new_upper.length > 1 and new_under.length > 1
2089
- raise Aozora_Error.new("1�‚̒P���3�‚̃��r�͂‚����܂���")
1221
+ raise Aozora2Html::Error, "1�‚̒P���3�‚̃��r�͂‚����܂���"
2090
1222
  end
2091
-
1223
+
2092
1224
  targets.each{|x|
2093
- if x.is_a?(Ruby_tag)
1225
+ if x.is_a?(Aozora2Html::Tag::Ruby)
2094
1226
  if x.target.is_a?(Array)
2095
- # inner Ruby_tag is already complex ... give up
2096
- raise Aozora_Error.new("�����ӏ���2�‚̃��r�͂‚����܂���")
1227
+ # inner Aozora2Html::Tag::Ruby is already complex ... give up
1228
+ raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
2097
1229
  else
2098
1230
  if x.ruby != ""
2099
1231
  if new_upper.is_a?(Array)
2100
1232
  new_upper.push(x.ruby)
2101
1233
  else
2102
- raise Aozora_Error.new("�����ӏ���2�‚̃��r�͂‚����܂���")
1234
+ raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
2103
1235
  end
2104
1236
  else
2105
1237
  if new_under.is_a?(Array)
2106
1238
  new_under.push(x.under_ruby)
2107
1239
  else
2108
- raise Aozora_Error.new("�����ӏ���2�‚̃��r�͂‚����܂���")
1240
+ raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
2109
1241
  end
2110
1242
  end
2111
1243
  new_targets.push(x.target)
2112
1244
  end
2113
- elsif x.is_a?(Reference_mentioned_tag)
1245
+ elsif x.is_a?(Aozora2Html::Tag::ReferenceMentioned)
2114
1246
  if x.target.is_a?(Array)
2115
1247
  # recursive
2116
1248
  tar,up,un = rearrange_ruby(x.target,"","")
@@ -2122,12 +1254,12 @@ class Aozora2Html
2122
1254
  if new_under.is_a?(Array)
2123
1255
  new_under.concat(un)
2124
1256
  elsif un.to_s.length > 0
2125
- raise Aozora_Error.new("�����ӏ���2�‚̃��r�͂‚����܂���")
1257
+ raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
2126
1258
  end
2127
1259
  if new_upper.is_a?(Array)
2128
1260
  new_upper.concat(up)
2129
1261
  elsif up.to_s.length > 0
2130
- raise Aozora_Error.new("�����ӏ���2�‚̃��r�͂‚����܂���")
1262
+ raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
2131
1263
  end
2132
1264
  else
2133
1265
  new_targets.push(x)
@@ -2153,36 +1285,36 @@ class Aozora2Html
2153
1285
  [targets, upper_ruby, under_ruby]
2154
1286
  end
2155
1287
  end
2156
-
2157
- def exec_style (targets, command)
1288
+
1289
+ def exec_style(targets, command)
2158
1290
  try_kuten = kuten2png(command)
2159
1291
  if try_kuten != command
2160
1292
  try_kuten
2161
1293
  elsif command.match(/�c����/)
2162
- Dir_tag.new(self, targets)
1294
+ Aozora2Html::Tag::Dir.new(self, targets)
2163
1295
  elsif command.match(/���g��/)
2164
- Inline_yokogumi_tag.new(self, targets)
1296
+ Aozora2Html::Tag::InlineYokogumi.new(self, targets)
2165
1297
  elsif command.match(/�r�͂�/)
2166
- Inline_keigakomi_tag.new(self, targets)
1298
+ Aozora2Html::Tag::InlineKeigakomi.new(self, targets)
2167
1299
  elsif command.match(/�L���v�V����/)
2168
- Inline_caption_tag.new(self, targets)
1300
+ Aozora2Html::Tag::InlineCaption.new(self, targets)
2169
1301
  elsif command.match(/�Ԃ�_/)
2170
- Kaeriten_tag.new(self, targets)
1302
+ Aozora2Html::Tag::Kaeriten.new(self, targets)
2171
1303
  elsif command.match(/�P�_���艼��/)
2172
- Okurigana_tag.new(self, targets)
1304
+ Aozora2Html::Tag::Okurigana.new(self, targets)
2173
1305
  elsif command.match(/���o��/)
2174
1306
  midashi_type = :normal
2175
1307
  if command.match(/���s/)
2176
1308
  midashi_type = :dogyo
2177
- elsif command.match (/��/)
1309
+ elsif command.match(/��/)
2178
1310
  midashi_type = :mado
2179
1311
  else
2180
1312
  @terprip = false
2181
1313
  end
2182
- Midashi_tag.new(self, targets, command, midashi_type)
1314
+ Aozora2Html::Tag::Midashi.new(self, targets, command, midashi_type)
2183
1315
  elsif command.match(/(.*)�i�K(..)�ȕ���/)
2184
- whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
2185
- Inline_font_size_tag.new(self,targets,
1316
+ _whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
1317
+ Aozora2Html::Tag::InlineFontSize.new(self,targets,
2186
1318
  convert_japanese_number(nest).to_i,
2187
1319
  if style.match("��")
2188
1320
  :sho
@@ -2190,14 +1322,14 @@ class Aozora2Html
2190
1322
  :dai
2191
1323
  end)
2192
1324
  elsif command.match(/(��|��)�Ɂu([^�v]*)�v��(���r|���L)/)
2193
- whole, dir, under = command.match(/(��|��)�Ɂu([^�v]*)�v��(���r|���L)/).to_a
2194
- if targets.length == 1 and targets[0].is_a?(Ruby_tag)
1325
+ _whole, dir, under = command.match(/(��|��)�Ɂu([^�v]*)�v��(���r|���L)/).to_a
1326
+ if targets.length == 1 and targets[0].is_a?(Aozora2Html::Tag::Ruby)
2195
1327
  tag = targets[0]
2196
1328
  if tag.under_ruby == ""
2197
1329
  tag.under_ruby = under
2198
1330
  tag
2199
1331
  else
2200
- raise Aozora_Error.new("1�‚̒P���3�‚̃��r�͂‚����܂���")
1332
+ raise Aozora2Html::Error, "1�‚̒P���3�‚̃��r�͂‚����܂���"
2201
1333
  end
2202
1334
  else
2203
1335
  rearrange_ruby_tag(targets,"",under)
@@ -2205,12 +1337,12 @@ class Aozora2Html
2205
1337
  elsif command.match(/�u(.+?)�v�̒��L/)
2206
1338
  rearrange_ruby_tag(targets,/�u(.+?)�v�̒��L/.match(command).to_a[1])
2207
1339
  elsif command.match(/�u(.)�v�̖T�L/)
2208
- rearrange_ruby_tag(targets,multiply( /�u(.)�v�̖T�L/.match(command).to_a[1], target.length))
1340
+ rearrange_ruby_tag(targets,multiply( /�u(.)�v�̖T�L/.match(command).to_a[1], targets.to_s.length))
2209
1341
  else
2210
1342
  ## direction fix! ##
2211
1343
  filter = lambda{|x| x}
2212
1344
  if command.match(/(�E|��|��|��)��(.*)/)
2213
- whole, dir, com = command.match(/(�E|��|��|��)��(.*)/).to_a
1345
+ _whole, dir, com = command.match(/(�E|��|��|��)��(.*)/).to_a
2214
1346
  # renew command
2215
1347
  command = com
2216
1348
  if command.match(/�_/)
@@ -2225,81 +1357,73 @@ class Aozora2Html
2225
1357
  end
2226
1358
  end
2227
1359
  end
2228
-
2229
- found = @@command_table[command]
1360
+
1361
+ found = COMMAND_TABLE[command]
2230
1362
  # found = [class, tag]
2231
1363
  if found
2232
- if found[1] == "em" # or found[1] == "strong"
2233
- @chuuki_table[:em] = true
2234
- end
2235
- Decorate_tag.new(self, targets, filter.call(found[0]), found[1])
1364
+ Aozora2Html::Tag::Decorate.new(self, targets, filter.call(found[0]), found[1])
2236
1365
  else
2237
1366
  nil
2238
1367
  end
2239
1368
  end
2240
1369
  end
2241
1370
 
2242
- def apply_dakuten_katakana (command)
1371
+ def apply_dakuten_katakana(command)
2243
1372
  n = command.match(/1-7-8([2345])/).to_a[1]
2244
- frontref =
2245
- case n
2246
- when "2"
2247
- "���J"
2248
- when "3"
2249
- "���J"
2250
- when "4"
2251
- "���J"
2252
- when "5"
2253
- "���J"
2254
- end
1373
+ frontref = DAKUTEN_KATAKANA_TABLE[n]
2255
1374
  if found = search_front_reference(frontref)
2256
- Dakuten_katakana_tag.new(self, n,found.join)
1375
+ Aozora2Html::Tag::DakutenKatakana.new(self, n,found.join)
2257
1376
  else
2258
1377
  apply_rest_notes(command)
2259
1378
  end
2260
1379
  end
2261
1380
 
1381
+ # ���̎��_�̏���
1382
+ #
1383
+ # ���̎��_�͌��󂻂̂܂܏o�͂���̂Ńt�b�^�́u�\�L�ɂ‚��āv�ŏo�͂��邩�ǂ����̃t���O���������s��
2262
1384
  def assign_kunoji
2263
1385
  second = @stream.peek_char(0)
2264
1386
  case second
2265
- when @@noji
1387
+ when NOJI
2266
1388
  @chuuki_table[:kunoji] = true
2267
- when @@dakuten
2268
- if @stream.peek_char(1) == @@noji
1389
+ when DAKUTEN
1390
+ if @stream.peek_char(1) == NOJI
2269
1391
  @chuuki_table[:dakutenkunoji] = true
2270
1392
  end
2271
1393
  end
2272
1394
  end
2273
1395
 
2274
- def apply_rest_notes (command)
1396
+ def apply_rest_notes(command)
2275
1397
  @chuuki_table[:chuki] = true
2276
- Editor_note_tag.new(self, command)
1398
+ Aozora2Html::Tag::EditorNote.new(self, command)
2277
1399
  end
2278
1400
 
2279
1401
  # �b�������Ƃ��͕�����𖳎�����ruby_buf�����Ȃ��Ⴂ���Ȃ�
2280
1402
  def apply_ruby
2281
- @ruby_buf_protected = nil
2282
- ruby,raw = read_to_nest("�t")
1403
+ @ruby_buf.protected = nil
1404
+ ruby, _raw = read_to_nest("�t")
2283
1405
  if ruby.length == 0
2284
1406
  # escaped ruby character
2285
1407
  return "�s�t"
2286
1408
  end
2287
1409
  ans = ""
2288
1410
  notes = []
2289
- @ruby_buf.each{|token|
2290
- if token.is_a?(UnEmbed_Gaiji_tag)
1411
+ @ruby_buf.each do |token|
1412
+ if token.is_a?(Aozora2Html::Tag::UnEmbedGaiji)
2291
1413
  ans.concat("��")
2292
1414
  token.escape!
2293
1415
  notes.push(token)
2294
1416
  else
2295
1417
  ans.concat(token.to_s)
2296
- end}
2297
- @buffer.push(Ruby_tag.new(self, ans, ruby))
1418
+ end
1419
+ end
1420
+ @buffer.push(Aozora2Html::Tag::Ruby.new(self, ans, ruby))
2298
1421
  @buffer = @buffer + notes
2299
- @ruby_buf = [""]
1422
+ @ruby_buf.clear
2300
1423
  nil
2301
1424
  end
2302
1425
 
1426
+ # parse_body�̃t�b�^��
2303
1427
  def parse_tail
2304
1428
  char = read_char
2305
1429
  check = true
@@ -2308,33 +1432,39 @@ class Aozora2Html
2308
1432
  check = false
2309
1433
  char = read_accent
2310
1434
  when @endchar
2311
- throw :terminate
1435
+ throw :terminate
2312
1436
  when "��"
2313
1437
  char = dispatch_gaiji
2314
1438
  when "�m"
2315
1439
  char = dispatch_aozora_command
2316
- when @@ku
2317
- assign_kunoji
1440
+ when KU
1441
+ assign_kunoji
2318
1442
  when "�s"
2319
1443
  char = apply_ruby
2320
1444
  end
2321
- if char == "\r\n"
1445
+
1446
+ case char
1447
+ when "\r\n"
2322
1448
  tail_output
2323
- elsif char == "�b"
2324
- ruby_buf_dump
2325
- @ruby_buf_protected = true
2326
- elsif char != nil
1449
+ when RUBY_PREFIX
1450
+ @ruby_buf.dump(@buffer)
1451
+ @ruby_buf.protected = true
1452
+ when nil
1453
+ # noop
1454
+ else
2327
1455
  if check
2328
- illegal_char_check(char)
1456
+ illegal_char_check(char, line_number)
2329
1457
  end
2330
1458
  push_chars(char)
2331
1459
  end
2332
1460
  end
2333
1461
 
1462
+ # general_output�̃t�b�^��
2334
1463
  def tail_output
2335
- ruby_buf_dump
1464
+ @ruby_buf.dump(@buffer)
2336
1465
  string = @buffer.join
2337
- @ruby_buf = [""]; @ruby_buf_mode = nil; @buffer = []
1466
+ @ruby_buf.clear
1467
+ @buffer = []
2338
1468
  string.gsub!("info@aozora.gr.jp",'<a href="mailto: info@aozora.gr.jp">info@aozora.gr.jp</a>')
2339
1469
  string.gsub!("�‹󕶌Ɂihttp://www.aozora.gr.jp/�j"){"<a href=\"http://www.aozora.gr.jp/\">#{$&}</a>"}
2340
1470
  if string.match(/(<br \/>$|<\/p>$|<\/h\d>$|<div.*>$|<\/div>$|^<[^>]*>$)/)
@@ -2343,8 +1473,9 @@ class Aozora2Html
2343
1473
  @out.print string, "<br />\r\n"
2344
1474
  end
2345
1475
  end
2346
-
2347
- def hyoki ()
1476
+
1477
+ # `���\�L�ɂ‚���`�Ŏg�p�������L�����o�͂���
1478
+ def hyoki
2348
1479
  # <br /> times fix
2349
1480
  @out.print "<br />\r\n</div>\r\n<div class=\"notation_notes\">\r\n<hr />\r\n<br />\r\n���\�L�ɂ‚���<br />\r\n<ul>\r\n"
2350
1481
  @out.print "\t<li>���̃t�@�C���� W3C ���� XHTML1.1 �ɂ������`���ō쐬����Ă��܂��B</li>\r\n"
@@ -2353,22 +1484,19 @@ class Aozora2Html
2353
1484
  end
2354
1485
  if @chuuki_table[:kunoji]
2355
1486
  if @chuuki_table[:dakutenkunoji]
2356
- @out.print "\t<li>�u���̎��_�v�́u#{@@ku}#{@@noji}�v�ŁA�u���_�t�����̎��_�v�́u#{@@ku}#{@@dakuten}#{@@noji}�v�ŕ\���܂����B</li>\r\n"
1487
+ @out.print "\t<li>�u���̎��_�v�́u#{KU}#{NOJI}�v�ŁA�u���_�t�����̎��_�v�́u#{KU}#{DAKUTEN}#{NOJI}�v�ŕ\���܂����B</li>\r\n"
2357
1488
  else
2358
- @out.print "\t<li>�u���̎��_�v�́u#{@@ku}#{@@noji}�v�ŕ\���܂����B</li>\r\n"
1489
+ @out.print "\t<li>�u���̎��_�v�́u#{KU}#{NOJI}�v�ŕ\���܂����B</li>\r\n"
2359
1490
  end
2360
1491
  elsif @chuuki_table[:dakutenkunoji]
2361
- @out.print "\t<li>�u���_�t�����̎��_�v�́u#{@@ku}#{@@dakuten}#{@@noji}�v�ŕ\���܂����B</li>\r\n"
1492
+ @out.print "\t<li>�u���_�t�����̎��_�v�́u#{KU}#{DAKUTEN}#{NOJI}�v�ŕ\���܂����B</li>\r\n"
2362
1493
  end
2363
- if @chuuki_table[:newjis]
1494
+ if @chuuki_table[:newjis] && !Aozora2Html::Tag::EmbedGaiji.use_jisx0213
2364
1495
  @out.print "\t<li>�u���̎��_�v���̂���JIS X 0213�ɂ��镶���́A�摜�����Ė��ߍ��݂܂����B</li>\r\n"
2365
1496
  end
2366
- if @chuuki_table[:accent]
1497
+ if @chuuki_table[:accent] && !Aozora2Html::Tag::Accent.use_jisx0213
2367
1498
  @out.print "\t<li>�A�N�Z���g�����t�����e�������́A�摜�����Ė��ߍ��݂܂����B</li>\r\n"
2368
1499
  end
2369
- # if @chuuki_table[:em]
2370
- # @out.print "\t<li>�T�_�⌗�_�A�T���̕t���������́A�����\���ɂ��܂����B</li>\r\n"
2371
- # end
2372
1500
  if @images[0]
2373
1501
  @out.print "\t<li>���̍�i�ɂ́AJIS X 0213�ɂȂ��A�ȉ��̕������p�����Ă��܂��B�i�����́A��{���̏o���u�y�[�W-�s�v���B�j�����̕����͖{�����ł́u���m���c�n�v�̌`�Ŏ����܂����B</li>\r\n</ul>\r\n<br />\r\n\t\t<table class=\"gaiji_list\">\r\n"
2374
1502
  @images.each{|cell|
@@ -2396,139 +1524,6 @@ class Aozora2Html
2396
1524
  end
2397
1525
  end
2398
1526
 
2399
- # �‹�L�@�̓���q�ɑΉ��i�H�j
2400
- class Aozora_tag_parser < Aozora2Html
2401
- def initialize (input, endchar, chuuki, image)
2402
- if not(input.is_a?(Jstream))
2403
- raise ArgumentError, "tag_parser must supply Jstream as input"
2404
- end
2405
- @stream = input;
2406
- @buffer = []; @ruby_buf = [""]; @ruby_char_type = nil
2407
- @chuuki_table = chuuki; @images = image; # global�Ȋ‹����L�^����A�C�e���͋��L����K�v����
2408
- @endchar = endchar # ���s���z����ׂ����ۂ��c
2409
- @section = :tail # ���������ƋL�@���̓C���f���g�����Ȃ��̂œ���
2410
- @raw = "" # �O���ϊ��O�̐��e�L�X�g���c���������Ƃ�����炵��
2411
- end
2412
-
2413
- def read_char # method override!
2414
- c = @stream.read_char
2415
- @raw.concat(c)
2416
- c
2417
- end
2418
-
2419
- def read_to_nest(endchar)
2420
- ans = super(endchar)
2421
- @raw.concat(ans[1])
2422
- ans
2423
- end
2424
-
2425
- def general_output # �o�͂�[String,String]�Ԃ��ŁI
2426
- ruby_buf_dump
2427
- ans=""
2428
- @buffer.each{|s|
2429
- if s.is_a?(UnEmbed_Gaiji_tag) and not(s.escaped?)
2430
- # �����Ă��������𕜊�������
2431
- ans.concat("��")
2432
- end
2433
- ans.concat(s.to_s)
2434
- }
2435
- [ans,@raw]
2436
- end
2437
-
2438
- def process ()
2439
- catch(:terminate){
2440
- loop{
2441
- parse
2442
- }
2443
- }
2444
- general_output
2445
- end
2446
- end
2447
-
2448
- # accent���ꕶ���𐶂������߂̍ċA�Ăяo��
2449
- class Aozora_accent_parser < Aozora2Html
2450
- def initialize (input, endchar, chuuki, image)
2451
- if not(input.is_a?(Jstream))
2452
- raise ArgumentError, "tag_parser must supply Jstream as input"
2453
- end
2454
- @stream = input
2455
- @buffer = []; @ruby_buf = [""]; @ruby_char_type = nil
2456
- @chuuki_table = chuuki; @images = image; # global�Ȋ‹����L�^����A�C�e���͋��L����K�v����
2457
- @endchar = endchar # ���s�͉z�����Ȃ� <br />���o�͂��Ă����Ȃ�
2458
- @closed = nil # ���s�ł̋����P�ރ`�F�b�N�t���O
2459
- @encount_accent = nil
2460
- end
2461
-
2462
- def general_output # �o�͔͂z��ŕԂ�
2463
- ruby_buf_dump
2464
- if not(@encount_accent)
2465
- @buffer.unshift("�k")
2466
- end
2467
- if @closed and not(@encount_accent)
2468
- @buffer.push("�l")
2469
- elsif not(@closed)
2470
- @buffer.push("<br />\r\n")
2471
- end
2472
- @buffer
2473
- end
2474
-
2475
- def parse
2476
- first = read_char
2477
- if found = @@accent_table[first]
2478
- if found2 = found[@stream.peek_char(0)]
2479
- if found2.is_a?(Hash)
2480
- if found3 = found2[@stream.peek_char(1)]
2481
- first = Accent_tag.new(self, *found3)
2482
- @encount_accent = true
2483
- @chuuki_table[:accent] = true
2484
- read_char
2485
- read_char
2486
- end
2487
- elsif found2
2488
- first = Accent_tag.new(self, *found2)
2489
- @encount_accent = true
2490
- read_char
2491
- @chuuki_table[:accent] = true
2492
- end
2493
- end
2494
- end
2495
- case first
2496
- when "��"
2497
- first = dispatch_gaiji
2498
- when "�m"
2499
- first = dispatch_aozora_command
2500
- when @@ku
2501
- assign_kunoji
2502
- when "�s"
2503
- first = apply_ruby
2504
- end
2505
- if first == "\r\n"
2506
- if @encount_accent
2507
- puts "�x��(#{scount}�s��):�A�N�Z���g�����̋T�b���ʂ̎n�߂ƏI��肪�A�s���ő����Ă��܂���"
2508
- end
2509
- throw :terminate
2510
- elsif first == "�l"
2511
- @closed = true
2512
- throw :terminate
2513
- elsif first == "�b"
2514
- ruby_buf_dump
2515
- @ruby_buf_protected = true
2516
- elsif first != "" and first != nil
2517
- illegal_char_check(first)
2518
- push_chars(first)
2519
- end
2520
- end
2521
-
2522
- def process ()
2523
- catch(:terminate){
2524
- loop{
2525
- parse
2526
- }
2527
- }
2528
- general_output
2529
- end
2530
- end
2531
-
2532
1527
  if $0 == __FILE__
2533
1528
  # todo: �����`�F�b�N�Ƃ�
2534
1529
  Aozora2Html.new($*[0],$*[1]).process