Skip to content

choiceで項目の間のスペースを増やすと末尾の文字が消える #72

@neotaso

Description

@neotaso

概要

choiceの各項目の間のスペースを増やすと、データ末尾が無視されてしまう。

choice 123  456  789  /* 各項目の間に半角スペースが2つある */
(choice 123 456 7) > 7 /* 余分な半角スペースの数だけ末尾が消える */

(BCDice本体は正常に動作する)

原因

patch.rb内の処理に問題があり、スペース2つがマッチした場合が考慮されておらず、posの位置がずれてしまう。

bcdice-js/ruby/patch.rb

Lines 44 to 47 in a98704b

self.matched = self.string.substr(self.pos, pos - self.pos - 1 + result[0].length);
self.prev_pos = pos - 1;
self.pos = pos;
self.working = working.substr(result[0].length - 1);

解決方法

1. patch.rbを修正する

マッチした文字の長さだけposを移動させるように修正する。
修正案

        pos = pos + result[0].length - 1;
        self.matched  = self.string.substr(self.pos, pos - self.pos);
        self.prev_pos = self.pos;    # bcdiceには影響が無いが、unscan()で使うためなので本来はこちらが正しそう
        self.pos      = pos;
        self.working  = working.substr(result[0].length - 1);

2. Opal側の処理を修正する

大本はOpal側に問題があるようなので、こちらのコードでPatchをあてて対応している状態?
本体が直ればこちらでのパッチも不要となる。
(ローカルで1.8.2に変更してみたが、patch.rbの処理が無いとnullが帰って来る)

3. bcdice側でスペースを正規化する

command.gsub(/\s+/, ' ') # "choice 123 456 789" => "choice 123 456 789" のようなスペースの正規化処理をBCDiceのchoiceに実装する。

備考

このpatch.rb周りがどういった経緯になっているのかわからず、1の方法でPRを送ることは可能ですが、方針がわからなかったためIssueを作成しました。

参考

https://github.com/ruby/strscan/blob/15c25883fadb2a70ddd8070652fd5858903ce027/ext/strscan/strscan.c

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions