はじめに
2025年1月14日リリースのVer.1.4.12.0に含まれる「選択肢一覧に選択項目を設定する際に、カンマを含む項目名が正しく識別されない問題を解消。」ですが、当社で改修・実装を行いましたので、ちょっとした中身の紹介をします。
どこが困っていたところか
プリザンターの機能で選択肢一覧で、保存値や表示名、スタイル用のクラス名を記述出来るモードがあります。マニュアルの記述例2や3がその記述になります。
100,未着手,未,status-new
150,準備,準,status-preparation
200,実施中,実,status-inprogress
300,レビュー,レ,status-review
900,完了,完,status-closed
910,保留,留,status-rejected
この方法で記述した場合は、プリザンターの内部ではカンマで文字列が分割されて1番目が保存値、2番目が表示名・・・というように自動的に割り振りが行われます。
[保存値],[表示名],[短縮表示名],[スタイル用のクラス名]
このようになります。ここで問題になってくるのが、保存値や表示名などの中身にカンマを含めたい場合です。
例えば表示名にカンマが含めれているケースを考えてみます。
100,Example Co., Ltd.,Example,status-xxxx
これをカンマで分割してみるとこうなります。
[100],[Example Co.],[ Ltd.],[Example],[status-xxxx]
Example Co., Ltd.
がExample Co.
と Ltd.
の2つに区切られてしまい、想定した挙動になっていません。
どうやって解決させたか
解決方法はとても簡単です。エスケープの導入です。分割してほしくないカンマの部分を\,
とすることで、正しく取り扱いが出来るようにしました。先ほどの例だと次の様になります。
100,Example Co.\, Ltd.,Example,status-xxxx
これをVer.1.4.12.0以降で処理をさせると次の様に分割されます。
[100],[Example Co., Ltd.],[Example],[status-xxxx]
当初の想定通りの挙動になりました。
どうやって実装しているか
今回の実装の差分を見てみましょう。こちらになります。
従来は単純にSplit(',')
で分割していたのですが、今回、正規表現による分割に書き換えました。分割に使用する正規表現は(?<!\\),
です。
否定後読みで\,
となっていない,
のみにマッチするようにして、エスケープされていないところのみで分割処理が実施されるようにしています。その後、分割した文字列に含まれる\,
を,
に置換して、処理は完了です。
ちょっとした応用
今回、分割に使用する正規表現はパラメータで設定可能なようにしています。そのため、ちょっとした応用を利かせることが可能です。Parameters\General.json
のChoiceSplitRegexPattern
ChoiceReplaceRegexPattern
ChoiceReplaceRegexReplacement
パラメータがぞれぞれ、分割に使用する正規表現、分割後のエスケープ検出に使用する正規表現、エスケープの置換後を指定する正規表現となります。
今回の実装は後方互換性を確保するためにエスケープという選択肢と取りましたが、そこを気にしなくていい環境の場合は、カンマ区切りをタブ区切りにしたり、CSVチックな実装にしてみたりといろいろな対応が取れるようになっています。
例えばタブ区切りに変更する場合は、ChoiceSplitRegexPattern
に\t
を、ChoiceReplaceRegexPattern
とChoiceReplaceRegexReplacement
には空文字を指定することで実現出来ます。ただし、JSONに格納するためには文字列のエスケープが必要になるので、そこは注意してください。タブ区切りの場合だと\
はエスケープ対象なので\\t
でファイルには記載する必要があります。
まとめ
選択肢一覧にエスケープを導入することで、値の中にカンマを持つ文字列を指定しても想定通りの挙動をさせることが出来るようになりました。また、それらの設定値をパラメータファイルを書き換えることで変更出来るようにし、選択肢一覧の設定方法の表現幅を広げることができました。
選択肢一覧はいろいろと便利な機能ですので、今回の機能拡張を機にどんどん使ってみてください!!