-
Notifications
You must be signed in to change notification settings - Fork 10
Open
Labels
bugSomething isn't workingSomething isn't working
Description
概要
choiceの各項目の間のスペースを増やすと、データ末尾が無視されてしまう。
choice 123 456 789 /* 各項目の間に半角スペースが2つある */
(choice 123 456 7) > 7 /* 余分な半角スペースの数だけ末尾が消える */
(BCDice本体は正常に動作する)
原因
patch.rb内の処理に問題があり、スペース2つがマッチした場合が考慮されておらず、posの位置がずれてしまう。
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
Labels
bugSomething isn't workingSomething isn't working