aozora2html 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -61,6 +61,7 @@ Dir.mktmpdir do |dir|
61
61
  end
62
62
 
63
63
  if File.extname(src_file) == ".zip"
64
+ require "aozora2html/zip"
64
65
  tmpfile = File.join(dir, "aozora.txt")
65
66
  Aozora2Html::Zip.unzip(src_file, tmpfile)
66
67
  Aozora2Html.new(tmpfile, dest_file).process
@@ -20,7 +20,7 @@ class Aozora2Html
20
20
  end
21
21
 
22
22
  def general_output # 出力は配列で返す
23
- @ruby_buf.dump(@buffer)
23
+ @ruby_buf.dump_into(@buffer)
24
24
  if !@encount_accent
25
25
  @buffer.unshift("〔".encode("shift_jis"))
26
26
  end
@@ -71,7 +71,7 @@ class Aozora2Html
71
71
  @closed = true
72
72
  throw :terminate
73
73
  elsif first == RUBY_PREFIX
74
- @ruby_buf.dump(@buffer)
74
+ @ruby_buf.dump_into(@buffer)
75
75
  @ruby_buf.protected = true
76
76
  elsif first != "" and first != nil
77
77
  illegal_char_check(first, line_number)
@@ -4,11 +4,11 @@ require "aozora2html/i18n"
4
4
  class Aozora2Html
5
5
  class Error < StandardError
6
6
 
7
- def initialize(message)
8
- @message = message
7
+ def initialize(msg)
8
+ @message = msg
9
9
  end
10
10
 
11
- def message(line)
11
+ def message(line = 0)
12
12
  I18n.t(:error_stop, line, @message)
13
13
  end
14
14
  end
@@ -20,8 +20,8 @@ class Aozora2Html
20
20
 
21
21
  def header_element_type(string)
22
22
  original = true
23
- string.each_char do |x|
24
- code = x.unpack("H*")[0]
23
+ string.each_char do |ch|
24
+ code = ch.unpack("H*")[0]
25
25
  if ("00" <= code and code <= "7f") or # 1byte
26
26
  ("8140" <= code and code <= "8258") or # 1-1, 3-25
27
27
  ("839f" <= code and code <= "8491") # 6-1, 7-81
@@ -7,7 +7,18 @@ class Aozora2Html
7
7
  :use_crlf => "改行コードを、「CR+LF」にあらためてください",
8
8
  :error_stop => "エラー(%d行目):%s. \r\n処理を停止します",
9
9
  :invalid_font_size => "文字サイズの指定が不正です",
10
- :unsupported_ruby => "サポートされていない複雑なルビ付けです"
10
+ :unsupported_ruby => "サポートされていない複雑なルビ付けです",
11
+ :warn_onebyte => "警告(%d行目):1バイトの「%s」が使われています",
12
+ :warn_chuki => "警告(%d行目):注記記号の誤用の可能性がある、「%s」が使われています",
13
+ :warn_jis_gaiji => "警告(%d行目):JIS外字「%s」が使われています",
14
+ :dont_crlf_in_style => "%s中に改行されました。改行をまたぐ要素にはブロック表記を用いてください",
15
+ :terminate_in_style => "%s中に本文が終了しました",
16
+ :invalid_closing => "%sを閉じようとしましたが、%s中ではありません",
17
+ :invalid_nesting => "%sを終了しようとしましたが、%s中です",
18
+ :dont_use_double_ruby => "同じ箇所に2つのルビはつけられません",
19
+ :dont_allow_triple_ruby => "1つの単語に3つのルビはつけられません",
20
+ :warn_unexpected_terminator => "警告(%d行目):予期せぬファイル終端",
21
+ :warn_undefined_command => "警告(%d行目):「%s」は未対応のコマンドのため無視します",
11
22
  }
12
23
 
13
24
  def self.t(msg, *args)
@@ -59,8 +59,8 @@ class Aozora2Html
59
59
  @ruby_buf.last.is_a?(String)
60
60
  end
61
61
 
62
- # buffer management
63
- def dump(buffer)
62
+ # buffer management
63
+ def dump_into(buffer)
64
64
  if @protected
65
65
  @ruby_buf.unshift(RUBY_PREFIX)
66
66
  @protected = nil
@@ -29,7 +29,7 @@ class Aozora2Html
29
29
  end
30
30
 
31
31
  def general_output # 出力は[String,String]返しで!
32
- @ruby_buf.dump(@buffer)
32
+ @ruby_buf.dump_into(@buffer)
33
33
  ans=""
34
34
  @buffer.each do |s|
35
35
  if s.is_a?(Aozora2Html::Tag::UnEmbedGaiji) and !s.escaped?
@@ -77,6 +77,17 @@ class Aozora2Html
77
77
  end
78
78
  end
79
79
  module_function :create_midashi_class
