Files
るみなー先生 08b86f3683 feat: update project version and description; add runtime state management and server routes
- Bump version to 0.6.0 and enhance project description in pyproject.toml.
- Introduce runtime state management with RuntimeCandidateState and RuntimeCandidateStateStore classes to handle candidate updates and state retrieval.
- Implement server routes for updating and reading runtime candidate states, handling various request scenarios and errors.
- Add tests for runtime layout and prompt random choice functionality, ensuring robust validation and state management.
- Enhance frontend with runtime candidate editor, including UI updates and synchronization with server state.
2026-08-19 20:39:39 +09:00

3.2 KiB

Candidate language specification

対象ノード

ノード # ! 入れ子
Prompt Random Choice コメント 通常文字 なし
Prompt Random Choice Ex 各階層でコメント 通常文字 あり
Runtime Prompt Random Choice コメント 強制選択 なし
Runtime Prompt Random Choice Ex 各階層でコメント 各階層で強制選択 あり

共通候補分割

  • 候補区切りは実改行または |。
  • CRLFとCRはLFへ正規化する。
  • 候補前後の空白、タブ、改行、カンマを除去する。
  • 空候補は無視する。
  • () は明示的な空文字候補。
  • 制御記号はtrim後の先頭1文字だけを判定する。

# コメント

  • 先頭が # の候補全体を除外する。
  • # 自体を除去して通常候補へ戻す処理ではない。
  • #!candidate はコメント。
  • Exでは各階層に同じ規則を再帰適用する。

Runtime限定の ! 強制選択

  • 同じ階層に ! 候補があれば、上から最初の1件だけを残す。
  • 通常候補と2件目以降の ! 候補は、その階層では選択しない。
  • 出力から制御用の先頭 ! を1文字だけ除去する。
  • !() は空文字を強制選択する。
  • 単独の ! はHard Error。
  • !!candidate は !candidate を強制出力する。
  • 従来版2ノードでは ! を通常文字として出力する。

! は現在のchange_every保持期間へ割り込まず、次回再選択時に評価する。

Exの階層と確率

  • 1候補は直接の子グループを最大1個持てる。
  • 子候補はさらに子グループを持てるため、縦方向の入れ子は許可する。
  • 子を持つ親候補を同じ階層へ複数並べることも許可する。
  • 各階層で # と、Runtimeの場合は最初の ! を適用する。
  • 絞り込み後の最終葉候補は、すべて等しい確率で選択する。
  • 実装は各枝の葉数を重みとして1経路だけを選び、完成文字列を全列挙しない。
  • 同じ文字列へ至る経路が複数あれば、それぞれ独立した葉として重みになる。

例:

A{x|y|z}
B{!p|q}

Runtime Exでの最終葉は A, x、A, y、A, z、B, p の4件で、 各確率は 1/4。

禁止する直積構文

同じ候補へ直接子グループを複数並べる構文は禁止する。

A{B|C}{D|E}
  • 2個目の直接子グループを構文解析中に検出する。
  • 候補展開や葉選択を開始する前にHard Errorとする。
  • 自動的な | 補完や式の書き換えはしない。
  • エラーには対象候補、位置、理由、String Joinを使う代替方法を含める。

許可例:

black hair{straight long hair|short cut}
blonde hair{long hair{side braid|black ribbon}|wavy long hair}

出力

  • 親子の非空文字列を , で結合する。
  • 独立したランダム軸は別ノードへ分け、String Joinで結合する。
  • 空のselected_textに対するselected_text_safeは empty。
  • selected_text_safeはファイル名禁止記号、Windows予約名、過大な長さを回避する。