Skip to content

Latest commit

 

History

History
57 lines (31 loc) · 2.85 KB

HACKING.md

File metadata and controls

57 lines (31 loc) · 2.85 KB

HACKING

aozora2htmlの技術的なnoteです。

char_typeについて

aozora2htmlでは、String#char_typeというメソッドが追加されています。

char_typeはルビの範囲を判別するために使われるメソッドです。

  • ひらがな: :hiragana
  • カタカナ: :katakana
  • 全角英数(ギリシア文字含む): :zenkaku
  • 半角英数(記号#-&',含む): :hankaku
  • 漢字: :kanji
  • 半角句読点等(.;"?!)): :hankaku_terminate
  • その他: :else

欧文アクセント文字は半角英数、濁点つきカタカナはカタカナ、外字は漢字、訓点はその他、ルビ付き文字はその他になります。

RubyBufferもRubyBuffer#char_typeを持っています。これはRubyBufferの中身次第で変更されます。複数のchar_typeを内部で持つ場合、char_typeは:elseになります。

Aozora2Html::TextBufferについて

古いRubyでは、Array#to_sはArrayの全要素が文字列だった場合、joinと同じ挙動でした。

現在のRubyでは、同様のことをするにはArray#joinを使わなければならなくなっており、Array#to_sをすると[]等が出力されます。これは埋め込み文字列に使った場合も同様です。 そのため、aozora2htmlではArrayの代わりにAozora2Html::TextBufferクラスを導入しています。Aozora2Html::TextBuffer#to_sは適切な文字列を返します。

Jstreamについて

JStreamIOの代わりとなるクラスです。

主に、読み込み行の行数の管理と、任意の文字数の先読みを行うために使われています。

先読みは同一行内のみ有効で、CRLFを超える先読みは動作が保証されません。

Aozora2Html::Tag::Multilineについて

Aozora2Html::Tag::Multilineは、そのタグが複数行であることを表すマーカー用のモジュールです。

マーカーとして使われるため、メソッド等は特に持っていない、空のモジュールとして実装されています。実行中に追加されたりすることもありません。

parserと入れ子について

青空文庫の記法は一部入れ子にできます。

Aozora2Htmlのparserは入れ子で実行されることがあります。 実装としては、parserとしてのAozora2HtmlにはサブクラスとしてAozora2Html::TagParserとAozora2Html::AccentParserがあります。Aozora2Htmlは[...]をparseする際にはTagParserを、《...》をparseする際にはAccentParserを呼び出します。

[...]のparseにはread_to_nestメソッドが、《...》のparseにはread_acccentメソッドが使われます。

[...]は入れ子にできますが、《...》は入れ子にできません。《...》の中に[...]を入れたり《...》を入れたりすることはできません。