80
+
81
+ def convert_japanese_number(command)
82
+ tmp = command.tr("0-9".encode("shift_jis"), "0-9")
83
+ tmp.tr!("一二三四五六七八九〇".encode("shift_jis"),"1234567890")
84
+ tmp.gsub!(/(\d)#{"十".encode("shift_jis")}(\d)/){"#{$1}#{$2}"}
85
+ tmp.gsub!(/(\d)#{"十".encode("shift_jis")}/){"#{$1}0"}
86
+ tmp.gsub!(/#{"十".encode("shift_jis")}(\d)/){"1#{$1}"}
87
+ tmp.gsub!(/#{"十".encode("shift_jis")}/,"10")
88
+ tmp
89
+ end
90
+ module_function :convert_japanese_number
80
91
  end
81
92
  end
82
93
 
@@ -1,3 +1,3 @@
1
1
  class Aozora2Html
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
@@ -27,5 +27,9 @@ class String
27
27
  :else
28
28
  end
29
29
  end
30
+
31
+ def to_sjis
32
+ self.encode("shift_jis")
33
+ end
30
34
  end
31
35
 
@@ -1,6 +1,5 @@
1
- # -*- coding:shift_jis -*-
2
- # �‹󕶌Ɍ`���̃e�L�X�g�t�@�C���� html �ɐ��`���� ruby �X�N���v�g
3
- require "cgi"
1
+ # -*- coding:utf-8 -*-
2
+ # 青空文庫形式のテキストファイルを html に整形する ruby スクリプト
4
3
  require "extensions"
5
4
  require "aozora2html/error"
6
5
  require "jstream"
@@ -11,30 +10,104 @@ require "aozora2html/style_stack"
11
10
  require "aozora2html/header"
12
11
  require "aozora2html/ruby_buffer"
13
12
  require "aozora2html/yaml_loader"
14
- require "aozora2html/zip"
15
13
  require "aozora2html/utils"
16
14
 
17
15
  $gaiji_dir = "../../../gaiji/"
18
16
 
19
17
  $css_files = Array["../../aozora.css"]
20
18
 
21
- # �ϊ���{��
19
+ # 変換器本体
22
20
  class Aozora2Html
23
21
 
24
- # �S�p�o�b�N�X���b�V�����o���Ȃ����璼�ł�
22
+ # 全角バックスラッシュが出せないから直打ち
25
23
  KU = ["18e5"].pack("h*").force_encoding("shift_jis")
26
24
  NOJI = ["18f5"].pack("h*").force_encoding("shift_jis")
27
25
  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"
26
+ GAIJI_MARK = "".to_sjis
27
+ IGETA_MARK = "".to_sjis
28
+ RUBY_BEGIN_MARK = "".to_sjis
29
+ RUBY_END_MARK = "".to_sjis
30
+ PAREN_BEGIN_MARK = "".to_sjis
31
+ PAREN_END_MARK = ")".to_sjis
32
+ SIZE_SMALL = "小".to_sjis
33
+ SIZE_MIDDLE = "中".to_sjis
34
+ SIZE_LARGE = "大".to_sjis
35
+ TEIHON_MARK = "底本:".to_sjis
36
+ COMMAND_BEGIN = "[".to_sjis
37
+ COMMAND_END = "]".to_sjis
38
+ ACCENT_BEGIN = "〔".to_sjis
39
+ ACCENT_END = "〕".to_sjis
40
+ AOZORABUNKO = "青空文庫".to_sjis
41
+ #PAT_EDITOR = /[校訂|編|編集|編集校訂|校訂編集]$/
42
+ PAT_EDITOR = "(校訂|編|編集)$".to_sjis
43
+ PAT_HENYAKU = "編訳$".to_sjis
44
+ PAT_TRANSLATOR = "訳$".to_sjis
45
+ RUBY_PREFIX = "|".to_sjis
46
+ PAT_RUBY = /#{"《.*?》".to_sjis}/
47
+ PAT_DIRECTION = "(右|左|上|下)に(.*)".to_sjis
48
+ PAT_REF = "^「.+」".to_sjis
49
+ CHUUKI_COMMAND = "注記付き".to_sjis
50
+ TCY_COMMAND = "縦中横".to_sjis
51
+ KEIGAKOMI_COMMAND = "罫囲み".to_sjis
52
+ YOKOGUMI_COMMAND = "横組み".to_sjis
53
+ CAPTION_COMMAND = "キャプション".to_sjis
54
+ WARIGAKI_COMMAND = "割書".to_sjis
55
+ KAERITEN_COMMAND = "返り点".to_sjis
56
+ KUNTEN_OKURIGANA_COMMAND = "訓点送り仮名".to_sjis
57
+ MIDASHI_COMMAND = "見出し".to_sjis
58
+ OMIDASHI_COMMAND = "大見出し".to_sjis
59
+ NAKAMIDASHI_COMMAND = "中見出し".to_sjis
60
+ KOMIDASHI_COMMAND = "小見出し".to_sjis
61
+ DOGYO_OMIDASHI_COMMAND = "同行大見出し".to_sjis
62
+ DOGYO_NAKAMIDASHI_COMMAND = "同行中見出し".to_sjis
63
+ DOGYO_KOMIDASHI_COMMAND = "同行小見出し".to_sjis
64
+ MADO_OMIDASHI_COMMAND = "窓大見出し".to_sjis
65
+ MADO_NAKAMIDASHI_COMMAND = "窓中見出し".to_sjis
66
+ MADO_KOMIDASHI_COMMAND = "窓小見出し".to_sjis
67
+ LEFT_MARK = "左".to_sjis
68
+ UNDER_MARK = "下".to_sjis
69
+ OVER_MARK = "上".to_sjis
70
+ MAIN_MARK = "本文".to_sjis
71
+ END_MARK = "終わり".to_sjis
72
+ TEN_MARK = "点".to_sjis
73
+ SEN_MARK = "線".to_sjis
74
+ OPEN_MARK = "ここから".to_sjis
75
+ CLOSE_MARK = "ここで".to_sjis
76
+ MADE_MARK = "まで".to_sjis
77
+ DOGYO_MARK = "同行".to_sjis
78
+ MADO_MARK = "窓".to_sjis
79
+ JIAGE_COMMAND = "字上げ".to_sjis
80
+ JISAGE_COMMAND = "字下げ".to_sjis
81
+ PHOTO_COMMAND = "写真".to_sjis
82
+ ORIKAESHI_COMMAND = "折り返して".to_sjis
83
+ ONELINE_COMMAND = "この行".to_sjis
84
+ NON_0213_GAIJI = "非0213外字".to_sjis
85
+ WARICHU_COMMAND = "割り注".to_sjis
86
+ TENTSUKI_COMMAND = "天付き".to_sjis
87
+ PAT_REST_NOTES = "(左|下)に「(.*)」の(ルビ|注記|傍記)".to_sjis
88
+ PAT_KUTEN = /#{"「※」[は|の]".to_sjis}/
89
+ PAT_KUTEN_DUAL = "※.*※".to_sjis
90
+ PAT_GAIJI = "(?:#)(.*)(?:、)(.*)".to_sjis
91
+ PAT_KAERITEN = "^([一二三四五六七八九十レ上中下甲乙丙丁天地人]+)$".to_sjis
92
+ PAT_OKURIGANA = "^((.+))$".to_sjis
93
+ PAT_REMOVE_OKURIGANA = /#{"[()]".to_sjis}/
94
+ PAT_CHITSUKI = /#{"(地付き|字上げ)(終わり)*$".to_sjis}/
95
+ PAT_ORIKAESHI_JISAGE = "折り返して(\\d*)字下げ".to_sjis
96
+ PAT_ORIKAESHI_JISAGE2 = "(\\d*)字下げ、折り返して(\\d*)字下げ".to_sjis
97
+ PAT_JI_LEN = "([0-9]+)字".to_sjis
98
+ PAT_INLINE_RUBY = "「(.*)」の注記付き".to_sjis
99
+ PAT_IMAGE = "(.*)((fig.+\\.png)(、横([0-9]+)×縦([0-9]+))*)入る".to_sjis
100
+ PAT_FRONTREF = "「([^「」]*(?:「.+」)*[^「」]*)」[にはの](「.+」の)*(.+)".to_sjis
101
+ PAT_RUBY_DIR = "(左|下)に「([^」]*)」の(ルビ|注記)".to_sjis
102
+ PAT_CHUUKI = /#{"「(.+?)」の注記".to_sjis}/
103
+ PAT_BOUKI = /#{"「(.)」の傍記".to_sjis}/
104
+ PAT_CHARSIZE = /#{"(.*)段階(..)な文字".to_sjis}/
105
+
106
+ DYNAMIC_CONTENTS = ("<div id=\"card\">\r\n<hr />\r\n<br />\r\n" +
107
+ "<a href=\"JavaScript:goLibCard();\" id=\"goAZLibCard\">●図書カード</a>" +
108
+ "<script type=\"text/javascript\" src=\"../../contents.js\"></script>\r\n" +
109
+ "<script type=\"text/javascript\" src=\"../../golibcard.js\"></script>\r\n" +
110
+ "</div>").to_sjis
38
111
 
39
112
  # KUNOJI = ["18e518f5"].pack("h*")
40
113
  # utf8 ["fecbf8fecbcb"].pack("h*")
@@ -49,24 +122,24 @@ class Aozora2Html
49
122
  JIS2UCS = loader.load("../yml/jis2ucs.yml")
50
123
 
51
124
  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 => "�����ȕ���",
125
+ :jisage => "字下げ".to_sjis,
126
+ :chitsuki => "地付き".to_sjis,
127
+ :midashi => "見出し".to_sjis,
128
+ :jizume => "字詰め".to_sjis,
129
+ :yokogumi => "横組み".to_sjis,
130
+ :keigakomi => "罫囲み".to_sjis,
131
+ :caption => "キャプション".to_sjis,
132
+ :futoji => "太字".to_sjis,
133
+ :shatai => "斜体".to_sjis,
134
+ :dai => "大きな文字".to_sjis,
135
+ :sho => "小さな文字".to_sjis,
63
136
  }
64
137
 
65
138
  DAKUTEN_KATAKANA_TABLE = {
66
- "2" => "���J",
67
- "3" => "���J",
68
- "4" => "���J",
69
- "5" => "���J",
139
+ "2" => "ワ゛".to_sjis,
140
+ "3" => "ヰ゛".to_sjis,
141
+ "4" => "ヱ゛".to_sjis,
142
+ "5" => "ヲ゛".to_sjis,
70
143
  }
71
144
 
72
145
  def initialize(input, output)
@@ -82,17 +155,17 @@ class Aozora2Html
82
155
  end
83
156
  @buffer = []
84
157
  @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 = []
158
+ @section = :head ## 現在処理中のセクション(:head,:head_end,:chuuki,:chuuki_in,:body,:tail)
159
+ @header = Aozora2Html::Header.new() ## ヘッダ行の配列
160
+ @style_stack = StyleStack.new ##スタイルのスタック
161
+ @chuuki_table = {} ## 最後にどの注記を出すかを保持しておく
162
+ @images = [] ## 使用した外字の画像保持用
163
+ @indent_stack = [] ## 基本はシンボルだが、ぶらさげのときはdivタグの文字列が入る
91
164
  @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
165
+ @midashi_id = 0 ## 見出しのカウンタ、見出しの種類によって増分が異なる
166
+ @terprip = true ## 改行制御用 (terpriLisp由来?)
167
+ @endchar = :eof ## 解析終了文字、AccentParserやTagParserでは異なる
168
+ @noprint = nil ## 行末を読み込んだとき、何も出力しないかどうかのフラグ
96
169
  end
97
170
 
98
171
  def line_number
@@ -100,18 +173,18 @@ class Aozora2Html
100
173
  end
101
174
 
102
175
  def block_allowed_context?
103
- # inline_tag���J���Ă��Ȃ����`�F�b�N����Ώ\��
176
+ # inline_tagが開いていないかチェックすれば十分
104
177
  @style_stack.empty?
105
178
  end
106
179
 
107
- # �ꕶ���ǂݍ���
180
+ # 一文字読み込む
108
181
  def read_char
109
182
  @stream.read_char
110
183
  end
111
184
 
112
- # �w�肳�ꂽ�I�[����(1������String��CRLF)�܂œǂݍ���
185
+ # 指定された終端文字(1文字のStringCRLF)まで読み込む
113
186
  #
114
- # @param [String] endchar �I�[����
187
+ # @param [String] endchar 終端文字
115
188
  def read_to(endchar)
116
189
  buf = ""
117
190
  loop do
@@ -129,22 +202,27 @@ class Aozora2Html
129
202
  end
130
203
 
131
204
  def read_accent
132
- Aozora2Html::AccentParser.new(@stream, "�l", @chuuki_table, @images).process
205
+ Aozora2Html::AccentParser.new(@stream, ACCENT_END, @chuuki_table, @images).process
133
206
  end
134
207
 
135
208
  def read_to_nest(endchar)
136
209
  Aozora2Html::TagParser.new(@stream, endchar, @chuuki_table, @images).process
137
210
  end
138
211
 
212
+ # 1行読み込み
213
+ #
214
+ # 合わせて@bufferもクリアする
215
+ # @return [String] 読み込んだ文字列を返す
216
+ #
139
217
  def read_line
140
218
  tmp = read_to("\r\n")
141
219
  @buffer = []
142
220
  tmp
143
221
  end
144
222
 
145
- # parse����
223
+ # parseする
146
224
  #
147
- # �I�����i�I�[�܂ŗ����ꍇ�j�ɂ�throw :terminate�ŒE�o����
225
+ # 終了時(終端まで来た場合)にはthrow :terminateで脱出する
148
226
  #
149
227
  def process
150
228
  begin
@@ -171,6 +249,7 @@ class Aozora2Html
171
249
 
172
250
  def char_type(char)
173
251
  begin
252
+ ## `String#char_type`も定義されているのに注意
174
253
  char.char_type
175
254
  rescue
176
255
  :else
@@ -184,11 +263,7 @@ class Aozora2Html
184
263
  end
185
264
 
186
265
  def dynamic_contents
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>"
266
+ @out.print DYNAMIC_CONTENTS
192
267
  end
193
268
 
194
269
  def close
@@ -196,6 +271,8 @@ class Aozora2Html
196
271
  @out.close
197
272
  end
198
273
 
274
+ # 記法のシンボル名から文字列へ変換する
275
+ # シンボルが見つからなければそのまま返す
199
276
  def convert_indent_type(type)
200
277
  INDENT_TYPE[type] || type
201
278
  end
@@ -228,16 +305,17 @@ class Aozora2Html
228
305
  end
229
306
  end
230
307
 
308
+ # 本文が終わってよいかチェックし、終わっていなければ例外をあげる
231
309
  def ensure_close
232
310
  if n = @indent_stack.last
233
- raise Aozora2Html::Error, "#{convert_indent_type(n)}���ɖ{�����I�����܂���"
311
+ raise Aozora2Html::Error, I18n.t(:terminate_in_style, convert_indent_type(n))
234
312
  end
235
313
  end
236
314
 
237
315
  def explicit_close(type)
238
316
  n = check_close_match(type)
239
317
  if n
240
- raise Aozora2Html::Error, "#{n}��‚��悤�Ƃ��܂������A#{n}���ł͂���܂���"
318
+ raise Aozora2Html::Error, I18n.t(:invalid_closing, n, n)
241
319
  end
242
320
  if tag = @tag_stack.pop
243
321
  push_chars(tag)
@@ -263,7 +341,7 @@ class Aozora2Html
263
341
  end
264
342
 
265
343
  def judge_chuuki
266
- # ���L�����邩�ǂ����`�F�b�N
344
+ # 注記が入るかどうかチェック
267
345
  i = 0
268
346
  loop do
269
347
  case @stream.peek_char(i)
@@ -272,11 +350,10 @@ class Aozora2Html
272
350
  when "\r\n"
273
351
  if i == 0 && @stream.peek_char(1) == "\r\n"
274
352
  @section = :body
275
- return
276
353
  else
277
354
  @section = :chuuki
278
- return
279
355
  end
356
+ return
280
357
  else
281
358
  @section = :body
282
359
  @out.print("<br />\r\n")
@@ -285,16 +362,16 @@ class Aozora2Html
285
362
  end
286
363
  end
287
364
 
288
- # header�͈�s���“ǂ�
365
+ # headerは一行ずつ読む
289
366
  def parse_header
290
367
  string = read_line
291
368
  # refine from Tomita 09/06/14
292
- if string == "" # ��s������΁A�����Ńw�b�_�[�I���Ƃ݂Ȃ�
369
+ if string == "" # 空行がくれば、そこでヘッダー終了とみなす
293
370
  @section = :head_end
294
371
  @out.print @header.to_html
295
372
  else
296
373
  string.gsub!(RUBY_PREFIX,"")
297
- string.gsub!(/�s.*?�t/,"")
374
+ string.gsub!(PAT_RUBY,"")
298
375
  @header.push(string)
299
376
  end
300
377
  end
@@ -311,10 +388,20 @@ class Aozora2Html
311
388
  end
312
389
  end
313
390
 
391
+ # 使うべきではない文字があるかチェックする
392
+ #
393
+ # 警告を出力するだけで結果には影響を与えない。警告する文字は以下:
394
+ #
395
+ # * 1バイト文字
396
+ # * `#`ではなく`♯`
397
+ # * JIS(JIS X 0208)外字
398
+ #
399
+ # @return [void]
400
+ #
314
401
  def illegal_char_check(char, line)
315
402
  if char.is_a?(String)
316
403
  code = char.unpack("H*")[0]
317
- if (code == "21" or
404
+ if code == "21" or
318
405
  code == "23" or
319
406
  ("a1" <= code and code <= "a5") or
320
407
  ("28" <= code and code <= "29") or
@@ -323,15 +410,15 @@ class Aozora2Html
323
410
  code == "3d" or
324
411
  code == "3f" or
325
412
  code == "2b" or
326
- ("7b" <= code and code <= "7d"))
327
- puts "�x��(#{line}�s��):1�o�C�g�́u#{char}�v���g���Ă��܂�"
413
+ ("7b" <= code and code <= "7d")
414
+ puts I18n.t(:warn_onebyte, line, char)
328
415
  end
329
416
 
330
417
  if code == "81f2"
331
- puts "�x��(#{line}�s��):���L�L���̌�p�̉”\��������A�u#{char}�v���g���Ă��܂�"
418
+ puts I18n.t(:warn_chuki, line, char)
332
419
  end
333
420
 
334
- if (("81ad" <= code and code <= "81b7") or
421
+ if ("81ad" <= code and code <= "81b7") or
335
422
  ("81c0" <= code and code <= "81c7") or
336
423
  ("81cf" <= code and code <= "81d9") or
337
424
  ("81e9" <= code and code <= "81ef") or
@@ -357,35 +444,35 @@ class Aozora2Html
357
444
  ("ec40" <= code and code <= "ecfc") or
358
445
  ("ed40" <= code and code <= "edfc") or
359
446
  ("ee40" <= code and code <= "eefc") or
360
- ("ef40" <= code and code <= "effc"))
361
- puts "�x��(#{line}�s��):JIS�O���u#{char}�v���g���Ă��܂�"
447
+ ("ef40" <= code and code <= "effc")
448
+ puts I18n.t(:warn_jis_gaiji, line, char)
362
449
  end
363
450
  end
364
451
  end
365
452
 
366
- # �{�̉�͕�
453
+ # 本体解析部
454
+ #
455
+ # 1文字ずつ読み込み、dispatchして@buffer,@ruby_bufへしまう
456
+ # 改行コードに当たったら溜め込んだものをgeneral_outputする
367
457
  #
368
- # 1�������“ǂݍ��݁Adispatch����@buffer,@ruby_buf�ւ��܂�
369
- # ���s�R�[�h�ɓ��������痭�ߍ��񂾂��̂�general_output����
370
-
371
458
  def parse_body
372
459
  char = read_char
373
460
  check = true
374
461
  case char
375
- when "�k"
462
+ when ACCENT_BEGIN
376
463
  check = false
377
464
  char = read_accent
378
- when "��"
465
+ when TEIHON_MARK[0]
379
466
  if @buffer.length == 0
380
467
  ending_check
381
468
  end
382
- when "��"
469
+ when GAIJI_MARK
383
470
  char = dispatch_gaiji
384
- when "�m"
471
+ when COMMAND_BEGIN
385
472
  char = dispatch_aozora_command
386
473
  when KU
387
474
  assign_kunoji
388
- when "�s"
475
+ when RUBY_BEGIN_MARK
389
476
  char = apply_ruby
390
477
  end
391
478
 
@@ -393,11 +480,11 @@ class Aozora2Html
393
480
  when "\r\n"
394
481
  general_output
395
482
  when RUBY_PREFIX
396
- @ruby_buf.dump(@buffer)
483
+ @ruby_buf.dump_into(@buffer)
397
484
  @ruby_buf.protected = true
398
485
  when @endchar
399
486
  # suddenly finished the file
400
- puts "�x��(#{line_number}�s��):�\�����ʃt�@�C���I�["
487
+ puts I18n.t(:warn_unexpected_terminator, line_number)
401
488
  throw :terminate
402
489
  when nil
403
490
  # noop
@@ -409,9 +496,12 @@ class Aozora2Html
409
496
  end
410
497
  end
411
498
 
499
+ # 本文が終了したかどうかチェックする
500
+ #
501
+ #
412
502
  def ending_check
413
- # `��{�F`�Ńt�b�^(:tail)�ɑJ��
414
- if @stream.peek_char(0) == "�{" and @stream.peek_char(1) == "�F"
503
+ # `底本:`でフッタ(:tail)に遷移
504
+ if @stream.peek_char(0) == TEIHON_MARK[1] and @stream.peek_char(1) == TEIHON_MARK[2]
415
505
  @section = :tail
416
506
  ensure_close
417
507
  @out.print "</div>\r\n<div class=\"bibliographical_information\">\r\n<hr />\r\n<br />\r\n"
@@ -423,23 +513,23 @@ class Aozora2Html
423
513
  #
424
514
  def push_chars(obj)
425
515
  if obj.is_a?(Array)
426
- obj.each{|x|
516
+ obj.each do |x|
427
517
  push_chars(x)
428
- }
518
+ end
429
519
  elsif obj.is_a?(String)
430
520
  if obj.length == 1
431
521
  obj = obj.gsub(/[&\"<>]/, {'&' => '&amp;', '"' => '&quot;', '<' => '&lt;', '>' => '&gt;'})
432
522
  end
433
- obj.each_char{|x|
523
+ obj.each_char do |x|
434
524
  push_char(x)
435
- }
525
+ end
436
526
  else
437
527
  push_char(obj)
438
528
  end
439
529
  end
440
530
 
441
531
  def push_char(char)
442
- ctype = char_type(char)
532
+ ctype = char_type(char)
443
533
  if ctype == :hankaku_terminate and @ruby_buf.char_type == :hankaku
444
534
  if @ruby_buf.last_is_string?
445
535
  @ruby_buf.last_concat(char)
@@ -455,54 +545,64 @@ class Aozora2Html
455
545
  @ruby_buf.push("")
456
546
  end
457
547
  else
458
- @ruby_buf.dump(@buffer)
548
+ @ruby_buf.dump_into(@buffer)
459
549
  @ruby_buf.clear(char)
460
550
  @ruby_buf.char_type = ctype
461
551
  end
462
552
  end
463
553
 
554
+ # 行出力時に@bufferが空かどうか調べる
555
+ #
556
+ # @bufferの中身によって行末の出力が異なるため
557
+ #
558
+ # @return [true, false, :inline] 空文字ではない文字列が入っていればfalse、1行注記なら:inline、それ以外しか入っていなければtrue
559
+ #
464
560
  def buf_is_blank?(buf)
465
- buf.each{|token|
466
- if token.is_a?(String) and not(token=="")
561
+ buf.each do |token|
562
+ if token.is_a?(String) and token != ""
467
563
  return false
468
564
  elsif token.is_a?(Aozora2Html::Tag::OnelineIndent)
469
565
  return :inline
470
566
  end
471
- }
567
+ end
472
568
  true
473
569
  end
474
570
 
475
- # �s����<br />���o�͂���ׂ����ǂ����̔��ʗp
571
+ # 行末で<br />を出力するべきかどうかの判別用
572
+ #
573
+ # @return [true, false] Multilineの注記しか入っていなければfalse、Multilineでも空文字でもない要素が含まれていればtrue
476
574
  #
477
575
  def terpri?(buf)
478
576
  flag = true
479
- buf.each{|x|
577
+ buf.each do |x|
480
578
  if x.is_a?(Aozora2Html::Tag::Multiline)
481
579
  flag = false
482
- elsif (x.is_a?(String) and x == "")
483
- nil
580
+ elsif x == ""
581
+ # skip
484
582
  else
485
583
  return true
486
584
  end
487
- }
585
+ end
488
586
  flag
489
587
  end
490
588
 
491
- # �ǂݍ��񂾍s�̏o�͂��s��
589
+ # 読み込んだ行の出力を行う
590
+ #
591
+ # parserが改行文字を読み込んだら呼ばれる。
592
+ # 最終的に@ruby_bufと@bufferは初期化する
492
593
  #
493
- # parser�����s������ǂݍ��񂾂�Ă΂��
494
- # @ruby_buf��@buffer�͏���������
594
+ # @return [void]
495
595
  #
496
596
  def general_output
497
597
  if @style_stack.last
498
- raise Aozora2Html::Error, "#{@style_stack.last_command}���ɉ��s����܂����B���s���܂����v�f�ɂ̓u���b�N�\�L��p���Ă�������"
598
+ raise Aozora2Html::Error, I18n.t(:dont_crlf_in_style, @style_stack.last_command)
499
599
  end
500
- # buffer�ɃC���f���g�^�O����������������s���Ȃ��I
600
+ # bufferにインデントタグだけがあったら改行しない!
501
601
  if @noprint
502
602
  @noprint = false
503
603
  return
504
604
  end
505
- @ruby_buf.dump(@buffer)
605
+ @ruby_buf.dump_into(@buffer)
506
606
  buf = @buffer
507
607
  @ruby_buf.clear
508
608
  @buffer = []
@@ -512,23 +612,23 @@ class Aozora2Html
512
612
  terprip = (terpri?(buf) and @terprip)
513
613
  @terprip = true
514
614
 
515
- if @indent_stack.last.is_a?(String) and not(indent_type)
615
+ if @indent_stack.last.is_a?(String) and !indent_type
516
616
  @out.print @indent_stack.last
517
617
  end
518
618
 
519
- buf.each{|s|
619
+ buf.each do |s|
520
620
  if s.is_a?(Aozora2Html::Tag::OnelineIndent)
521
621
  tail.unshift(s.close_tag)
522
622
  elsif s.is_a?(Aozora2Html::Tag::UnEmbedGaiji) and !s.escaped?
523
- # �����Ă��������𕜊�������
524
- @out.print "��"
623
+ # 消してあった※を復活させて
624
+ @out.print GAIJI_MARK
525
625
  end
526
626
  @out.print s.to_s
527
- }
627
+ end
528
628
 
529
- # �Ō��CRLF���o�͂���
629
+ # 最後はCRLFを出力する
530
630
  if @indent_stack.last.is_a?(String)
531
- # �Ԃ牺��indent
631
+ # ぶら下げindent
532
632
  # tail always active
533
633
  @out.print tail.map{|s| s.to_s}.join("")
534
634
  if indent_type == :inline
@@ -546,9 +646,9 @@ class Aozora2Html
546
646
  end
547
647
  end
548
648
 
549
- # �O���Q�Ƃ̔��� Ruby,style�d�˂������X�̂��߁A�v�f�̔z��ŕԂ�
649
+ # 前方参照の発見 Ruby,style重ねがけ等々のため、要素の配列で返す
550
650
  #
551
- # �O���Q�Ƃ�`�����m���u�����v�ɖT�_�n`�A`�����m���u���v�Ɂu�}�}�v�̒��L�n`�Ƃ������\�L
651
+ # 前方参照は`○○[#「○○」に傍点]`、`吹喋[#「喋」に「ママ」の注記]`といった表記
552
652
  def search_front_reference(string)
553
653
  if string.length == 0
554
654
  return false
@@ -562,9 +662,9 @@ class Aozora2Html
562
662
  if last_string.is_a?(String)
563
663
  if last_string == ""
564
664
  searching_buf.pop
565
- search_front_reference(string.sub(Regexp.new(Regexp.quote(last_string)+"$"),""))
665
+ search_front_reference(string)
566
666
  elsif last_string.match(Regexp.new(Regexp.quote(string)+"$"))
567
- # ���S��v
667
+ # 完全一致
568
668
  # start = match.begin(0)
569
669
  # tail = match.end(0)
570
670
  # last_string[start,tail-start] = ""
@@ -572,7 +672,7 @@ class Aozora2Html
572
672
  searching_buf.push(last_string.sub(Regexp.new(Regexp.quote(string)+"$"),""))
573
673
  [string]
574
674
  elsif string.match(Regexp.new(Regexp.quote(last_string)+"$"))
575
- # ������v
675
+ # 部分一致
576
676
  tmp = searching_buf.pop
577
677
  found = search_front_reference(string.sub(Regexp.new(Regexp.quote(last_string)+"$"),""))
578
678
  if found
@@ -585,11 +685,11 @@ class Aozora2Html
585
685
  elsif last_string.is_a?(Aozora2Html::Tag::ReferenceMentioned)
586
686
  inner = last_string.target_string
587
687
  if inner == string
588
- # ���S��v
688
+ # 完全一致
589
689
  searching_buf.pop
590
690
  [last_string]
591
691
  elsif string.match(Regexp.new(Regexp.quote(inner)+"$"))
592
- # ������v
692
+ # 部分一致
593
693
  tmp = searching_buf.pop
594
694
  found = search_front_reference(string.sub(Regexp.new(Regexp.quote(inner)+"$"),""))
595
695
  if found
@@ -604,60 +704,50 @@ class Aozora2Html
604
704
  end
605
705
  end
606
706
 
607
- # ���������O���Q�Ƃ����ɖ߂�
707
+ # 発見した前方参照を元に戻す
708
+ #
709
+ # @ruby_bufがあれば@ruby_bufに、なければ@bufferにpushする
710
+ # バッファの最後と各要素が文字列ならconcatし、どちらが文字列でなければ(concatできないので)pushする
711
+ #
712
+ # @return [void]
713
+ #
608
714
  def recovery_front_reference(reference)
609
- reference.each{|elt|
715
+ reference.each do |elt|
610
716
  # if @ruby_buf.protected
611
717
  if @ruby_buf.present?
612
- if @ruby_buf.last_is_string?
613
- if elt.is_a?(String)
614
- @ruby_buf.last_concat(elt)
615
- else
616
- @ruby_buf.push(elt)
617
- end
718
+ if @ruby_buf.last_is_string? && elt.is_a?(String)
719
+ @ruby_buf.last_concat(elt)
618
720
  else
619
721
  @ruby_buf.push(elt)
620
722
  end
621
- else
622
- if @buffer.last.is_a?(String)
623
- if elt.is_a?(String)
624
- @buffer.last.concat(elt)
625
- else
626
- @buffer.push(elt)
627
- end
723
+ elsif @buffer.last.is_a?(String)
724
+ if elt.is_a?(String)
725
+ @buffer.last.concat(elt)
628
726
  else
629
- @ruby_buf.push(elt)
727
+ @buffer.push(elt)
630
728
  end
729
+ else
730
+ @ruby_buf.push(elt)
631
731
  end
632
- }
633
- end
634
-
635
- def convert_japanese_number(command)
636
- tmp = command.tr("�O-�X", "0-9")
637
- tmp.tr!("���O�l�ܘZ������Z","1234567890")
638
- tmp.gsub!(/(\d)�\(\d)/){"#{$1}#{$2}"}
639
- tmp.gsub!(/(\d)�\/){"#{$1}0"}
640
- tmp.gsub!(/�\(\d)/){"1#{$1}"}
641
- tmp.gsub!(/�\/,"10")
642
- tmp
732
+ end
643
733
  end
644
734
 
645
735
  def kuten2png(substring)
646
- desc = substring.gsub(/�u���v[��|��]/,"")
736
+ desc = substring.gsub(PAT_KUTEN,"")
647
737
  match = desc.match(/[12]\-\d{1,2}\-\d{1,2}/)
648
- if (match and not(desc.match(/��0213�O��/)) and not(desc.match(/��.*��/)))
738
+ if match and !desc.match(NON_0213_GAIJI) and !desc.match(PAT_KUTEN_DUAL)
649
739
  @chuuki_table[:newjis] = true
650
740
  codes = match[0].split("-")
651
741
  folder = sprintf("%1d-%02d", codes[0], codes[1])
652
742
  code = sprintf("%1d-%02d-%02d",*codes)
653
- Aozora2Html::Tag::EmbedGaiji.new(self, folder, code, desc.gsub!("��",""))
743
+ Aozora2Html::Tag::EmbedGaiji.new(self, folder, code, desc.gsub!(IGETA_MARK,""))
654
744
  else
655
745
  substring
656
746
  end
657
747
  end
658
748
 
659
749
  def escape_gaiji(command)
660
- _whole, kanji, line = command.match(/(?:��)(.*)(?:�A)(.*)/).to_a
750
+ _whole, kanji, line = command.match(PAT_GAIJI).to_a
661
751
  tmp = @images.assoc(kanji)
662
752
  if tmp
663
753
  tmp.push(line)
@@ -668,68 +758,72 @@ class Aozora2Html
668
758
  end
669
759
 
670
760
  def dispatch_gaiji
671
- hook = @stream.peek_char(0)
672
- if hook == "�m"
673
- read_char
674
- # embed?
675
- command, _raw = read_to_nest("�n")
676
- try_emb = kuten2png(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
683
- # Unemb
684
- escape_gaiji(command)
685
- end
761
+ # 「※」の次が「[」でなければ外字ではない
762
+ if @stream.peek_char(0) != COMMAND_BEGIN
763
+ return GAIJI_MARK
764
+ end
765
+
766
+ # 「[」を読み捨てる
767
+ _ = read_char
768
+ # embed?
769
+ command, _raw = read_to_nest(COMMAND_END)
770
+ try_emb = kuten2png(command)
771
+ if try_emb != command
772
+ try_emb
773
+ elsif command.match(/U\+([0-9A-F]{4,5})/) && Aozora2Html::Tag::EmbedGaiji.use_unicode
774
+ unicode_num = $1
775
+ Aozora2Html::Tag::EmbedGaiji.new(self, nil, nil, command, unicode_num)
686
776
  else
687
- "��"
777
+ # Unemb
778
+ escape_gaiji(command)
688
779
  end
689
780
  end
690
781
 
782
+ # 注記記法の場合分け
691
783
  def dispatch_aozora_command
692
- if @stream.peek_char(0) != "��"
693
- "�m"
784
+ # 「[」の次が「#」でなければ注記ではない
785
+ if @stream.peek_char(0) != IGETA_MARK
786
+ return COMMAND_BEGIN
787
+ end
788
+
789
+ # 「#」を読み捨てる
790
+ _ = read_char
791
+ command,raw = read_to_nest(COMMAND_END)
792
+ # 適用順序はこれで大丈夫か? 誤爆怖いよ誤爆
793
+ if command.match(ORIKAESHI_COMMAND)
794
+ apply_burasage(command)
795
+
796
+ elsif command.start_with?(OPEN_MARK)
797
+ exec_block_start_command(command)
798
+ elsif command.start_with?(CLOSE_MARK)
799
+ exec_block_end_command(command)
800
+
801
+ elsif command.match(WARICHU_COMMAND)
802
+ apply_warichu(command)
803
+ elsif command.match(JISAGE_COMMAND)
804
+ apply_jisage(command)
805
+ elsif command.match(/fig(\d)+_(\d)+\.png/)
806
+ exec_img_command(command,raw)
807
+ # avoid to try complex ruby -- escape to notes
808
+ elsif command.match(PAT_REST_NOTES)
809
+ apply_rest_notes(command)
810
+ elsif command.end_with?(END_MARK)
811
+ exec_inline_end_command(command)
812
+ nil
813
+ elsif command.match(PAT_REF)
814
+ exec_frontref_command(command)
815
+ elsif command.match(/1-7-8[2345]/)
816
+ apply_dakuten_katakana(command)
817
+ elsif command.match(PAT_KAERITEN)
818
+ Aozora2Html::Tag::Kaeriten.new(self, command)
819
+ elsif command.match(PAT_OKURIGANA)
820
+ Aozora2Html::Tag::Okurigana.new(self, command.gsub!(PAT_REMOVE_OKURIGANA,""))
821
+ elsif command.match(PAT_CHITSUKI)
822
+ apply_chitsuki(command)
823
+ elsif exec_inline_start_command(command)
824
+ nil
694
825
  else
695
- read_char
696
- command,raw = read_to_nest("�n")
697
- # �K�p�����͂���ő��v���H�@�딚�|����딚
698
- if command.match(/�܂�Ԃ���/)
699
- apply_burasage(command)
700
-
701
- elsif command.match(/^��������/)
702
- exec_block_start_command(command)
703
- elsif command.match(/^������/)
704
- exec_block_end_command(command)
705
-
706
- elsif command.match(/���蒍/)
707
- apply_warichu(command)
708
- elsif command.match(/������/)
709
- apply_jisage(command)
710
- elsif command.match(/fig(\d)+_(\d)+\.png/)
711
- exec_img_command(command,raw)
712
- # avoid to try complex ruby -- escape to notes
713
- elsif command.match(/(��|��)�Ɂu(.*)�v��(���r|���L|�T�L)/)
714
- apply_rest_notes(command)
715
- elsif command.match(/�I���$/)
716
- exec_inline_end_command(command)
717
- nil
718
- elsif command.match(/^�u.+�v/)
719
- exec_frontref_command(command)
720
- elsif command.match(/1-7-8[2345]/)
721
- apply_dakuten_katakana(command)
722
- elsif command.match(/^([���O�l�ܘZ������\���㒆���b�������V�n�l]+)$/)
723
- Aozora2Html::Tag::Kaeriten.new(self, command)
724
- elsif command.match(/^�i(.+)�j$/)
725
- Aozora2Html::Tag::Okurigana.new(self, command.gsub!(/[�i�j]/,""))
726
- elsif command.match(/(�n�t��|���グ)(�I���)*$/)
727
- apply_chitsuki(command)
728
- elsif exec_inline_start_command(command)
729
- nil
730
- else
731
- apply_rest_notes(command)
732
- end
826
+ apply_rest_notes(command)
733
827
  end
734
828
  end
735
829
 
@@ -740,12 +834,12 @@ class Aozora2Html
740
834
  general_output
741
835
  end
742
836
  @noprint = true # always no print
743
- command = convert_japanese_number(command)
744
- if command.match(/�V�t��/)
745
- width = command.match(/�܂�Ԃ���(\d*)������/)[1]
837
+ command = Utils.convert_japanese_number(command)
838
+ if command.match(TENTSUKI_COMMAND)
839
+ width = command.match(PAT_ORIKAESHI_JISAGE)[1]
746
840
  tag = '<div class="burasage" style="margin-left: ' + width + 'em; text-indent: -' + width + 'em;">'
747
841
  else
748
- match = command.match(/(\d*)�������A�܂�Ԃ���(\d*)������/)
842
+ match = command.match(PAT_ORIKAESHI_JISAGE2)
749
843
  left, indent = match.to_a[1,2]
750
844
  left = left.to_i - indent.to_i
751
845
  tag = "<div class=\"burasage\" style=\"margin-left: #{indent}em; text-indent: #{left}em;\">"
@@ -756,58 +850,52 @@ class Aozora2Html
756
850
  end
757
851
 
758
852
  def jisage_width(command)
759
- convert_japanese_number(command).match(/(\d*)(?:������)/)[1]
853
+ Utils.convert_japanese_number(command).match(/(\d*)(?:#{JISAGE_COMMAND})/)[1]
760
854
  end
761
855
 
762
856
  def apply_jisage(command)
763
- if command.match(/�܂�/) or command.match(/�I���/)
764
- # �������I���
857
+ if command.match(MADE_MARK) or command.match(END_MARK)
858
+ # 字下げ終わり
765
859
  explicit_close(:jisage)
766
860
  @indent_stack.pop
767
861
  nil
862
+ elsif command.match(ONELINE_COMMAND)
863
+ # 1行だけ
864
+ @buffer.unshift(Aozora2Html::Tag::OnelineJisage.new(self, jisage_width(command)))
865
+ nil
866
+ elsif @buffer.length == 0 and @stream.peek_char(0) == "\r\n"
867
+ # commandのみ
868
+ @terprip = false
869
+ implicit_close(:jisage)
870
+ # adhook hack
871
+ @noprint = false
872
+ @indent_stack.push(:jisage)
873
+ Aozora2Html::Tag::MultilineJisage.new(self, jisage_width(command))
768
874
  else
769
- if command.match(/���̍s/)
770
- # 1�s����
771
- @buffer.unshift(Aozora2Html::Tag::OnelineJisage.new(self, jisage_width(command)))
772
- nil
773
- else
774
- if @buffer.length == 0 and @stream.peek_char(0) == "\r\n"
775
- # command�̂�
776
- @terprip = false
777
- implicit_close(:jisage)
778
- # adhook hack
779
- @noprint = false
780
- @indent_stack.push(:jisage)
781
- Aozora2Html::Tag::MultilineJisage.new(self, jisage_width(command))
782
- else
783
- @buffer.unshift(Aozora2Html::Tag::OnelineJisage.new(self, jisage_width(command)))
784
- nil
785
- end
786
- end
875
+ @buffer.unshift(Aozora2Html::Tag::OnelineJisage.new(self, jisage_width(command)))
876
+ nil
787
877
  end
788
878
  end
789
879
 
790
880
  def apply_warichu(command)
791
- if command.match(/�I���/)
792
- if @stream.peek_char(0) != "�j"
793
- push_chars('�j')
881
+ if command.match(END_MARK)
882
+ if @stream.peek_char(0) != PAREN_END_MARK
883
+ push_chars(PAREN_END_MARK)
794
884
  end
795
885
  push_chars('</span>')
796
886
  else
797
887
  check = @ruby_buf.last
798
- if check.is_a?(String) and check.match(/�i$/)
799
- push_chars('<span class="warichu">')
800
- else
801
- push_chars('<span class="warichu">')
802
- push_chars('�i')
888
+ push_chars('<span class="warichu">')
889
+ unless check.is_a?(String) and check.end_with?(PAREN_BEGIN_MARK)
890
+ push_chars(PAREN_BEGIN_MARK)
803
891
  end
804
892
  end
805
893
  nil
806
894
  end
807
895
 
808
896
  def chitsuki_length(command)
809
- command = convert_japanese_number(command)
810
- if match = command.match(/([0-9]+)��/)
897
+ command = Utils.convert_japanese_number(command)
898
+ if match = command.match(PAT_JI_LEN)
811
899
  match[1]
812
900
  else
813
901
  "0"
@@ -815,54 +903,55 @@ class Aozora2Html
815
903
  end
816
904
 
817
905
  def apply_chitsuki(string, multiline = false)
818
- if string.match(/�����Œn�t���I���/) or
819
- string.match(/�����Ŏ��グ�I���/)
906
+ if string.match(CLOSE_MARK+INDENT_TYPE[:chitsuki]+END_MARK) or
907
+ string.match(CLOSE_MARK+JIAGE_COMMAND+END_MARK)
820
908
  explicit_close(:chitsuki)
821
909
  @indent_stack.pop
822
910
  nil
823
911
  else
824
- l = chitsuki_length(string)
912
+ len = chitsuki_length(string)
825
913
  if multiline
826
- # �����s�w��
914
+ # 複数行指定
827
915
  implicit_close(:chitsuki)
828
916
  @indent_stack.push(:chitsuki)
829
- Aozora2Html::Tag::MultilineChitsuki.new(self, l)
917
+ Aozora2Html::Tag::MultilineChitsuki.new(self, len)
830
918
  else
831
- # 1�s�̂�
832
- Aozora2Html::Tag::OnelineChitsuki.new(self, l)
919
+ # 1行のみ
920
+ Aozora2Html::Tag::OnelineChitsuki.new(self, len)
833
921
  end
834
922
  end
835
923
  end
836
924
 
837
925
  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
926
+ if size.kind_of?(Integer)
927
+ @midashi_id += size
928
+ return @midashi_id
929
+ end
930
+
931
+ case size
932
+ when /#{SIZE_SMALL}/
933
+ inc = 1
934
+ when /#{SIZE_MIDDLE}/
935
+ inc = 10
936
+ when /#{SIZE_LARGE}/
937
+ inc = 100
849
938
  else
850
- inc = size
939
+ raise Aozora2Html::Error, I18n.t(:undefined_header)
851
940
  end
852
941
  @midashi_id += inc
853
942
  end
854
943
 
855
944
  def apply_midashi(command)
856
945
  @indent_stack.push(:midashi)
946
+ if command.match(DOGYO_MARK)
947
+ midashi_type = :dogyo
948
+ elsif command.match(MADO_MARK)
949
+ midashi_type = :mado
950
+ else
857
951
  midashi_type = :normal
858
- if command.match(/���s/)
859
- midashi_type = :dogyo
860
- elsif command.match(/��/)
861
- midashi_type = :mado
862
- else
863
- @terprip = false
864
- end
865
- Aozora2Html::Tag::MultilineMidashi.new(self,command,midashi_type)
952
+ @terprip = false
953
+ end
954
+ Aozora2Html::Tag::MultilineMidashi.new(self, command, midashi_type)
866
955
  end
867
956
 
868
957
  def apply_yokogumi(command)
@@ -881,7 +970,7 @@ class Aozora2Html
881
970
  end
882
971
 
883
972
  def apply_jizume(command)
884
- w = convert_japanese_number(command).match(/(\d*)(?:���l��)/)[1]
973
+ w = Utils.convert_japanese_number(command).match(/(\d*)(?:#{INDENT_TYPE[:jizume]})/)[1]
885
974
  @indent_stack.push(:jizume)
886
975
  Aozora2Html::Tag::Jizume.new(self, w)
887
976
  end
@@ -891,175 +980,177 @@ class Aozora2Html
891
980
  closing.concat(tag.close_tag)
892
981
  end
893
982
 
983
+ def detect_style_size(style)
984
+ if style.match("小".to_sjis)
985
+ :sho
986
+ else
987
+ :dai
988
+ end
989
+ end
990
+
894
991
  def exec_inline_start_command(command)
895
992
  case command
896
- when "���L�t��"
993
+ when CHUUKI_COMMAND
897
994
  @style_stack.push([command,'</ruby>'])
898
995
  push_char('<ruby><rb>')
899
- when "�c����"
996
+ when TCY_COMMAND
900
997
  @style_stack.push([command,'</span>'])
901
998
  push_char('<span dir="ltr">')
902
- when "�r�͂�"
999
+ when KEIGAKOMI_COMMAND
903
1000
  @style_stack.push([command,'</span>'])
904
1001
  push_chars('<span class="keigakomi">')
905
- when "���g��"
1002
+ when YOKOGUMI_COMMAND
906
1003
  @style_stack.push([command,'</span>'])
907
1004
  push_chars('<span class="yokogumi">')
908
- when "�L���v�V����"
1005
+ when CAPTION_COMMAND
909
1006
  @style_stack.push([command,'</span>'])
910
1007
  push_chars('<span class="caption">')
911
- when "����"
1008
+ when WARIGAKI_COMMAND
912
1009
  @style_stack.push([command,'</span>'])
913
1010
  push_chars('<span class="warigaki">')
914
- when "�匩�o��"
1011
+ when OMIDASHI_COMMAND
915
1012
  @style_stack.push([command,'</a></h3>'])
916
1013
  @terprip = false
917
1014
  push_chars("<h3 class=\"o-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(100)}\">")
918
- when "�����o��"
1015
+ when NAKAMIDASHI_COMMAND
919
1016
  @style_stack.push([command,'</a></h4>'])
920
1017
  @terprip = false
921
1018
  push_chars("<h4 class=\"naka-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(10)}\">")
922
- when "�����o��"
1019
+ when KOMIDASHI_COMMAND
923
1020
  @style_stack.push([command,'</a></h5>'])
924
1021
  @terprip = false
925
1022
  push_chars("<h5 class=\"ko-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(1)}\">")
926
- when "���s�匩�o��"
1023
+ when DOGYO_OMIDASHI_COMMAND
927
1024
  @style_stack.push([command,'</a></h3>'])
928
1025
  push_chars("<h3 class=\"dogyo-o-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(100)}\">")
929
- when "���s�����o��"
1026
+ when DOGYO_NAKAMIDASHI_COMMAND
930
1027
  @style_stack.push([command,'</a></h4>'])
931
1028
  push_chars("<h4 class=\"dogyo-naka-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(10)}\">")
932
- when "���s�����o��"
1029
+ when DOGYO_KOMIDASHI_COMMAND
933
1030
  @style_stack.push([command,'</a></h5>'])
934
1031
  push_chars("<h5 class=\"dogyo-ko-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(1)}\">")
935
- when "���匩�o��"
1032
+ when MADO_OMIDASHI_COMMAND
936
1033
  @style_stack.push([command,'</a></h3>'])
937
1034
  push_chars("<h3 class=\"mado-o-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(100)}\">")
938
- when "�������o��"
1035
+ when MADO_NAKAMIDASHI_COMMAND
939
1036
  @style_stack.push([command,'</a></h4>'])
940
1037
  push_chars("<h4 class=\"mado-naka-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(10)}\">")
941
- when "�������o��"
1038
+ when MADO_KOMIDASHI_COMMAND
942
1039
  @style_stack.push([command,'</a></h5>'])
943
1040
  push_chars("<h5 class=\"mado-ko-midashi\"><a class=\"midashi_anchor\" id=\"midashi#{new_midashi_id(1)}\">")
1041
+ when PAT_CHARSIZE
1042
+ @style_stack.push([command,'</span>'])
1043
+ _whole, nest, style = command.match(PAT_CHARSIZE).to_a
1044
+ times = Utils.convert_japanese_number(nest).to_i
1045
+ daisho = detect_style_size(style)
1046
+ html_class = daisho.to_s + times.to_s
1047
+ size = Utils.create_font_size(times, daisho)
1048
+ push_chars("<span class=\"#{html_class}\" style=\"font-size: #{size};\">")
944
1049
  else
945
- if command.match(/(.*)�i�K(..)�ȕ���/)
946
- @style_stack.push([command,'</span>'])
947
- _whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
948
- times = convert_japanese_number(nest).to_i
949
- daisho = if style.match("��")
950
- :sho
951
- else
952
- :dai
953
- end
954
- html_class = daisho.to_s + times.to_s
955
- size = Utils.create_font_size(times, daisho)
956
- push_chars("<span class=\"#{html_class}\" style=\"font-size: #{size};\">")
957
- else
958
- ## Decoration ##
959
- key = command
960
- filter = lambda{|x| x}
961
- if command.match(/(�E|��|��|��)��(.*)/)
962
- _whole, dir, com = command.match(/(�E|��|��|��)��(.*)/).to_a
963
- # renew command
964
- key = com
965
- if command.match(/�_/)
966
- case dir
967
- when "��", "��"
968
- filter = lambda{|x| x + "_after"}
969
- end
970
- elsif command.match(/��/)
971
- case dir
972
- when "��", "��"
973
- filter = lambda{|x| x.sub("under","over")}
974
- end
1050
+ ## Decoration ##
1051
+ key = command
1052
+ filter = lambda{|x| x}
1053
+ if command.match(PAT_DIRECTION)
1054
+ _whole, dir, com = command.match(PAT_DIRECTION).to_a
1055
+ # renew command
1056
+ key = com
1057
+ if command.match(TEN_MARK)
1058
+ case dir
1059
+ when LEFT_MARK, UNDER_MARK
1060
+ filter = lambda{|x| x + "_after"}
1061
+ end
1062
+ elsif command.match(SEN_MARK)
1063
+ case dir
1064
+ when LEFT_MARK, OVER_MARK
1065
+ filter = lambda{|x| x.sub("under","over")}
975
1066
  end
976
1067
  end
1068
+ end
977
1069
 
978
- found = COMMAND_TABLE[key]
979
- # found = [class, tag]
980
- if found
981
- @style_stack.push([command,"</#{found[1]}>"])
982
- push_chars("<#{found[1]} class=\"#{filter.call(found[0])}\">")
983
- else
984
- if $DEBUG
985
- puts "�x��(#{line_number}�s��):�u#{key}�v�͖��Ή��̃R�}���h�̂��ߖ������܂�"
986
- end
987
- nil
1070
+ found = COMMAND_TABLE[key]
1071
+ # found = [class, tag]
1072
+ if found
1073
+ @style_stack.push([command,"</#{found[1]}>"])
1074
+ push_chars("<#{found[1]} class=\"#{filter.call(found[0])}\">")
1075
+ else
1076
+ if $DEBUG
1077
+ puts I18n.t(:warn_undefined_command, line_number, key)
988
1078
  end
1079
+ nil
989
1080
  end
990
1081
  end
991
1082
  end
992
1083
 
993
1084
  def exec_inline_end_command(command)
994
- encount = command.sub("�I���","")
995
- if encount == "�{��"
1085
+ encount = command.sub(END_MARK,"")
1086
+ if encount == MAIN_MARK
996
1087
  # force to finish main_text
997
1088
  @section = :tail
998
1089
  ensure_close
999
1090
  @noprint = true
1000
1091
  @out.print "</div>\r\n<div class=\"after_text\">\r\n<hr />\r\n"
1001
- elsif encount.match("���L�t��") and @style_stack.last_command == "���L�t��"
1092
+ elsif encount.match(CHUUKI_COMMAND) and @style_stack.last_command == CHUUKI_COMMAND
1002
1093
  # special inline ruby
1003
1094
  @style_stack.pop
1004
- _whole, ruby = encount.match("�u(.*)�v�̒��L�t��").to_a
1005
- push_char("</rb><rp>�i</rp><rt>#{ruby}</rt><rp>�j</rp></ruby>")
1095
+ _whole, ruby = encount.match(PAT_INLINE_RUBY).to_a
1096
+ push_char("</rb><rp>(</rp><rt>".to_sjis + ruby + "</rt><rp>)</rp></ruby>".to_sjis)
1006
1097
  elsif @style_stack.last_command.match(encount)
1007
1098
  push_chars(@style_stack.pop[1])
1008
1099
  else
1009
- raise Aozora2Html::Error, "#{encount}���I�����悤�Ƃ��܂������A#{@style_stack.last_command}���ł�"
1100
+ raise Aozora2Html::Error, I18n.t(:invalid_nesting, encount, @style_stack.last_command)
1010
1101
  end
1011
1102
  end
1012
1103
 
1013
1104
  def exec_block_start_command(command)
1014
1105
  original_command = command.dup
1015
- command.sub!(/^��������/, "")
1106
+ command.sub!(/^#{OPEN_MARK}/, "")
1016
1107
  match = ""
1017
- if command.match(/������/)
1108
+ if command.match(INDENT_TYPE[:jisage])
1018
1109
  push_block_tag(apply_jisage(command),match)
1019
- elsif command.match(/(�n�t��|���グ)$/)
1110
+ elsif command.match(/(#{INDENT_TYPE[:chitsuki]}|#{JIAGE_COMMAND})$/)
1020
1111
  push_block_tag(apply_chitsuki(command,true),match)
1021
1112
  end
1022
1113
 
1023
- if command.match(/���o��/)
1114
+ if command.match(INDENT_TYPE[:midashi])
1024
1115
  push_block_tag(apply_midashi(command),match)
1025
1116
  end
1026
1117
 
1027
- if command.match(/���l��/)
1118
+ if command.match(INDENT_TYPE[:jizume])
1028
1119
  if match != ""
1029
1120
  @indent_stack.pop
1030
1121
  end
1031
1122
  push_block_tag(apply_jizume(command),match)
1032
1123
  end
1033
1124
 
1034
- if command.match(/���g��/)
1125
+ if command.match(INDENT_TYPE[:yokogumi])
1035
1126
  if match != ""
1036
1127
  @indent_stack.pop
1037
1128
  end
1038
1129
  push_block_tag(apply_yokogumi(command),match)
1039
1130
  end
1040
1131
 
1041
- if command.match(/�r�͂�/)
1132
+ if command.match(INDENT_TYPE[:keigakomi])
1042
1133
  if match != ""
1043
1134
  @indent_stack.pop
1044
1135
  end
1045
1136
  push_block_tag(apply_keigakomi(command),match)
1046
1137
  end
1047
1138
 
1048
- if command.match(/�L���v�V����/)
1139
+ if command.match(INDENT_TYPE[:caption])
1049
1140
  if match != ""
1050
1141
  @indent_stack.pop
1051
1142
  end
1052
1143
  push_block_tag(apply_caption(command),match)
1053
1144
  end
1054
1145
 
1055
- if command.match(/����/)
1146
+ if command.match(INDENT_TYPE[:futoji])
1056
1147
  if match != ""
1057
1148
  @indent_stack.pop
1058
1149
  end
1059
1150
  push_block_tag(Aozora2Html::Tag::MultilineStyle.new(self, "futoji"),match)
1060
1151
  @indent_stack.push(:futoji)
1061
1152
  end
1062
- if command.match(/�Α�/)
1153
+ if command.match(INDENT_TYPE[:shatai])
1063
1154
  if match != ""
1064
1155
  @indent_stack.pop
1065
1156
  end
@@ -1067,18 +1158,14 @@ class Aozora2Html
1067
1158
  @indent_stack.push(:shatai)
1068
1159
  end
1069
1160
 
1070
- if command.match(/(.*)�i�K(..)�ȕ���/)
1071
- _whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
1161
+ if command.match(PAT_CHARSIZE)
1162
+ _whole, nest, style = command.match(PAT_CHARSIZE).to_a
1072
1163
  if match != ""
1073
1164
  @indent_stack.pop
1074
1165
  end
1075
- daisho = if style == "����"
1076
- :sho
1077
- else
1078
- :dai
1079
- end
1166
+ daisho = detect_style_size(style)
1080
1167
  push_block_tag(Aozora2Html::Tag::FontSize.new(self,
1081
- convert_japanese_number(nest).to_i,
1168
+ Utils.convert_japanese_number(nest).to_i,
1082
1169
  daisho),
1083
1170
  match)
1084
1171
  @indent_stack.push(daisho)
@@ -1092,37 +1179,25 @@ class Aozora2Html
1092
1179
  end
1093
1180
  end
1094
1181
 
1182
+ # コマンド文字列からモードのシンボルを取り出す
1183
+ #
1184
+ # @return [Symbol]
1185
+ #
1095
1186
  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
1187
+ if command.match(INDENT_TYPE[:chitsuki]+END_MARK) || command.match(JIAGE_COMMAND+END_MARK)
1188
+ return :chitsuki
1120
1189
  end
1190
+ INDENT_TYPE.keys.each do |key|
1191
+ if command.match(INDENT_TYPE[key])
1192
+ return key
1193
+ end
1194
+ end
1195
+ return nil
1121
1196
  end
1122
1197
 
1123
1198
  def exec_block_end_command(command)
1124
1199
  original_command = command.dup
1125
- command.sub!(/^������/, "")
1200
+ command.sub!(/^#{CLOSE_MARK}/, "")
1126
1201
  match = false
1127
1202
  mode = detect_command_mode(command)
1128
1203
  if mode
@@ -1141,10 +1216,10 @@ class Aozora2Html
1141
1216
  end
1142
1217
 
1143
1218
  def exec_img_command(command,raw)
1144
- match = raw.match(/(.*)�i(fig.+\.png)(�A��([0-9]+)�~�c([0-9]+))*�j����/)
1219
+ match = raw.match(PAT_IMAGE)
1145
1220
  if match
1146
1221
  _whole, alt, src, _wh, width, height = match.to_a
1147
- css_class = if alt.match(/�ʐ^/)
1222
+ css_class = if alt.match(PHOTO_COMMAND)
1148
1223
  "photo"
1149
1224
  else
1150
1225
  "illustration"
@@ -1156,12 +1231,12 @@ class Aozora2Html
1156
1231
  end
1157
1232
 
1158
1233
  def exec_frontref_command(command)
1159
- _whole, reference, spec1, spec2 = command.match(/�u([^�u�v]*(?:�u.+�v)*[^�u�v]*)�v[�ɂ͂�](�u.+�v��)*(.+)/).to_a
1160
- spec = if spec1
1161
- spec1 + spec2
1162
- else
1163
- spec2
1164
- end
1234
+ _whole, reference, spec1, spec2 = command.match(PAT_FRONTREF).to_a
1235
+ if spec1
1236
+ spec = spec1 + spec2
1237
+ else
1238
+ spec = spec2
1239
+ end
1165
1240
  if reference and found = search_front_reference(reference)
1166
1241
  tmp = exec_style(found, spec)
1167
1242
  if tmp
@@ -1174,17 +1249,19 @@ class Aozora2Html
1174
1249
  apply_rest_notes(command)
1175
1250
  end
1176
1251
 
1252
+ # 傍記を並べる用
1253
+ #
1177
1254
  def multiply(bouki, times)
1178
- s = ""
1179
- (times-1).times{
1180
- s += bouki
1181
- s += "&nbsp;"
1182
- }
1183
- s + bouki
1255
+ sep = "&nbsp;"
1256
+ ([bouki]*times).join(sep)
1184
1257
  end
1185
1258
 
1259
+ # arrayがルビを含んでいればそのインデックスを返す
1260
+ #
1261
+ # @return [Integer, nil]
1262
+ #
1186
1263
  def include_ruby?(array)
1187
- array.index{|elt|
1264
+ array.index do |elt|
1188
1265
  if elt.is_a?(Aozora2Html::Tag::Ruby)
1189
1266
  true
1190
1267
  elsif elt.is_a?(Aozora2Html::Tag::ReferenceMentioned)
@@ -1194,16 +1271,19 @@ class Aozora2Html
1194
1271
  elt.target.is_a?(Aozora2Html::Tag::Ruby)
1195
1272
  end
1196
1273
  end
1197
- }
1274
+ end
1198
1275
  end
1199
1276
 
1277
+ # rubyタグの再生成(本体はrearrange_ruby)
1278
+ #
1200
1279
  # complex ruby wrap up utilities -- don't erase! we will use soon ...
1280
+ #
1201
1281
  def rearrange_ruby_tag(targets, upper_ruby, under_ruby = "")
1202
- target,upper,under = rearrange_ruby(targets, upper_ruby, under_ruby)
1203
- Aozora2Html::Tag::Ruby.new(self, target,upper,under)
1282
+ target, upper, under = rearrange_ruby(targets, upper_ruby, under_ruby)
1283
+ Aozora2Html::Tag::Ruby.new(self, target, upper, under)
1204
1284
  end
1205
1285
 
1206
- # ruby�^�O�̍Ċ��蓖��
1286
+ # rubyタグの再割り当て
1207
1287
  def rearrange_ruby(targets, upper_ruby, under_ruby = "")
1208
1288
  if include_ruby?(targets)
1209
1289
  new_targets = []
@@ -1218,26 +1298,26 @@ class Aozora2Html
1218
1298
  []
1219
1299
  end
1220
1300
  if new_upper.length > 1 and new_under.length > 1
1221
- raise Aozora2Html::Error, "1�‚̒P���3�‚̃��r�͂‚����܂���"
1301
+ raise Aozora2Html::Error, I18n.t(:dont_allow_triple_ruby)
1222
1302
  end
1223
1303
 
1224
1304
  targets.each{|x|
1225
1305
  if x.is_a?(Aozora2Html::Tag::Ruby)
1226
1306
  if x.target.is_a?(Array)
1227
1307
  # inner Aozora2Html::Tag::Ruby is already complex ... give up
1228
- raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
1308
+ raise Aozora2Html::Error, I18n.t(:dont_use_double_ruby)
1229
1309
  else
1230
1310
  if x.ruby != ""
1231
1311
  if new_upper.is_a?(Array)
1232
1312
  new_upper.push(x.ruby)
1233
1313
  else
1234
- raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
1314
+ raise Aozora2Html::Error, I18n.t(:dont_use_double_ruby)
1235
1315
  end
1236
1316
  else
1237
1317
  if new_under.is_a?(Array)
1238
- new_under.push(x.under_ruby)
1318
+ new_under.push(x.under_ruby)
1239
1319
  else
1240
- raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
1320
+ raise Aozora2Html::Error, I18n.t(:dont_use_double_ruby)
1241
1321
  end
1242
1322
  end
1243
1323
  new_targets.push(x.target)
@@ -1245,7 +1325,7 @@ class Aozora2Html
1245
1325
  elsif x.is_a?(Aozora2Html::Tag::ReferenceMentioned)
1246
1326
  if x.target.is_a?(Array)
1247
1327
  # recursive
1248
- tar,up,un = rearrange_ruby(x.target,"","")
1328
+ tar,up,un = rearrange_ruby(x.target, "", "")
1249
1329
  # rotation!!
1250
1330
  tar.each{|y|
1251
1331
  tmp = x.dup
@@ -1254,12 +1334,12 @@ class Aozora2Html
1254
1334
  if new_under.is_a?(Array)
1255
1335
  new_under.concat(un)
1256
1336
  elsif un.to_s.length > 0
1257
- raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
1337
+ raise Aozora2Html::Error, I18n.t(:dont_use_double_ruby)
1258
1338
  end
1259
1339
  if new_upper.is_a?(Array)
1260
1340
  new_upper.concat(up)
1261
1341
  elsif up.to_s.length > 0
1262
- raise Aozora2Html::Error, "�����ӏ���2�‚̃��r�͂‚����܂���"
1342
+ raise Aozora2Html::Error, I18n.t(:dont_use_double_ruby)
1263
1343
  end
1264
1344
  else
1265
1345
  new_targets.push(x)
@@ -1290,69 +1370,65 @@ class Aozora2Html
1290
1370
  try_kuten = kuten2png(command)
1291
1371
  if try_kuten != command
1292
1372
  try_kuten
1293
- elsif command.match(/�c����/)
1373
+ elsif command.match(TCY_COMMAND)
1294
1374
  Aozora2Html::Tag::Dir.new(self, targets)
1295
- elsif command.match(/���g��/)
1375
+ elsif command.match(YOKOGUMI_COMMAND)
1296
1376
  Aozora2Html::Tag::InlineYokogumi.new(self, targets)
1297
- elsif command.match(/�r�͂�/)
1377
+ elsif command.match(KEIGAKOMI_COMMAND)
1298
1378
  Aozora2Html::Tag::InlineKeigakomi.new(self, targets)
1299
- elsif command.match(/�L���v�V����/)
1379
+ elsif command.match(CAPTION_COMMAND)
1300
1380
  Aozora2Html::Tag::InlineCaption.new(self, targets)
1301
- elsif command.match(/�Ԃ�_/)
1381
+ elsif command.match(KAERITEN_COMMAND)
1302
1382
  Aozora2Html::Tag::Kaeriten.new(self, targets)
1303
- elsif command.match(/�P�_���艼��/)
1383
+ elsif command.match(KUNTEN_OKURIGANA_COMMAND)
1304
1384
  Aozora2Html::Tag::Okurigana.new(self, targets)
1305
- elsif command.match(/���o��/)
1385
+ elsif command.match(MIDASHI_COMMAND)
1306
1386
  midashi_type = :normal
1307
- if command.match(/���s/)
1387
+ if command.match(DOGYO_MARK)
1308
1388
  midashi_type = :dogyo
1309
- elsif command.match(/��/)
1389
+ elsif command.match(MADO_MARK)
1310
1390
  midashi_type = :mado
1311
1391
  else
1312
1392
  @terprip = false
1313
1393
  end
1314
1394
  Aozora2Html::Tag::Midashi.new(self, targets, command, midashi_type)
1315
- elsif command.match(/(.*)�i�K(..)�ȕ���/)
1316
- _whole, nest, style = command.match(/(.*)�i�K(..)�ȕ���/).to_a
1395
+ elsif command.match(PAT_CHARSIZE)
1396
+ _whole, nest, style = command.match(PAT_CHARSIZE).to_a
1317
1397
  Aozora2Html::Tag::InlineFontSize.new(self,targets,
1318
- convert_japanese_number(nest).to_i,
1319
- if style.match("��")
1320
- :sho
1321
- else
1322
- :dai
1323
- end)
1324
- elsif command.match(/(��|��)�Ɂu([^�v]*)�v��(���r|���L)/)
1325
- _whole, dir, under = command.match(/(��|��)�Ɂu([^�v]*)�v��(���r|���L)/).to_a
1398
+ Utils.convert_japanese_number(nest).to_i,
1399
+ detect_style_size(style))
1400
+ elsif command.match(PAT_RUBY_DIR)
1401
+ _whole, _dir, under = command.match(PAT_RUBY_DIR).to_a
1326
1402
  if targets.length == 1 and targets[0].is_a?(Aozora2Html::Tag::Ruby)
1327
1403
  tag = targets[0]
1328
1404
  if tag.under_ruby == ""
1329
1405
  tag.under_ruby = under
1330
1406
  tag
1331
1407
  else
1332
- raise Aozora2Html::Error, "1�‚̒P���3�‚̃��r�͂‚����܂���"
1408
+ raise Aozora2Html::Error, I18n.t(:dont_allow_triple_ruby)
1333
1409
  end
1334
1410
  else
1335
- rearrange_ruby_tag(targets,"",under)
1411
+ rearrange_ruby_tag(targets, "", under)
1336
1412
  end
1337
- elsif command.match(/�u(.+?)�v�̒��L/)
1338
- rearrange_ruby_tag(targets,/�u(.+?)�v�̒��L/.match(command).to_a[1])
1339
- elsif command.match(/�u(.)�v�̖T�L/)
1340
- rearrange_ruby_tag(targets,multiply( /�u(.)�v�̖T�L/.match(command).to_a[1], targets.to_s.length))
1413
+ elsif command.match(PAT_CHUUKI)
1414
+ rearrange_ruby_tag(targets, PAT_CHUUKI.match(command).to_a[1])
1415
+ elsif command.match(PAT_BOUKI)
1416
+ rearrange_ruby_tag(targets, multiply(PAT_BOUKI.match(command).to_a[1], targets.to_s.length))
1341
1417
  else
1342
1418
  ## direction fix! ##
1343
1419
  filter = lambda{|x| x}
1344
- if command.match(/(�E|��|��|��)��(.*)/)
1345
- _whole, dir, com = command.match(/(�E|��|��|��)��(.*)/).to_a
1420
+ if command.match(PAT_DIRECTION)
1421
+ _whole, dir, com = command.match(PAT_DIRECTION).to_a
1346
1422
  # renew command
1347
1423
  command = com
1348
- if command.match(/�_/)
1424
+ if command.match(TEN_MARK)
1349
1425
  case dir
1350
- when "��", "��"
1426
+ when LEFT_MARK, UNDER_MARK
1351
1427
  filter = lambda{|x| x + "_after"}
1352
1428
  end
1353
- elsif command.match(/��/)
1429
+ elsif command.match(SEN_MARK)
1354
1430
  case dir
1355
- when "��", "��"
1431
+ when LEFT_MARK, OVER_MARK
1356
1432
  filter = lambda{|x| x.sub("under","over")}
1357
1433
  end
1358
1434
  end
@@ -1378,9 +1454,9 @@ class Aozora2Html
1378
1454
  end
1379
1455
  end
1380
1456
 
1381
- # ���̎��_�̏���
1457
+ # くの字点の処理
1382
1458
  #
1383
- # ���̎��_�͌��󂻂̂܂܏o�͂���̂Ńt�b�^�́u�\�L�ɂ‚��āv�ŏo�͂��邩�ǂ����̃t���O���������s��
1459
+ # くの字点は現状そのまま出力するのでフッタの「表記について」で出力するかどうかのフラグ処理だけ行う
1384
1460
  def assign_kunoji
1385
1461
  second = @stream.peek_char(0)
1386
1462
  case second
@@ -1398,19 +1474,19 @@ class Aozora2Html
1398
1474
  Aozora2Html::Tag::EditorNote.new(self, command)
1399
1475
  end
1400
1476
 
1401
- # �b�������Ƃ��͕�����𖳎�����ruby_buf�����Ȃ��Ⴂ���Ȃ�
1477
+ # |が来たときは文字種を無視してruby_bufを守らなきゃいけない
1402
1478
  def apply_ruby
1403
1479
  @ruby_buf.protected = nil
1404
- ruby, _raw = read_to_nest("�t")
1480
+ ruby, _raw = read_to_nest(RUBY_END_MARK)
1405
1481
  if ruby.length == 0
1406
1482
  # escaped ruby character
1407
- return "�s�t"
1483
+ return RUBY_BEGIN_MARK+RUBY_END_MARK
1408
1484
  end
1409
1485
  ans = ""
1410
1486
  notes = []
1411
1487
  @ruby_buf.each do |token|
1412
1488
  if token.is_a?(Aozora2Html::Tag::UnEmbedGaiji)
1413
- ans.concat("��")
1489
+ ans.concat(GAIJI_MARK)
1414
1490
  token.escape!
1415
1491
  notes.push(token)
1416
1492
  else
@@ -1418,28 +1494,28 @@ class Aozora2Html
1418
1494
  end
1419
1495
  end
1420
1496
  @buffer.push(Aozora2Html::Tag::Ruby.new(self, ans, ruby))
1421
- @buffer = @buffer + notes
1497
+ @buffer += notes
1422
1498
  @ruby_buf.clear
1423
1499
  nil
1424
1500
  end
1425
1501
 
1426
- # parse_body�̃t�b�^��
1502
+ # parse_bodyのフッタ版
1427
1503
  def parse_tail
1428
1504
  char = read_char
1429
1505
  check = true
1430
1506
  case char
1431
- when "�k"
1507
+ when ACCENT_BEGIN
1432
1508
  check = false
1433
1509
  char = read_accent
1434
1510
  when @endchar
1435
1511
  throw :terminate
1436
- when "��"
1512
+ when GAIJI_MARK
1437
1513
  char = dispatch_gaiji
1438
- when "�m"
1514
+ when COMMAND_BEGIN
1439
1515
  char = dispatch_aozora_command
1440
1516
  when KU
1441
1517
  assign_kunoji
1442
- when "�s"
1518
+ when RUBY_BEGIN_MARK
1443
1519
  char = apply_ruby
1444
1520
  end
1445
1521
 
@@ -1447,7 +1523,7 @@ class Aozora2Html
1447
1523
  when "\r\n"
1448
1524
  tail_output
1449
1525
  when RUBY_PREFIX
1450
- @ruby_buf.dump(@buffer)
1526
+ @ruby_buf.dump_into(@buffer)
1451
1527
  @ruby_buf.protected = true
1452
1528
  when nil
1453
1529
  # noop
@@ -1459,14 +1535,14 @@ class Aozora2Html
1459
1535
  end
1460
1536
  end
1461
1537
 
1462
- # general_output�̃t�b�^��
1538
+ # general_outputのフッタ版
1463
1539
  def tail_output
1464
- @ruby_buf.dump(@buffer)
1540
+ @ruby_buf.dump_into(@buffer)
1465
1541
  string = @buffer.join
1466
1542
  @ruby_buf.clear
1467
1543
  @buffer = []
1468
1544
  string.gsub!("info@aozora.gr.jp",'<a href="mailto: info@aozora.gr.jp">info@aozora.gr.jp</a>')
1469
- string.gsub!("�‹󕶌Ɂihttp://www.aozora.gr.jp/�j"){"<a href=\"http://www.aozora.gr.jp/\">#{$&}</a>"}
1545
+ string.gsub!("青空文庫(http://www.aozora.gr.jp/)".to_sjis){"<a href=\"http://www.aozora.gr.jp/\">#{$&}</a>"}
1470
1546
  if string.match(/(<br \/>$|<\/p>$|<\/h\d>$|<div.*>$|<\/div>$|^<[^>]*>$)/)
1471
1547
  @out.print string, "\r\n"
1472
1548
  else
@@ -1474,57 +1550,58 @@ class Aozora2Html
1474
1550
  end
1475
1551
  end
1476
1552
 
1477
- # `���\�L�ɂ‚���`�Ŏg�p�������L�����o�͂���
1553
+ # `●表記について`で使用した注記等を出力する
1478
1554
  def hyoki
1479
1555
  # <br /> times fix
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"
1481
- @out.print "\t<li>���̃t�@�C���� W3C ���� XHTML1.1 �ɂ������`���ō쐬����Ă��܂��B</li>\r\n"
1556
+ @out.print "<br />\r\n</div>\r\n<div class=\"notation_notes\">\r\n<hr />\r\n<br />\r\n●表記について<br />\r\n<ul>\r\n".to_sjis
1557
+ @out.print "\t<li>このファイルは W3C 勧告 XHTML1.1 にそった形式で作成されています。</li>\r\n".to_sjis
1482
1558
  if @chuuki_table[:chuki]
1483
- @out.print "\t<li>�m���c�n�́A���͎҂ɂ�钍��\���L���ł��B</li>\r\n"
1559
+ @out.print "\t<li>[#…]は、入力者による注を表す記号です。</li>\r\n".to_sjis
1484
1560
  end
1485
1561
  if @chuuki_table[:kunoji]
1486
1562
  if @chuuki_table[:dakutenkunoji]
1487
- @out.print "\t<li>�u���̎��_�v�́u#{KU}#{NOJI}�v�ŁA�u���_�t�����̎��_�v�́u#{KU}#{DAKUTEN}#{NOJI}�v�ŕ\���܂����B</li>\r\n"
1563
+ @out.printf("\t<li>「くの字点」は「%s」で、「濁点付きくの字点」は「%s」で表しました。</li>\r\n".to_sjis, KU+NOJI, KU+DAKUTEN+NOJI)
1488
1564
  else
1489
- @out.print "\t<li>�u���̎��_�v�́u#{KU}#{NOJI}�v�ŕ\���܂����B</li>\r\n"
1565
+ @out.printf("\t<li>「くの字点」は「%s」で表しました。</li>\r\n".to_sjis, KU+NOJI)
1490
1566
  end
1491
1567
  elsif @chuuki_table[:dakutenkunoji]
1492
- @out.print "\t<li>�u���_�t�����̎��_�v�́u#{KU}#{DAKUTEN}#{NOJI}�v�ŕ\���܂����B</li>\r\n"
1568
+ @out.printf("\t<li>「濁点付きくの字点」は「%s」で表しました。</li>\r\n".to_sjis, KU+DAKUTEN+NOJI)
1493
1569
  end
1494
1570
  if @chuuki_table[:newjis] && !Aozora2Html::Tag::EmbedGaiji.use_jisx0213
1495
- @out.print "\t<li>�u���̎��_�v���̂���JIS X 0213�ɂ��镶���́A�摜�����Ė��ߍ��݂܂����B</li>\r\n"
1571
+ @out.print "\t<li>「くの字点」をのぞくJIS X 0213にある文字は、画像化して埋め込みました。</li>\r\n".to_sjis
1496
1572
  end
1497
1573
  if @chuuki_table[:accent] && !Aozora2Html::Tag::Accent.use_jisx0213
1498
- @out.print "\t<li>�A�N�Z���g�����t�����e�������́A�摜�����Ė��ߍ��݂܂����B</li>\r\n"
1574
+ @out.print "\t<li>アクセント符号付きラテン文字は、画像化して埋め込みました。</li>\r\n".to_sjis
1499
1575
  end
1500
1576
  if @images[0]
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"
1577
+ @out.print "\t<li>この作品には、JIS X 0213にない、以下の文字が用いられています。(数字は、底本中の出現「ページ-行」数。)これらの文字は本文内では「※[#…]」の形で示しました。</li>\r\n</ul>\r\n<br />\r\n\t\t<table class=\"gaiji_list\">\r\n".to_sjis
1502
1578
  @images.each{|cell|
1503
1579
  k,*v = cell
1580
+ vs = v.join("、".to_sjis)
1504
1581
  @out.print " <tr>
1505
1582
  <td>
1506
1583
  #{k}
1507
1584
  </td>
1508
1585
  <td>&nbsp;&nbsp;</td>
1509
1586
  <td>
1510
- #{v.join("�A")} </td>
1587
+ #{vs} </td>
1511
1588
  <!--
1512
1589
  <td>
1513
- �@�@<img src=\"../../../gaiji/others/xxxx.png\" alt=\"#{k}\" width=32 height=32 />
1590
+ <img src=\"../../../gaiji/others/xxxx.png\" alt=\"#{k}\" width=32 height=32 />
1514
1591
  </td>
1515
1592
  -->
1516
1593
  </tr>
1517
- "
1594
+ ".to_sjis
1518
1595
  }
1519
- @out.print "\t\t</table>\r\n"
1596
+ @out.print "\t\t</table>\r\n".to_sjis
1520
1597
  else
1521
- @out.print "</ul>\r\n" # <ul>����<li>�ȊO�̃G�������g������͕̂s���Ȃ̂ŏC��
1598
+ @out.print "</ul>\r\n" # <ul>内に<li>以外のエレメントが来るのは不正なので修正
1522
1599
  end
1523
1600
  @out.print "</div>\r\n"
1524
1601
  end
1525
1602
  end
1526
1603
 
1527
1604
  if $0 == __FILE__
1528
- # todo: �����`�F�b�N�Ƃ�
1605
+ # todo: 引数チェックとか
1529
1606
  Aozora2Html.new($*[0],$*[1]).process
1530
1607
  end