bitclust
bitclust copied to clipboard
サンプルコード内の `class Foo; end` が `class ;Foo end` と表示される
概要
Rubyリファレンスマニュアルのサンプルコードで、class Foo; end
が class ;Foo end
と表示されています。
ソースを確認したところ、 class Foo; end
(相当)で書かれていました。
再現確認
irb 上の次のコードで再現することが確認できました。
irb> require 'bitclust'
irb> BitClust::SyntaxHighlighter.new('class A; end').highlight
=> "<span class=\"k\">class</span> ;<span class=\"nn\"></span><span class=\"o\"></span><span class=\"nc\">A</span> <span class=\"k\">end</span>"
原因分析
この状態は on_const
と ;
が on_default
で処理されることが関係しているようです。
https://github.com/rurema/bitclust/blob/fd203d14a7e8a982f413085312e2621558f8ffa7/lib/bitclust/syntax_highlighter.rb#L178-L191
クラス名(and/or モジュール名; 以下、同様)をトリガーとする on_const
ではトークンが data
ではなく @name_buffer
に保存されます。
ですが、次の ;
をトリガーとする on_default
ではトークンが data
に保存されます。
この時点で data
にはクラス名の前に ;
が保存された状態となっています。
対処案
基本的に ;
は改行と同様に扱えば良いと考えています。
つまり on_nl
と同等の on_semicolon
を設ければ良さそうです。
https://github.com/rurema/bitclust/blob/fd203d14a7e8a982f413085312e2621558f8ffa7/lib/bitclust/syntax_highlighter.rb#L256-L276
対処コード
フォーク リポジトリにて上述の対処案で修正されることを確認しています:
https://github.com/rurema/bitclust/compare/b853df0...ysjj:rurema-bitclust:da05f15